一、环境准备

node1 192.168.157.128

node2 192.168.157.129

node3 192.168.157.130

三台机器分别安装MySQL8.0

二、增加my.cnf配置文件

以192.168.157.128为例,其他节点只需要修改server_id 和 loose-group_replication_local_address 即可。

server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE

log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE

transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aadaaaaa-adda-adda-aaaa-aaaaaaddaaaa"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address= "192.168.157.128:24901"
loose-group_replication_group_seeds= "192.168.157.128:24901,192.168.157.129:24902,192.168.157.130:24903"
loose-group_replication_bootstrap_group=OFF

三、启动MySQL服务

1. 增加mgr复制用户(三台机器都要操作)

SET SQL_LOG_BIN=0;
CREATE USER mgruser@'%' IDENTIFIED BY 'mgruser';
GRANT REPLICATION SLAVE ON *.* TO mgruser@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='mgruser', MASTER_PASSWORD='mgruser' FOR CHANNEL 'group_replication_recovery';

2. 下载mgr插件 (三台机器都要操作)

install PLUGIN group_replication SONAME 'group_replication.so';

查看是否下载成功,使用show plugins;语句查看

mysql 集群安装教程 mysql8自带集群搭建_mysql

 3. 启动mgr单主模式

主节点操作

SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;

从节点操作

START GROUP_REPLICATION;

查看此时MGR组信息,MEMBER_STATE状态全部是ONLINE才是成功。不然就需要查看日志信息。

SELECT * FROM performance_schema.replication_group_members;

mysql 集群安装教程 mysql8自带集群搭建_MySQL_02

 四、测试数据读写

主库上操作

1. 创建数据库

create database mgr;

查看从库上是否有数据库mgr

mysql 集群安装教程 mysql8自带集群搭建_MySQL_03

 

2. 创建表

use mgr;
CREATE TABLE `user` (
  `id` bigint NOT NULL ,
  `account` varchar(30)  NOT NULL ,
  `name` varchar(50) NOT NULL ,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `UN_ACCOUNT` (`account`) USING BTREE
)

从库上查看表信息

mysql 集群安装教程 mysql8自带集群搭建_MySQL_04

 3. 插入数据

INSERT INTO user VALUES (1, 'zhangsan', '张三');
INSERT INTO user VALUES (2, 'lisi', '李四');

从库查看信息如下

mysql 集群安装教程 mysql8自带集群搭建_运维_05

 4. 删除数据

delete from user where id = 1;

从库user表信息更新

mysql 集群安装教程 mysql8自带集群搭建_运维_06

5. 从库只有查询的权力,没有更改的权限

mysql 集群安装教程 mysql8自带集群搭建_MySQL_07

6. 主库服务停掉,查看从库状态变化

在node1 上执行

stop group_replication;

node1 状态变成OFFLINE下线状态

mysql 集群安装教程 mysql8自带集群搭建_mysql_08

 在node2 上查看组信息,发现node3现在的MEMBER_ROLE为PRIMARY

mysql 集群安装教程 mysql8自带集群搭建_mysql 集群安装教程_09

 重新启动node1

start group_replication;

node1 重新加入到组中,但是此时是从节点

mysql 集群安装教程 mysql8自带集群搭建_服务器_10

 五、MGR整合MySQL Router实现读写分离

1. 下载安装MySQL Router

这里我安装在node2节点上

# 下载
wget https://dev.mysql.com/get/Downloads/MySQL-Router/mysql-router-8.0.23-el7-x86_64.tar.gz
# 解压
tar -zxvf mysql-router-8.0.23-el7-x86_64.tar.gz
# 重命名
mv mysql-router-8.0.23-el7-x86_64 mysql-router-8.0
# 将mysql-router的目录添加到环境变量PATH中
echo "export PATH=$PATH:/opt/apps/mysql-router-8.0/bin/" >> /etc/profile
source /etc/profile
# 验证是否安装成功
mysqlrouter -V

2. 修改MySQL Router配置

在mysql-router-8.0目录下

# 创建日志和数据目录
mkdir logs data

在/etc 目录下创建mysqlrouter.cnf文件,内容如下

[keepalive]
interval = 60

[DEFAULT]
logging_folder=/opt/apps/mysql-router-8.0/logs
runtime_folder=/opt/apps/mysql-router-8.0/run
data_folder=/opt/apps/mysql-router-8.0/data
connect_timeout=30
read_timeout=30

[logger]
level = INFO

[routing:primary]
bind_address = 0.0.0.0
# 端口7001
bind_port = 7001  
max_connections = 1024
# 可用的支持写操作的主库,或者主库共用的IP
destinations = 192.168.157.128:3306,192.168.157.129:3306,192.168.157.130:3306 
routing_strategy = first-available

[routing:secondary] 
bind_address = 0.0.0.0 
# 端口7002
bind_port = 7002 
max_connections = 1024 
# 参与读负载均衡的从库
destinations = 192.168.157.129:3306,192.168.157.130:3306 
routing_strategy = round-robin

修改权限

chown -R mysql:mysql /opt/apps/mysql-router-8.0/
chown -R mysql:mysql /etc/mysqlrouter.conf

3. 启动MySQL Router

mysqlrouter --config=/etc/mysqlrouter.conf &

4. 验证是否正确

在node1 上连接 129 的 7001 端口查看现在的主库为node1,并且其他节点连接129的7001也均为node1。

mysql 集群安装教程 mysql8自带集群搭建_mysql 集群安装教程_11

在node1 上连接 129 的 7002 端口,显示连接的为node3

mysql 集群安装教程 mysql8自带集群搭建_MySQL_12

 在node2 上连接 129 的 7002 端口,显示连接的为node2

mysql 集群安装教程 mysql8自带集群搭建_MySQL_13

 在node3上连接 129 的 7002 端口,显示连接的为node3

mysql 集群安装教程 mysql8自带集群搭建_服务器_14

 至此,MySQL MGR集群安装完毕。

六、问题总结

1. 主库执行开始组复制的时候报错

The member was unable to join the group. Local port: 3306'

造成错误的原因是这个配置不是ip:port,而是三个连续的数字比如官网给的24091 24092 24093即可。

loose-group_replication_group_seeds= "192.168.157.128:3306,192.168.157.129:3306,192.168.157.130:3306"

2. 主库执行开始组复制的时候报错

Error on opening a connection to slave1:24901 on local port: 24901

需要先执行stop,然后重新start

3. 从库执行开始组复制的时候报错

Plugin group_replication reported: 'Group membership changed to localhost.localdomain:3306, localhost.localdomain:3306, localhost.localdomain:3306 on view 16643679251932611:5.'

需要修改hostname的名字,修改/etc/hosts,然后重启网卡。

#编辑/etc/hosts文件
vi /etc/hosts
192.168.157.128 node1
192.168.157.129 node2
192.168.157.130 node3
# 重启网卡
service network restart
# 查看hostname是否修改
hostname

4. 从库执行开始组复制的时候报错

Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. Error_code: MY-002061

STOP GROUP_REPLICATION;
SET GLOBAL group_replication_recovery_get_public_key=ON;
START GROUP_REPLICATION;

好了,MySQL集群就这样搭完了。大家快去试试吧。