MySQL集群主从复制

文章目录

  • [1 MySQL源码编译部署](#1 MySQL源码编译部署)
  • [2 主从复制](#2 主从复制)
    • [2.1 环境](#2.1 环境)
    • [2.2 一主一从](#2.2 一主一从)
    • [2.3 一主多从](#2.3 一主多从)
    • [2.5 主从架构的使用技巧及优化](#2.5 主从架构的使用技巧及优化)
      • [2.5.1 延迟复制](#2.5.1 延迟复制)
      • [2.5.2 慢查询日志](#2.5.2 慢查询日志)
      • [2.5.3 gtid模式](#2.5.3 gtid模式)
      • [2.5.6 并行复制](#2.5.6 并行复制)
      • [2.5.7 半同步模式](#2.5.7 半同步模式)

1 MySQL源码编译部署

bash 复制代码
# 源码包,带cpp插件,这网址变来变去的,建议直接去官网下然后上传,不要wget
[root@mysql-node1 ~]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-8.3.0.tar.gz
[root@mysql-node1 ~]# ll
total 438200
-rw-------. 1 root root      1024 Oct 25 13:18 anaconda-ks.cfg
-rw-r--r--  1 root root    115485 Feb  6 15:50 libtirpc-devel-1.3.3-9.el9.x86_64.rpm
-rw-r--r--  1 root root 448592294 Feb  6 15:49 mysql-boost-8.3.0.tar.gz
# 依赖
[root@mysql-node1 ~]# dnf install cmake3 gcc git bison openssl-devel ncurses-devel systemd-devel rpcgen.x86_64 libtirpc-devel-1.3.3-9.el9.x86_64.rpm  gcc-toolset-12-gcc gcc-toolset-12-gcc-c++ gcc-toolset-12-binutils gcc-toolset-12-annobin-annocheck gcc-toolset-12-annobin-plugin-gcc -y

# 源码编译
[root@mysql-node1 ~]# tar zxf mysql-boost-8.3.0.tar.gz
[root@mysql-node1 ~]# cd mysql-8.3.0/
[root@mysql-node1 mysql-8.3.0]# mkdir  build
[root@mysql-node1 mysql-8.3.0]# cd build/
[root@mysql-node1 build]# cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_BOOST=bundled  -DWITH_SSL=system -DWITH_DEBUG=OFF -DWITH_SYSTEMD=1
[root@mysql-node1 build]# echo $(nproc)
12
# make和make install了22分钟,卧槽了。
[root@mysql-node1 build]# make -j$(nproc) && make install

# 部署
[root@mysql-node1 build]# echo export PATH=\$PATH:/usr/local/mysql/bin > ~/.bash_profile
[root@mysql-node1 build]# tail -n1 ~/.bash_profile
export PATH=$PATH:/usr/local/mysql/bin
[root@mysql-node1 build]# source ~/.bash_profile
[root@mysql-node1 build]# useradd -r -s /sbin/nologin -M mysql
[root@mysql-node1 build]# mkdir -p /data/mysql
[root@mysql-node1 build]# chown mysql.mysql /data/mysql/
[root@mysql-node1 build]# vim /etc/my.cnf
  1 [mysqld]
  2 datadir=/data/mysql
  3 socket=/data/mysql/mysql.sock
# 数据库初始化建立mysql基本数据
[root@mysql-node1 build]# mysqld --initialize --user=mysql
2026-03-03T12:06:20.201267Z 0 [System] [MY-015017] [Server] MySQL Server Initialization - start.
2026-03-03T12:06:20.204347Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.3.0) initializing of server in progress as process 1664
2026-03-03T12:06:20.229925Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2026-03-03T12:06:20.774051Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2026-03-03T12:06:21.500937Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: ?C7tOJ(u0PbK		# 初始密码
2026-03-03T12:06:23.113888Z 0 [System] [MY-015018] [Server] MySQL Server Initialization - end.
# 生成systemd启动文件(rhel9)
[root@mysql-node1 build]# cp -p /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system
# 起服务自动生成/data/mysql/mysql.sock文件,mysql_secure_installation需要/data/mysql/mysql.sock文件
[root@mysql-node1 build]# systemctl daemon-reload
[root@mysql-node1 build]# systemctl enable --now mysqld.service
# 数据库安全初始化
[root@mysql-node1 build]# mysql_secure_installation
Enter password for user root:	# 初始密码
New password:
Re-enter new password:
Press y|Y for Yes, any other key for No: no		# 是否启用密码插件
Change the password for root ? ((Press y|Y for Yes, any other key for No) : no	# 是否要重置密码
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
All done!

# 测试
[root@mysql-node1 build]# mysql -uroot -p123
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

2 主从复制

由于mysql源码编译太久了可以直接把编译好的mysql文件scp到其它节点(或者更快的:虚拟机克隆,就改个IP和添加个主机解析)

2.1 环境

bash 复制代码
# master:node1,slave:node2(克隆)、node3(scp)
# master的配置
[root@mysql-node1 ~]# vim /etc/hosts
[root@mysql-node1 ~]# tail -n3 /etc/hosts
172.25.254.10   mysql-node1
172.25.254.20   mysql-node2
172.25.254.30   mysql-node3
# 编写主配置文件(/etc/my.cnf)
[root@mysql-node1 ~]# vim /etc/my.cnf
  1 [mysqld]
  2 datadir=/data/mysql
  3 socket=/data/mysql/mysql.sock
  4 symbolic-links=0
  5 log-bin=mysql-bin
  6 server-id=10
[root@mysql-node1 ~]# systemctl restart mysqld.service
[root@mysql-node1 ~]# mysql -uroot -p123
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|          10 |
+-------------+
mysql> select @@global.log_bin;
+------------------+
| @@global.log_bin |
+------------------+
|                1 |
+------------------+
mysql> show variables like 'default_authentication_plugin';
+-------------------------------+-----------------------+
| Variable_name                 | Value                 |
+-------------------------------+-----------------------+
| default_authentication_plugin | caching_sha2_password |
+-------------------------------+-----------------------+
mysql> create user repl@'%' identified with mysql_native_password by '123';
mysql> grant replication slave on *.* to repl@'%';
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      661 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
mysql> flush privileges;
mysql> exit
[root@mysql-node1 ~]# mysqlbinlog /data/mysql/mysql-bin.000001 -v #查看二进制日志
# 在从主机中测试复制账户登录情况
[root@mysql-node2 ~]# mysql -urepl -p123 -h 172.25.254.10
mysql> show grants for current_user();
+----------------------------------------------+
| Grants for repl@%                            |
+----------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO `repl`@`%` |
+----------------------------------------------+

# 后续实验环境
# slave
[root@mysql-node1 ~]# for i in {20,30};do scp -q /etc/hosts root@172.25.254.$i:/etc/hosts;done
[root@mysql-node1 ~]# for i in {20,30};do scp -q /etc/my.cnf root@172.25.254.$i:/etc/my.cnf ;done
# 传数据库到node3(后续要实现一主多从)
[root@mysql-node1 ~]# du -sh /usr/local/mysql/
1.4G    /usr/local/mysql/
[root@mysql-node1 ~]# scp -qr /usr/local/mysql/ root@172.25.254.30:/usr/local/mysql/
[root@mysql-node3 ~]# watch -n1 du -sh /usr/local/mysql/
Every 1.0s: du -sh /usr/local/mysql/                       mysql-node3: Wed Mar  4 07:40:07 2026

1.5G    /usr/local/mysql/
[root@mysql-node1 ~]# scp -q /root/.bash_profile  root@172.25.254.30:/root/.bash_profile
[root@mysql-node1 ~]# scp -q /usr/lib/systemd/system/mysqld.service root@172.25.254.30:/usr/lib/systemd/system/

2.2 一主一从

bash 复制代码
# 克隆虚拟机/容器常见的复制问题:MySQL的UUID相同
[root@mysql-node2 ~]# mysql -urepl -p123 -h 172.25.254.10
mysql> show variables like 'server_uuid';
+---------------+--------------------------------------+
| Variable_name | Value                                |
+---------------+--------------------------------------+
| server_uuid   | 63cc667c-16f9-11f1-902a-000c290f8099 |
+---------------+--------------------------------------+
mysql> exit
mysql> show variables like 'server_uuid';
+---------------+--------------------------------------+
| Variable_name | Value                                |
+---------------+--------------------------------------+
| server_uuid   | 63cc667c-16f9-11f1-902a-000c290f8099 |
+---------------+--------------------------------------+
# 把auto.conf文件删掉,启动时自己会生成
[root@mysql-node2 ~]# find /usr/local/mysql/ -name auto.cnf
[root@mysql-node2 ~]# find /data/mysql/ -name auto.cnf
/data/mysql/auto.cnf
[root@mysql-node2 ~]# rm -rf /data/mysql/auto.cnf
[root@mysql-node2 ~]# systemctl restart mysqld.service
[root@mysql-node2 ~]# find /data/mysql/ -name auto.cnf
/data/mysql/auto.cnf
[root@mysql-node2 ~]# mysql -p123
mysql> show variables like 'server_uuid';
+---------------+--------------------------------------+
| Variable_name | Value                                |
+---------------+--------------------------------------+
| server_uuid   | 0d44a8bc-176a-11f1-ae1e-000c2939010c |
+---------------+--------------------------------------+

# slave(node2)实现一主一从
[root@mysql-node2 ~]# vim /etc/my.cnf
  1 [mysqld]
  2 datadir=/data/mysql
  3 socket=/data/mysql/mysql.sock
  4 symbolic-links=0
  5 log-bin=mysql-bin
  6 server-id=20
[root@mysql-node2 ~]# systemctl restart mysqld.service
[root@mysql-node2 ~]# mysql -p123
mysql> change master to master_host='172.25.254.10',master_user='repl',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=661;
mysql> start slave;
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 172.25.254.10
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 828
               Relay_Log_File: mysql-node2-relay-bin.000004
                Relay_Log_Pos: 328
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
# 注如果slave信息填写错误可以reset重新填写

# 测试
# 在主写表数据
[root@mysql-node1 ~]# mysql -p123
mysql> create database slave_test1;
mysql> create table slave_test1.userlist(name varchar(10) not null,passwd varchar(50) not null);
mysql> insert into slave_test1.userlist values('user1','123');
# 在从查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| slave_test1        |
| sys                |
+--------------------+
mysql> select * from slave_test1.userlist;
+-------+--------+
| name  | passwd |
+-------+--------+
| user1 | 123    |
+-------+--------+

2.3 一主多从

bash 复制代码
# 配置slave(node3)
[root@mysql-node3 ~]# tail -n1 .bash_profile
export PATH=$PATH:/usr/local/mysql/bin
[root@mysql-node3 ~]# source .bash_profile
[root@mysql-node3 ~]# mkdir -p /data/mysql
[root@mysql-node3 ~]# useradd -r -s /sbin/nologin -M mysql
[root@mysql-node3 ~]# chown mysql.mysql /data/mysql/
[root@mysql-node3 ~]# ls -d /usr/local/mysql/;ls /usr/lib/systemd/system/mysqld.service
/usr/local/mysql/
/usr/lib/systemd/system/mysqld.service
[root@mysql-node3 ~]# vim /etc/my.cnf
  1 [mysqld]
  2 datadir=/data/mysql
  3 socket=/data/mysql/mysql.sock
  4 symbolic-links=0
  5 log-bin=mysql-bin
  6 server-id=30
[root@mysql-node3 ~]# mysqld --initialize --user=mysql
2026-03-04T02:27:17.837589Z 0 [System] [MY-015017] [Server] MySQL Server Initialization - start.
2026-03-04T02:27:17.838903Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (o                     r equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future rel                     ease.
2026-03-04T02:27:17.839289Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.3.0) initializing o                     f server in progress as process 2248
2026-03-04T02:27:17.850763Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2026-03-04T02:27:18.618992Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2026-03-04T02:27:20.044062Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: qsiuBx;Yg8jn
2026-03-04T02:27:20.970701Z 0 [System] [MY-015018] [Server] MySQL Server Initialization - end.
# 如果忘记了初始密码重新创建/data/mysql
[root@mysql-node3 ~]# cp -r /data/mysql /data/mysql.bak/
[root@mysql-node3 ~]# rm -rf /data/mysql
[root@mysql-node3 ~]# mkdir -p /data/mysql
[root@mysql-node3 ~]# chown mysql:mysql /data/mysql
[root@mysql-node3 ~]# mysqld --initialize --user=mysql
2026-03-04T02:38:39.619682Z 0 [System] [MY-015017] [Server] MySQL Server Initialization - start.
2026-03-04T02:38:39.620603Z 0 [Warning] [MY-011070] [Server] 'Disabling symbolic links using --skip-symbolic-links (or equivalent) is the default. Consider not using this option as it' is deprecated and will be removed in a future release.
2026-03-04T02:38:39.620664Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.3.0) initializing of server in progress as process 2329
2026-03-04T02:38:39.627130Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2026-03-04T02:38:39.799356Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2026-03-04T02:38:40.721634Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: PTa;kNcNl5>l
2026-03-04T02:38:42.056954Z 0 [System] [MY-015018] [Server] MySQL Server Initialization - end.
[root@mysql-node3 ~]# systemctl daemon-reload
[root@mysql-node3 ~]# systemctl enable --now mysqld.service
[root@mysql-node3 ~]# mysql_secure_installation
Enter password for user root:
New password:
Re-enter new password:
Press y|Y for Yes, any other key for No: no
Change the password for root ? ((Press y|Y for Yes, any other key for No) : no
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
All done!
[root@mysql-node3 ~]# mysql -p123
mysql> select @@server_id;
+-------------+
| @@server_id |
+-------------+
|          30 |
+-------------+

# 当有数据时添加slave(node3)
mysql> change master to master_host='172.25.254.10',master_user='repl',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=661;
mysql> start slave;
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 172.25.254.10
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 1585
               Relay_Log_File: mysql-node3-relay-bin.000002
                Relay_Log_Pos: 1252
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
mysql> select * from slave_test1.userlist;
+-------+--------+
| name  | passwd |
+-------+--------+
| user1 | 123    |
+-------+--------+

# 主中写数据
mysql> insert into slave_test1.userlist values('user2','456');
# 从查看
# node2
mysql> select * from slave_test1.userlist;
+-------+--------+
| name  | passwd |
+-------+--------+
| user1 | 123    |
| user2 | 456    |
+-------+--------+
# node3
mysql> select * from slave_test1.userlist;
+-------+--------+
| name  | passwd |
+-------+--------+
| user1 | 123    |
| user2 | 456    |
+-------+--------+

# 如果新增的从没有master之前的数据,那么需要手动拉数据库过slave(我直接开始slave就有数据了)
# master备份前锁表
mysql > flush tables with read lock;
[root@mysql-node1 ~]# mysqldump -uroot -p123 slave_test1 > slave_test1.sql
[root@mysql-node1 ~]# scp slave_test1.sql root@172.25.254.30:/root/
# 停止slave
[root@mysql-node3 ~]# mysql -uroot -p123 -e "create database slave_test1;"
[root@mysql-node3 ~]# mysql -uroot -plee slave_test1 < slave_test1.sql
# 开始slave
# master解表锁
mysql > unlock tables;

2.5 主从架构的使用技巧及优化

2.5.1 延迟复制

bash 复制代码
# 在指定需要延迟同步的slave主机中(mysql8版本及以上)
# 在node3设定延迟
mysql> stop replica;
mysql> change replication source to source_delay=60;
mysql> start replica;
mysql> show slave status\G
..................
                    SQL_Delay: 60
..................

# 测试
# 数据库表数据如下
mysql> select * from slave_test1.userlist;
+-------+--------+
| name  | passwd |
+-------+--------+
| user1 | 123    |
| user2 | 456    |
+-------+--------+
# master添加数据
mysql> insert into slave_test1.userlist values('user3','789');
# node2查看(没设定复制延迟)
mysql> select * from slave_test1.userlist;
+-------+--------+
| name  | passwd |
+-------+--------+
| user1 | 123    |
| user2 | 456    |
| user3 | 789    |
+-------+--------+
# node3查看(设定了复制延迟)
mysql> select * from slave_test1.userlist;
+-------+--------+
| name  | passwd |
+-------+--------+
| user1 | 123    |
| user2 | 456    |
+-------+--------+
# node3延迟实践过了60秒后再查看
mysql> select * from slave_test1.userlist;
+-------+--------+
| name  | passwd |
+-------+--------+
| user1 | 123    |
| user2 | 456    |
| user3 | 789    |
+-------+--------+

2.5.2 慢查询日志

bash 复制代码
# 想在哪个node上设置就在哪个node上设置,在当前所做的设置,再设置此功能时不会被从复制过去。
[root@mysql-node3 ~]# find /data/mysql/ -name mysql-node3*
/data/mysql/mysql-node3.pid
[root@mysql-node3 ~]# mysql -p123
mysql> show variables like 'slow%';
+---------------------+----------------------------------+
| Variable_name       | Value                            |
+---------------------+----------------------------------+
| slow_launch_time    | 2                                |
| slow_query_log      | OFF                              |
| slow_query_log_file | /data/mysql/mysql-node3-slow.log |
+---------------------+----------------------------------+
mysql> set global slow_query_log=on;
mysql> show variables like 'slow%';
+---------------------+----------------------------------+
| Variable_name       | Value                            |
+---------------------+----------------------------------+
| slow_launch_time    | 2                                |
| slow_query_log      | ON                               |
| slow_query_log_file | /data/mysql/mysql-node3-slow.log |
+---------------------+----------------------------------+
mysql> show variables like 'long%';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
mysql> set long_query_time=4;
mysql> show variables like 'long%';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 4.000000 |
+-----------------+----------+
mysql> exit
[root@mysql-node3 ~]# find /data/mysql/ -name mysql-node3*
/data/mysql/mysql-node3.pid
/data/mysql/mysql-node3-slow.log
[root@mysql-node3 ~]# cat /data/mysql/mysql-node3-slow.log
/usr/local/mysql/bin/mysqld, Version: 8.3.0 (Source distribution). started with:
Tcp port: 3306  Unix socket: /data/mysql/mysql.sock
Time                 Id Command    Argument

# 测试
[root@mysql-node1 ~]# mysql -p123
mysql> select sleep (10);
+------------+
| sleep (10) |
+------------+
|          0 |
+------------+
[root@mysql-node3 ~]# cat /data/mysql/mysql-node3-slow.log
/usr/local/mysql/bin/mysqld, Version: 8.3.0 (Source distribution). started with:
Tcp port: 3306  Unix socket: /data/mysql/mysql.sock
Time                 Id Command    Argument
# Time: 2026-03-04T04:15:00.899750Z
# User@Host: root[root] @ localhost []  Id:    24
# Query_time: 10.011449  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 1
SET timestamp=1772597690;
select sleep (10);

2.5.3 gtid模式

bash 复制代码
# gtid模式默认是关闭的
[root@mysql-node1 ~]# mysql -p123 -e "show variables like '%gtid%';" | grep -i gtid_mode
gtid_mode       OFF

# gtid模式的配置
# 在所有主机mysql配置文件中中加入参数gtid_mode=ON、enforce-gtid-consistency=ON
[root@mysql-node1 ~]# vim /etc/my.cnf
  1 [mysqld]
  2 datadir=/data/mysql
  3 socket=/data/mysql/mysql.sock
  4 symbolic-links=0
  5 log-bin=mysql-bin
  6 server-id=10
  7 gtid_mode=ON
  8 enforce-gtid-consistency=ON
[root@mysql-node1 ~]# vim /etc/my.cnf
[root@mysql-node1 ~]# systemctl restart mysqld.service
[root@mysql-node1 ~]# mysql -p123 -e "show variables like '%gtid%';" | grep -i gtid_mode
gtid_mode       ON
[root@mysql-node1 ~]# for i in {20,30};do scp -q /etc/my.cnf root@172.25.254.$i:/etc/my.cnf;done

[root@mysql-node2 ~]# sed -i 's/^server-id=10$/server-id=20/' /etc/my.cnf
[root@mysql-node2 ~]# grep server-id /etc/my.cnf
server-id=20
[root@mysql-node2 ~]# systemctl restart mysqld.service
[root@mysql-node2 ~]# mysql -p123 -e "show variables like '%gtid%';" | grep -i gtid_mode
gtid_mode       ON
[root@mysql-node3 ~]# mysql -p123 -e "show slave status\G" | grep -i auto_position
                Auto_Position: 0
[root@mysql-node2 ~]# mysql -p123 -e "stop slave;change master to master_auto_position=1;start slave;show slave status\G" | grep -i auto_position
                Auto_Position: 1
[root@mysql-node3 ~]# sed -i 's/^server-id=10$/server-id=30/' /etc/my.cnf
[root@mysql-node3 ~]# grep server-id /etc/my.cnf
server-id=30
[root@mysql-node3 ~]# systemctl restart mysqld.service
[root@mysql-node3 ~]# mysql -p123 -e "show variables like '%gtid%';" | grep -i gtid_mode
gtid_mode       ON
[root@mysql-node2 ~]# mysql -p123 -e "stop slave;change master to master_auto_position=1;start slave;show slave status\G" | grep -i auto_position
                Auto_Position: 1
# 测试
[root@mysql-node1 ~]# mysql -p123 -e "show master status\G" | grep -i gtid
Executed_Gtid_Set:
# 插入数据生成gtid
[root@mysql-node1 ~]# mysql -p123 -e "insert into slave_test1.userlist values('user4','123');"
[root@mysql-node1 ~]# mysql -p123 -e "show master status\G" | grep -i gtid
Executed_Gtid_Set: 63cc667c-16f9-11f1-902a-000c290f8099:1
# slave也可以看到gtid且与主一致
[root@mysql-node2 ~]# mysql -p123 -e "show master status\G" | grep -i gtid
Executed_Gtid_Set: 63cc667c-16f9-11f1-902a-000c290f8099:1
[root@mysql-node3 ~]# mysql -p123 -e "show master status\G" | grep -i gtid
Executed_Gtid_Set: 63cc667c-16f9-11f1-902a-000c290f8099:1

2.5.6 并行复制

bash 复制代码
# 在slave主机中默认回放日志时使用单线程回放(我的不是,不知道是做了gtid实验还是mysql8版本默认的原因),可以配置并行复制更改多线程
[root@mysql-node2 ~]# mysql -p123 -e "show variables like 'slave_parallel%';"
+------------------------+---------------+
| Variable_name          | Value         |
+------------------------+---------------+
| slave_parallel_type    | LOGICAL_CLOCK |
| slave_parallel_workers | 4             |
+------------------------+---------------+
[root@mysql-node2 ~]# mysql -p123 -e "select * from performance_schema.replication_applier_status_by_worker\G" | egrep -i "worker_id|service_state"
                                              WORKER_ID: 1
                                          SERVICE_STATE: ON
                                              WORKER_ID: 2
                                          SERVICE_STATE: ON
                                              WORKER_ID: 3
                                          SERVICE_STATE: ON
                                              WORKER_ID: 4
                                          SERVICE_STATE: ON
[root@mysql-node2 ~]# vim /etc/my.cnf
  1 [mysqld]
  2 datadir=/data/mysql
  3 socket=/data/mysql/mysql.sock
  4 symbolic-links=0
  5 log-bin=mysql-bin
  6 server-id=20
  7 gtid_mode=ON
  8 enforce-gtid-consistency=ON
  # 并行复制调整:
  9 slave-parallel-type=LOGICAL_CLOCK
 10 slave-parallel-workers=16
 11 relay_log_recovery=ON
[root@mysql-node2 ~]# systemctl restart mysqld.service
[root@mysql-node2 ~]# mysql -p123 -e "show variables like 'slave_parallel%';"
+------------------------+---------------+
| Variable_name          | Value         |
+------------------------+---------------+
| slave_parallel_type    | LOGICAL_CLOCK |
| slave_parallel_workers | 16            |
+------------------------+---------------+
[root@mysql-node2 ~]# mysql -p123 -e "select * from performance_schema.replication_applier_status_by_worker\G" | egrep -i "worker_id|service_state"
                                              WORKER_ID: 1
                                          SERVICE_STATE: ON
                                              WORKER_ID: 2
                                          SERVICE_STATE: ON
                                              WORKER_ID: 3
                                          SERVICE_STATE: ON
                                              WORKER_ID: 4
                                          SERVICE_STATE: ON
                                              WORKER_ID: 5
                                          SERVICE_STATE: ON
                                              WORKER_ID: 6
                                          SERVICE_STATE: ON
                                              WORKER_ID: 7
                                          SERVICE_STATE: ON
                                              WORKER_ID: 8
                                          SERVICE_STATE: ON
                                              WORKER_ID: 9
                                          SERVICE_STATE: ON
                                              WORKER_ID: 10
                                          SERVICE_STATE: ON
                                              WORKER_ID: 11
                                          SERVICE_STATE: ON
                                              WORKER_ID: 12
                                          SERVICE_STATE: ON
                                              WORKER_ID: 13
                                          SERVICE_STATE: ON
                                              WORKER_ID: 14
                                          SERVICE_STATE: ON
                                              WORKER_ID: 15
                                          SERVICE_STATE: ON
                                              WORKER_ID: 16
                                          SERVICE_STATE: ON

2.5.7 半同步模式

master
bash 复制代码
# 在master配置半同步模式
# 开启半同步模式
[root@mysql-node1 ~]# echo rpl_semi_sync_master_enabled=1 >> /etc/my.cnf
[root@mysql-node1 ~]# mysql -p123 -e "show plugins;" | egrep -i "name|rpl"
mysql: [Warning] Using a password on the command line interface can be insecure.
Name    Status  Type    Library License
# 安装半同步插件,打开半同步功能
[root@mysql-node1 ~]# mysql -p123 -e "install plugin rpl_semi_sync_master soname 'semisync_master.so';set global rpl_semi_sync_master_enabled = 1;"
# 查看半同步功能状态
[root@mysql-node1 ~]# mysql -p123 -e "show variables like 'rpl_semi_sync%';show status like 'rpl_semi_sync%';"
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 10000      |
| 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 |
+-------------------------------------------+------------+
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 2     |
| 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     |
+--------------------------------------------+-------+
[root@mysql-node1 ~]# mysql -p123 -e "show plugins;" | egrep -i "name|rpl"
Name    Status  Type    Library License
rpl_semi_sync_master    ACTIVE  REPLICATION     semisync_master.so      GPL
slave
bash 复制代码
# 在slave开启半同步功能
[root@mysql-node2 ~]# echo rpl_semi_sync_slave_enabled=1 >> /etc/my.cnf
[root@mysql-node2 ~]# mysql -p123 -e "install plugin rpl_semi_sync_slave soname 'semisync_slave.so';set global rpl_semi_sync_slave_enabled = 1;"
[root@mysql-node2 ~]# mysql -p123 -e "show variables like 'rpl_semi_sync%';show status like 'rpl_semi_sync%';" | grep slave
rpl_semi_sync_slave_enabled     ON
rpl_semi_sync_slave_trace_level 32
Rpl_semi_sync_slave_status      OFF
# 重启io线程,半同步才能生效
[root@mysql-node2 ~]# mysql -p123 -e "stop slave io_thread;start slave io_thread;"
[root@mysql-node2 ~]# mysql -p123 -e "show variables like 'rpl_semi_sync%';show status like 'rpl_semi_sync%';" | grep slave
rpl_semi_sync_slave_enabled     ON
rpl_semi_sync_slave_trace_level 32
Rpl_semi_sync_slave_status      ON

# node3
[root@mysql-node3 ~]# echo rpl_semi_sync_slave_enabled=1 >> /etc/my.cnf
[root@mysql-node3 ~]# mysql -p123 -e "install plugin rpl_semi_sync_slave soname 'semisync_slave.so';set global rpl_semi_sync_slave_enabled = 1;"
[root@mysql-node3 ~]# mysql -p123 -e "stop slave io_thread;start slave io_thread;"
[root@mysql-node3 ~]# mysql -p123 -e "show variables like 'rpl_semi_sync%';show status like 'rpl_semi_sync%';" | grep slave
rpl_semi_sync_slave_enabled     ON
rpl_semi_sync_slave_trace_level 32
Rpl_semi_sync_slave_status      ON
测试
bash 复制代码
[root@mysql-node1 ~]# watch -n1 $'mysql -p123 -t -e "show status like \'rpl_semi_sync%\';"'
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 2     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 15    |
| Rpl_semi_sync_master_no_times              | 1     |
| Rpl_semi_sync_master_no_tx                 | 1     |	# 未同步数据1笔
| Rpl_semi_sync_master_status                | ON    |	# 当slave故障时,插入数据,自动转为异步模式,当slave恢复,插入数据,会自动恢复
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 612   |
| Rpl_semi_sync_master_tx_wait_time          | 4288  |
| Rpl_semi_sync_master_tx_waits              | 7     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 7     |	# 已同步数据7笔
+--------------------------------------------+-------+
[root@mysql-node2 ~]# mysql -p123 -e "stop slave io_thread;"
[root@mysql-node2 ~]# mysql -p123 -e "stop slave io_thread;"
[root@mysql-node1 ~]# mysql -p123 -e "insert into slave_test1.userlist values('user6','789'); select * from slave_test1.userlist;"
[root@mysql-node2 ~]# mysql -p123 -e "start slave io_thread;"
[root@mysql-node2 ~]# mysql -p123 -e "start slave io_thread;"
[root@mysql-node1 ~]# mysql -p123 -e "insert into slave_test1.userlist values('user7','123'); select * from slave_test1.userlist;"
相关推荐
路溪非溪2 小时前
Linux下wifi子系统的数据流
linux·arm开发·驱动开发
QWQ___qwq2 小时前
AutoDL服务器NLTK语料包下载失败(卡死/404)完美解决方案
运维·服务器
志栋智能2 小时前
预算有限?超自动化安全运维的普惠解决方案
运维·网络·人工智能·安全·自动化
RDCJM2 小时前
redis 使用
数据库·redis·缓存
万岳科技系统开发2 小时前
教育培训系统开发正在重构培训机构的盈利结构
数据库·重构
2501_945423542 小时前
数据分析师的Python工具箱
jvm·数据库·python
qq_172805592 小时前
WSL 完整教学文档(Windows Linux 子系统)
linux·运维·windows·wsl
xingyynt2 小时前
【HTML+CSS】使用HTML与后端技术连接数据库
css·数据库·html
2401_879693872 小时前
自动化与脚本
jvm·数据库·python