Mysql MGR集群方案搭建和配置
下面基于Centos环境下的Mysql MGR集群方案的搭建和配置
搭建步骤
虚拟机环境准备
3台CentOS7系统虚拟机,2G内存2核CPU,10G硬盘
CentOS7系统要求安装Yum与Vim,采用“服务器“模式安装已内置
单主MGR拓扑
192.168.137.230-Master服务器(hostname:n0)
192.168.137.231-Slave服务器1(hostname:n1)
192.168.137.232-Slave服务器2(hostname:n2)
系统环境脚本
开头结尾带 * 号的注释说明下行代码需要根据环境进行调整请将下面代码片段在每一台节点上运行
#更改IP地址脚本
cd /etc/sysconfig/network-scripts
sed -i 's/dhcp/static/g' ifcfg-ens33
sudo cat >> ifcfg-ens33 <<-'EOF'
#*三台服务器都要运行这段脚本,依次将下面230/231/232*
IPADDR=192.168.137.230
GATEWAY=192.168.137.2
NETMASK=255.255.255.0
DNS1=192.168.137.2
DNS2=8.8.8.8
EOF
#重启网络将IP地址生效
service network restart
#将Hosts文件写入n0/n1/n2节点与IP对应关系,后面配置采用域名访问
#将Hosts文件写入n0/n1/n2节点与IP对应关系,后面配置采用域名访问
sudo cat > /etc/hosts <<-'EOF'
192.168.137.230 n0
192.168.137.231 n1
192.168.137.232 n2
EOF
#*修改当前主机的名字,230->n0,231->n1,232-n2*
hostnamectl set-hostname n0
#大坑1:
#临时关闭selinux防火墙,开启后端口将无法访问,开发环境可以这样用
#生产环境这块安全配置更麻烦点,咱们后面再说
setenforce 0
#放行端口,3306MySQL默认端口,24901MGR通信端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=24901/tcp --permanent
firewall-cmd --reload
安装部署MySQL
采用MySQL官方YUM仓库方式安装
安装MySQL官方 Yum 安装源,请将下面代码片段在每一台节点上运行
cd /home/
wget --no-check-certificate https://repo.mysql.com/mysql80-community-release-el7-5.noarch.rpm
yum localinstall -y mysql80-community-release-el7-5.noarch.rpm
安装MySQL 8.0.28
#自动安装MySQL 8.0.28
yum install -y mysql-community-server
调整配置文件
主从三个节点配置文件是不同的,请分别复制粘贴
n0-230-Master节点
#安装完成,追加mysql
sudo cat >> /etc/my.cnf <<-'EOF'
#使用mysql_native_password密码策略,防止navicat连不上mysql8
default_authentication_plugin=mysql_native_password
#设置MySQL插件所在目录,因为MGR基于插件,所以必须设置插件路径
plugin_dir=/usr/lib64/mysql/plugin
#服务器编号,Master=1
server_id=1
#开启binlog的GTID模式
gtid_mode=ON
#开启后MySQL只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行
enforce_gtid_consistency=ON
#关闭binlog校验
binlog_checksum=NONE
#定义用于事务期间哈希写入提取的算法,组复制模式下必须设置为 XXHASH64。
transaction_write_set_extraction=XXHASH64
#确定组复制恢复时是否应该应用 SSL,通常设置为“开”,但默认设置为“关”。
loose-group_replication_recovery_use_ssl=ON
#该服务器的实例所在复制组的名称,必须是有效的 UUID,所有节点必须相同。
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
#确定服务器是否应该在服务器启动期间启动组复制。
loose-group_replication_start_on_boot=OFF
#大坑2:
#为复制组中其他的成员提供的网络地址,指定为“主机:端口”的格式化字符串。
#很多人想当然认为端口应该是3306,起始不然,MGR需要开启新端口24901同步交换
#所以这里不要写错,同时,前面我们配置了hosts文件做了主机名与IP的映射,这里直接写主机名即可
loose-group_replication_local_address="n0:24901"
#用于建立新成员到组的连接组成员列表。
#这个列表指定为由分隔号间隔的组成员网络地址列表,类似 host1:port1、host2:port2 的格式。
#同样采用n0~n2的主机名替代
loose-group_replication_group_seeds="n0:24901,n1:24901,n2:24901"
#配置此服务器为引导组,这个选项必须仅在一台服务器上设置,
#并且仅当第一次启动组或者重新启动整个组时。成功引导组启动后,将此选项设置为关闭。
loose-group_replication_bootstrap_group=OFF
EOF
#启动MySQl服务器
systemctl start mysqld
n1-231-Slave节点1
从节点和主节点的配置变化部分通过注释标出
sudo cat >> /etc/my.cnf <<-'EOF'
default_authentication_plugin=mysql_native_password
plugin_dir=/usr/lib64/mysql/plugin
#设置唯一的服务器编号
server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
#这个参数决定primary节点到secondary节点的请求是否为基于 RSA 密钥对的密码交换所需的公钥
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_recovery_use_ssl=ON
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF
#设置本机地址n1:24901
loose-group_replication_local_address="n1:24901"
loose-group_replication_group_seeds="n0:24901,n1:24901,n2:24901"
loose-group_replication_bootstrap_group=OFF
EOF
#启动MySQl服务器
systemctl start mysqld
n2-232-Slave节点2
从节点和主节点的配置变化部分通过注释标出
sudo cat >> /etc/my.cnf <<-'EOF'
default_authentication_plugin=mysql_native_password
plugin_dir=/usr/lib64/mysql/plugin
#设置唯一的服务器编号
server_id=3
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
#这个参数决定primary节点到secondary节点的请求是否为基于 RSA 密钥对的密码交换所需的公钥
loose-group_replication_recovery_get_public_key=ON
loose-group_replication_recovery_use_ssl=ON
loose-group_replication_group_name="bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee"
loose-group_replication_start_on_boot=OFF
#设置本机地址n2:24901
loose-group_replication_local_address="n2:24901"
loose-group_replication_group_seeds="n0:24901,n1:24901,n2:24901"
loose-group_replication_bootstrap_group=OFF
EOF
#启动MySQl服务器
systemctl start mysqld
初始化MySQL数据库
获取初始密码
grep 'temporary password' /var/log/mysqld.log
修改初始密码并设置主从同步账户(进入mysql)
#修改root密码为asAS123456!
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'asAS123456!';
#创建rpl_user账户,此账户用于实现主从数据同步
CREATE USER rpl_user@'%' IDENTIFIED BY 'asAS123456!';
#赋予主从同步权限
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
#创建一个远程连接用户,这个用户用在Navcate、JDBC登录的时候,直接用root登录不好
create user 'remote'@'%' identified with mysql_native_password by 'asAS123456!';
#为remote用户赋予所有数据库资源的访问权限,熟悉grant的可以自己调整
grant all privileges on *.* to remote@'%';
#让刚才的修改生效
FLUSH PRIVILEGES;
#大坑3:
#删除已产生的Binlog
#一定要RESET MASTER,它会删除刚才已产生的Binlog
#因为刚才Binglog包含创建用户这种高权限操作,用于主从同步的rpl_user账户是没有权限执行的
#这就会导致RelayLog重放无法正确执行,导致从属服务器卡死在"RECEVERING"状态
#利用RESET MASTER删除这些无法执行的binlog,就没问题了
#就是这个卡了我3个小时 5555
RESET MASTER;
安装MGR插件
每一台节点,在MySQL提示符状态下,使用INSTALL PLUGIN安装MGR插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
#运行下面的SQL,看到结果出现PLUGIN_STATUS=ACTIVE,说明安装成功了
SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'group_replication' \G;
组网数据同步
组网同步需要主从运行不同的脚本
n0-230-Master节点
在 primary.cnf 配置文件中把 group_replication_bootstrap_group 参数设置成 OFF,在 primary 服务器启动时并不会直接启动复制组,通过下面的命令动态的开启复制组是集群更安全。
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
运行成功,可以在linux命令提示符下
tail -f /var/log/mysqld.log
看到下面的数据代表Master启动成功
Plugin group_replication reported: 'This server is working as primary member.'
n1-231-Slave节点1与n2-232-Slave节点2
从节点运行下面的命令
#指定主从账户与指定通信频道
CHANGE MASTER TO MASTER_USER="rpl_user", MASTER_PASSWORD="asAS123456!" FOR CHANNEL
'group_replication_recovery';
#开启组网数据同步
START GROUP_REPLICATION;
#当两个从节点都运行完毕后,运行下面结果进行验证。
SELECT * FROM performance_schema.replication_group_members;
看到一主两从都是“ONLINE”状态,代表组网成功