MGR单主模式部署
一、服务器设置
1.1环境准备
1.1.1服务器规划:
IP | 主机名 | 数据库版本信息 | server-id | 优先级 |
192.168.136.11 | mgr_node1 | MySQL-8.0.24 | 101 | 100 |
192.168.136.12 | mgr_node2 | MySQL-8.0.24 | 102 | 90 |
192.168.136.13 | mgr_node3 | MySQL-8.0.24 | 103 | 80 |
1.1.2关闭防火墙
# 关闭防火墙
systemctl stop firewalld
# 临时关闭
selinux setenforce 0
本次搭建涉及端口号:3306 、33061
1.1.3配置主机名,修改hosts文件
修改主机名
hostnamectl set-hostname mgr_node1
hostnamectl set-hostname mgr_node2
hostnamectl set-hostname mgr_node3
修改hosts文件
cat >> /etc/hosts <<EOF
192.168.136.11 mgr_node1
192.168.136.12 mgr_node2
192.168.136.13 mgr_node3
EOF
时间同步
# 时间同步
yum install ntpdate -y
ntpdate time.windows.com
1.2安装mysql
1.2.1下载
官网地址:https://dev.mysql.com/downloads/mysql/
链接:https://pan.baidu.com/s/10ctZd1sZurlmi6yhE0TX_Q 提取码:m9e7
链接:https://pan.baidu.com/s/15xVbZ5tLXyf87s4AMCH4eA 提取码:vn8f
1.2.2上传
解压安装
#解压
tar -xvf mysql-8.0.24-1.el7.x86_64.rpm-bundle.tar
#yum包安装
rpm -ivh mysql-community-* --nodeps --force
----------------------------------------------------
#二进制安装 (本文采用)
scp mysql-8.0.24-el7-x86_64.tar.gz 192.168.136.12:~
groupadd mysql
useradd -r -g mysql mysql
mkdir -pv /data/{data,log,temp}
chown -R mysql:mysql /data
mkdir /usr/local/mysql
tar -zxvf mysql-8.0.24-el7-x86_64.tar.gz
mv mysql-8.0.24-el7-x86_64/* /usr/local/mysql/
cd /usr/local/mysql/bin
ln -s /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
1.2.3创建mysql初始化目录
# 创建存放数据库初始化信息的目录
mkdir -pv /data/{data,log,temp}
# 修改数据目录属主属组
chown -R mysql:mysql /data
# 初始化数据库,设置默认密码为空
./mysqld --initialize-insecure --datadir=/data/data --user=mysql
# 修改数据目录属主属组
chown -R mysql:mysql /data
查看目录
tree /data/ -L 1
[root@mgr_node1 ~]# tree /data/ -L 1
/data/
├── data # 存放MySQL数据信息
├── log # 存放MySQL产生的错误日志,二进制日志信息
└── temp # 存放MySQL的一些临时文件,比如pid,sock文件
1.3生成MGR组名node1上执行
1.3.1修改node1上的my.cnf配置文件
vim /etc/my.cnf
内容如下:
[mysqld]
user=mysql
port=3306
datadir=/data/data
log-error=/data/log/err.log
pid-file=/data/temp/mysqld.pid
socket=/data/temp/mysql.sock
symbolic-links=0
#忘记密码时使用
#skip-grant-tables
#设置协议认证方式(重点啊)
default_authentication_plugin=mysql_native_password
[client]
socket=/data/temp/mysql.sock
1.3.2启动数据库
cd /usr/local/mysql/bin/
./mysqld --initialize-insecure --datadir=/data/data --user=mysql
./mysqld --defaults-file=/etc/my.cnf --daemonize
#修改root密码,执行命令之后输入您要设置的root密码
mysql -u root -p
mysql>set password for root@localhost ='tj123456';
#开放远程连接
mysql>use mysql;
mysql>update user set user.Host='%' where user.User='root';
mysql> flush privileges;
#确保navicat可以连接
mysql>ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'tj123456';
mysql> flush privileges;
1.3.3生成UUID,作为MGR组名
# 执行后输入密码(cnemc.cn)tj123456
[root@localhost repo.mysql.com]# mysql -uroot -p -e "SELECT UUID()"
Enter password:
+--------------------------------------+
| UUID() |
+--------------------------------------+
| 7fdbce46-aa47-11eb-9363-0050568f03a0 |
+--------------------------------------+
组名为:7fdbce46-aa47-11eb-9363-0050568f03a0
1.3.4修改my.cnf配置文件
vim /etc/my.cnf
修改内容如下:
[mysqld]
user=mysql
port=3306
datadir=/data/data
log-error=/data/log/err.log
pid-file=/data/temp/mysqld.pid
socket=/data/temp/mysql.sock
symbolic-links=0
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
server_id=101
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
master_info_repository=TABLE
relay_log_info_repository=TABLE
log_slave_updates=ON
log_bin=/data/log/binlog
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
#忘记密码时使用
#skip-grant-tables
#设置协议认证方式(重点啊)
default_authentication_plugin=mysql_native_password
plugin_load_add='group_replication.so'
loose-group_replication_group_name="d6dc0864-ae46-11eb-ab0e-0050568f03a0"
#配置 group_replication_start_on_boot 变量以off,指示插件在服务器启动时不自动启动操作。这在设置组复制时非常重要,因为它可以确保您可以在手动启动插件之前配置服务器。一旦配置了成员,就可以设置on以便在服务器启动时自动启动组复制
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "mgr_node1:33061"
loose-group_replication_group_seeds= "mgr_node1:33061,mgr_node2:33061,mgr_node3:33061"
loose-group_replication_bootstrap_group=off
loose-group_replication_member_weight=100
[client]
socket=/data/temp/mysql.sock
注:
server_id:不能与其他MySQL实例重复
loose-group_replication_group_name:通过SELECT UUID()生成一个UUID作为组名
loose-group_replication_local_address:当前节点用于内部通讯的ip:port
loose-group_replication_group_seeds:组内成员通讯的ip:port
基本参数 | 描述 |
user | 启动进程的user |
port | 数据库使用的端口 |
datadir | 数据库的数据目录位置 |
log-error | 数据库的错误日志位置 |
pid-file | 数据库的pid文件位置 |
socket | 数据库的sock文件位置 |
symbolic-links | 禁用符号链接以防止出现各种安全风险 |
MGR要求的相关参数 | 描述 |
server_id | 不同实例必须保证此server_id不同,如果启用了二进制日志记录,则必须指定该选项,否则不允许服务器启动 |
gtid_mode | 使用全局事务标识符(GTID)来标识事务。将此选项设置为–gtid-mode=ON 要求 enforce-gtid-consistency设置为ON |
enforce_gtid_consistency | ON:不允许任何事务违反GTID一致性 OFF:允许事务违反GTID一致性。WARN:允许所有事务违反GTID一致性,但在这种情况下会生成警告 |
master_info_repository | 设置从站将主状态和连接信息记录到 FILE(master.info)还是TABLE (mysql.slave_master_info)中 |
relay_log_info_repository | 设置从站在中继日志中的位置是写入FILE (relay-log.info)还是 写入TABLE (mysql.slave_relay_log_info)中 |
binlog_checksum | 启用后,此变量会使主服务器为二进制日志中的每个事件写入校验和,当binlog_checksum禁用(值 NONE)时,服务器通过编写和检查每个事件的事件长度(而不是校验和)来验证它是否只将完整事件写入二进制日志 |
log_slave_updates | 设置从主服务器接受的更新是否写入二进制日志中 |
log_bin | 设置二进制日志的位置 |
binlog_format | 二进制日志格式,有行模式,语句模式,混合模式,使用MGR必须使用行模式 |
组复制相关参数 | 描述 |
transaction_write_set_extraction | 定义用于生成标识与事务关联的写入的哈希的算法,哈希值将用于分布式冲突检测和处理 |
loose-group_replication_group_name | 通知插件它正在加入或创建的组,需要使用SELECT UUID()生成一个UUID |
loose-group_replication_start_on_boot | 指示插件在服务器启动时不自动引导组操作 |
loose-group_replication_local_address | 诉插件使用哪个ip:port与组中的其他成员进行内部通信。这里的ip与端口不能与MySQL提供的ip:port 相同,如果使用相同ip则port必须不相同 |
loose-group_replication_group_seeds | 设置组成员的主机名和端口 |
loose-group_replication_bootstrap_group | 插件是否引导组,此选项只能在任何时候在一个服务器实例上使用,通常是第一次引导组时(或者在整个组关闭并重新备份的情况下)。如果多次引导组,例如当多个服务器实例设置了此选项时,则可以创建一个人工分裂脑情景,其中存在两个具有相同名称的不同组。 |
loose-group_replication_single_primary_mode | 单主模式设置为ON,多主模式设置为OFF |
loose-group_replication_enforce_update_everywhere_checks | 在所有节点启用多主数据更新的严格一致性检查 |
1.3.5重启node1数据库
# 关闭数据库,执行后输入root密码
./mysqladmin -uroot -p shutdown
# 启动数据库
./mysqld --defaults-file=/etc/my.cnf --daemonize
1.4启动MGR节点
1.4.1登陆数据库
# 登陆数据库
mysql -uroot -ptj123456
1.4.2创建用户
# 创建MGR内部消息互通的用户
SET SQL_LOG_BIN=0;
CREATE USER mgr_user@'%' IDENTIFIED WITH mysql_native_password BY 'mgr@123';
GRANT BACKUP_ADMIN ON *.* TO mgr_user@'%'; GRANT REPLICATION SLAVE ON *.* TO mgr_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
1.4.3安装插件
# 安装MGR插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
# 检查是否成功安装
SHOW PLUGINS ;
1.4.4配置组
#构建 group replication 集群
CHANGE REPLICATION SOURCE TO SOURCE_USER='mgr_user', SOURCE_PASSWORD='mgr@123' FOR CHANNEL 'group_replication_recovery';
# 使用当前数据库节点引导组,一个组内只有一个节点能引导
# 不允许组内多次引导,这将导致产生两个相同名称的不同组
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION USER='mgr_user', PASSWORD='mgr@123';
SET GLOBAL group_replication_bootstrap_group=OFF;
1.4.5检查是否成功
SELECT * FROM performance_schema.replication_group_members\G
SELECT * FROM performance_schema.replication_group_members;
1.4.6添加测试数据
CREATE DATABASE test;
USE test;
CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
INSERT INTO t1 VALUES (1, 'Luis');
检查表t1和二进制日志的内容
SELECT * FROM t1;
+----+------+ | c1 | c2 | +----+------+ | 1 | Luis | +----+------+ SHOW BINLOG EVENTS; +---------------+------+----------------+-----------+-------------+----------------------------------------------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +---------------+------+----------------+-----------+-------------+----------------------------------------------------------------------------------+ | binlog.000001 | 4 | Format_desc | 101 | 125 | Server ver: 8.0.24, Binlog ver: 4 | | binlog.000001 | 125 | Previous_gtids | 101 | 152 |
1.5让其余节点加入组
1.5.1复制node1 的my.cnf文件
scp /etc/my.cnf 192.168.136.12:/etc/my.cnf
scp /etc/my.cnf 192.168.136.13:/etc/my.cnf
1.5.2修改配置文件
server_id修改为前期部署规划的值
loose-group_replication_local_address修改为该节点用于内部通讯的ip地址
loose-group_replication_member_weight 修改为前期部署规划的值
1.5.3启动数据库
# 初始化数据库,设置默认密码为空
cd /usr/local/mysql/bin/
./mysqld --initialize-insecure --datadir=/data/data --user=mysql
./mysqld --defaults-file=/etc/my.cnf --daemonize
#设置密码
mysql -u root -p
mysql>set password for root@localhost ='tj123456';
#开放远程连接
mysql>use mysql;
mysql>update user set user.Host='%' where user.User='root';
mysql> flush privileges;
#确保navicat可以连接
mysql>ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'tj123456';
mysql>flush privileges;
1.5.4创建用户
#创建MGR内部消息互通的用户
mgr_user SET SQL_LOG_BIN=0;
CREATE USER mgr_user@'%' IDENTIFIED WITH mysql_native_password BY 'mgr@123';
GRANT REPLICATION SLAVE ON *.* TO mgr_user@'%';
GRANT BACKUP_ADMIN ON *.* TO mgr_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
1.5.5安装插件加入组
# 安装MGR插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
# 加入组复制
reset master;
CHANGE REPLICATION SOURCE TO SOURCE_USER='mgr_user', SOURCE_PASSWORD='mgr@123' FOR CHANNEL 'group_replication_recovery';
START GROUP_REPLICATION USER='mgr_user', PASSWORD='mgr@123';
1.5.6检查是否成功
SELECT * FROM performance_schema.replication_group_members;
一旦node2为 ONLINE,则它开始处理与该组的交易。验证node2是否确实已与服务器node1同步,如下所示。
mysql> SHOW DATABASES LIKE 'test';
+-----------------+ | Database (test) | +-----------------+ | test | +-----------------+
mysql> SELECT * FROM test.t1;
+----+------+ | c1 | c2 | +----+------+ | 1 | Luis | +----+------+
mysql> SHOW BINLOG EVENTS;
1.5.7配置重启后自动加入组
一旦配置了成员,就可以设置on以便在服务器启动时自动启动组复制
修改/etc/my.cnf
原:loose-group_replication_start_on_boot=off
改:loose-group_replication_start_on_boot=on
重启数据库
1.6参考文档
https://dev.mysql.com/doc/refman/8.0/en/group-replication.html
https://cloud.tencent.com/developer/article/1684118
1.7配置systemctl管理
#现将原来模式启动的mysql关闭,然后再用systemd管理
pkill mysql
编写mysql服务
vim /etc/systemd/system/mysqld.service
内容如下
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
systemctl start mysqld
添加环境变量
echo 'export PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile
source /etc/profile