书名:《MYSQL管理之道》
摘要:MYSQL半同步复制配置步骤
What:半同步复制是什么?
简单说,半同步复制就是主库把事务日志发到从库上,并且确认从库已经将该事务日志写入到relay后,主库才提交事务的一种机制。
Why:为什么使用半同步复制?
主要是为了提高主从库数据一致性。
Who:谁会用?
架构师进行规划时,结合系统要求评估是否需要实现高可用性或读写分离。
When:什么时候用?
要求mysql数据库实现高可用性或读写分离时候用。
Where:在什么地方用?
要求mysql数据库实现高可用性或读写分离的系统。
How:怎样配置?
材料:
两台主机,两个万兆网卡,MYSQL 5.7以上的安装包
连接方式:
两台主机可以直连,也可以通过网络交换机通信。据有经验的基友反馈,直接效果更好。
软件配置:
1.MYSQL软件安装略去。
2.安装半同步插件(主从库都需要安装)
2.1 插件所在目录 mysql安装目录下的./lib/plugin有两个以SO结尾的文件,分别是:
semisync_master.so
semisync_slave.so
2.2 cd 到./plugin目录下进行安装,命令如下
在主从库上分别以root用户登录到mysql,并执行如下命令:
install plugin rpl_semi_sync_master soname 'semisync_master.so'
install plugin rpl_semi_sync_slave soname 'semisync_slave.so'
备注:记得在主从库上都要安装这两个插件,为了以后主从切换时也能继续使用半同步复制。
2.3 插件安装完后,在主库执行如下命令:
set global rpl_semi_sync_master_enabled=on
并按需修改半同步相关参数,具体如下:
- rpl_semi_sync_master_timeout=10000 :单位是毫秒,即10秒,表示主库某个事件在10秒内没有获取到从库的响应,即降级为异步复制。可动太修改。
- rpl_semi_sync_master_wait_on_slave=on:表示主库每个事务都要等待从库的响应才可以提交, 等待时间为10秒。
- rpl_semi_sync_master_trace_level=32:半同步复制的调试级别
备注:应my.cnf同时加入以上配置项.
2.4 从库上的配置,相对简单,只要两个参数。
set global rpl_semi_sync_slave_enabled=on
set global rpl_semi_sync_master_trace_level=32
3. 启动半同步复制
3.1 在主库上执行备份,并恢复到从库上。
3.2 在从库上执行以下命令,“建立主从关系”
change master to master_host='192.168.0.1',master_user='rpl',master_password='rpl',master_port=3306,master_log_file='mysql-bin-000001';master_log_pos=107;
start slave;
注:master_log_file及master_log_pos都是来自于你所恢复的备份文件的log内容。像我是用xtrabackup,在备份的结尾就有这么一段话“MySQL binlog position: filename 'mysql-binlog.011640', position '34589199'“,这一段话的字段关键字就是替换change master to 命令所对应的关键字。
4.半同步复制状态查看,命令如下:
show status like '%semi%';
- rpl_semi_sync_master_status: 现在是处于半同步还是异步复制模式
- rpl_semi_sync_master_clients:有多少个从库以半同步方式连到该主库上.
- rpl_semi_sync_master_yes_tx:显示从库上成功提交的事务数
- rpl_semi_sync_master_no_tx:显示从库上失败的事务数
- rpl_semi_sync_slave_status: on 表示从库半同步复制已经启动《〈〈在从库上查看。
5. 备注: CHANGE MASTER TO 命令
参数解释
MASTER_HOST, MASTER_USER, MASTER_PASSWORD,MASTER_PORT四个选项提供了slave从机连接到master主机的信息。
MASTER_HOST 与 MASTER_PORT:
分别代表master主机名(或IP地址)及mysql实例端口号。
注意: 复制不能使用unix socet文件,必须使用tcp/ip 连接到master。
如果我们指定MASTER_HOST 与 MASTER_PORT参数,slave会认为master与之前的不是同一个(即便MASTER_HOST 与 MASTER_PORT所带的参数与之前相同),之前指定的master的binlog文件名及位置将不再适用。所以如果我们在后面不明确指定MASTER_LOG_FILE 和 MASTER_LOG_POS 的参数值,那么MASTER_LOG_FILE='' 以及 MASTER_LOG_POS=4 将会默认的追加到后面。
设置MASTER_HOST为空(MASTER_HOST=' ')与不设置该参数是不同的,mysql5.5开始,将MASTER_HOST设为空将会失败并报错【验证】
MASTER_USER 与 MASTER_PASSWORD:
连接到master主机复制账户所对应的用户名及密码。
mysql5.6.4及其后续版本,MASTER_USER不能设置为空;当明确设置MASTER_PASSWORD参数时,MASTER_USER 不能设置为空或不进行设置【验证2.1实例】。
MASTER_PASSWORD参数对应的密码长度最大为32位字符【验证】,如果字符超长(超过32位),语句会执行成功,但超出的长度会被截取掉,mysql复制的这个问题在mysql5.7版本中得到了修复。
MASTER_LOG_FILE 与 MASTER_LOG_POS:
这两项确定slave的io线程下次开始执行时从master开始读取的位置坐标,RELAY_LOG_FILE 与 RELAY_LOG_POS这两项确定slave的sql线程下次开始执行时从relay log开始读取的位置坐标。如果我们指定了MASTER_LOG_FILE 或 MASTER_LOG_POS中的任意一项,就不能再指定RELAY_LOG_FILE 或 RELAY_LOG_POS,也不能指定MASTER_AUTO_POSITION = 1 (mysql5.6.5及其后续版本)。如果二者都没有指定,slave使用上次slave sql线程保存的位置。
RELAY_LOG_FILE 与 RELAY_LOG_POS:
change master to操作删除所有relay log文件并创建一个新的,除非我们指定RELAY_LOG_FILE 或 RELAY_LOG_POS。如果全局变量relay_log_purge设置为0(默认为ON),relay log也将会保持。
mysql5.6.2之前,RELAY_LOG_FILE需要配置绝对路径,mysql5.6.2及其后续版本,可以配置相对路径(相对mysql的data目录)。
MASTER_AUTO_POSITION:
该参数在mysql5.6.5版本引入,如果进行change master to时使用MASTER_AUTO_POSITION = 1,slave连接master将使用基于GTID的复制协议。
使用基于GTID协议的复制,slave会告诉master它已经接收到或执行了哪些事务。计算这个集,slave需要读取全局参数gtid_executed以及通过show slave status获取的参数Retrieved_gtid_set。
结果集作为初次握手的一部分,发送到master,master发回它已经执行的且不在结果集这部分的所有事务。如果这些事务在master的binlog文件中已经被清除,master将会发送一个ER_MASTER_HAS_PURGED_REQUIRED_GTIDS错误信息到slave,复制将不会开启。
使用基于GTID的复制时(MASTER_AUTO_POSITION = 1),首先要开启gtid_mode(在my.cnf中设置gtid-mode = ON),MASTER_LOG_FILE 与 MASTER_LOG_POS也不能使用,否则会报错。
使用GTID后想要恢复到老的基于文件的复制协议,在change master to时需要指定MASTER_AUTO_POSITION = 0以及MASTER_LOG_FILE 或 MASTER_LOG_POSITION中至少一项。
MASTER_CONNECT_RETRY:
重连到master时的超时等待时间,默认为60秒。
MASTER_RETRY_COUNT:
mysql5.6.1引入该参数,限制重连次数以及更新show slave status输出的Master_Retry_Count列。默认值是24 * 3600 = 86400。MASTER_RETRY_COUNT主要用于替代mysqld服务器参数 --master-retry-count(该参数在mysql5.6.1及其后续版本废除)。MASTER_RETRY_COUNT = 0表示重连次数无限制。
MASTER_HEARTBEAT_PERIOD:
设置复制心跳的周期,取值范围为0 到 4294967秒。精确度可以达到毫秒,最小的非0值是0.001秒。心跳信息由master在主机binlog日志文件在设定的间隔时间内没有收到新的事件时发出,以便slave知道master是否正常。
slave连接到master后,该参数可通过mysql.slave_master_info表查看。
默认值为slave_net_timeout的值除以2,设置为0表示完全的禁用心跳。
MASTER_DELAY:
默认值为0,取值范围为0至2^31–1,表示slave至少落后master的复制时间。来自master的事件不直接执行,而是至少等到master执行完该该事件MASTER_DELAY所指定的时间间隔后才执行。
MASTER_BIND:
在slave复制从机多网络接口的情况下使用,以确定用哪一个slave网络接口连接到master。该参数在mysql5.6.2版本加入,同时也支持MySQL Cluster NDB 7.3.1及其后续版本。
该参数可通过show slave status的Master_Bind列进行查看,如果启动mysql时指定了--master-info-repository=TABLE,也可通过mysql.slave_master_info表查看(Bind列)。
IGNORE_SERVER_IDS = (server_id_list):
server_id_list: [server_id [, server_id] ... ]
后面接以逗号分隔的0个或多个server-id,主要用于多主复制或环形复制的情况,处于复制链条中间的服务器异常,可以通过
MASTER_SSL*:
该选项提供使用ssl连接的信息。它们保存在master的信息表,即使slave没有使用SSL选项编译,这些参数依然可以更改,只不过会被忽略。MASTER_SSL_CRL 与 MASTER_SSL_CRLPATH 在 MySQL 5.6.3版本加入。