mysql replication及主主互备
mysql安装方式以及关闭防火墙操作请参考,下文中mysql安装部分:
https://www.cnblogs.com/nlbqdcn/p/13615390.html
Mysql replication:
mysql replication是mysql自身提供的一个主从复制功能,其实也就是一台mysql服务器(slave)从另一台mysql服务器(master)上复制日志,然后解析日志并应用到自身的过程.
mysql replication复制方式:
基于语句复制:
mysql默认采用基于语句的复制,效率很高,基本方式是:在master服务器上执行的sql语句,在slave服务器上再次执行同样的语句,而一旦发现没法精确复制时,会自动选择基于行的复制.
基于行的复制:
基本方式:把master服务器上改变的内容复制过去,而不是把SQL语句在从服务器上执行一遍,从Mysql5.0开始支持基于行的复制.
混合类型的复制:
上述两种类型的混合,默认采用基于语句的复制,如果发现基于语句的复制无法精准完成,就会采用基于行的复制.
mysql replication实现原理:
mysql replication是一个从master复制到一台或者多台slave的异步过程,在master与slave之间实现整个复制过程主要由三个线程来完成.其中一个io线程在master端,另两个线程(SQL线程和io线程)在slave端
过程如下:
- 首先slave上的io线程连接到master,然后请求从指定日志文件的指定位置或者从最开始的日志位置之后的内容日志.
- master在接收到来自slave的io线程请求后,通过自身的io线程,根据请求信息读取指定日志位置之后的日志信息,并返回给slave端的io线程.返回信息中除了日志所包含的信息之外,还包括此次返回的信息在master端对应binary log文件的名称以及在binary log中的位置
- slave的io线程接收到信息后,将获取到的日志内容依次写入slave端的relay log文件(类似于mysql-relay-bin.xxx)的最后,并将读取到的master端的binary log的文件名和位置记录到一个名为master-info的文件中,以便在下次读取的时候能够迅速定位开始往后读取日志信息的位置.
- slave的sql线程在检测到relay log文件中新增加的内容后,会马上解析该ralay log文件中的内容,将日志内容解析为sql语句,然后在自身执行这些sql,由于是在master端和slave端执行了同样的sql操作,所以两端的数据一致.
Mysql replication 遵守的规则:
- 同一时刻只能有一个master服务器进行写操作
- 一台master服务器可以有多台slave服务器
- 无论是master服务器还是slave服务器,都要确保各自的server ID唯一,否则双主互备就会出现问题
- 一台salve服务器可以将其从master服务器获取的更新信息传递给其他slave服务器.
主主互备配置:
配置环境信息:
|
主机名 |
操作系统 |
mysql版本 |
主机IP |
|
mysql-master(master) |
CentOS 7.6.1810 |
mysql-server-5.7.31 |
192.168.1.25 |
|
mysql-nodes(slave) |
CentOS 7.6.1810 |
mysql-server-5.7.31 |
192.168.1.26 |
修改mysql-master主机配置文件,在/etc/my.cnf文件的[mysqld]字段中添加如下内容:
server-id = 1
log-bin = mysql-bin
relay-log = mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
修改mysql-nodes主机配置文件,在/etc/my.cnf文件的[mysqld]字段中添加如下内容:
server-id = 2
log-bin = mysql-bin
relay-log = mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
(replicate-wild-do-table=)
注:设置完毕后,matser和slave都重启数据库服务
参数解释:
server-id是节点标识,主从不能相同,必须全局唯一
log-bin表示开启mysql的binlog日志功能,mysql-bin表示日志文件的命名格式,生成mysql-bin-000001, mysql-bin-000002的日志文件
relay-log用来定义relay-log日志文件的命名格式
replicate-wild-ignore-table 是复制过滤选项,可以过滤不需要的数据库或表
replicate-wild-do-table用来指定需要复制的数据库或表
手动同步数据库:
mysql-master 登陆进数据库执行sql语句:
flush tables with read lock; ##关闭所有打开的表并使用全局读锁锁定所有数据库的所有表,不会刷新脏块
另起一个终端,防止锁失效.执行命令:
cd /var/lib/
tar zcvf mysql.tar.gz mysql (mysqldump也可以)
scp复制到slave上的/var/lib上解压
创建复制用户并授权:
master主机进入数据库上执行sql语句:
grant replication slave on *.* to ‘rep_user’@’192.168.1.26’ identified by ‘123456’;
show master status;
记住master_log_file和master_log_pos,设置时需要指定

slave的mysql库将master设置自己的主服务器:
slave主机进入数据库上执行sql语句:
change master to \
master_host=’192.168.1.25’,
master_user=’rep_user’,
master_password=’123456’,
master_log_file=’ mysql-bin.000002’,
master_log_pos=154;
启动slave服务:
start slave; ##启动slave服务器
show slave status \G ###查看slave运行状态

需要关注下面两个线程,正常情况下应该为yes
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
注: Slave_IO_Running: 为NO时,
- 检测防火墙是否关闭
- 账号密码是否正确
- 主服务器mysql权限是否正确
- 网络是否正常可以通信
- selinux是否关闭
设置salve到master的主从复制,过程和上面一样,在slave上创建复制用户,在master上设置主服务器即可
浙公网安备 33010602011771号