为什么需要主从复制?
- 在实际生产中,数据的重要性不言而喻
- 如果我们的数据库只有一台服务器,那么很容易产生单点故障的问题,比如这台服务器访问压力过大而没有响应或者崩溃,那么服务就不可用了,再比如这台服务器的硬盘坏了,那么整个数据库的数据就全部丢失了,这是重大的安全事故;
- 为了避免服务的不可用以及保障数据的安全可靠性,我们至少需要部署两台或两台以上服务器来存储数据库数据,也就是我们需要将数据复制多份部署在多台不同的服务器上,即使有一台服务器出现故障了,其他服务器依然可以继续提供服务。
主从复制是什么?
- MySQL提供了主从复制功能以提高服务的可用性与数据的安全可靠性
- 主从复制是指服务器分为主服务器和从服务器,主服务器负责读和写,从服务器只负责读,主从复制也叫master/slave, master 是主,slave 是从
- 主从复制可以实现对数据库备份和读写分离。
主从复制架构
主从复制流程解析
- 当master主服务器上的数据库发生改变时,则将其改变写入二进制时间日志文件中
- salve从服务器会在一定时间间隔内对master 主服务器上的二进制日志进行探测,探测其是否发生过改变,如果探测到master主服务器的二进制时间日志发生了改变,则开始一个 I/O Thread 请求master 二进制事件日志;
- 同时master 主服务器为每个I /O thread 启动一个dump Thread, 用于向其发送二进制事件日志。
- slave 从服务器将接受到的二进制事件日志保存至自己本地的中继日志文件中;
- salve 从服务器将启动SQL Thread 从中继日志中读取二进制日志,在本地重放,使得其数据和主服务器保持一致
- 最后I/O Thread 和SQL Thread 将进入睡眠状态等待下一次被唤醒。
主从复制配置文件介绍
配置Master的my.cnf文件(关键性配置) /etc/my.cnf log-bin=mysql-bin // 开启二进制日志功能(必填项) server-id = 1 // masterID(必填项且不能和slave冲突) binlog-do-db=icinga binlog-do-db=DB2 //如果备份多个数据库,重复设置这个选项即可 binlog-do-db=DB3 //需要同步的数据库,如果没有本行,即表示同步所有的数据库 binlog-ignore-db=mysql //被忽略的数据库
配置Slave的my.cnf文件(关键性的配置)/etc/my.cnf log-bin=mysql-bin server-id=2 replicate-do-db=icinga replicate-do-db=DB2 replicate-do-db=DB3 //需要同步的数据库,如果没有本行,即表示同步所有的数据库 replicate-ignore-db=mysql //被忽略的数据库
搭建一主一从
1. 分别登上主从服务器的MYSQL
2. 在主从服务器上分别新建数据库sync
3. 在主服务器上创建复制数据的账号并授权
create user 'username'@'host' identified by 'password';
grant replication slave on 'databasename.tablename' to 'username'@'host' identified by 'password'; # 这是详细到表的权限
grant replication slave on *.* to 'username'@'host' ; 所有的数据库
4. 修改主备数据库的配置文件
主服务器配置
查找my.cnf文件位置 whereis my.cnf
在文件中添加:
log_bin = mysql-bin # 日志文件名字
binlog-format=ROW # 日志文件的格式
server-id = 17 # 服务器的id,一定要是唯一的, 必填
binlog_do_db=ddm # 对应需要实现主从复制的数据库 选填,这个可以写多个
5. systemctl restart mysqld 重启mysql
6.重新登录mysql在主服务器上执行命令,查看主服务器状态: show master status
可以看到file那一列变成了mysql-bin.000001,配置成功。
7. 如果主服务状态不是初始状态,建议重置状态,执行命令: reset master
8. 从服务器配置
退出mysql, 找到并编辑my.cnf文件
添加以下内容:
log_bin = mysql-bin
server_id = 22
relay_log = /var/lib/mysql/mysql-realay-bin
log_slave_updates = 1
read_only = 1
log_bin默认情况下会使用机器名命名,这里设成和主库相同的名称,当然也可以设置成其他名称。
relay_log指定中继日志的位置和名字
log_slave_updates允许备库将其重放事件记录到自身的二进制文件中
read_only会阻止没有权限的线程修改数据
这里其实只有server_id是必填项,其他都是选填的。
9. 保存好配置文件后,重启mysql
systemctl restart mysqld
10. 重新进入MySQL,使用change master to命令开始复制
change master to master_host=‘10.145.1.17’,
master_user = ‘repl’,
master_password = ‘Repl123!@#’,
master_log_file = ‘mysql-bin.000001’,
master_log_pos = 0;
启动slave 的数据同步
start slave
停止slave的数据同步
stop slave
11. 输入命令show slave statusG;查看状态
Slave_IO_Running: No
Slave_SQL_Running: No
表示当前备库还没有开始复制。
12. 输入命令:start slave;开始复制
13. 在主数据库上运行 show processlistG;
显示了来自10.145.1.22的连接,并等待更多的更
现在来验证一下
现在这个配置,从服务器是没有权限修改数据的,一旦修改会出现
这就说明,你的配置是对的,但是如果你修改成功了,
注意:read_only=1只读模式,可以限定普通用户进行数据修改的操作,但不会限定具有super权限的用户(如超级管理员root用户)的数据修改操作。
详细请看https://blog.csdn.net/zhanyd/article/details/104997254