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
相关推荐
夏乌_Wx2 小时前
Linux 多线程编程详解:从基础概念到同步机制
linux·操作系统·线程·线程同步
男孩李2 小时前
浅谈Linux上安装 PostgreSQL数据库
linux·运维·服务器
Qt程序员2 小时前
深入理解 Linux 内核 RCU 机制:从原理到实现
linux·c++·内核·linux内核·rcu
黄焖鸡能干四碗2 小时前
企业数据架构、应用架构、技术架构设计方案(PPT文件)
大数据·运维·数据库·安全·架构·需求分析
钝挫力PROGRAMER2 小时前
Linux systemd服务获取不到用户环境变量
linux·运维·python
志栋智能2 小时前
故障发现滞后、处置不及时引发的业务中断与数据风险,超自动化巡检帮您解决
运维·自动化
不会写DN2 小时前
php 如何使用mysqli连接mysql
开发语言·mysql·php
gechunlian882 小时前
Nginx多域名,多证书,多服务配置,实用版
运维·网络·nginx
Kapaseker2 小时前
你知道屏幕上存在多少个 Window 吗
android·kotlin