Mysql组复制+Mysql-router部署搭建
实验环境:
节点名称 IP 角色 mysql 版本 组复制端口号 mysqlrouter1端口 端口角色 mysqlrouter2端口 端口角色
app-01 192.168.100.104 mgr主/mysqlrouter 主 8.0.25 33061 7001 读写 7001 读写
app-01 192.168.100.242 mgr从/mysqlrouter 从 8.0.25 33061 7002 只读 7002 只读
docker-hub 192.168.100.236 mgr从 8.0.25 33061
三个节点最多容忍1个节点发生故障(非自愿自组,停止mysql服务属于自愿自组),2个节点发生故障,整个组复制将会阻塞,最后的server节点状态将会显示为
ERROR,此时虽然后还有mysql节点,但是只能读,不能写,这个适合需要人为接入,重头启动整个组复制.当然此时不需要再执行change和添加权限等操作.
修改/etc/hosts文件,添加3个计算机名称,三个节点都需要修改,保证主机名可以互相ping通
正常安装单实例mysql
使用初始密码登录,修改root密码set password='Hjlydata@2018';
登录mysql安装mgr插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
进入mysql,查看插件 show plusgins;是否存在group_replication
修改配置文件,添加以上参数,注意部分参数需要个性化,同时需要复制到/etc/my.cnf一份。
------------组复制配置文件添加------
在以往mysql配置文件[mysqld]配置段添加如下参数:
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
binlog_checksum=NONE #修改以往这个参数值为NONE
transaction_write_set_extraction=XXHASH64
slave-parallel-workers=4
slave-preserve-commit-order=1
slave-parallel-type=LOGICAL_CLOCK
group_replication_group_name="34d9b756-100f-11ea-a5ff-005056842fb1" #在任意一个mysql中使用selecct uuid();获取一个有效的,三个节点配置一致
group_replication_start_on_boot=off
group_replication_local_address= "192.168.100.104:33061" #自定义修改为本机的ip和自定义端口
group_replication_group_seeds= "192.168.100.104:33061, 192.168.100.24233061, 192.168.100.236:33061" #按照实际填写,三个节点均填写一致
group_replication_bootstrap_group=off
group_replication_unreachable_majority_timeout=5
group_replication_compression_threshold=131072
group_replication_transaction_size_limit=20971520
在第一个节点app-01添加组复制相关账号权限
set sql_log_bin=0;
CREATE USER rpl_user@'%' identified with mysql_native_password by 'repl8LJpHMhrp';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
set sql_log_bin=1;
开启组复制通道
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='repl8LJpHMhrp' FOR CHANNEL 'group_replication_recovery';
启动组复制,注意此处操作只在一个节点上操作一遍其他,其他节点无需设置该参数,直接start group_replication即可.
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
查看成员,会看到只有1个成员,稍后需要其他成员加入进来
SELECT * FROM performance_schema.replication_group_members;
其他节点加入组复制:
按照节点一方式安装mysql,组复制插件后,修改配置文件后,添加账号权限,START GROUP_REPLICATION即可,切忌不要执行
SET GLOBAL group_replication_bootstrap_group=ON;此命令只需要在一台机器上执行接口,并且启动组复制后,需要设置该参数为OFF,否则会启动多个相同名字的通道,彼此无法加入
,你将会看到几个数据库都只能看到自己为primary角色,启动完毕后查看成员,第三个节点启动组复制后,查看组成员。
SELECT * FROM performance_schema.replication_group_members;
root@server 15:29: [(none)]> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
| group_replication_applier | 11c2a2e2-d2f8-11eb-90b5-000c297b1f21 | app-02 | 3306 | ONLINE | PRIMARY | 8.0.25 |
| group_replication_applier | 1a19ebd5-d2f8-11eb-be56-000c295bbabe | app-01 | 3306 | ONLINE | SECONDARY | 8.0.25 |
| group_replication_applier | 7910bd7b-d2f7-11eb-ac0b-000c29cdac76 | docker-hub | 3306 | ONLINE | SECONDARY | 8.0.25 |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
单主,多主切换
说明:单主只能主写入,多主全部可写入
切换为单主:
SELECT group_replication_switch_to_single_primary_mode();
切换为多主:
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%";
注意,切换为单主状态后,主可能不是原来那个节点,也可能是其他节点
查看是否是只可读状态
show variables like '%super_read_only%';
问题一:
如无法看到其他节点,请检查/etc/my.cnf配置文件是否存在,同时可以尝试停止所有组复制STOP GROUP_REPLICATION 后,reset master ,3个节点重新开启通道,按顺序启动组复制。
---------其他命令-------------
初始化脚本:
删除现有data文件夹
rm -rf /data/mysql/mysql3306/data/
/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3306/my3306-mgr33061.cnf --initialize --lower-case-table-names=1
/usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3306/my3306.cnf --initialize --lower-case-table-names=1
删除rpl_user
set sql_log_bin=0;
drop user rpl_user@'%';
set sql_log_bin=1;
FLUSH PRIVILEGES;
----------------------
=====mysql-router部署=========
特别注意:程序使用mysqlrouter进行连接,要求程序需要有错误重试功能。
官方下载mysqlrouter
cd /opt
wget https://dev.mysql.com/get/Downloads/MySQL-Router/mysql-router-8.0.25-el7-x86_64.tar.gz
tar zxvf mysql-router-8.0.25-el7-x86_64.tar.gz
创建软连接
ln -s /opt/mysql-router-8.0.25-el7-x86_64 /usr/local/mysql-router
添加PAHT环境变量并生效
PAHT=${PAHT}:/usr/local/mysql-router/bin
source /etc/profile
创建相应的文件夹
mkdir /usr/local/mysql-router/{data,log}
chown -R mysql:mysql /usr/local/mysql-router
创建配置文件
cp /usr/local/mysql-router/share/doc/mysqlrouter/sample_mysqlrouter.conf /etc/mysql-router.conf
修改配置模板如下:
[DEFAULT]
logging_folder = /usr/local/mysql-router/log
plugin_folder = /usr/local/mysql-router/lib/mysqlrouter
config_folder = /etc
#runtime_folder = /var/run
data_folder = /usr/local/mysql-router/data
#keyring_path = /var/lib/keyring-data
#master_key_path = /var/lib/keyring-key
[logger]
level = INFO
filename = mysqlrouter.log
#timestamp_precision = second
[routing:default_rw]
# To be more transparent, use MySQL Server port 3306
bind_address = 0.0.0.0
bind_port = 7001
routing_strategy = first-available
destinations = 192.168.100.104:3306,192.168.100.242:3306,192.168.100.104:3306
[routing:default_r]
# To be more transparent, use MySQL Server port 3306
bind_address = 0.0.0.0
bind_port = 7002
routing_strategy = round-robin
destinations = 192.168.100.104:3306,192.168.100.242:3306
# If no plugin is configured which starts a service, keepalive
# will make sure MySQL Router will not immediately exit. It is
# safe to remove once Router is configured.
[keepalive]
interval = 60
此配置文件使用7001端口接受mysql读写,使用7002端口接受只读访问,可以修改里面的destinations来添加节点
,其中routing_strategy策略定义了访问测试,建议可读写配置段使用first-available,即便primary宕机,会依次寻找可用节点写入(程序要有错误重试),只读配置段使用round-robin,轮询读数据
策略介绍:
first-available:新连接从目标列表路由到列表中第一个可用服务器。如果失败,则使用下一个可用服务器。此循环将持续到所有服务器都不可用。
next-available:和first-available相似,新连接从目的地列表路由到第一个可用服务器。不同豫first-available的是,如果服务器被标记为无法访问,则它将被丢弃,并且永远不会再次用作目标。
重新启动MySQL-router后,所有之前被丢弃设为不可用的服务器都将恢复可用。
round-robin:对于负载平衡,每个新连接都以循环方式进入下一个可用服务器。
round-robin-with-fallback:对于负载平衡,每个新连接以循环方式对下一个可用的辅助服务器进行。如果辅助服务器不可用,则主列表中的服务器将以循环方式使用。
启动:
mysqlrouter --config=/etc/mysql-router.conf &
查看后备节点,核对是否符合策略,可返回实际处理此次请求的的主机名或端口号
mysql -uroot -p -P 7001 -h 192.168.100.104 -e 'select @@hostname'
mysql -uroot -p -P 7001 -h 192.168.100.104 -e 'select @@port'
查看日志:
tail -f /usr/local/mysql-router/log/mysqlrouter.log
如需保证高可用,可以安装两个节点,配置一样,跟nginx类似。
相关命令:
reset master
STOP GROUP_REPLICATION;
UNINSTALL PLUGIN group_replication;
评论