mysql 组复制(MGR)系列文章(四)之组复制集群部署和运维操作
一、说明
MySQL组复制作为MySQL服务器的插件提供;组中的每个服务器都需要配置和安装插件。本节提供了一个详细的教程,其中包含创建至少有三个成员的复制组所需的步骤。
本次部署三个节点:
primary 节点1 | 192.168.167.141 |
---|---|
secondary节点2 | 192.168.167.142 |
secondary节点3 | 192.168.167.143 |
mysql版本是8.0.34,推荐组复制使用MySQL 8.0.22 及之后的版本,整体会更稳定可靠
mysql 部署请见我另一篇文章:
https://www.cnblogs.com/sunjiwei/articles/18359401
二、组复制配置(单主模式)
2.0、节点配置域名解析,三个节点都做vim /etc/hosts
192.168.167.141 ob01
192.168.167.142 ob02
192.168.167.143 ob03
2.1、组复制必须要求的配置
# 存储引擎必须是innodb,默认就是innodb,可以不设置
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
# 必须开启gtid模式和binlog
server_id=1 # 每个节点的server_id不能相同
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
# 在MySQL 8.0中,下面两个设置是默认设置,FILE设置已弃用。从MySQL 8.0.23开始,不推荐设置这两个系统变量,只允许使用默认值,所以可以不设置,这里留个说明以防忘记
master_info_repository=TABLE
relay_log_info_repository=TABLE
# In MySQL 8.0, this setting is the default, and from MySQL 8.0.26, the use of the system variable is deprecated
# 所以8.0以后的组复制无需设置这个参数
transaction_write_set_extraction=XXHASH64 # 开启写入集,这个参数在5.7是关闭的
# 8.0.20及之前的版本必须设置为NONE,之后的版本使用默认值即可,默认是CRC32
binlog_checksum=NONE
# 在所有组成员上将lower_case_table_names设置为相同的值。设置1对于使用InnoDB存储引擎是正确的,这是组复制所必需的,默认就是1
lower_case_table_names=1
# 组复制相关的参数
# 注意,下面这几个组复制参数在首次部署mysql时不要添加,否则mysql无法启动,会报错,等部署好mysql
# 后再把这几个参数添加到配置文件中,然后重启mysql即可生效
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" # 组复制必须有一个uuid格式的名字
group_replication_single_primary_mode=on
group_replication_start_on_boot=off
group_replication_local_address= "s1:33061"
group_replication_group_seeds= "s1:33061,s2:33061,s3:33061"
group_replication_bootstrap_group=off
group_replication_recovery_get_public_key=1
# 组复制性能相关参数,安装group_replication.so插件之后才能看到,下面这三个配置默认都是开启的,可以不用写在配置文件中也行
replica_parallel_workers = 4 # 多线程复制,默认就是4,从MySQL 8.0.27开始,默认情况下所有副本都配置为多线程。
replica_preserve_commit_order=ON # 开启多线程复制必须开启此设置以确保并行事务的最终提交与原始事务的顺序相同,默认是开启的
replica_parallel_type=LOGICAL_CLOCK # 开启逻辑时钟模式,默认开启
参数解释:
plugin_load_add:需要的插件,多个插件用分号隔开
transaction_write_set_extraction:主要用于控制 InnoDB 存储引擎如何提取事务的写入集(write set)以用于基于写入集的复制(Write Set Based Replication, WSBR)。这个特性在 MySQL 8.0.16 及更高版本中被引入。当启用了基于写入集的复制时,MySQL 会记录每个事务的写入集,并将其发送到从服务器进行复制。写入集是一个事务对数据表所做的所有修改的集合。通过只传输写入集而不是整个事务的语句,可以减少网络带宽的消耗,提高复制效率。
transaction_write_set_extraction 可以设置为以下几个值:
ON:
启用基于写入集的复制。
适用于大多数情况,默认情况下是启用的。
OFF:
禁用基于写入集的复制。
如果遇到不支持 WSBR 的操作,则会回退到传统的基于语句或基于行的复制。
FORCE_ON:
强制启用基于写入集的复制。
即使遇到不支持 WSBR 的操作也不回退到传统的复制方式,可能会导致复制失败。
FORCE_OFF:
强制禁用基于写入集的复制。
总是使用传统的基于语句或基于行的复制。
transaction_write_set_extraction 的默认值通常是 ON,这意味着 InnoDB 会自动选择合适的哈希算法来生成写入集的标识符。然而,如果显式设置为 XXHASH64,则表示使用 XXHASH64 作为哈希函数。
group_replication_start_on_boot:指定mysql在启动时是否自动启动组复制,必须为off,否则还要有其他配置才行。此系统变量的值可以在组复制运行时更改,但只有在您停止并重新启动组成员上的组复制后,更改才会生效。
group_replication_local_address:设置成员用于与组中其他成员进行内部通信的网络地址和端口,注意,此端口号和用于客户端连接的端口号不能相同。推荐使用33061
group_replication_group_seeds:该列表通常包含组内所有成员的group_replication_local_address参数的配置,但这不是强制性的,可以选择组成员的子集作为种子。
group_replication_bootstrap_group:该参数作用是第一次初始化组复制集群或者是整个组被关闭需要再次恢复。在任何时候都只能在属于某个组的其中一个服务器实例上启用(所以所有节点的配置文件中最好都设置为off,默认就是off,然后手动在其中一个数据库里启动)。如果多次引导组,例如当多个服务器实例开启了此选项时,它们会创建一个分裂场景,会存在两个同名的不同组。
group_replication_recovery_get_public_key:获取公钥,默认是off,8.0.3之后密码插件默认是caching_sha2_password,不把该参数打组复制repl账号连不上其他节点,或者是使用group_replication_recovery_public_key_path这个参数设置公钥路径也可以。
2.2、创建Distributed Recovery所需用户,三个节点上都要执行
# 创建Distributed Recovery所需账号
set sql_log_bin = 0;
reset master; # 该命令慎用,会清空所有binlog,确保你的mysql是新部署的再执行该命令
create user repl@'%' identified by 'xxxxxx';
GRANT REPLICATION SLAVE,CONNECTION_ADMIN,BACKUP_ADMIN,GROUP_REPLICATION_STREAM ON *.* TO repl@'%';
set sql_log_bin = 1;
# 为节点配置Distributed Recovery通道
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='xxxxxx' FOR CHANNEL 'group_replication_recovery';
从MySQL 8.0.23以后也可以使用以下命令:
CHANGE REPLICATION SOURCE TO SOURCE_USER='repl', SOURCE_PASSWORD='xxxxxx' FOR CHANNEL 'group_replication_recovery';
2.3、Bootstrapping the Group
首次启动组的过程称为Bootstrap。可以使用group_replication_boottrap_group系统变量引导组。引导动作只能在三个节点中的其中一个节点上执行一次,在哪个节点上执行下面的命令,哪个节点就会是主节点,命令如下:
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
# 一旦初始化一个组复制集群,并START GROUP_REPLICATION后,就可以查看该组内的这个成员节点了,执行以下命令查看,此时会有一个节点:
SELECT * FROM performance_schema.replication_group_members;
2.4、把其他两个节点加入复制组内
# 在其他两个节点分别执行以下步骤
1、启动组复制
START GROUP_REPLICATION;
2、查看组内成员节点
SELECT * FROM performance_schema.replication_group_members;
三、监控组复制
可以使用 Performance Schema 库下的相关视图表来监控组复制:# replication_group_member_stats表
该表提供了与认证过程相关的组级信息,以及复制组中每个成员接收和发起的事务的统计信息。
该信息在作为复制组成员的所有服务器实例之间共享,因此可以从任何成员查询所有组成员的信息。
# replication_group_members表
该表可以查看组内成员信息
该表中有个字段MEMBER_STATE表示节点成员的状态,状态值如下:
online:服务器是组的活动成员,处于完全正常运行状态,只有当成员处于此状态时,成员才能与组完全同步并参与其中。
recovering:服务器已加入一个组,正在成为活动成员,目前正在进行分布式恢复
offline:已加载组复制插件,但该成员不属于任何组。
error:该成员处于错误状态,无法作为组成员正常运行。成员可以在应用事务或恢复阶段进入错误状态。
unreachable:本地故障检测器怀疑无法联系到该成员,因为该组的消息已超时。例如,如果一个成员非自愿或自愿地断开连接,就会发生这种情况。
replication_group_communication_information:此表显示了整个复制组的组配置选项。该表仅在安装了组复制时可用。
replication_connection_status:显示有关组复制的信息,例如从组接收并在应用程序队列(中继日志)中排队的事务
replication_applier_status:显示了与组复制相关的通道和线程的状态。
组复制有两个复制通道:
group_replication_recovery:用于与分布式恢复相关的复制更改。
group_replication_applier:用于来自组的传入更改,以应用直接来自组的事务。
四、组复制运维操作
说明:以下的组复制运维操作都必须8.0.13以上版本才支持4.1、单主模式下手动切换主节点
SELECT group_replication_set_as_primary('member_uuid'):
该函数可以更改单主模式集群的主节点,该函数可以在组的任何成员上运行。
完成此操作后,当前主服务器将成为只读secondary服务器,指定的组成员将成为读写主服务器。
组正在等待的任何未提交事务都必须在操作完成之前提交、回滚或终止。在MySQL 8.0.29之前,该函数会等待现有主服务器上的所有活动事务结束,包括在使用该函数后启动的传入事务。
从MySQL 8.0.29开始,您可以为使用该函数时正在运行的事务指定从0秒(立即)到3600秒(60分钟)的超时。group_replication_set_as_primary('member_uuid', seconds)
当超时到期时,对于尚未达到提交阶段的任何事务,客户端会话将断开连接,因此事务不会继续进行。
已达到提交阶段的事务可以完成。当您设置超时时,它还会阻止从该点开始在主服务器上启动新事务
# 你可以从performance_schema.threads视图中查看切换主节点的相关事宜:
mysql> SELECT NAME, PROCESSLIST_INFO FROM performance_schema.threads
-> WHERE NAME="thread/group_rpl/THD_transaction_monitor"\G
*************************** 1. row ***************************
NAME: thread/group_rpl/THD_transaction_monitor
PROCESSLIST_INFO: Group replication transaction monitor: Stopped client connections
# 上面的视图显示了何时创建了事务监视线程,何时停止了新事务,何时断开了与未提交事务的客户端连接,以及最后,何时流程完成并再次允许新事务。
# 查看切换进度
mysql> SELECT event_name, work_completed, work_estimated
-> FROM performance_schema.events_stages_current
-> WHERE event_name LIKE "%stage/group_rpl%"\G
*************************** 1. row ***************************
EVENT_NAME: stage/group_rpl/Primary Election: Waiting for members to turn on super_read_only
WORK_COMPLETED: 3
WORK_ESTIMATED: 5
4.2、改变组复制集群模式
1、多主模式切换到单主模式
SELECT group_replication_switch_to_single_primary_mode('member_uuid');
只有指定了member_uuid才会强制该节点成为主节点,也可以不指定member_uuid
# 检查切换进度
SELECT event_name, work_completed, work_estimated FROM performance_schema.events_stages_current WHERE event_name LIKE "%stage/group_rpl%";
+----------------------------------------------------------------------------+----------------+----------------+
| event_name | work_completed | work_estimated |
+----------------------------------------------------------------------------+----------------+----------------+
| stage/group_rpl/Primary Switch: waiting for pending transactions to finish | 4 | 20 |
+----------------------------------------------------------------------------+----------------+----------------+
2、单主模式切换为多主模式
SELECT group_replication_switch_to_multi_primary_mode();
# 检查切换进度
SELECT event_name, work_completed, work_estimated FROM performance_schema.events_stages_current WHERE event_name LIKE "%stage/group_rpl%";
+----------------------------------------------------------------------+----------------+----------------+
| event_name | work_completed | work_estimated |
+----------------------------------------------------------------------+----------------+----------------+
| stage/group_rpl/Multi-primary Switch: applying buffered transactions | 0 | 1 |
+----------------------------------------------------------------------+----------------+----------------+
4.3、重启组复制集群
https://dev.mysql.com/doc/refman/8.0/en/group-replication-restarting-group.html
详情见官网
4.4、事务一致性保证
详情见官网:https://dev.mysql.com/doc/refman/8.0/en/group-replication-consistency-guarantees.html
# primary failover
在单主模式中,当发生主节点故障转移时,无论积压的事务有多少,新的主节点都可以立即对应用程序流量可用,或者可以限制对它的访问,直到积压被应用为止,在故障转移时必须考虑组复制一致性级别对于只读(RO)事务和读写(RW)事务的影响。
在MySQL 8.0.14之前,无法配置故障转移策略,默认情况下,可用性最大化,如第一种方法所述。在MySQL 8.0.14及更高版本的中,您可以使用group_replication_consistance变量配置成员在主故障转移期间提供的事务一致性保证级别,
此参数有5个可选配置值,分别是:EVENTUAL(默认)、BEFORE_ON_PRIMARY_FAILOVER、BEFORE、AFTER、BEFORE_AND_AFTER:
eventual:primary failover后,外部新的RO和RW事务可以立即执行,不用等待旧主遗留的积压下来的事务应用完成。
五、组复制注意事项
1、组复制集群中所有的表都要是innodb引擎,所有表都必须有主键或唯一索引2、组复制集群不支持SERIALIZABLE隔离级别
3、多主模式下不允许使用外键,冲突检测会有问题,单主模式下不影响
4、多主模式下 for update 语句会导致死锁,单主模式不影响
5、组复制集群不支持过滤复制
6、单个复制组中可以包含的MySQL服务器的最大数量为9个
7、组复制中的事务大小限制如下:
如果单个事务导致消息内容足够大,以至于无法在5秒内通过网络在组成员之间复制消息,
则成员可能会被怀疑失败,然后被开除,仅仅是因为他们忙于处理事务。由于内存分配问题,
大型事务也可能导致系统运行缓慢。为避免这些问题,请使用以下缓解措施:
1、如果由于大型消息而发生不必要的驱逐,请使用系统变量group_replication_member_expel_timeout,
在驱逐怀疑失败的成员之前留出额外的时间。在最初的5秒检测期后,您最多可以允许一个小时,
然后将可疑成员从小组中开除。从MySQL 8.0.21开始,默认情况下允许额外5秒。
在可能的情况下,在组复制处理事务之前,请尝试限制事务的大小。例如,将与LOAD DATA一起使用的文件拆分为更小的块。
2、使用系统变量group_replication_transaction_size_limit指定组接受的最大事务大小。在MySQL 8.0中,
此系统变量默认为最大事务大小150000000字节(约143 MB)。超过此大小的事务将回滚,
不会发送到组复制的组通信系统(GCS)以分发到组。根据您需要组容忍的最大消息大小调整此变量的值,
同时记住处理事务所花费的时间与其大小成正比。
3、使用系统变量group_replication_compression_threshold指定消息大小,超过该大小将应用压缩。
此系统变量默认为1000000字节(1 MB),因此大消息会自动压缩。
当组复制的组通信系统(GCS)接收到Group_Replication_transaction_size_limit设置允许
但超过Group_Replication_Compression_threshold设置的消息时,它会执行压缩。
4、使用系统变量group_replication_communication_max_message_size指定消息大小,超过该大小的消息将被分段。
此系统变量默认为10485760字节(10 MiB),因此大型消息会自动分段。
如果压缩后的消息仍然超过group_replication_communication_max_message_size限制,GCS将在压缩后执行分段。
为了使复制组使用分段,所有组成员必须为MySQL 8.0.16或更高版本,并且组使用的组复制通信协议版本必须允许分段。
如果您已停用所有这些保护措施,则复制组成员上的应用程序线程可以处理的消息的大小上限是该成员的
replica_max_allowed_packet或slave_max_allowed_packet系统变量的值,其默认值和最大值为1073741824字节(1 GB)。
当接收成员尝试处理超过此限制的消息时,该消息将失败。
组成员可以发起并尝试传输到组的消息的大小上限为4294967295字节(约4 GB)。
这是组复制(XCom,Paxos变体)的组通信引擎接受的数据包大小的硬限制,该引擎在GCS处理消息后接收消息。
当发起成员尝试广播超过此限制的消息时,该消息将失败。
8、分配给来自客户端的传入事务的GTID使用group_replication_group_name系统变量指定的组名作为标识符的UUID部分,而不是接收事务的单个组成员的服务器UUID作为GTID标识符的UUID部分。
六、mysql router安装部署
官网:https://dev.mysql.com/doc/mysql-router/8.0/en/6.1、下载
下载地址:https://dev.mysql.com/downloads/router/6.2、介绍
MySQL Router 是 MySQL 生态系统中的一个组件,它充当客户端和 MySQL 服务器之间的代理。MySQL Router 提供负载均衡、路由选择、连接池等功能,并支持多种 MySQL 服务类型,如主从复制(不建议使用)、读写分离以及组复制等。
为什么MGR要配合mysql router使用?
例如现在有一个单主模式的三个节点集群,如果客户端直接连集群,那就只能连主节点,如果主节点down了,那客户端就无法连到主节点了。如果客户端连的是mysql router,由mysql router 来管理MGR集群,这样即使主节点down了,mysql router 也会自动识别到新的主节点继续对外提供服务。并且mysql router 还可以配置读写分离,使读操作都路由到从节点从而分摊主节点压力。
6.3、安装部署
1、要求硬件:最低要求是1core CPU和256MB 内存。建议使用4+CPU核心和4+GB 内存。
磁盘空间:最低要求为100 MB。
依赖包:大多数外部依赖包,如protobuf和rapidjson,都捆绑在MySQL Router包中。一个例外是OpenSSL,它仅捆绑用于Windows版本,linux系统根据需要安装正确的OpenSSL版本。
2、安装
把下载的安装包上传到Linux上,然后执行下面命令安装;
# 创建目录
mkdir -p /opt/software/mysql-router/{log,run,data}
mkdir /etc/mysqlrouter
chown -R mysql:mysql /etc/mysqlrouter
# 解压并授权
tar -zxvf mysql-router-8.0.34-linux-glibc2.28-x86_64.tar.gz
mv mysql-router-8.0.34-linux-glibc2.28-x86_64 mysql-router-8.0.34
chown -R mysql:mysql mysql-router
# 配置环境变量
vim /home/mysql/.bash_profile
export PATH=$PATH:$HOME/.local/bin:$HOME/bin/:/opt/software/mysql-8.0.34/bin:/opt/software/mysql-router/mysql-router-8.0.34/bin
# 使配置生效
source /home/mysql/.bash_profile
3、编辑配置文件
配置的是读写分离6446(rw)端口和6447(ro)端口
cat > /etc/mysqlrouter/mysqlrouter.conf << EOF
[DEFAULT]
user=mysql
logging_folder=/opt/software/mysql-router/log
runtime_folder=/opt/software/mysql-router/run
data_folder=/opt/software/mysql-router/data
plugin_folder=/opt/software/mysql-router/mysql-router-8.0.34/lib/mysqlrouter
pid_file=/opt/software/mysql-router/run/mysqlrouter.pid
connect_timeout=15
client_connect_timeout=15
max_total_connections = 2000
max_connections = 512
protocol=classic
connection_sharing=1
connection_sharing_delay=5
[logger]
level = INFO
[connection_pool]
max_idle_server_connections = 32
idle_timeout=28800
[routing:myCluster_rw]
bind_address=0.0.0.0
bind_port=6446
socket=/opt/software/mysql-router/data/mysql_rw.sock
destinations=192.168.167.141:3306,192.168.167.142:3306,192.168.167.143:3306
routing_strategy=first-available
[routing:myCluster_ro]
bind_address=0.0.0.0
bind_port=6447
socket=/opt/software/mysql-router/data/mysql_ro.sock
destinations=192.168.167.141:3306,192.168.167.142:3306,192.168.167.143:3306
routing_strategy=round-robin
EOF
# 参数解释
user=mysql # 运行mysql router的用户
logging_folder:mysql router 运行日志目录
runtime_folder:runtime目录
plugin_folder=:该目录必须与msyql router 安装目录保持一致
pid_file:pid 文件目录
data_folder:mysql router 运行数据目录
connect_timeout=15:连接超时时间
client_connect_timeout=15:从server端接收返回数据的超时时间
max_total_connections:该 mysql router 最大连接数,默认值是512
max_connections = 512:每个router instance 的最大连接数,默认值512
connection_sharing:是否开启连接共享,即连接池,默认0,8.0.32以后才有
connection_sharing_delay:将空闲连接移动到连接池之前等待的秒数,8.0.32以后才有
protocol=classic # 通信协议,有classic 和 x
[connect_pool]
max_idle_server_connections:连接池里保持的最大空闲连接数,默认值为0,表示禁用连接池,8.0.29 以后才有
idle_timeout:空闲连接超过多少秒之后会被关闭,默认5s,8.0.29 以后才有
[metadata_cache:myCluster] # 注意,metadat_cache的配置MGR用不上,只有innodb cluster才用的到,这里就是记录下
cluster_type=gr # 集群类型,有gr(组复制)和rs(主从)两个值
router_id=1 # 给mysql router 分配一个id
user=mysql_router # 这个用户用来访问mysql组复制集群的metadata schema,账号密码会自动创建,密码完全由Router管理,从不公开,然后,Router可以使用它连接到InnoDB Cluster并检索当前拓扑信息
metadata_cluster=myCluster # 集群的名字
ttl=0.5 # metadata cache刷新时间间隔. 值必须小于auth_cache_refresh_interval 和 auth_cache_ttl值,否则mysql router无法启动
auth_cache_ttl=-1 # auth cache中的信息过多长时间不刷新就会失效,默认是-1,表示永远不失效
auth_cache_refresh_interval=2 # auth cache 刷新时间间隔
use_gr_notifications=0 # 是否启用组复制通知。启用后,mysql Router会收到集群更改的异步通知
[routing:myCluster_rw] # 这里routing是关键字,myCluster_rw是随便写的一个名字,方便区分路由规则,我这里配置的是读写分离,所以一个写rw(表示读写事务),一个写ro(表示只读事务)
bind_address=0.0.0.0
bind_port=6446
socket=/opt/software/mysql-router/data/mysql.sock
destinations=metadata-cache://myCluster/?role=PRIMARY # 路由目标可以是逗号分隔的MySQL服务器列表,也可以是元数据缓存定义
# 路由策略,即路由器如何选择目标MySQL服务器去连接,有以下四个值:
# first-available:根据destinations这个配置依次往后找,如果第一台不可用,继续找第二个,并且最后一个如果不可用会从头再开始循环
# next-available:和上面相似,不同的是如果服务器被标记为不可访问,那么它将被丢弃,并且永远不会再次用作目标。
# round-robin:为了负载平衡,每个新连接都以轮转方式与下一个可用服务器建立连接。
# round-robin-with-fallback:为了实现负载平衡,每个新连接都以轮询方式连接到下一个可用的从secondary服务器。如果secondary服务器不可用,则会使用主节点。
routing_strategy=first-available
4、启动mysql router
# 启动
mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf &
# 停止
ps -ef |grep mysqlrouter
kill -9 即可
rm -f /opt/software/mysql-router/mysql-router-8.0.34/data/mysqlrouter.pid
注意:停止后要删除pid文件,否则下次启动时会检测是否存在pid文件,如果存在是无法启动的
# 另外启动停止也可以写个脚本或者使用systemctl管理:
# 官网脚本如下:
// *** start.sh *********************** //
#!/bin/bash
basedir=/opt/myrouter
ROUTER_PID=$basedir/mysqlrouter.pid /usr/bin/mysqlrouter -c $basedir/mysqlrouter.conf &
disown %-
// *** stop.sh *********************** //
#!/bin/bash
if [ -f /opt/myrouter/mysqlrouter.pid ]; then
kill -HUP `cat /opt/myrouter/mysqlrouter.pid`
rm -f /opt/myrouter/mysqlrouter.pid
fi
# systemctl 配置如下:
cat > /usr/lib/systemd/system/mysqlrouter.service << EOF
[Unit]
Description=MySQL Router
After=syslog.target
After=network.target
[Service]
Type=simple
User=mysql
Group=mysql
PIDFile=/opt/software/mysql-router/data/mysqlrouter.pid
ExecStart=/opt/software/mysql-router/mysql-router-8.0.34/bin/mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf
Restart=on-failure
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
# 启动命令
systemctl start mysqlrouter
systemctl enablemysqlrouter
systemctl daemon-reload
5、测试读写分离和高可用
# 多次连接6446端口可以看到只会连到主节点
[13:50:31 mysql@ob03 mysql-router]$ for ((i=0;i<=2;i++));do mysql -h192.168.167.143 -P6446 -udba -p111111 -e"select @@hostname;";done;
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| ob01 |
+------------+
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| ob01 |
+------------+
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| ob01 |
+------------+
# 多次连接6447端口可以看到按配置的destination的节点顺序依次寻找
for ((i=0;i<=4;i++));do mysql -h192.168.167.143 -P6447 -udba -p111111 -e"select @@hostname;";done;
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| ob01 |
+------------+
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| ob02 |
+------------+
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| ob03 |
+------------+
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| ob01 |
+------------+
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| ob02 |
+------------+
# 高可用测试,把主节点down机,然后查看
mysql -h192.168.167.143 -P6446 -udba -p111111 -e"SELECT * FROM performance_schema.replication_group_members;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 626021e3-5dfc-11ef-946f-0050569179d8 | ob02 | 3306 | ONLINE | PRIMARY | 8.0.34 | XCom |
| group_replication_applier | 642dae8c-5dfc-11ef-9944-005056916eaa | ob03 | 3306 | ONLINE | SECONDARY | 8.0.34 | XCom |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
for ((i=0;i<=2;i++));do mysql -h192.168.167.143 -P6446 -udba -p111111 -e"select @@hostname;";done;
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| ob02 |
+------------+
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| ob02 |
+------------+
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| @@hostname |
+------------+
| ob02 |
+------------+
# 重新拉起老的主节点,查看下,重新加入集群作为secondary
mysql> start group_replication;
Query OK, 0 rows affected (9.66 sec)
mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 60b54ff1-5dfc-11ef-ba9a-0050569139fe | ob01 | 3306 | ONLINE | SECONDARY | 8.0.34 | XCom |
| group_replication_applier | 626021e3-5dfc-11ef-946f-0050569179d8 | ob02 | 3306 | ONLINE | PRIMARY | 8.0.34 | XCom |
| group_replication_applier | 642dae8c-5dfc-11ef-9944-005056916eaa | ob03 | 3306 | ONLINE | SECONDARY | 8.0.34 | XCom |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.00 sec)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix