文章目录
- [1 MySQL源码编译部署](#1 MySQL源码编译部署)
- [2 主从复制](#2 主从复制)
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;"
