1. 安装MySQL
1.1 MySQL 下载
-
下载mysql安装
https://dev.mysql.com/downloads/mysql/
1.2 安装MySQL8.0
在三个节点均执行以下操作:
- 查看mariadb并移除
# 1、查看 mariadb 的安装包
rpm -qa | grep mariadb </pre>
# 2、卸载mariadb 需要管理员权限,否在会报错
rpm -e XXXXXX --nodeps
# 3、再次查看
rpm -qa | grep mariadb
- 安装mysql
# 1、在/usr/local(存放本地的共享资源)目录下创建mysql文件夹,通过ll查看目录结构
cd /usr/local
mkdir mysql
ll
# 2、上传下载的mysql压缩包文件到mysql文件下
# 3、解压文件
tar -xvf mysql-8.0.23-1.el7.x86_64.rpm-bundle.tar</pre>
# 4、安装common,libs, client,server
rpm -ivh mysql-community-common-8.0.23-1.el7.x86_64.rpm --nodeps --force
rpm -ivh mysql-community-libs-8.0.23-1.el7.x86_64.rpm --nodeps --force
rpm -ivh mysql-community-client-8.0.23-1.el7.x86_64.rpm --nodeps --force
rpm -ivh mysql-community-server-8.0.23-1.el7.x86_64.rpm --nodeps --force
# 5、检查mysql安装情况
rpm -qa | grep mysql
1.3 配置MySQL相关信息
# 1、初始化和配置mysql
mysqld --initialize;
chown mysql:mysql /var/lib/mysql -R;
systemctl start mysqld.service;
systemctl enable mysqld;
# 2、查看数据库密码
cat /var/log/mysqld.log | grep password
# 3、登录mysql密码直接复制粘贴上面随机的密码
mysql -uroot -p
# 4、修改mysql密码为123456
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
# 5、进行远程访问的授权
create user 'root'@'%' identified with mysql_native_password by '123456';
grant all privileges on *.* to 'root'@'%' with grant option;
flush privileges;
# 6、修改加密规则
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
flush privileges;
exit; # 提出mysql登录
1.4 Navicat连接数据库
# 1、尝试用navicat连接数据库,但需要关闭firewall
systemctl stop firewalld.service;
systemctl disable firewalld.service;
systemctl mask firewalld.service;
# 2、安装 iptables 防火墙
yum -y install iptables-services
# 3、启动设置防火墙
systemctl enable iptables;
systemctl start iptables;
# 4、命令编辑防火墙 添加端口
vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8090 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 33061 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 33062 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 33063 -j ACCEPT
# 5、重启防火墙使配置生效
systemctl restart iptables.service
# 6、设置防火墙开机启动
systemctl enable iptables.service
# 7、ifconfig 命令查看 ip
使用navicat本地测试连接
2. 搭建MGR群
2.1 环境信息
- 服务器基本信息
主机 | 操作系统 | IP与HostName映射 |
---|---|---|
服务器1 | Centos7 | 172.20.10.14 node1.mgr.com |
服务器2 | Centos7 | 172.20.10.13 node2.mgr.com |
服务器3 | Centos7 | 172.20.10.2 node3.mgr.com |
- 设置hostname和ip映射信息
# 在三个节点每个虚拟机上均要配置
vi /etc/hosts
172.20.10.14 node1.mgr.com
172.20.10.13 node2.mgr.com
172.20.10.2 node3.mgr.com
-
修改mysql配置文件信息(三个节点均需配置)
修改每个节点的配置,3个节点除了server_id、loose-group_replication_local_address参数不一样外,其他保持一致。注意:其中33061,33062,33063并非mysql服务端口号。
# 打开编辑配置文件
vim /etc/my.cnf
# 具体配置信息内容如下(以第一个节点为例):
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
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= "node1.mgr.com:33061"
loose-group_replication_group_seeds= "node1.mgr.com:33061,node2.mgr.com:33062,node3.mgr.com:33063"
loose-group_replication_bootstrap_group=OFF
第二个节点修改内容如下:
server_id=2
loose-group_replication_local_address= "node2.mgr.com:33062"
第三个节点修改内容如下:
server_id=3
loose-group_replication_local_address= "node3.mgr.com:330</pre>
2.2 创建复制环境
- 创建复制账号(三个节点均需配置)
# 设置复制账号
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER repl@'%' IDENTIFIED BY 'repl';
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl' FOR CHANNEL 'group_replication_recovery';
- 安装MGR插件
# 安装插件
mysql> install PLUGIN group_replication SONAME 'group_replication.so';
-- 查看group replication组件
mysql> show plugins;
2.3 启动MGR单主模式
2.3.1 启动MGR
- 主节点执行命令
# 1、启动MGR,在主库(172.20.10.14)上执行
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
# 2、查看MGR组信息
mysql> SELECT * FROM performance_schema.replication_group_members;
在 START GROUP_REPLICATION时,报错如下:
[Repl] Plugin group_replication reported: '[GCS] Error connecting to the local group communication engine instance.'
[Repl] Plugin group_replication reported: '[GCS] The member was unable to join the group. Local port: 33061'
解决措施如下:
1.关闭SELinux,不太安全,不特别推荐
setenforce 0
2.开放通讯端口(推荐)
yum install -y policycoreutils-python
semanage port -a -t mysqld_port_t -p tcp 33061
- 从节点执行命令
# 1、其他节点加入MGR,在从库(172.20.10.13,172.20.10.2)上执行
mysql> START GROUP_REPLICATION;
# 2、查看MGR组信息
mysql> SELECT * FROM performance_schema.replication_group_members;
此中方式在查看MGR组信息时,2个从节点状态一直处于RECOVING状态,通过cat /var/log/mysqld.log查看报错信息如下:
[ERROR] [MY-010584] [Repl] Slave I/O for channel 'group_replication_recovery': error connecting to master 'repl@node1.mgr.com:3306' - retry-time: 60 retries: 1 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. Error_code: MY-002061
[ERROR] [MY-011582] [Repl] Plugin group_replication reported: 'There was an error when connecting to the donor server. Please check that group_replication_recovery channel credentials and all MEMBER_HOST column values of performance_schema.replication_group_members table are correct and DNS resolvable.'
[ERROR] [MY-011583] [Repl] Plugin group_replication reported: 'For details please check performance_schema.replication_connection_status table and error log messages of Slave I/O for channel group_replication_recovery.'
解决措施如下:
mysql8.0之后加密规则变成 caching_sha2_password,需打开公钥访问(在每个从节点执行)
mysql> set global group_replication_recovery_get_public_key=on;
mysql> start group replication;
再次查看mgr信息
mysql>SELECT * FROM performance_schema.replication_group_members;
3个节点状态为online,并且主节点为node1.mgr.com,只有主节点可以写入,其他节点只读,MGR单主模式搭建成功。
2.3.2 简单测试
- node1.mgr.com上创建测试库、表,并添加数据,测试从库是否能同步数据;在从节点node2.mgr.com,node3.mgr.com写入数据是否可以写入。
# 1、在node1.mgr.com点执行
mysql> CREATE DATABASE test;
mysql> USE test;
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
mysql> INSERT INTO t1 VALUES (1, 'Luis');
# 2、在3个节点查看均可查看到相同结果均有数据表和数据
mysql> select * from test.t1;
# 3、在从节点测试写入,验证不支持写入操作
- node1.mgr.com上创建测试库、表,并添加数据,测试新节点接入到组中后,是否同步数据。
# 1、在node2.mgr.com上执行,从mgr组中去除
mysql> stop group_replication;
# 2、在node1.mgr.com或node3.mgr.com查看,仅剩2个节点
mysql> SELECT * FROM performance_schema.replication_group_members;
# 3、在node1.mgr.com进行写操作,此时查看node2.mgr.com数据库信息并没有信息同步
# 4、将node2.mgr.com加入mgr组,在node2.mgr.com执行,之后在查看信息,数据库信息已同步
mysql> start group_replication;
2.4 切换MGR模式(单到多,多到单)
2.4.1 切换多主模式
MGR切换模式需要重新启动组复制,在所有节点上先关闭组复制,设置 group_replication_single_primary_mode=OFF 等参数,再启动组复制。
# 1、停止组复制(所有节点执行):
mysql> stop group_replication;
mysql> set global group_replication_single_primary_mode=OFF;
mysql> set global group_replication_enforce_update_everywhere_checks=ON;
# 2、随便选择某个节点执行
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
# 3、其他节点执行
mysql> START GROUP_REPLICATION;
# 4、查看组信息,所有节点的 MEMBER_ROLE 都为 PRIMARY
mysql> SELECT * FROM performance_schema.replication_group_member
可以看到所有节点状态都是online,角色都是PRIMARY,MGR多主模式搭建成功。
2.4.1.1 简单测试
# 1、在任意节点均可执行写操作
mysql> CREATE DATABASE test;
mysql> USE test;
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
mysql> INSERT INTO t1 VALUES (1, 'Luis');
# 2、在3个节点查看均可查看到相同结果
mysql> select * from test.t1;
2.4.2 切换单主模式
# 1、所有节点执行
mysql> stop group_replication;
mysql> set global group_replication_enforce_update_everywhere_checks=OFF;
mysql> set global group_replication_single_primary_mode=ON;
# 2、主节点(172.20.10.14)执行
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
# 3、从节点(172.20.10.13、172.20.10.2)执行
START GROUP_REPLICATION;
# 4、查看MGR组信息
mysql> SELECT * FROM performance_schema.replication_group_members;