> 文档中心 > MySQL8.0之MGR单主模式部署(一)

MySQL8.0之MGR单主模式部署(一)

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=mysqlport=3306datadir=/data/datalog-error=/data/log/err.logpid-file=/data/temp/mysqld.pidsocket=/data/temp/mysql.socksymbolic-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=mysqlport=3306datadir=/data/datalog-error=/data/log/err.logpid-file=/data/temp/mysqld.pidsocket=/data/temp/mysql.socksymbolic-links=0disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"​server_id=101gtid_mode=ONenforce_gtid_consistency=ONbinlog_checksum=NONEmaster_info_repository=TABLErelay_log_info_repository=TABLElog_slave_updates=ONlog_bin=/data/log/binlogbinlog_format=ROWtransaction_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=offloose-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=offloose-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