mysql 5.7主备半同步复制搭建及手工切换步骤

一、复制中用到的概念:
1、GITD
GITD是唯一标示符是由服务器的UUID(全局唯一标示对于任何一个服务器都是128位随机符)并结合事务ID号来组合成一个唯一的标示,某一个主机上某一个事务的标识码 就叫做GTID
自从引入GTID之后 MySQL5.6的binlog在每一个事务的首部都会写上GTID的标示,在二进制文件中,每一个事务的语句记录下来的时候在这个事件首部会把相关联的GTID给记录下来。
因此GTID使得追踪和比较复制事务变得非常简单,而且能够实现从崩溃中快速进行恢复。

2、从库多线程复制
MySQL的多线程复制不是一个新的东西,在5,7之前就已经有了,在5.7上进行了增强;
多线程复制可以减轻主从复制的延迟;
从服务器中一个线程只能针对一个数据库进行复制,显得有些鸡肋;但是大部分操作有可能都是对一个库的操作;
在MySQL5.7中的多线程复制可以看做是基于table的,这样就可以提高效率;

3、几种不同复制的概念
异步复制:其为Mysql的默认模式,Master在执行完Client所提交的事务会将结果立即返回给Client,但是并不关心Slave是否接收并处理,如果此时Master宕机,主上已经提交的事务可能并没有传到Slave上,Slave提升为Master,数据也会可能不完整。

全同步复制:当Master接受到Client所提交的事务,会等Slave执行了该事务在把结果返回给Client,因此必定有大量的性能损失。

半同步复制(版本5.7):介于异步复制和全同步复制之间,Master在执行了Client所提交的事务后不会立即返回给 Client,而是等待至少有一个Salve的relay log接受到bin log才返回给Client,大大提高了的数据的安全性。如果Slave响应超时(默认为10s)以后,半同步复制会切换为异步复制,在Slave恢复以后,会切换到半同步复制,并且数据会进行同步

二、半同步复制搭建
192.168.1.66 (主服务器)
192.168.1.68(备服务器)
1、先在两台服务器上安装5.7版本mysql数据库,创建用户,并手工同步数据。我们只设置为同步yu和zong两个数据库
2、在两台服务器的My.cnf配置文件[mysqld]中都添加如下内容,其中server_id要求唯一,不能重复出现:

server_id = 15
log-bin=master-bin
binlog-do-db=yu
binlog-do-db=zong
replicate-do-db=yu
replicate-do-db=zong

gtid_mode=ON # 开启GTID功能
enforce-gtid-consistency=true

slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16 # ###打开16个线程,原先的进程变成调度器
###下面是优化参数
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON

3、按照半同步功能插件。启动mysql数据库后,在两台服务器上进入数据库后执行

mysql> install plugin rpl_semi_sync_master soname ‘semisync_master.so’;

mysql> install plugin rpl_semi_sync_slave soname ‘semisync_slave.so’;

在master数据上执行

mysql> set global rpl_semi_sync_master_enabled=ON;
mysql> show global variables like ‘%semi%’;
在slave数据库上执行
mysql> set global rpl_semi_sync_slave_enabled=ON;
mysql> stop slave io_thread;
mysql> start slave io_thread;
mysql> show global variables like ‘%semi%’;

或者在两台服务器的my.cnf参数文件中添加两个参数并重启数据库
rpl_semi_sync_slave_enabled
rpl_semi_sync_master_enabled
这两个参数作用就是启用半同步复制功能

4、搭建完成后,进行验证,不在赘述。
列出几个常用命令:
主服务器上的相关命令:
show master status
show slave hosts
show logs
show binlog events
purge logs to ‘log_name’
purge logs before ‘date’
reset master(老版本是flush master)
set sql_log_bin=
从服务器上的相关命令:
slave start
slave stop
SLAVE STOP IO_THREAD //此线程把master段的日志写到本地
SLAVE start IO_THREAD
SLAVE STOP SQL_THREAD //此线程把写到本地的日志应用于数据库
SLAVE start SQL_THREAD
reset slave
SET GLOBAL SQL_SLAVE_SKIP_COUNTER
load data from master
show slave status(SUPER,REPLICATION CLIENT)
CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,MASTER_USER=, MASTER_PASSWORD= //动态改变master信息
PURGE MASTER [before ‘date’] 删除master端已同步过的日志

三、手工进行主备切换

1、主库停止应用,确认主库不再有数据生成
将主库改为read_only模式

mysql> set global super_read_only=on;
Query OK, 0 rows affected (0.00 sec)

mysql> set global read_only=on;
Query OK, 0 rows affected (0.00 sec)
2、在从库上验证是否日志全部同步完毕,确保所有从数据库都已经执行了relay log中的全部更新
mysql>stop slave io_thread;
mysql>show processlist;
3、在从库上关闭slave进程并记录binlog日志及POS
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush logs;
Query OK, 0 rows affected (0.02 sec)

mysql> show master status;
±------------------±---------±-------------±-----------------±-----------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±------------------±---------±-------------±-----------------±-----------------------------------------+
| master-bin.000003 | 154 | yu,zong | | 5b3ba816-bce8-11e9-ac03-005056a83402:1-4 |
±------------------±---------±-------------±-----------------±-----------------------------------------+
1 row in set (0.00 sec)

4、如果从库开启了只读模式,将从库只读模式关闭

mysql> show global variables like ‘%read_only%’;
mysql> set global super_read_only=off;
Query OK, 0 rows affected (0.00 sec)

mysql> set global read_only=off;
Query OK, 0 rows affected (0.00 sec)

mysql> reset master;(非必须)
Query OK, 0 rows affected (0.00 sec)

5、将原主库切换为从库。

CHANGE MASTER 分2种情况,一种是开启了GTID模式,一种是未开启GTID模式

GTID模式:
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)

mysql> CHANGE MASTER TO master_host=‘192.168.1.68’,master_port=3308,master_user=‘repl’,master_password=‘Zh.123456’,MASTER_AUTO_POSITION=1;
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql> start slave;
Query OK, 0 rows affected (0.06 sec)

有时从库同步主库时会报错如下:
mysql> CHANGE MASTER TO MASTER_HOST=‘xxx’,MASTER_USER=‘replicant’,MASTER_PASSWORD=‘xxx’, MASTER_LOG_FILE=‘bin.000050’, MASTER_LOG_POS=191;
ERROR 1776 (HY000): Parameters MASTER_LOG_FILE, MASTER_LOG_POS, RELAY_LOG_FILE and RELAY_LOG_POS cannot be set when MASTER_AUTO_POSITION is active.
解决办法如下:
mysql> change master to master_auto_position=0;
Query OK, 0 rows affected (0.34 sec)

mysql> CHANGE MASTER TO MASTER_HOST=‘xxx’,MASTER_USER=‘replicant’,MASTER_PASSWORD=‘xxx’, MASTER_LOG_FILE=‘bin.000050’, MASTER_LOG_POS=191;
Query OK, 0 rows affected, 2 warnings (0.51 sec)

mysql> START SLAVE;
Query OK, 0 rows affected (0.08 sec)

mysql> SHOW SLAVE STATUS \G

如果未开启GTID模式
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)

mysql> CHANGE MASTER TO master_host=‘192.168.1.68’,master_port=3308, master_user=‘repl’,master_password=‘Zh.123456’, master_log_file=‘master-bin.000003’,master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.03 sec)

mysql> start slave;
Query OK, 0 rows affected (0.06 sec)

切换完成后进行手工验证

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值