【MySQL 8.0】手动部署MGR
文章目录
前言
MySQL 8自2016年9月12日推出以来已过去5年,其版本趋于成熟稳定,各大厂的工业升级实现方案也逐步上线生产环境(例如前段时间FaceBook宣布完成全线MySQL 5.6升级到MySQL 8)。
尽管近年来国内数据库行业国产数据库涌入200多家厂商,但想要实现弯道超车,任重而道远,不可以一蹴而就。即便是国内最早(1999年)做国产自研数据库的人大金仓,做了20多年依旧谦虚地表示弯道超车不太现实,与国外数据库巨头差距仍有10年以上。
虽然目前TiDB、OceanBase、达梦等这些位列墨天轮国产数据库排行榜前列的数据库产品宣传得声势浩大,但实际使用起来仍有很多缺陷,个人觉得很是浮夸,宣传吹嘘的“人设”远大于实力。依赖政策红利、资本入驻带来的短期优势,无法供应像数据库这样的基础软件的长期投入需求。
所以,目前国内大部分使用MySQL的企业,尤其是那些将开源免费视为主要技术选型因素的互联网企业、创新型企业,未来可能仍会选用MySQL作为其生产数据库。
因此,作为数据方向从业者,应加快学习MySQL 8,熟悉其新特性以实践于生产环境,满足日益增加的大数量、高可用、高并发等需求。
参考资料:
十年比肩?看国产数据库如何突出重围!| 新程序员
墨天轮国产数据库流行度排行榜
一、准备环境
本章描述安装、部署MySQL 8前的准备工作。本次实验目的是搭建一个单主二副本的三节点集群。
注:因本次实验使用的是之前研究Hadoop大数据搭建的实验环境,故操作系统包、MySQL包可能早于当前稳定版本,但实验前已将操作系统内核、Yum、DNF升至官方Yum源AppStream提供的最新版本。
1.1 节点划分
节点名 | 节点描述 | 节点IP | MGR角色(8.0.23以前) | MGR角色(8.0.23以后) |
---|---|---|---|---|
node0 | 主(复制源)节点 | 192.168.125.3 | Master | Replication Source |
node1 | 从(副本)节点1 | 192.168.125.4 | Slave | Replica |
node2 | 从(副本)节点2 | 192.168.125.5 | Slave | Replica |
1.2 软件包
1.2.1 操作系统及内核版本
三台机器均使用CentOS Linux release 8.2.2004 (Core)版本,内核版本为4.18.0-305.19.1.el8_4.x86_64。
1.2.2 MySQL版本
MySQL版本为8.0.21。使用是来自CentOS AppStream的MySQL Yum包安装。
二、部署步骤
2.1 安装MySQL 8
具体参考我的另一篇文章《CentOS 8安装MySQL 8》,此处不予赘述。
2.2 配置MGR
2.2.1 生成UUID
启动并连接到MySQL,查询出一个UUID作为复制组的UUID。
SELECT UUID();
2.2.2 配置.cnf文件
1、编辑/etc/my.cnf.d/mysql-server.cnf
主节点node0的服务端选项配置:
[mysqld]
basedir=/opt/mysql
datadir=/opt/mysql/data
socket=/opt/mysql/mysql.sock
log-error=/opt/mysql/log/mysqld.log
pid-file=/opt/mysql/mysqld.pid
secure_file_priv=''
character_set_server=utf8mb4
collation_server=utf8mb4_bin
explicit-defaults-for-timestamp=OFF
#Innodb Config
#
innodb_buffer_pool_size =2G
innodb_log_file_size=1G
innodb_log_files_in_group=3
#innodb_io_capacity = 1000
#MGR Config
#Storage Engine
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
#Replication Framework
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
# Up to 8.2.20
#binlog_checksum=NONE
#Before 8.0.3
#log_bin=binlog
#log_slave_updates=ON
#binlog_format=ROW
#master_info_repository=TABLE
#relay_log_info_repository=TABLE
#transaction_write_set_extraction=XXHASH64
#Group Replication Settings
plugin_load_add='group_replication.so'
group_replication_group_name="f9018ed2-2036-11ec-8c89-000c293d687e"
group_replication_start_on_boot=off
group_replication_local_address= "node0:33061"
group_replication_group_seeds= "node0:33061,node1:33061,node2:33061"
group_replication_bootstrap_group=off
副本节点node1的服务端选项配置:
[mysqld]
datadir=/opt/mysql/data
socket=/opt/mysql/mysql.sock
log-error=/opt/mysql/log/mysqld.log
pid-file=/opt/mysql/mysqld.pid
secure_file_priv=''
character_set_server=utf8mb4
collation_server=utf8mb4_bin
explicit-defaults-for-timestamp=OFF
#Innodb Config
#
innodb_buffer_pool_size =2G
innodb_log_file_size=1G
innodb_log_files_in_group=3
#innodb_io_capacity = 1000
#MGR Config
#Storage Engine
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
#Replication Framework
server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
#Group Replication Settings
plugin_load_add='group_replication.so'
group_replication_group_name="f9018ed2-2036-11ec-8c89-000c293d687e"
group_replication_start_on_boot=off
group_replication_local_address= "node1:33061"
group_replication_group_seeds= "node0:33061,node1:33061,node2:33061"
group_replication_bootstrap_group=off
副本节点node2的服务端选项配置:
[mysqld]
basedir=/opt/mysql
datadir=/opt/mysql/data
socket=/opt/mysql/mysql.sock
log-error=/opt/mysql/log/mysqld.log
pid-file=/opt/mysql/mysqld.pid
secure_file_priv=''
character_set_server=utf8mb4
collation_server=utf8mb4_bin
explicit-defaults-for-timestamp=OFF
#Innodb Config
#
innodb_buffer_pool_size =2G
innodb_log_file_size=1G
innodb_log_files_in_group=3
#innodb_io_capacity = 1000
#MGR Config
#Storage Engine
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
#Replication Framework
server_id=3
gtid_mode=ON
enforce_gtid_consistency=ON
#Group Replication Settings
plugin_load_add='group_replication.so'
group_replication_group_name="f9018ed2-2036-11ec-8c89-000c293d687e"
group_replication_start_on_boot=off
group_replication_local_address= "node2:33061"
group_replication_group_seeds= "node0:33061,node1:33061,node2:33061"
group_replication_bootstrap_group=off
选项含义说明:
MGR选项分为三部分,分别为存储引擎、复制框架、组复制配置。
1、存储引擎方面,MGR需要事务存储引擎。因为MGR采用的是XCOM协议(Paxos的变种),事务乐观地提交,在提交时为保证整组的一致性会检测冲突,一旦冲突则回滚。而且,InnoDB提供了一些额外的功能,当与组复制一起运行时,可以更好地管理和处理冲突。
2、复制框架方面,MGR需要使用全局唯一标识作为server_id,并且要启用GTID(全局唯一事务标识)。自MySQL 8.0.21以后,才在二进制日志引入校验和(checksum)。因此在此之前的版本需配置binlog_checksum=NONE。在MySQL 8.0.3以前,因默认值改变,需要额外配置一些参数。
3、组复制配置方面。
plugin_load_add = 组复制插件的.so文件名
group_replication_group_name = “2.2.1中生成的UUID”
group_replication_start_on_boot = OFF 在部署期间关闭组复制的自启动,可以在部署成功后改为启用
group_replication_local_address = “本地节点的主机名或IP:组复制端口”
group_replication_group_seeds = “组内所有节点的主机名或IP:端口号,以逗号分隔” 配置种子成员的主机和端口列表。种子成员是指新连入复制组的新成员。通常配置为所有组成员
group_replication_bootstrap_group = OFF 关闭启动时自动引导组复制,防止使用不当导致脑裂。
2、编辑/etc/my.cnf.d/client.cnf
三个节点的客户端选项配置:
[client]
socket=/opt/mysql/mysql.sock
default-character-set='utf8mb4'
[client-mariadb]
2.3 启动MGR
2.3.1 在复制源节点node0上启动组复制
连接MySQL,执行如下语句:
#临时关闭binlog
set sql_log_bin=0;
#创建用户及授权
create user rpl_user@'%' identified by 'mgr1_rpluser';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
#恢复开启binlog
set sql_log_bin=1;
#将组复制主节点/复制源节点设置为node0.
#MySQL 8.0.23版本以前的语法为
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='mgr1_rpluser' \
FOR CHANNEL 'group_replication_recovery';
#MySQL 8.0.23版本以后的语法为
#CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='password' \
# FOR CHANNEL 'group_replication_recovery';
#安装组复制插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
#查看组复制插件
SHOW PLUGINS;
#在主节点开启组复制引导
SET GLOBAL group_replication_bootstrap_group=ON;
#启动组复制
START GROUP_REPLICATION;
#如果想要在组复制时进行分布式恢复用户的身份认证,可以使用如下语句:
#START GROUP_REPLICATION USER='rpl_user', PASSWORD='password';
#查看组成员状态,验证组复制结果
SELECT * FROM performance_schema.replication_group_members;
#引导完成后关闭组复制引导
SET GLOBAL group_replication_bootstrap_group=OFF;
创建新数据库mgr01,验证组复制的数据一致性
#查看当前本地实例拥有的数据库,在开启组复制前创建的数据库不会进行组复制
show databases;
#创建新的数据库和表,用于验证组复制
create database mgr01;
create table mgr_test1(id int primary key auto_increment,name varchar(30));
insert into mgr_test1(name) values (4,'King');
insert into mgr_test1(name) values ('King');
select * from mgr_test1;
#查看binlog事件
SHOW BINLOG EVENTS;
2.3.2 在副本节点node1上启动组复制
连接MySQL,执行如下语句:
#临时关闭binlog
set sql_log_bin=0;
#创建用户及授权
create user rpl_user@'%' identified by 'mgr1_rpluser';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
#恢复开启binlog
set sql_log_bin=1;
#将组复制主节点/复制源节点设置为node0.
#MySQL 8.0.23版本以前的语法为
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='mgr1_rpluser' \
FOR CHANNEL 'group_replication_recovery';
#MySQL 8.0.23版本以后的语法为
#CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='password' \
# FOR CHANNEL 'group_replication_recovery';
#安装组复制插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
#查看组复制插件
SHOW PLUGINS;
#启动组复制
START GROUP_REPLICATION;
#如果想要在组复制时进行分布式恢复用户的身份认证,可以使用如下语句:
#START GROUP_REPLICATION USER='rpl_user', PASSWORD='password';
#查看组成员状态,验证组复制结果
SELECT * FROM performance_schema.replication_group_members;
2.3.3 在副本节点node2上启动组复制
连接MySQL,执行如下语句:
#临时关闭binlog
set sql_log_bin=0;
#创建用户及授权
create user rpl_user@'%' identified by 'mgr1_rpluser';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
#恢复开启binlog
set sql_log_bin=1;
#将组复制主节点/复制源节点设置为node0.
#MySQL 8.0.23版本以前的语法为
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='mgr1_rpluser' \
FOR CHANNEL 'group_replication_recovery';
#MySQL 8.0.23版本以后的语法为
#CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='password' \
# FOR CHANNEL 'group_replication_recovery';
#安装组复制插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
#查看组复制插件
SHOW PLUGINS;
#启动组复制
START GROUP_REPLICATION;
#如果想要在组复制时进行分布式恢复用户的身份认证,可以使用如下语句:
#START GROUP_REPLICATION USER='rpl_user', PASSWORD='password';
#查看组成员状态,验证组复制结果
SELECT * FROM performance_schema.replication_group_members;
2.4 验证MGR
分别在两个副本节点连接MySQL,执行如下语句:
#三个节点均启动好MGR后,查看组复制结果,如均为ONLINE状态则组复制部署成功,否则需要查看错误日志mysql.log,找到具体报错以解决问题
SELECT * FROM performance_schema.replication_group_members;
#查看副本节点上的数据库列表,验证只有在开启组复制后创建的数据库才会进行组复制
SHOW DATABASES;
#验证副本节点的组复制数据一致性
SELECT * FROM mgr01.mgr_test1;
总结
以上就是今天要讲的内容,本文仅介绍了如何部署MySQL 8的单主三节点MGR,且对MySQL 8的不同版本配置不同做了简要说明。
后续会介绍如何添加副本节点,修改单主复制组为多主复制组,敬请关注,谢谢支持!