目录
gtid模式
当gtid模式被启用时,MySQL会自动为每个事务生成GTID,并将其记录在二进制日志中,以便于在复制链上的其他MySQL实例中进行复制。
通过启用gtid模式,我们可以更加方便地进行主从复制,而且不需要依赖于特定的主从架构或者拓扑结构,因为GTID是全局唯一和不可重复的。
master配置
server1
vim /etc/my.cnf
log-bin=mysql-bin
server-id=1
gtid_mode=ON //启用gtid功能
enforce-gtid-consistency=ON //强制要求所有更新操作都使用GTID
/etc/init.d/mysqld restart
slave配置
server2
vim /etc/my.cnf
server-id=2
gtid_mode=ON
enforce-gtid-consistency=ON
/etc/init.d/mysqld restart
mysql -pwestos
stop slave;
CHANGE MASTER TO MASTER_HOST='192.168.81.30', MASTER_USER='repl', MASTER_PASSWORD='westos', MASTER_AUTO_POSITION = 1;
start slave;
show slave status\G;
其它slave节点(server3)以此类推
半同步模式
master配置
安装半同步模块
server1
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
-> FROM INFORMATION_SCHEMA.PLUGINS
-> WHERE PLUGIN_NAME LIKE '%semi%';
激活master半同步模式,查看半同步参数
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
查看半同步状态
mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
半同步参数写入配置文件,确保重启后依然生效
vim /etc/my.cnf
log-bin=mysql-bin
server-id=1
gtid_mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_master_enabled=1 //开机启动半同步模式
slave配置
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;
需要重启IO线程,slave端的半同步才能生效
mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;
mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%'; //查看是否启用了复制半同步模式,并可以查看其它相关变量的取值
mysql> SHOW STATUS LIKE 'Rpl_semi_sync%'; //查看当前复制半同步模式的工作状态,比如是禁用、正在运行,还是已停止等
半同步参数写入配置文件
vim /etc/my.cnf
server-id=2
gtid_mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_slave_enabled=1
测试:
master写入数据
mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
停止所有slave节点的IO线程:
master节点再次写入数据:
所有slave节点再次启动IO线程,mysql会自动切回半同步模式
延迟复制
在其中一个slave中执行
mysql> stop slave;
mysql> CHANGE MASTER TO MASTER_DELAY =30;
mysql> start slave ;
在master上插入数据后,slave不会立即更新,而是需要等待指定的延迟后才会执行。
并行复制
默认slave节点sql单线程回放,会造成数据同步延时较高
slave节点添加以下参数
vim /etc/my.cnf
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON
/etc/init.d/mysqld restart
mysql -pwestos
show processlist;
mysql组复制
server1配置
首先停止数据库,清楚数据
/etc/init.d/mysqld stop
cd /data/mysql
rm -fr *
vim /etc/my.cnf
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "server1:33061"
group_replication_group_seeds= "server1:33061,server2:33061,server3:33061"
group_replication_bootstrap_group=off
group_replication_ip_whitelist="192.168.81.0/24,127.0.0.1/8"
group_replication_single_primary_mode=OFF
group_replication_enforce_update_everywhere_checks=ON
group_replication_allow_local_disjoint_gtids_join=1
根据实际情况修改主机名和网段
初始化
mysqld --initialize --user=mysql
启动服务
/etc/init.d/mysqld start
mysql -p
#首先修改临时密码
mysql> alter user root@localhost identified by 'westos';
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'westos';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='westos' FOR CHANNEL 'group_replication_recovery';
mysql> SET GLOBAL group_replication_bootstrap_group=ON; //只在server1上执行
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF; //只在server1上执行
mysql> SELECT * FROM performance_schema.replication_group_members;
server2配置
/etc/init.d/mysqld stop
cd /data/mysql
rm -fr *
vim /etc/my.cnf //与server1相同,修改主机名和网段
mysqld --initialize --user=mysql
/etc/init.d/mysqld start
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='westos' FOR CHANNEL 'group_replication_recovery';
mysql> START GROUP_REPLICATION;
mysql> SELECT * FROM performance_schema.replication_group_members;
server3配置
同server2
测试:
所有节点都可以读写数据
server1
server2
server3
慢查询
mysql> set global slow_query_log=ON;
mysql> show variables like "long%";
mysql> set long_query_time=5;
mysql> select sleep(5); //模拟慢查询语句
mysql> show variables like "slow%";
mysql路由器
server4
安装软件
rpm -ivh mysql-router-community-8.0.21-1.el7.x86_64.rpm
配置服务
cd /etc/mysqlrouter/
vim mysqlrouter.conf
[routing:ro]
bind_address = 0.0.0.0
bind_port = 7001
destinations = 192.168.81.30:3306,192.168.81.40:3306,192.168.81.50:3306
routing_strategy = round-robin
//表示路由策略为轮询(Round-Robin),即按照目标服务器列表的顺序依次将请求路由到不同的后端MySQL服务器,以实现负载均衡。
[routing:rw]
bind_address = 0.0.0.0
bind_port = 7002
destinations = 192.168.81.50:3306,192.168.81.40:3306,192.168.81.30:3306
routing_strategy = first-available
//表示路由策略为首个可用服务器(First-Available),即首先将请求路由到列表中第一个可用的服务器,从而实现高可用性。
启动服务
systemctl enable --now mysqlrouter.service
安装mysql客户端工具
yum install -y mariadb
server1
在mysql集群中创建远程测试用户
mysql> grant all on test.* to 'shx'@'%' identified by 'westos';
server4
连接mysql路由器
mysql -h 192.168.81.60 -P 7001 -u shx -pwestosL;
MySQL [(none)]> select * from test.t1;
在server1上查看网络连接
yum install -y lsof
lsof -i :3306
mysql -h 192.168.81.60 -P 7002 -u shx -pwestosL;
server3