集群
单节点数据库
优点:适合数据量小的网站,如企业网站。
缺点:单个数据库无法满足日益增长的读写请求;
为什么要使用集群
高可用性:站点高可用,冗余站点;服务高可用,冗余服务;数据高可用,冗余数据。
负载均衡:切换某服务访问某节点,分摊单个节点的数据库压力
可伸缩性:新增数据库节点便利,方便扩容。
MySQL集群缺点
- 网络分裂:群集还可能由于网络故障而拆分为多个部分,每部分内的节点相互连接,但各部分之间的节点失去连接。
- 脑裂:导致数据库节点彼此独立运行的集群故障称为“脑裂”。这种情况可能导致数据不一致,并且无法修复,例如当两个数据库节点独立更新同一表上的同一行时
MySQL集群中各实例的数据同步,均基于mysql的复制机制。
主从复制
一、读写分离
二、复制:每个节点都有相同的数据集,向外扩展,基于二进制日志的单向复制。
三、二进制日志推荐使用ROW格式
原理
第一步:主库开启bin-log日志: ** 主库需要设置开启记录二进制日志,提交数据更新的事务之前将更新的事件记录都二进制日志中,后才进行事务提交。
第二步:备库建立IO线程连接: ** 备库创建IO线程与主库创建连接,主库上会启动一个binlog-dump线程,把binlog内容发送至从库,从库IO线程会将事件写入到中继日志(relay-log)中。如果从库数据与主库已经保持一致后,该线程进入休眠状态,一旦主库有新事件会以信号量唤醒binlog-dump线程。
第三步:SQL线程重放数据:**SQL线程执行最后一步,从中继日志中获取事件并在备库中执行,从而实现数据库的更新。
相关线程
主节点
dump Thread:为每个Slave的I/O Thread启动一个dump线程,用于向其发送二进制日志事件
从节点
I/O Thread:向Master请求二进制日志事件,并保存于中继日志中
SQL Thread:从中继日志中读取日志事件,在本地完成重放
相关文件
master.info:用于保存slave连接至master时的相关信息,例如账号、密码、服务器地址等
relay-log.info:保存在当前slave节点上已经复制的当前二进制日志和本地relay log日志的对应关
系
mysql-relay-bin.00000#: 中继日志,保存从主节点复制过来的二进制日志,本质就是二进制日志
MySQL8.0取消 master.info 和 relay-log.info文件
类型
一主一从
一主多从
级联复制,从服务器还能有从服务器
双主(慎用)
环状复制(慎用)
一从多主(禁用)
主从配置基本流程
主节点
1、启用二进制日志
[mysqld]
log_bin=/data/logbin/mysql-bin
2、为当前节点设置一个全局惟一的ID号
[mysqld]
server-id=
log-basename=master 可选项,设置datadir中日志名称,确保不依赖主机名
3、查看从二进制日志的文件和位置开始进行复制
SHOW MASTER STATUS;
4、创建有复制权限的用户账号
mysql> create user repluser@'10.0.0.%' identified by '123456';
mysql> grant replication slave on *.* to repluser@'10.0.0.%';
-------------------------------------------------------------------------------------------
从节点
1、启用中继日志
[mysqld]
server_id= 为当前节点设置一个全局惟的ID号
log-bin
read_only=ON 设置数据库只读,针对supper user无效
relay_log=relay-log relay log的文件路径,默认值hostname-relay-bin
relay_log_index=relay-log.index 默认值hostname-relay-bin.index
2、使用有复制权限的用户账号连接至主服务器,并启动复制线程
mysql> CHANGE MASTER TO MASTER_HOST='masterhost',
MASTER_USER='repluser',
MASTER_PASSWORD='replpass',
MASTER_LOG_FILE='mariadb-bin.xxxxxx',
MASTER_LOG_POS=#
MASTER_DELAY = interval; 此项可选,可指定延迟复制实现访问误操作,单位秒
mysql> START SLAVE [IO_THREAD|SQL_THREAD];
mysql> SHOW SLAVE STATUS;
查看 relaylog 事件
SHOW RELAYLOG EVENTS in 'relay-bin.00000x';
主从复制相关设置
限制从服务器为只读
read_only=on:此限制对拥有super权限的用户无效
在从节点清除信息
执行下列命令需要先 stop slave
一、RESET SLAVE
用于重置从服务器的状态信息,但保留复制用户账户信息。
- 清除二进制日志文件位置信息:从服务器将不再知道主服务器上的当前复制位置。
- 清除中继日志信息:删除从服务器上的所有中继日志文件,并重置中继日志位置信息。
- 清除错误信息:清除从服务器上可能存在的复制错误信息。
- 保留复制用户信息:复制所需的用户账户和权限信息保持不变。
场景:
当你需要重置复制状态,但保留现有的复制配置。
当你只需要清除当前的复制错误或重新同步从服务器的位置信息。
二、RESET SLAVE ALL
除了重置从服务器的状态信息外,还删除所有复制相关的配置信息和用户账户信息,并停止复制线程。
- 停止从服务器上的复制线程:确保在重置之前没有正在进行的复制活动。
- 清除所有复制相关的配置:删除与复制相关的所有配置信息,包括复制用户账户信息。
- 删除所有临时表:删除从服务器上与复制相关的所有临时表。
场景:
当你需要完全清除所有的复制相关配置,包括复制用户账户。
当你需要从头开始配置一个新的从服务器,而不保留任何现有的复制信息。
复制错误解决办法
通过 show slave status\G; 查看从库状态时可能会发现有错误,如
解决:
可以在从库配置忽略一些主服务器的复制事件。
1、设置全局系统变量,指定跳过复制事件的个数。
stop slave;
set global sql_slave_skip_counter = N;
start slave;
2、设置服务器选项,指定跳过事件的ID,如上图的 Error_code:1062
[mysqld]
slave_skip_errors=错误代码 或 all
systemctl restart mariadb
从库通过start slave单独指定
执行特定线程
START SLAVE IO_THREAD或SQL_THREAD
执行SQL_THREAD到指定点
START SLAVE [SQL_THREAD] UNTIL MASTER_LOG_FILE = 'log_name',MASTER_LOG_POS =log_pos
START SLAVE [SQL_THREAD] UNTIL RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS =
log_pos
保证主从复制的事务安全
在主节点配置
每次写入后立即同步二进制日志到磁盘,性能差
sync_binlog=1
如果是InnoDB引擎
innodb_flush_log_at_trx_commit=1 每次事务提交立即同步日志写磁盘
sync_master_info=n n次事件后master.info同步到磁盘
在从节点配置
skip-slave-start=ON 不自动启动slave
sync_relay_log=n n次写后同步relay log到磁盘
sync_relay_log_info=n n次事务后同步relay-log.info到磁盘
级联复制
关键:中间slave节点能将master的二进制日志在本机进行数据库更新,且同时更新本机二进制日志,从而实现级联复制
在中间slave配置
log_slave_updates:允许读取中继日志,并将发生的数据记录到本机二进制日志中
[mysqld]
server-id=18
log_bin
log_slave_updates 级联复制中间节点的必选项,MySQL8.0此为默认值,可以不要人为添加,其它 版本默认不开启
read-only
双主复制(慎用)
两个节点,都可以更新数据,并且互为主从,但实际上配置按双主方法配,用的时候按 一主一从用,否则会出现冲突错误,如可能出现主键冲突(相同主键),见 show slave status;
容易产生数据不一致的问题。
考虑要点:自动增长id
配置一个节点使用奇数id
auto_increment_offset=1 开始点
auto_increment_increment=2 增长幅度
另一个节点使用偶数id
auto_increment_offset=2
auto_increment_increment=2
配置步骤
1、各节点使用一个唯一的server_id
2、都启动二进制日志和中继日志
3、创建拥有复制权限的用户账号
4、定义自动增长id字段的数值范围,且各位奇数、偶数
5、均把对方指定为主节点,并启动复制线程
半同步复制(标配)
全同步复制 Full Synchronous Replication
主服务器在事务提交后,会等待所有从服务器都接收并记录了该事务的二进制日志事件。
只有所有从服务器都确认接收并记录了数据,主服务器才会返回结果给客户端。
优点
数据一致性高
缺点
性能开销大
异步复制 Asynchronous Replication——MySQL默认方式
主服务器在事务提交后,会立即返回结果给客户端。
主服务器将二进制日志事件异步地发送给从服务器,不会等待从服务器的确认。
从服务器根据主服务器的二进制日志事件,异步地更新自己的数据。
优点
性能较高
缺点
主库突然崩溃时,主库上已经提交的事务可能还未传到从库上,数据丢失,导致数据不一致。
半同步复制 semi-synchronous Replication
主服务器在事务提交后,会等待至少一个从服务器接收并记录了该事务的二进制日志事件。
一旦至少一个从服务器确认接收并记录了数据,主服务器会返回结果给客户端。
优点
提供了比异步复制更好的数据一致性保证,同时减少了同步复制的性能开销
缺点
仍然存在一定的数据丢失风险,因为不是所有的从服务器都需要确认接收数据
补充
当半同步复制发生超时(默认rpl_semi_sync_master_timeout=10s),即在指定时间内没有收到一台从库的确认,会暂时关闭半同步复制,自动切换至异步复制。
当主库的dump线程发送完一个事务的所有事件之后,如果在指定时间内,收到了从库的响应, 则主从又重新恢复为半同步复制。
查看插件文件
[root@wenzi ~]$rpm -ql mysql-server | grep semisync
/usr/lib64/mysql/plugin/semisync_master.so
/usr/lib64/mysql/plugin/semisync_slave.so
相关配置
rpl_semi_sync_master_enabled=on
设置此行,要先装semisync_master.so插件,否则mysqld启动失败
rpl_semi_sync_master_timeout=3000
设定3s内无法同步,也将返回成功信息给请求端
相关变量
mysql> show global variables like '%semi%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 3000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+-------------------------------------------+------------+
mysql> show global status like '%semi%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 0 |
| Rpl_semi_sync_master_net_avg_wait_time | 0 |
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 0 |
| Rpl_semi_sync_master_no_times | 0 |
| Rpl_semi_sync_master_no_tx | 0 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 0 |
| Rpl_semi_sync_master_tx_wait_time | 0 |
| Rpl_semi_sync_master_tx_waits | 0 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 0 |
+--------------------------------------------+-------+
复制过滤器
让从节点仅复制指定的数据库、或指定数据库的表。
实现
从服务器的SQL_Thread在重放relay log中的事件时,仅读取与特定数据库(特定表)相关的事件并应用于本地。
优点
不影响二进制备份还原
缺点
会造成网络及磁盘IO浪费;在所有从节点都要配置
从服务器上复制过滤器相关变量
replicate_do_db=db_name 指定复制库的白名单,多个库只能分开多行写
replicate_ignore_db= 指定复制库黑名单
replicate_do_table= 指定复制表的白名单
replicate_ignore_table= 指定复制表的黑名单
replicate_wild_do_table= foo%.bar% 支持通配符
GTID复制
GTID(Global Transaction ID 全局事务标识符)
MySQL5.6开始支持,不成熟;推荐使用MySQL5.7以上版本的GTID功能。
使用GTID无需找到binlog文件名和POS点,只需知道主库的IP、端口、账号、密码即可;开启GITD后,执行change master to master_auto_position=1 即可,它会自动寻找相应的位置开始同步。
实现
主库
vim /etc/my.cnf
server-id=1
log-bin=mysql-bin
gtid_mode=ON 开启GTID
enforce_gtid_consistency 保证GTID安全
从库
vim /etc/my.cnf
server-id=2
gtid_mode=ON
enforce_gtid_consistency
优点
保证事务全局统一
截取日志更方便,跨多文件,判断起点终点更方便
判断主从工作状态更方便
传输日志,可并发传输。SQL回放更高并发
主从复制更方便
复制的监控和维护
清理日志
RESET SLAVE [ALL];
复制监控
SHOW MASTER STATUS 显示主服务器复制的状态
SHOW BINARY LOGS 列出所有可用的二进制日志文件
SHOW BINLOG EVENTS 显示二进制日志中的事件
SHOW SLAVE STATUS 显示从服务器复制的状态
SHOW PROCESSLIST 显示当前MySQL服务器上运行的所有进程或线程
从库是否落后于主库
通过 show slave status\G;观察 Seconds_Behind_Master 参数,表示从服务器相对于主服务器的延迟时间,以秒s为单位,越小越好,0最好
复制的问题及解决方案
数据损坏、丢失
Master:MHA + semisync replication
Slave: 重新复制
不唯一的server id
重新复制
复制延迟
升级到MySQL5.7以上版本(5.7之前的版本,没有开GTID之前,主库可以并发事务,但是dump传
输时是串行)利用GTID(MySQL5.6需要手动开启,MySQL5.7以上默认开启)支持并发传输binlog及并
行多个SQL线程。
减少大事务,将大事务拆分成小事务。大事务执行时间长,小事务执行时间短。
减少锁。
调整sync_binlog
参数:这个参数控制何时将事务日志刷新到磁盘。适当增加此值可以减少磁盘I/O操作,但可能会牺牲数据的持久性。
调整innodb_flush_log_at_trx_commit
参数:此参数决定每次事务提交时是否需要将日志刷新到磁盘。设置为2可以提高性能,但牺牲了一些数据安全性。
监控和预警,使用监控工具来跟踪复制延迟,并设置预警阈值;当延迟超过特定时间时,可以及时收到通知并采取措施
开启半同步复制。
一从多主:Mariadb10 版后支持。
多线程复制:对多个数据库复制。
主从数据不一致
判断主从数据是否一致
checksum表
- MySQL 自带的
checksum
表功能可以用来校验表的一致性。在主服务器上,你可以使用Checksum
表来生成校验和,然后在从服务器上对比这些校验和。 - 使用命令
CHECKSUM TABLE table_name;
来生成校验和。
mysqldiff
mysqldiff
是 MySQL Utilities 套件的一部分,它可以比较两个 MySQL 服务器或数据库的模式和数据。- 它可以生成差异报告,包括数据不一致的地方。
Percona Toolkit
- 使用命令
pt-table-checksum --databases db_name
来生成校验和,然后使用pt-table-checksum --checksum
来校验。
原因
主库binlog格式为Statement,同步到从库执行后可能造成主从不一致。
主库执行更改前有执行set sql_log_bin=0,会使主库不记录binlog,从库也无法变更这部分数据。
从节点未设置只读,误操作写入数据。
主库或从库意外宕机,宕机可能会造成binlog或者relaylog文件出现损坏,导致主从不一致。
主从实例版本不一致,特别是高版本是主,低版本为从的情况下,主数据库上面支持的功能,从数
据库上面可能不支持该功能。
主从sql_mode 不一致。
MySQL自身bug导致。
修复
将从库重建
恢复时间慢,有时从库可能担负部分查询操作,不能贸然重建
使用perconna-tookit工具辅助
此工具包含pt-table-checksum和pt-table-sync两个工具,主要用于检测主从是否一致以及修
复数据不一致情况。这种方案优点是修复速度快,不需要停止主从辅助,缺点是需要知识积累,多测试。慎用。
手动重建不一致的表
在从库发现某几张表与主库数据不一致,而这几张表数据量也比较大,手工比对数据不现实,并且
重做整个库也比较慢,此时可以只重做这几张表来修复主从不一致。
缺点是在执行导入期间需要暂时停止从库复制,可接受。
1、从库停止复制
mysql>stop slave;
2、在主库上备份这三张表,并记录下同步的binlog和POS点
mysqldump -uroot -pmagedu -q --single-transaction --master-data=2 testdb A B C
/backup/A_B_C.sql
3、查看A_B_C.sql文件,找出记录的binlog和POS点
例如:MASTERLOGFILE='mysql-bin.888888', MASTERLOGPOS=666666;
#以下指令是为了保障其他表的数据不丢失,一直同步直到那个点结束,A,B,C表的数据在之前的备份已
经生成了一份快照,只需要导入进入,然后开启同步即可
4、把A_B_C.sql拷贝到Slave机器上,并做指向新位置
mysql>start slave until MASTERLOGFILE='mysql-bin.888888',
MASTERLOGPOS=666666;
5、在Slave机器上导入A_B_C.sql
mysql -uroot -pmagedu testdb
mysql>set sql_log_bin=0;
mysql>source /backup/A_B_C.sql
mysql>set sql_log_bin=1;
6、导入完毕后,从库开启同步即可。
mysql>start slave;
避免主从不一致
主库binlog采用ROW格式。
主从实例数据库版本保持一致。
主库做好账号权限把控,不可以执行set sql_log_bin=0。
从库开启只读,不允许人为写入。
定期进行主从一致性检验
实验
一主一从
主库、从库都是新搭建的
CentOS8 | 192.168.28.30 | 主数据库 |
Rocky8 | 192.168.28.40 | 从数据库 |
CentOS8主库 yum安装mariadb10.3.28
修改配置文件
[root@wenzi ~]$vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=1
log-bin=/data/mysqllog/binlog
创建二进制日志存储目录,并授权,重启mariadb
[root@wenzi ~]$mkdir -p /data/mysqllog
[root@wenzi ~]$chown -R mysql:mysql /data/mysqllog/
[root@wenzi ~]$systemctl restart mariadb
查看当前二进制日志POS位置
[root@wenzi ~]$mysql -uroot -pAdmin.
MariaDB [(none)]> show master logs;
+---------------+-----------+
| Log_name | File_size |
+---------------+-----------+
| binlog.000001 | 348 |
| binlog.000002 | 325 |
+---------------+-----------+
2 rows in set (0.000 sec)
MariaDB [(none)]> show master status;
+---------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| binlog.000002 | 325 | | |
+---------------+----------+--------------+------------------+
1 row in set (0.000 sec)
创建复制用户并授权
MariaDB [(none)]> create user rep@'192.168.28.%' identified by 'Admin.';
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> grant replication slave on *.* to rep@'192.168.28.%';
Query OK, 0 rows affected (0.000 sec)
-------------------------------------------------------------------------------------------
从节点 yum安装mariadb10.3.28
修改配置文件,重启服务
[root@wenzi ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=11
read-only=on
[root@wenzi ~]#systemctl restart mariadb
登录mysql,进行同步配置
[root@wenzi ~]#mysql
MariaDB [(none)]> change master to master_host='192.168.28.30',master_user='rep',master_password='Admin.',master_port=3306,master_log_file='binlog.000002',master_log_pos=325;
Query OK, 0 rows affected (0.002 sec)
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.28.30
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000002
Read_Master_Log_Pos: 656
Relay_Log_File: mariadb-relay-bin.000002
Relay_Log_Pos: 883
Relay_Master_Log_File: binlog.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 656
Relay_Log_Space: 1194
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
Replicate_Do_Domain_Ids:
Replicate_Ignore_Domain_Ids:
Parallel_Mode: conservative
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Slave_DDL_Groups: 2
Slave_Non_Transactional_Groups: 0
Slave_Transactional_Groups: 0
1 row in set (0.000 sec)
ERROR: No query specified
MariaDB [(none)]> show processlist;
+----+-------------+-----------+------+-----------+------+-----------------------------------------------------------------------------+------------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+----+-------------+-----------+------+-----------+------+-----------------------------------------------------------------------------+------------------+----------+
| 1 | system user | | NULL | Daemon | NULL | InnoDB purge worker | NULL | 0.000 |
| 2 | system user | | NULL | Daemon | NULL | InnoDB purge worker | NULL | 0.000 |
| 3 | system user | | NULL | Daemon | NULL | InnoDB purge worker | NULL | 0.000 |
| 4 | system user | | NULL | Daemon | NULL | InnoDB purge coordinator | NULL | 0.000 |
| 5 | system user | | NULL | Daemon | NULL | InnoDB shutdown handler | NULL | 0.000 |
| 8 | root | localhost | NULL | Query | 0 | Init | show processlist | 0.000 |
| 9 | system user | | NULL | Slave_IO | 86 | Waiting for master to send event | NULL | 0.000 |
| 10 | system user | | NULL | Slave_SQL | 86 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL | 0.000 |
+----+-------------+-----------+------+-----------+------+-----------------------------------------------------------------------------+------------------+----------+
8 rows in set (0.000 sec)
此时在主库修改数据,查看从库能否同步
主库
[root@wenzi ~]$mysql -uroot -pAdmin.
MariaDB [(none)]> create database cs;
从库
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| cs |
| information_schema |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.002 sec)
主库已有数据,非新建,此时新增从节点
继上面实验基础
CentOS8 | 192.168.28.30 | 主数据库 |
Rocky8 | 192.168.28.40 | 从数据库 |
Rocky8 | 192.168.28.41 | 从数据库 |
主库新增数据
[root@wenzi ~]$mysql -uroot -pAdmin.
MariaDB [(none)]> use cs;
Database changed
MariaDB [cs]> create table student(id int not null auto_increment primary key,name varchar(10) not null);
MariaDB [cs]> insert into student(name) values('liubei');
MariaDB [cs]> insert into student(name) values('guanyu');
MariaDB [cs]> insert into student(name) values('zhangfei');
MariaDB [cs]> insert into student(name) values('zhaoyun');
MariaDB [cs]> insert into student(name) values('huangzhong');
MariaDB [(none)]> select * from cs.student;
+----+------------+
| id | name |
+----+------------+
| 1 | liubei |
| 2 | guanyu |
| 3 | zhangfei |
| 4 | zhaoyun |
| 5 | huangzhong |
+----+------------+
新增从库192.168.28.41
主库
完全备份主库数据,将数据传输至新从库
[root@wenzi ~]$mysqldump -uroot -pAdmin. -A -E -R -F --triggers --single-transaction --master-data=1 --flush-privileges --default-character-set=utf8 --hex-blob > full.sql
[root@wenzi ~]$rsync -a full.sql root@192.168.28.41:/root/
-------------------------------------------------------------------------------------------
从库
修改配置文件
从节点 yum安装mariadb10.3.28
修改配置文件,重启服务
[root@wenzi ~]#vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=11
read-only=on
[root@wenzi ~]#systemctl restart mariadb
修改full.sql中 change master 部分,添加主库信息
[root@wenzi ~]#vim full.sql
...
CHANGE MASTER TO
master_host='192.168.28.30',
master_user='rep',
master_password='Admin.',
master_port=3306,
MASTER_LOG_FILE='binlog.000003', MASTER_LOG_POS=379;
...
恢复数据,导入后要使用主库的用户密码
[root@wenzi ~]#mysql < full.sql
[root@wenzi ~]#mysql -uroot -pAdmin.
MariaDB [(none)]> select * from cs.student;
+----+------------+
| id | name |
+----+------------+
| 1 | liubei |
| 2 | guanyu |
| 3 | zhangfei |
| 4 | zhaoyun |
| 5 | huangzhong |
+----+------------+
5 rows in set (0.001 sec)
MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.28.30
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000003
Read_Master_Log_Pos: 379
Relay_Log_File: mariadb-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: binlog.000003
Slave_IO_Running: No
Slave_SQL_Running: No
...
启动同步
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.28.30
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000003
Read_Master_Log_Pos: 379
Relay_Log_File: mariadb-relay-bin.000002
Relay_Log_Pos: 552
Relay_Master_Log_File: binlog.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 379
Relay_Log_Space: 863
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
Replicate_Do_Domain_Ids:
Replicate_Ignore_Domain_Ids:
Parallel_Mode: conservative
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Slave_DDL_Groups: 0
Slave_Non_Transactional_Groups: 0
Slave_Transactional_Groups: 0
1 row in set (0.000 sec)
测试同步
主库
MariaDB [cs]> insert into student(name) values ('caocao');
可以看到有两个dump线程
MariaDB [(none)]> show processlist;
+----+-------------+---------------------+------+-------------+------+-----------------------------------------------------------------------+------------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+----+-------------+---------------------+------+-------------+------+-----------------------------------------------------------------------+------------------+----------+
| 1 | system user | | NULL | Daemon | NULL | InnoDB purge worker | NULL | 0.000 |
| 2 | system user | | NULL | Daemon | NULL | InnoDB purge coordinator | NULL | 0.000 |
| 3 | system user | | NULL | Daemon | NULL | InnoDB purge worker | NULL | 0.000 |
| 4 | system user | | NULL | Daemon | NULL | InnoDB purge worker | NULL | 0.000 |
| 5 | system user | | NULL | Daemon | NULL | InnoDB shutdown handler | NULL | 0.000 |
| 10 | rep | 192.168.28.40:59908 | NULL | Binlog Dump | 5635 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL | 0.000 |
| 16 | rep | 192.168.28.41:49292 | NULL | Binlog Dump | 2717 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL | 0.000 |
| 18 | root | localhost | NULL | Query | 0 | Init | show processlist | 0.000 |
+----+-------------+---------------------+------+-------------+------+-----------------------------------------------------------------------+------------------+----------+
第一个从库
MariaDB [(none)]> select * from cs.student;
+----+------------+
| id | name |
+----+------------+
| 1 | liubei |
| 2 | guanyu |
| 3 | zhangfei |
| 4 | zhaoyun |
| 5 | huangzhong |
| 6 | caocao |
+----+------------+
新从库
MariaDB [(none)]> select * from cs.student;
+----+------------+
| id | name |
+----+------------+
| 1 | liubei |
| 2 | guanyu |
| 3 | zhangfei |
| 4 | zhaoyun |
| 5 | huangzhong |
| 6 | caocao |
+----+------------+
级联复制
CentOS8 | 192.168.28.30 | 主数据库 |
CentOS8 | 192.168.28.31 | 级联slave |
CentOS8 | 192.168.28.32 | 从数据库 |
主库
CentOS8主库 yum安装mariadb10.3.28
修改配置文件,新增以下内容
[root@wenzi ~]$vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=1
log-bin=/data/mysqlog/binlog
创建二进制日志存储目录,并授权,重启mariadb
[root@wenzi ~]$mkdir -p /data/mysqlog
[root@wenzi ~]$chown -R mysql:mysql /data/mysqlog/
[root@wenzi ~]$systemctl restart mariadb
创建复制用户并授权
MariaDB [(none)]> create user rep@'192.168.28.%' identified by 'Admin.';
MariaDB [(none)]> grant replication slave on *.* to rep@'192.168.28.%';
查看当前二进制日志POS位置
[root@wenzi ~]$mysql -uroot -pAdmin. -e 'show master status;';
+---------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| binlog.000003 | 379 | | |
+---------------+----------+--------------+------------------+
进行完全备份
[root@wenzi ~]$mysqldump -uroot -pAdmin. -A -E -R -F --triggers --single-transaction --master-data=1 --flush-privileges --default-character-set=utf8 --hex-blob > full.sql
将备份传输至级联slave
[root@wenzi ~]$rsync full.sql root@192.168.28.31:/root/
中间级联slave
yum安装mariadb10.3.28
修改配置文件,新增以下内容
[root@wenzi ~]$vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=11
log-bin=/data/mysqlog/logbin
read-only
log_slave_updates
创建二进制目录,启动服务
[root@wenzi ~]$mkdir -p /data/mysqlog/
[root@wenzi ~]$chown -R mysql:mysql /data
[root@wenzi ~]$systemctl enable --now mariadb
修改收到的完全备份文见中的change master to,替代命令行中执行的步骤
[root@wenzi ~]$vim full.sql
CHANGE MASTER TO
master_host='192.168.28.30',
master_user='rep',
master_password='Admin.',
master_port=3306,
MASTER_LOG_FILE='binlog.000003', MASTER_LOG_POS=379;
...
将full.sql导入数据库,恢复完全备份,记录此时二进制日志POS
[root@wenzi ~]$mysql
MariaDB [(none)]> set sql_log_bin=0;
MariaDB [(none)]> source full.sql;
MariaDB [(none)]> set sql_log_bin=1;
MariaDB [mysql]> select * from cs.student;
+----+------------+
| id | name |
+----+------------+
| 1 | liubei |
| 2 | guanyu |
| 3 | zhangfei |
| 4 | zhaoyun |
| 5 | huangzhong |
+----+------------+
MariaDB [mysql]> show master status;
+---------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| logbin.000002 | 339 | | |
+---------------+----------+--------------+------------------+
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.28.30
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000003
Read_Master_Log_Pos: 379
Relay_Log_File: mariadb-relay-bin.000002
Relay_Log_Pos: 552
Relay_Master_Log_File: binlog.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 379
Relay_Log_Space: 863
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
Replicate_Do_Domain_Ids:
Replicate_Ignore_Domain_Ids:
Parallel_Mode: conservative
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Slave_DDL_Groups: 0
Slave_Non_Transactional_Groups: 0
Slave_Transactional_Groups: 0
1 row in set (0.000 sec)
对级联slave进行完全备份
[root@wenzi ~]$mysqldump -uroot -pAdmin. -A -F -E -R --triggers --single-transaction --flush-privileges --default-character-set=utf8 --master-data=1 --hex-blob > fullbak2.sql
将备份传输至slave 192.168.28.32
[root@wenzi ~]$rsync -a fullbak2.sql root@192.168.28.32:/root/
从库
yum安装mariadb10.3.28
修改配置文件,新增以下内容
[root@wenzi ~]$vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=21
read-only
启动服务
[root@wenzi ~]$systemctl enable --now mariadb
修改fullbak2.sql,其中host指定级联slave地址
[root@wenzi ~]$vim fullbak2.sql
...
CHANGE MASTER TO
master_host='192.168.28.31',
master_user='rep',
master_password='Admin.',
master_port=3306,
MASTER_LOG_FILE='logbin.000004', MASTER_LOG_POS=379;
...
导入数据库
[root@wenzi ~]$mysql
MariaDB [(none)]> set sql_log_bin=0;
MariaDB [(none)]> source fullbak2.sql
MariaDB [(none)]> set sql_log_bin=1;
MariaDB [mysql]> start slave;
MariaDB [mysql]> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.28.31
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: logbin.000004
Read_Master_Log_Pos: 379
Relay_Log_File: mariadb-relay-bin.000002
Relay_Log_Pos: 552
Relay_Master_Log_File: logbin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 379
Relay_Log_Space: 863
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 11
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
Replicate_Do_Domain_Ids:
Replicate_Ignore_Domain_Ids:
Parallel_Mode: conservative
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Slave_DDL_Groups: 0
Slave_Non_Transactional_Groups: 0
Slave_Transactional_Groups: 0
验证
主库增加数据
MariaDB [cs]> insert into student(name) values ('qqq');
级联slave查看
MariaDB [(none)]> select * from cs.student;
+----+------------+
| id | name |
+----+------------+
| 1 | liubei |
| 2 | guanyu |
| 3 | zhangfei |
| 4 | zhaoyun |
| 5 | huangzhong |
| 6 | qqq |
从slave查看
MariaDB [(none)]> select * from cs.student;
+----+------------+
| id | name |
+----+------------+
| 1 | liubei |
| 2 | guanyu |
| 3 | zhangfei |
| 4 | zhaoyun |
| 5 | huangzhong |
| 6 | qqq
主主复制
一、准备
192.168.28.30
yum安装mariadb-server 10.3.28
修改配置文件,添加以下内容
[root@wenzi ~]$vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=1
log-bin
auto-increment-offset=1
auto-increment-increment=2
启动服务
[root@wenzi ~]$systemctl enable --now mariadb
创建复制用户,并授权
MariaDB [(none)]> create user rep@'192.168.28.%' identified by 'Admin.';
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> grant replication slave on *.* to rep@'192.168.28.%';
Query OK, 0 rows affected (0.000 sec)
查看此时二进制日志pos
MariaDB [(none)]> show master status;
+--------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000002 | 685 | | |
+--------------------+----------+--------------+------------------+
192.168.28.31
yum安装mariadb-server 10.3.28
修改配置文件,添加以下内容
[root@wenzi ~]$vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
server-id=2
log-bin
auto-increment-offset=2
auto-increment-increment=2
启动服务
[root@wenzi ~]$systemctl enable --now mariadb
创建复制用户,并授权
MariaDB [(none)]> create user rep@'192.168.28.%' identified by 'Admin.';
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> grant replication slave on *.* to rep@'192.168.28.%';
Query OK, 0 rows affected (0.000 sec)
查看此时二进制日志pos
MariaDB [(none)]> show master status;
+--------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| mariadb-bin.000002 | 685 | | |
+--------------------+----------+--------------+------------------+
二、互相指定对方为主
192.168.28.30
MariaDB [(none)]> change master to master_host='192.168.28.31',master_user='rep',master_password='Admin.',master_port=3306,master_log_file='mariadb-bin.000002',master_log_pos=685;
Query OK, 0 rows affected (0.003 sec)
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.28.31
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mariadb-bin.000003
Read_Master_Log_Pos: 344
Relay_Log_File: mariadb-relay-bin.000003
Relay_Log_Pos: 645
Relay_Master_Log_File: mariadb-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 344
Relay_Log_Space: 1005
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 2
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
Replicate_Do_Domain_Ids:
Replicate_Ignore_Domain_Ids:
Parallel_Mode: conservative
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Slave_DDL_Groups: 0
Slave_Non_Transactional_Groups: 0
Slave_Transactional_Groups: 0
1 row in set (0.000 sec)
192.168.28.31
MariaDB [(none)]> change master to master_host='192.168.28.30',master_user='rep',master_password='Admin.',master_port=3306,master_log_file='mariadb-bin.000002',master_log_pos=685;
Query OK, 0 rows affected (0.002 sec)
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.28.30
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mariadb-bin.000002
Read_Master_Log_Pos: 685
Relay_Log_File: mariadb-relay-bin.000002
Relay_Log_Pos: 557
Relay_Master_Log_File: mariadb-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 685
Relay_Log_Space: 868
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:
Replicate_Do_Domain_Ids:
Replicate_Ignore_Domain_Ids:
Parallel_Mode: conservative
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Slave_DDL_Groups: 0
Slave_Non_Transactional_Groups: 0
Slave_Transactional_Groups: 0
1 row in set (0.000 sec)
经测试新增数据库数据,已实现互相同步
半同步复制
master 和 两个 slave 都是 CentOS8 + mysql8.0.26 + yum安装
master
修改配置文件,新增以下内容
[root@wenzi ~]$vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=1
log-bin
启动服务,安装插件
[root@wenzi ~]$systemctl enable --now mysqld
[root@wenzi ~]$mysql
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
#临时开启半同步
mysql> set global rpl_semi_sync_master_enabled=1;
mysql> show plugins;
+---------------------------------+----------+--------------------+--------------------+---------+
| Name | Status | Type | Library | License |
+---------------------------------+----------+--------------------+--------------------+---------+
...
| rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL |
+---------------------------------+----------+--------------------+--------------------+---------+
mysql> create user rep@'192.168.28.%' identified by 'Admin.';
mysql> grant replication slave on *.* to rep@'192.168.28.%';
再次修改配置文件,新增以下内容,再重启服务
[root@wenzi ~]$vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=1
log-bin
rpl_semi_sync_master_enabled=on 设置此行,永久开启半同步,要先装semisync_master.so插件,否则mysqld启动失败
rpl_semi_sync_master_timeout=3000 设定3s内无法同步,也将返回成功信息给请求端
[root@wenzi ~]$systemctl restart mysqld
mysql> show global variables like '%semi%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_master_timeout | 3000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
+-------------------------------------------+------------+
mysql> show global status like '%semi%';
+--------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients | 0 |
| Rpl_semi_sync_master_net_avg_wait_time | 0 |
| Rpl_semi_sync_master_net_wait_time | 0 |
| Rpl_semi_sync_master_net_waits | 0 |
| Rpl_semi_sync_master_no_times | 0 |
| Rpl_semi_sync_master_no_tx | 0 |
| Rpl_semi_sync_master_status | ON |
| Rpl_semi_sync_master_timefunc_failures | 0 |
| Rpl_semi_sync_master_tx_avg_wait_time | 0 |
| Rpl_semi_sync_master_tx_wait_time | 0 |
| Rpl_semi_sync_master_tx_waits | 0 |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0 |
| Rpl_semi_sync_master_wait_sessions | 0 |
| Rpl_semi_sync_master_yes_tx | 0 |
+--------------------------------------------+-------+
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| wenzi-bin.000003 | 156 | | | |
+------------------+----------+--------------+------------------+-------------------+
slave
修改配置文件,新增以下内容
[root@wenzi ~]$vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=11
read-only
启动服务,安装插件
[root@wenzi ~]$systemctl enable --now mysqld
[root@wenzi ~]$mysql
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
#临时开启半同步
mysql> set global rpl_semi_sync_slave_enabled=1;
mysql> show plugins;
+---------------------------------+----------+--------------------+-------------------+---------+
| Name | Status | Type | Library | License |
+---------------------------------+----------+--------------------+-------------------+---------+
...
| rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL |
+---------------------------------+----------+--------------------+-------------------+---------+
再次修改配置文件,新增以下内容,重启服务
[root@wenzi ~]$vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=11
read-only
rpl_semi_sync_slave_enabled=on 设置此行,要先装semisync_slave.so插件,否则mysqld启动失败
[root@wenzi ~]$systemctl restart mysqld
[root@wenzi ~]$mysql
mysql> show global variables like '%semi%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled | ON |
| rpl_semi_sync_slave_trace_level | 32 |
+---------------------------------+-------+
mysql> change master to master_host='192.168.28.30',master_user='rep',master_password='Admin.',master_port=3306,master_log_file='wenzi-bin.000003',master_log_pos=156;
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 192.168.28.30
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: wenzi-bin.000003
Read_Master_Log_Pos: 156
Relay_Log_File: wenzi-relay-bin.000003
Relay_Log_Pos: 324
Relay_Master_Log_File: wenzi-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
测试
在master上创建数据库cs,瞬间完成。
mysql> create database cs;
Query OK, 1 row affected (0.00 sec)
在slave上查看,数据已同步。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| cs |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
当关闭slave库的线程后,再在master上修改数据,发现出现了3s的延迟,符合设定rpl_semi_sync_master_timeout=3000 。
slave
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)
master
mysql> create database ab;
Query OK, 1 row affected (3.01 sec)
查看日志发现同步超时记录
2024-01-24T17:24:08.554849Z 8 [Warning] [MY-011153] [Repl] Timeout waiting for
reply of binlog (file: wenzi-bin.000003, pos: 514), semi-sync up to file
wenzi-bin.000003, position 335
GTID复制
master、slave 都是 CentOS8 + mysql8.0.26 + yum安装
master
[root@wenzi ~]$vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=1
log-bin
gtid_mode=on
enforce_gtid_consistency
...
[root@wenzi ~]$systemctl enable --now mysqld
[root@wenzi ~]$mysql
mysql> create user rep@'192.168.28.%' identified by 'Admin.';
mysql> grant replication slave on *.* to rep@'192.168.28.%';
slave
[root@wenzi ~]$vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=11
read-only
gtid_mode=on
enforce_gtid_consistency
...
[root@wenzi ~]$systemctl enable --now mysqld
[root@wenzi ~]$mysql
mysql> change master to master_host='192.168.28.30',master_user='rep',master_password='Admin.',master_port=3306,master_auto_position=1;
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 192.168.28.30
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: wenzi-bin.000003
Read_Master_Log_Pos: 335
Relay_Log_File: wenzi-relay-bin.000002
Relay_Log_Pos: 550
Relay_Master_Log_File: wenzi-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 335
Relay_Log_Space: 759
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 8eaaa80b-bae1-11ee-ace5-000c299f929b
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set: 8eaaa80b-bae1-11ee-ace5-000c299f929b:1
Executed_Gtid_Set: 8eaaa80b-bae1-11ee-ace5-000c299f929b:1
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
Network_Namespace:
此时,slave的how slave status\G;结果中的两项值应该是master中show master status的值相同