怎么在MySQL中配置半同步复制

52次阅读
没有评论

共计 5321 个字符,预计需要花费 14 分钟才能阅读完成。

自动写代码机器人,免费开通

今天就跟大家聊聊有关怎么在 MySQL 中配置半同步复制,可能很多人都不太了解,为了让大家更加了解,丸趣 TV 小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

MySQL 安装

通过 APT 的方式安装,官方指导文档地址:
https://dev.mysql.com/downloads/repo/apt/

1、下载 mysql-apt-config_0.8.3-1_all.deb

怎么在 MySQL 中配置半同步复制

2、安装 deb

A Quick Guide to Using the MySQL APT Repository:
https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/

sudo dpkg -i mysql-apt-config_0.8.3-1_all.deb

3、更新源

sudo apt-get update

4、安装 MySQL

sudo apt-get install mysql-server

5、根据提示选择安装和设置密码。

另外,还需要对其进行设置,绑定的 IP 和打开防火墙的 3306 端口,这里主要是学习 MySQL 半同步复制,对 MySQL 的安装不做多解释,如果疑问欢迎留言。

MySQL 半同步复制介绍

怎么在 MySQL 中配置半同步复制

(1)默认情况下,MySQL 的复制功能是异步的,异步复制可以提供最佳的性能,主库把 binlog 日志发送给从库,这一动作就结束了,并不会验证从库是否接收完毕,这一过程,也就意味着有可能出现当主服务器或从服务器端发生故障的时候,有可能从服务器没有接收到主服务器发送过来的 binlog 日志,这就会造成主服务器和从服务器的数据不一致,甚至在恢复时造成数据的丢失。

注意:

半同步复制模式必须在主服务器和从服务器端同时开启,否则主服务器默认使用异步复制模式。

(2)异步复制案例:

MySQL5.6 数据库主从(Master/Slave)同步安装与配置详解

(3)为了解决上述可能发生的错误,MySQL 5.5 引入了一种半同步复制模式。该模式可以确保从服务器接收完主服务器发送的 binlog 日志文件并写入到自己的中继日志 relay log 里,然后会给主服务器一个反馈,告诉主服务器已经接收完毕,这时主服务线程才返回给当前 session 告知操作完成。

(4)当出现超时情况是,主服务器会暂时切换到异步复制模式,直到至少有一个从服务器从及时收到信息为止。

(5)中继日志的自我修复:

从 MySQL 5.5.X 版本开始,增加了 relay_log_recovery 参数,这个参数的作用是:当 slave 从库宕机后,假如 relay.log 损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的 relay-log, 并且重新从 master 上获取日志,这样就保证了 relay-log 的完整性。默认情况下该功能是关闭的,将 relay_log_recovery 的值设置为 1 时,可在 slave 从库上开启该功能,建议开启。

(6)半同步复制与异步复制的切换:

半同步复制的工作原理就是当 slave 从库 IO_Thread 线程将 binlog 日志接收完毕之后,要给 master 主库一个确认,如果 rpl_semi_sync_master_timeout=10000 (10 秒) 超过 10 秒未收到 slave 从库的接受确认信号,那么就会自动切换为传统的异步复制模式。

MySQL 半同步复制配置

首先,需要安装两个 MySQL,这里是:

Master:192.168.1.227

Slave:192.168.1.224

原始数据库的模样如下:

怎么在 MySQL 中配置半同步复制

一、Master 配置

(1)在 Master 数据库安装半同步复制插件:

mysql INSTALL PLUGIN rpl_semi_sync_master SONAME  semisync_master.so

怎么在 MySQL 中配置半同步复制

(2)设置 Master 上开启半同步复制:

mysql SET GLOBAL rpl_semi_sync_master_enabled = 1;

怎么在 MySQL 中配置半同步复制

(3)修改 mysqld.cnf 配置文件:

怎么在 MySQL 中配置半同步复制

上图指出了 MySQL 配置的文件路径。

[mysqld]
log-bin=mysql-bin
server_id = 10086
server_id_bits = 33
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000

怎么在 MySQL 中配置半同步复制

(4)修改 MySQL server-uuid 配置文件:

root@xuliugen:/var/lib/mysql# pwd
/var/lib/mysql

修改 auto.cnf 文件,server-uuid 的值格式固定,为了和 Slave 的区别开

[auto]
server-uuid=8d90feb7-1a88-11e7-9d11-000c298a546f

(5)查看配置是否成功:

mysql SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE  %semi%

怎么在 MySQL 中配置半同步复制

(6)参数说明:

1、rpl_semi_sync_master_enabled = 1, 表示在 master 上已经开启了半同步复制模式;

2、rpl_semi_sync_master_timeout = 10000,表示如果主库在某次事务中的等待时间超过 10000 毫秒,则降级为异步复制模式,不在等待 slave 从库。如果主库再次探测到 slave 从恢复了,则会自动切换回半同步复制模式;

3、rpl_semi_sync_master_wait_no_slave , 表示是否允许 master 每个事务提交后都要等待 slave 的接收确认信号。默认为 ON,即每一个事务都会等待。如果为 OFF,则 slave 追赶上之后,也不会开启半同步复制模式,需要手工开启;

4、rpl_semi_sync_master_trace_level = 32, 指用于开启半同步复制模式时的调试级别,默认为 32。

可以看出,在配置 Master 的时候,只设置了 1,其他的都采取的默认设置。

二、Slave 配置

