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_passwordplugin_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