MySQL-Router+MySQL-MGR

文章目录

  • [1 环境](#1 环境)
  • [2 MySQL组复制(MGA)](#2 MySQL组复制(MGA))
    • [2.1 配置文件](#2.1 配置文件)
    • [2.2 配置组复制](#2.2 配置组复制)
    • [2.3 测试](#2.3 测试)
  • [3 MySQL-Router](#3 MySQL-Router)
    • [3.1 安装MySQL-Router](#3.1 安装MySQL-Router)
    • [3.2 配置文件](#3.2 配置文件)
    • [3.3 测试](#3.3 测试)

1 环境

没8.3的就看8.4的,不信可以自行尝试看8.0的

MySQL-Router:40、MySQL-Node:10、20、30

bash 复制代码
[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
[root@mysql-node1 ~]# vim /etc/my.cnf
[root@mysql-node1 ~]# cat /etc/my.cnf
[mysqld]
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0

server-id=10
log-bin=mysql-bin

gtid_mode=ON
enforce-gtid-consistency=ON
default_authentication_plugin=mysql_native_password
log_slave_updates=ON
binlog_format=ROW
binlog_checksum=NONE
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
[root@mysql-node1 ~]# for i in {20,30};do scp /etc/my.cnf root@172.25.254.$i:/etc/my.cnf; done

[root@mysql-node2 ~]# tail -n3 /etc/hosts
172.25.254.10   mysql-node1
172.25.254.20   mysql-node2
172.25.254.30   mysql-node3
[root@mysql-node2 ~]# vim /etc/my.cnf
[root@mysql-node2 ~]# grep server-id /etc/my.cnf
server-id=20

[root@mysql-node3 ~]# tail -n3 /etc/hosts
172.25.254.10   mysql-node1
172.25.254.20   mysql-node2
172.25.254.30   mysql-node3
[root@mysql-node3 ~]# vim /etc/my.cnf
[root@mysql-node3 ~]# grep server-id /etc/my.cnf
server-id=30

利用ansible还原节点数据
具体还原步骤

bash 复制代码
[devops@MySQL-Router ansible]$ ansible-playbook clear_mysql.yml -vv | grep password
172.25.254.30 root@localhost: Mo:FHoIs_4w9
172.25.254.10 root@localhost: xcaR*JtSc11d
172.25.254.20 root@localhost: g!,yC*g(4uu8

2 MySQL组复制(MGA)

2.1 配置文件

往配置文件中添加组复制配置

bash 复制代码
# node10
[root@mysql-node1 ~]# vim /etc/my.cnf
[root@mysql-node1 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0

server-id=10
log-bin=mysql-bin

gtid_mode=ON
enforce-gtid-consistency=ON
default_authentication_plugin=mysql_native_password
log_slave_updates=ON
binlog_format=ROW
binlog_checksum=NONE
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address="172.25.254.10:33061"
group_replication_group_seeds="172.25.254.10:33061,172.25.254.20:33061,172.25.254.30:33061"
group_replication_bootstrap_group=off
group_replication_single_primary_mode=OFF

# node20
[root@mysql-node2 ~]# vim /etc/my.cnf
[root@mysql-node2 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0

server-id=20
log-bin=mysql-bin

gtid_mode=ON
enforce-gtid-consistency=ON
default_authentication_plugin=mysql_native_password
log_slave_updates=ON
binlog_format=ROW
binlog_checksum=NONE
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address="172.25.254.20:33061"
group_replication_group_seeds="172.25.254.10:33061,172.25.254.20:33061,172.25.254.30:33061"
group_replication_bootstrap_group=off
group_replication_single_primary_mode=OFF

# node30
[root@mysql-node3 ~]# vim /etc/my.cnf
[root@mysql-node3 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0

server-id=30
log-bin=mysql-bin

gtid_mode=ON
enforce-gtid-consistency=ON
default_authentication_plugin=mysql_native_password
log_slave_updates=ON
binlog_format=ROW
binlog_checksum=NONE
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address="172.25.254.30:33061"
group_replication_group_seeds="172.25.254.10:33061,172.25.254.20:33061,172.25.254.30:33061"
group_replication_bootstrap_group=off
group_replication_single_primary_mode=OFF

2.2 配置组复制

bash 复制代码
# 配置组复制-在首台主机中
[root@mysql-node1 ~]# systemctl start mysqld.service
[root@mysql-node1 ~]# mysql -p'xcaR*JtSc11d'
mysql> alter user root@localhost identified by '123';
mysql> set sql_log_bin=0;
mysql> create user repl@'%' identified by '123';
mysql> grant replication slave on *.* to repl@'%';
mysql> grant connection_admin on *.* to repl@'%';
mysql> grant backup_admin on *.* to repl@'%';
mysql> grant group_replication_stream on *.* to repl@'%';
mysql> flush privileges;
mysql> set sql_log_bin=1;
mysql> change replication source to source_user='repl',source_password='123' for channel 'group_replication_recovery';
mysql> exit
# 查看组复制插件状态
[root@mysql-node1 ~]# mysql -p123 -e "show plugins" | grep .*replication.*
group_replication       ACTIVE  GROUP REPLICATION       group_replication.so    GPL
[root@mysql-node1 ~]# mysql -p123 -e "set global group_replication_bootstrap_group=on;"
[root@mysql-node1 ~]# mysql -p123 -e "start group_replication user='repl',password='123';"
[root@mysql-node1 ~]# mysql -p123 -e "set global group_replication_bootstrap_group=off;"
[root@mysql-node1 ~]# mysql -p123 -e "select * from performance_schema.replication_group_members\G"
*************************** 1. row ***************************
              CHANNEL_NAME: group_replication_applier
                 MEMBER_ID: 7ff6f96f-277b-11f1-a4ee-000c290f8099
               MEMBER_HOST: mysql-node1
               MEMBER_PORT: 3306
              MEMBER_STATE: ONLINE
               MEMBER_ROLE: PRIMARY
            MEMBER_VERSION: 8.3.0
MEMBER_COMMUNICATION_STACK: XCom

# 这里嫌麻烦直接都设置为主节点(刷节点1的命令就好),MGA允许多主架构,如果不嫌麻烦可以调整权限使其成为从节点(SECONDARY,通常只有只读权限)
# 在其余主机中配置组复制
[root@mysql-node2 ~]# systemctl start mysqld.service
[root@mysql-node2 ~]# mysql -p'g!,yC*g(4uu8'
mysql> alter user root@localhost identified by '123';
mysql> set sql_log_bin=0;
mysql> create user repl@'%' identified by '123';
mysql> grant replication slave on *.* to repl@'%';
mysql> grant connection_admin on *.* to repl@'%';
mysql> grant backup_admin on *.* to repl@'%';
mysql> grant group_replication_stream on *.* to repl@'%';
mysql> flush privileges;
mysql> set sql_log_bin=1;
mysql> change replication source to source_user='repl',source_password='123' for channel 'group_replication_recovery';
# 直接开启组复制会报错,得清除master数据-->reset master
mysql> start group_replication user='repl',password='123';
ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.
mysql> reset master;
mysql> start group_replication user='repl',password='123';
mysql> select * from performance_schema.replication_group_members\G
*************************** 1. row ***************************
              CHANNEL_NAME: group_replication_applier
                 MEMBER_ID: e1f0922b-2801-11f1-ba32-000c290f8099
               MEMBER_HOST: mysql-node1
               MEMBER_PORT: 3306
              MEMBER_STATE: ONLINE
               MEMBER_ROLE: PRIMARY
            MEMBER_VERSION: 8.3.0
MEMBER_COMMUNICATION_STACK: XCom
*************************** 2. row ***************************
              CHANNEL_NAME: group_replication_applier
                 MEMBER_ID: e441f19f-2801-11f1-91fb-000c2939010c
               MEMBER_HOST: mysql-node2
               MEMBER_PORT: 3306
              MEMBER_STATE: ONLINE
               MEMBER_ROLE: PRIMARY
            MEMBER_VERSION: 8.3.0
MEMBER_COMMUNICATION_STACK: XCom

# 同样的步骤设置其它节点
[root@mysql-node3 ~]# systemctl start mysqld.service
[root@mysql-node3 ~]# mysql -p'Mo:FHoIs_4w9'
..................
[root@mysql-node3 ~]# mysql -p123 -e "select * from performance_schema.replication_group_members\G"
*************************** 1. row ***************************
              CHANNEL_NAME: group_replication_applier
                 MEMBER_ID: e1f0922b-2801-11f1-ba32-000c290f8099
               MEMBER_HOST: mysql-node1
               MEMBER_PORT: 3306
              MEMBER_STATE: ONLINE		# 设备正常
               MEMBER_ROLE: PRIMARY		# 主,拥有读写权限的节点
            MEMBER_VERSION: 8.3.0
MEMBER_COMMUNICATION_STACK: XCom
*************************** 2. row ***************************
              CHANNEL_NAME: group_replication_applier
                 MEMBER_ID: e441f19f-2801-11f1-91fb-000c2939010c
               MEMBER_HOST: mysql-node2
               MEMBER_PORT: 3306
              MEMBER_STATE: ONLINE		# 设备正常
               MEMBER_ROLE: PRIMARY		# 主,拥有读写权限的节点
            MEMBER_VERSION: 8.3.0
MEMBER_COMMUNICATION_STACK: XCom
*************************** 3. row ***************************
              CHANNEL_NAME: group_replication_applier
                 MEMBER_ID: e66d0804-2801-11f1-bc2c-000c29a33d79
               MEMBER_HOST: mysql-node3
               MEMBER_PORT: 3306
              MEMBER_STATE: ONLINE		# 设备正常
               MEMBER_ROLE: PRIMARY		# 主,拥有读写权限的节点
            MEMBER_VERSION: 8.3.0
MEMBER_COMMUNICATION_STACK: XCom

2.3 测试

bash 复制代码
[root@mysql-node1 ~]# mysql -p123 -e "insert into test.userlist values('user1','123');"
[root@mysql-node1 ~]# mysql -p123 -e "select * from test.userlist;"
+----------+----------+
| username | password |
+----------+----------+
| user1    | 123      |
+----------+----------+
[root@mysql-node2 ~]# mysql -p123 -e "insert into test.userlist values('user2','456');select * from test.userlist;"
+----------+----------+
| username | password |
+----------+----------+
| user1    | 123      |
| user2    | 456      |
+----------+----------+
[root@mysql-node3 ~]# mysql -p123 -e "insert into test.userlist values('user3','789');select * from test.userlist;"
+----------+----------+
| username | password |
+----------+----------+
| user1    | 123      |
| user2    | 456      |
| user3    | 789      |
+----------+----------+

3 MySQL-Router

这个图片是找MySQL-Router的rpm包的教程的,下次不录gif动图了,图片有上传内存限制,直接录视频。

3.1 安装MySQL-Router

bash 复制代码
[root@MySQL-Router ~]# wget https://downloads.mysql.com/archives/get/p/41/file/mysql-router-community-8.4.7-1.el9.x86_64.rpm
[root@MySQL-Router ~]# dnf install -yq mysql-router-community-8.4.7-1.el9.x86_64.rpm
Installed:
  mysql-router-community-8.4.7-1.el9.x86_64
[root@MySQL-Router ~]# rpm -qc mysql-router-community
/etc/logrotate.d/mysqlrouter			# 日志轮询及日志截断策略
/etc/mysqlrouter/mysqlrouter.conf		# 主配置文件
[root@MySQL-Router ~]# systemctl status mysqlrouter.service  | grep loaded
     Loaded: loaded (/usr/lib/systemd/system/mysqlrouter.service; disabled; preset: disabled)

3.2 配置文件

bash 复制代码
[root@MySQL-Router ~]# vim /etc/mysqlrouter/mysqlrouter.conf
[root@MySQL-Router ~]# tail -n10 /etc/mysqlrouter/mysqlrouter.conf
[routing:ro]
bind_address = 0.0.0.0
bind_port = 7001
destinations = 172.25.254.10:3306,172.25.254.20:3306,172.25.254.30:3306
routing_strategy = round-robin
[routing:rw]
bind_address = 0.0.0.0
bind_port = 7002
destinations = 172.25.254.30:3306,172.25.254.20:3306,172.25.254.10:3306
routing_strategy = first-available
[root@MySQL-Router ~]# systemctl enable --now mysqlrouter.service
[root@MySQL-Router ~]# ps -aux | grep mysqlrouter
mysqlro+    2364  0.0  0.6 438964 24136 ?        Ssl  14:35   0:00 /usr/bin/mysqlrouter
root        2377  0.0  0.0   6408  2304 pts/0    S+   14:35   0:00 grep --color=auto mysqlrouter
[root@MySQL-Router ~]# netstat -lntupa | grep mysqlrouter
tcp        0      0 0.0.0.0:7001            0.0.0.0:*               LISTEN      2364/mysqlrouter
tcp        0      0 0.0.0.0:7002            0.0.0.0:*               LISTEN      2364/mysqlrouter

3.3 测试

bash 复制代码
# 创建远程用户,给远程用户授权
[root@mysql-node1 ~]# mysql -p123 -e "create user remote@'%' identified by '123';grant all on *.* to remote@'%'"
[root@mysql-node1 ~]# mysql -p123 -e "select user, host, plugin, authentication_string, password_expired from mysql.user;" | grep remote
remote  %       mysql_native_password   *23AE809DDACAF96AF0FD78ED04B6A265E05AA257       N
# 可以正常登录
[root@MySQL-Router ~]# mysql -uremote -p123 -h172.25.254.10
mysql> exit
[root@MySQL-Router ~]# mysql -uremote -p123 -h172.25.254.20
mysql> exit
[root@MySQL-Router ~]# mysql -uremote -p123 -h172.25.254.30
mysql> exit
# 调度测试
[root@MySQL-Router ~]# watch -n1 lsof -i :3306
# round-robin(轮询)
[root@MySQL-Router ~]# mysql -uremote -p123 -h172.25.254.40 -P7001
# first-available(第一个可通),安装destinations列表中的顺序调度,连通节点就一直连这个节点,连不通就下一个。
[root@MySQL-Router ~]# mysql -uremote -p123 -h172.25.254.40 -P7002
相关推荐
小码农 - 初5 小时前
MySQL 增删改查
mysql
DLYSB_8 小时前
存储运维实战:基于 Ceph Event 监听与 Python 适配器的分布式存储健康度物理声光响应架构
运维·ceph·python·报警灯
爱丶狸9 小时前
Grafana_Zabbix_ImageRenderer_部署与前端操作手册
linux·前端·zabbix·grafana·kylin
阿里云云原生10 小时前
可用性从 99.9% 跃升至 99.995%:畅捷通如何用 AI 重塑运维底座?
运维·网络·人工智能
k4m7v2pz10 小时前
把 Bevy 0.14 游戏移植到 R36S 掌机:一场与“无窗口系统“的搏斗
linux·rust·bevy·r36s·rk3326·开源掌机
阿童木写作10 小时前
Python实现Temu图片批量翻译自动化教程
运维·人工智能·python·自动化
iori97king11 小时前
库存不足自动通知:第一次使用自动化
运维·自动化
@insist12311 小时前
信息系统管理工程师-信息系统运维资源、技术与智能运维核心考点解析
运维·软考·信管·软件水平考试·信息系统管理工程师
木子欢儿12 小时前
Intel 架构的 MacBook Pro 运行 Linux 发热量高解决
linux·运维·服务器
凌虚12 小时前
面向 MySQL 用户的 PostgreSQL 快速上手指南
数据库·后端·架构