(1)在 Slave 数据库安装半同步复制插件:

mysql INSTALL PLUGIN rpl_semi_sync_slave SONAME  semisync_slave.so

怎么在 MySQL 中配置半同步复制

(2)设置 Slave 上开启半同步复制:

mysql SET GLOBAL rpl_semi_sync_slave_enabled = 1;

怎么在 MySQL 中配置半同步复制

(3)修改 mysqld.cnf 配置文件:

[mysqld]
log-bin=mysql-bin
server_id=10089
server_id_bits = 32
rpl_semi_sync_slave_enabled = 1

怎么在 MySQL 中配置半同步复制

(4)修改 MySQL server-uuid 配置文件:

root@xuliugen:/var/lib/mysql# pwd
/var/lib/mysql

修改 auto.cnf 文件,server-uuid 的值格式固定,为了和 Slave 的区别开

[auto]
server-uuid=8d90feb7-1a88-11e7-9d11-000c298a123f

确保和 Master 的 server-uuid 不一样!

(5)查看配置是否成功:

mysql SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE  %semi%

怎么在 MySQL 中配置半同步复制

(6)参数说明:

1、rpl_semi_sync_slave_enabled = 1, 表示在 slave 上已经开启了半同步复制模式;

2、rpl_semi_sync_slave_trace_level = 32, 指用于开启半同步复制模式时的调试级别,默认为 32。

三、为 Slave 指定 Master

(1)命令行模式下重启 Master

root@xuliugen:~# service mysql restart

(2)命令行模式下重启 Slave

root@xuliugen:~# service mysql restart

(3)查看 Master 状态:

mysql  show master status\G;
*************************** 1. row ***************************
 File: mysql-bin.000004
 Position: 154
 Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.02 sec)
mysql

怎么在 MySQL 中配置半同步复制

注意:

File: mysql-bin.000004
Position: 154

很重要,后边需要使用!

(4)为 Slave 指定 Master:

1、首先关闭 Slave 的半同步复制

mysql  stop slave;
Query OK, 0 rows affected (0.01 sec)

2、为 Slave 指定 Master

mysql change master to master_host= 192.168.1.227 ,master_user= root ,master_password= 123456 ,master_log_file= mysql-bin.000004 , master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

其中:

master_host= 192.168.1.227 ,Master 主库 IP 地址
master_user= root ,Master 主库数据库账户
master_password= 123456 ,Master 主库数据库 root 用户密码
master_log_file= mysql-bin.000004 , Master 主库 binlog 文件
master_log_pos=154,Master 主库 binlog 文件 position

注意:

在 MySQL 5.6 版本以后,在进行主从复制的时候可以使用 GTID 的方式,无需再找 binglog 和 pos 点,只需要知道主服务器的 IP、端口、账户、密码就可以实现自动找点同步,开启 GTID 功能的时候就不用再使用 binlog 和 pos 了。详细信息,请查阅相关资料进行学习。

3、开启 Slave 的半同步复制

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

四、测试半同步复制是否成功

怎么在 MySQL 中配置半同步复制

五、如何优雅的关闭 Slave 同步信息

在某些时候,一台服务器不再用来作为 Slave,那么我们就需要清楚他的同步信息,一般会使用:

mysql  stop slave # 先关闭
mysql  reset slave # 清楚 Slave 同步信息 

但是,这样再通过 show master status\G 显示的时候:

mysql  show master status\G;

还是会出现同步的信息,这是因为执行了 reset slave 只是把 master.info 和 relay-log.info 文件删除了,但同步信息还在,如果有人在执行 start slave 命令开启了同步功能,结果就会又从头开始同步了,有可能还会造成数据的丢失。

如何让其清除的更干净哪?请使用下边的命令:

mysql  stop slave # 先关闭
mysql  reset slave all# 清楚 Slave 同步信息 

再次执行 show master status\G 就不会再有任何信息了。

六、部分异常场景模拟

(1)半同步复制与异步复制的切换:

上述已经介绍了为什么会出现半同步复制到异步复制的切换,那么现在模拟一个场景进行演示。

场景如下:

1、关闭 slave 同步,停止 IO 接收 binlog 日志

mysql  stop slave;

该操作就将 IO 线程关闭,等待 10 秒之后,如果 master 未收到来自 slave 的确认信息,就会切换到异步复制模式:

怎么在 MySQL 中配置半同步复制

上图看到 slave 已经关闭了半同步复制模式,再次开启:

mysql  start slave;

怎么在 MySQL 中配置半同步复制

此时,已经还原到半同步复制模式了。

(2)同步报错案例演示:

我们,首先从 slave 库上删除数据库表 ufind,然后到 master 再次删除该库 ufind,该同步就会报错:

怎么在 MySQL 中配置半同步复制

Last_Error: Error Can t drop database ufind database doesn t exist on query. Default database: ufind . Query: DROP DATABASE `ufind`

此时,查看半同步状态:

怎么在 MySQL 中配置半同步复制

是开启的,因此没有将半同步复制模式转化为异步复制模式,可以看出半同步复制模式跟 IO_Thread 是有直接关系的,但跟 SQL_THREAD 没有关系。

也就是说,slave 从库接收完二进制日志后给 master 主库一个确认,但是他不会管 relay-log 中继日志是否执行完毕。

看完上述内容,你们对怎么在 MySQL 中配置半同步复制有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注丸趣 TV 行业资讯频道,感谢大家的支持。

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计5321字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)