MySQL8.4组复制

https://dev.mysql.com/doc/refman/8.4/en/group-replication.html

1 什么是组复制
  • 组复制主要解决传统异步复制主机宕机可能造成主从节点数据不一致问题
  • MySQL Group Replication简称MGR
  • 原有gtid复制功能进行增强支持模式模式
  • 组复制数据库层面到了只要集群大多数主机可用服务可用也就是3服务器集群允许其中1宕机

  • 组复制提供了分布式状态机复制服务器之间具有很强协调性
  • 当服务器属于同一组它们自动进行协调
  • 传统的主从复制方式一个不等数据量主节点执行事务异步发送节点从节点重新执行
  • 组复制采用整组写入避免单点问题
  • 组复制传输数据使用Paxos协议Paxos协议保证了数据传输一致性原子
  • 基于Paxos协议组复制构建一个分布式状态复制机制这是实现多主复制核心技术
  • 组复制提供多写方案
  • MGR保证数据库服务连续可用但是存在以下问题
    • 一个成员不可用连接到客户不能自主转移其他组成员
    • MySQL Router提供故障转移能力

2 单主模式
2.1 什么是单主模式
  • 模式下只有一个主服务器
  • 主服务器被设置读写模式
  • 组中其他所有成员设置只读模式

2.2 单主模式部署示例

https://dev.mysql.com/doc/refman/8.4/en/group-replication-configuring-instances.html

2.2.1 准备MySQL实例10000
  • 创建目录
mkdir -p /opt/mysql/10000/{data,log,tmp}

  • 准备配置文件
vi /opt/mysql/10000/my.cnf

[mysql]
#设置mysql客户端默认编码
default-character-set=utf8
[mysqld]
port=10000
pid-file= /opt/mysql/10000/mysqld.pid
socket= /opt/mysql/10000/mysqld.sock
datadir= /opt/mysql/10000/data
log-error=/opt/mysql/10000/log/mysqld.log
tmpdir=/opt/mysql/10000/tmp
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#服务器唯一ID,默认是1
server-id=10000
#启用二进制日志
log-bin=mysql-bin
#最大连接数
max_connections=1000
#设置默认时区
default-time_zone='+8:00'
# 0:区分大小写
# 1:不区分大小写
lower_case_table_names=1
user = mysql
#启用全局事务标识符(GTID)模式
gtid_mode=on
#强制GTID的一致性。这意味着在执行事务时,MySQL将确保所有涉及的服务器都使用相同的GTID集。
enforce_gtid_consistency=on

  • 初始化
chown -R mysql:mysql /opt/mysql/10000
mysqld --defaults-file=/opt/mysql/10000/my.cnf --initialize

mysqld --defaults-file=/opt/mysql/10000/my.cnf &

  • 初始化密码
#查看临时密码
cat /opt/mysql/10000/log/mysqld.log|grep "A temporary password"
#登录
mysql -uroot -p'EG+Pvd&jj0N=' --socket=/opt/mysql/10000/mysqld.sock
>ALTER USER 'root'@'localhost' identified by '123456';
  flush privileges;

  • 创建同步用户
 mysql -uroot -p'123456' --socket=/opt/mysql/10000/mysqld.sock
 >CREATE USER 'repl'@'%' IDENTIFIED  BY '123456';
  GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
  flush privileges;

  • 添加组复制配置
vi /opt/mysql/10000/my.cnf
#组复制设置
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "192.168.221.100:33061"
group_replication_group_seeds= "192.168.221.100:33061,192.168.221.100:33062,192.168.221.100:33063"
group_replication_bootstrap_group=off
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

2.2.2 复制MySQL实例10001
cp -rf /opt/mysql/10000 /opt/mysql/10001
sed -i "s#10000#10001#g" /opt/mysql/10001/my.cnf
rm -f /opt/mysql/10001/data/auto.cnf
sed -i  "s#group_replication_local_address= '192.168.221.100:33061'#group_replication_local_address= '192.168.221.100:33062'#g" /opt/mysql/10001/my.cnf
chown -R mysql:mysql /opt/mysql/10001
mysqld --defaults-file=/opt/mysql/10001/my.cnf &

2.2.3 复制MySQL实例10002
cp -rf /opt/mysql/10000 /opt/mysql/10002
sed -i "s#10000#10002#g" /opt/mysql/10002/my.cnf
rm -f /opt/mysql/10002/data/auto.cnf
sed -i  "s#group_replication_local_address= '192.168.221.100:33061'#group_replication_local_address= '192.168.221.100:33063'#g" /opt/mysql/10002/my.cnf
chown -R mysql:mysql /opt/mysql/10002
mysqld --defaults-file=/opt/mysql/10002/my.cnf &

2.2.3 配置组复制
  • 主库实例10000执行
mysql -uroot -p'123456' --socket=/opt/mysql/10000/mysqld.sock
> set global group_replication_recovery_get_public_key=on;
  CHANGE REPLICATION SOURCE TO SOURCE_USER='repl', SOURCE_PASSWORD='123456' FOR CHANNEL 'group_replication_recovery';
  SET GLOBAL group_replication_bootstrap_group=ON;
  START GROUP_REPLICATION;
  SET GLOBAL group_replication_bootstrap_group=OFF;

  • 从库实例10001执行
mysql -uroot -p'123456' --socket=/opt/mysql/10001/mysqld.sock
> START GROUP_REPLICATION;

  • 从库实例10002执行
mysql -uroot -p'123456' --socket=/opt/mysql/10002/mysqld.sock
> START GROUP_REPLICATION;

  • 查看成员
mysql -uroot -p'123456' --socket=/opt/mysql/10000/mysqld.sock
> SELECT CHANNEL_NAME,MEMBER_ID,MEMBER_HOST,MEMBER_PORT, MEMBER_ROLE FROM performance_schema.replication_group_members;
2.2.4 组复制数据同步测试
  • 主库实例10000插入数据
mysql -uroot -p'123456' --socket=/opt/mysql/10000/mysqld.sock
> create database test;
   use test;
   create table test (id int,name varchar(10));
   ALTER TABLE test ADD PRIMARY KEY id(id);
   insert into test values(1,'a'),(2,'b'),(3,'c');

  • 从库实例10001查询数据
mysql -uroot -p'123456' --socket=/opt/mysql/10001/mysqld.sock
>  use test;
   select * from test;

  • 从库实例10002查询数据
mysql -uroot -p'123456' --socket=/opt/mysql/10002/mysqld.sock
>  use test;
   select * from test;

2.2.5 组复制主库宕机测试
  • kill主库实例10000
  • 查看成员

3 多主模式

https://dev.mysql.com/doc/refman/8.4/en/group-replication-multi-primary-mode.html

3.1 什么是多主模式
  • 多主模式下没有成员具有特殊角色
  • 任何组成员加入复制读背设置读写模式可都以处理写事物
3.2 多主模式部署示例
  • 关闭实例10000,10001,10002模式
mysql -uroot -p'123456' --socket=/opt/mysql/10000/mysqld.sock
>  stop GROUP_REPLICATION;
set global group_replication_single_primary_mode=off;
set global group_replication_enforce_update_everywhere_checks=ON;


mysql -uroot -p'123456' --socket=/opt/mysql/10001/mysqld.sock
>  stop GROUP_REPLICATION;
set global group_replication_single_primary_mode=off;
set global group_replication_enforce_update_everywhere_checks=ON;

mysql -uroot -p'123456' --socket=/opt/mysql/10002/mysqld.sock
>  stop GROUP_REPLICATION;
set global group_replication_single_primary_mode=off;
set global group_replication_enforce_update_everywhere_checks=ON;

  • 使用实例10000引导组复制
mysql -uroot -p'123456' --socket=/opt/mysql/10000/mysqld.sock
> SET GLOBAL group_replication_bootstrap_group=ON;
  START GROUP_REPLICATION;
  SET GLOBAL group_replication_bootstrap_group=OFF;

  • 实例10001,10002开启组复制
mysql -uroot -p'123456' --socket=/opt/mysql/10001/mysqld.sock
> START GROUP_REPLICATION;

mysql -uroot -p'123456' --socket=/opt/mysql/10002/mysqld.sock
> START GROUP_REPLICATION;

  • 查看成员
mysql -uroot -p'123456' --socket=/opt/mysql/10000/mysqld.sock
>  SELECT CHANNEL_NAME,MEMBER_ID,MEMBER_HOST,MEMBER_PORT, MEMBER_ROLE FROM performance_schema.replication_group_members;
<think>嗯,用户要求提供MySQL 8.4集群部署指南,特别关注配置方法。从用户提到的引用内容看,ta可能参考过Galera Cluster相关的资料,但MySQL 8.4作为2024年6月发布的最新版本,官方主推的是InnoDB Cluster方案。 用户可能正在搭建高可用数据库环境,需要明确的步骤指导。考虑到ta引用过三台服务器的配置示例,推测实际部署规模至少是三节点。需要重点提醒几个关键风险点:MySQL Shell的安装必须用官方源,不能用系统默认的旧版;MySQL 8.4要求所有节点时间同步误差控制在毫秒级;防火墙设置容易遗漏。 配置流程需要分层说明:先准备操作系统环境,再安装MySQL本体和MySQL Shell,然后才是集群初始化。路由层配置可以单独说明,因为不是所有场景都需要。示例命令要标注清楚每台服务器的操作区别,特别是引导集群时的primary节点特殊操作。 故障排查部分应该包含三个典型场景:节点无法加入时的证书验证问题、脑裂恢复流程、以及MySQL Router连接池报错处理。这些在文档里容易被忽略,但实际部署必然遇到。 最后补充的Galera方案需要标注兼容性警告,避免用户直接套用旧资料导致失败。PXC官方还没宣布支持8.4,强行安装会有依赖冲突风险。</think>以下是MySQL 8.4集群部署与配置的完整指南(基于InnoDB Cluster方案): --- ### **一、环境准备** 1. **服务器要求** - 至少3台服务器(推荐CentOS 8+/Ubuntu 22.04) - 每台服务器配置: ```bash # 关闭防火墙或开放端口 sudo systemctl disable firewalld --now # 或配置3306,33061,6446端口放行 # 时间同步(NTP) sudo timedatectl set-ntp yes ``` 2. **安装依赖** 所有节点执行: ```bash # Ubuntu/Debian sudo apt-get update sudo apt-get install libaio1 libnuma1 # CentOS/RHEL sudo yum install libaio numactl ``` --- ### **二、安装MySQL 8.4** **所有节点执行:** ```bash # 添加MySQL官方源 wget https://dev.mysql.com/get/mysql-apt-config_0.8.28-1_all.deb # Ubuntu sudo dpkg -i mysql-apt-config_0.8.28-1_all.deb # 选择8.4版本 # 安装服务端 sudo apt-get update sudo apt-get install mysql-server mysql-shell -y ``` --- ### **三、配置MySQL节点** 1. **修改配置文件** (`/etc/mysql/my.cnf`) 每台服务器需**不同**`server_id`: ```ini [mysqld] server_id=1 # 节点1设为1,节点2设为2,依此类推 gtid_mode=ON enforce_gtid_consistency=ON log_bin=mysql-bin binlog_format=ROW disabled_storage_engines="MyISAM,BLACKHOLE" plugin_load_add='group_replication.so' group_replication_start_on_boot=OFF ``` 2. **初始化并启动服务** ```bash sudo systemctl restart mysql sudo mysql_secure_installation # 设置root密码,建议统一 ``` --- ### **四、部署InnoDB Cluster** 1. **配置第一节点(Primary)** ```bash mysqlsh > dba.configureInstance('root@node1_ip', {password: 'YourPassword'}) > shell.connect('root@node1_ip') > cluster = dba.createCluster('MyCluster', {memberWeight: 60}) ``` 2. **添加其他节点** ```bash > cluster.addInstance('root@node2_ip', {password: 'YourPassword', memberWeight: 50}) > cluster.addInstance('root@node3_ip', {password: 'YourPassword', memberWeight: 50}) ``` 3. **验证集群状态** ```sql SELECT * FROM performance_schema.replication_group_members; ``` ```bash > cluster.status() # 在MySQL Shell中查看 ``` --- ### **五、配置MySQL Router(可选)** 1. **在应用服务器安装Router** ```bash sudo apt-get install mysql-router -y ``` 2. **生成路由配置** ```bash mysqlrouter --bootstrap root@node1_ip:3306 --user=mysqlrouter ``` 3. **启动路由服务** ```bash sudo systemctl start mysqlrouter ``` - 应用通过`6446`端口访问集群(自动负载均衡) --- ### **六、集群管理命令** | 场景 | 命令 | |------|------| | 切换主节点 | `cluster.setPrimaryInstance('node2_ip:3306')` | | 重启集群 | `cluster.rebootClusterFromCompleteOutage()` | | 移除节点 | `cluster.removeInstance('node3_ip:3306')` | --- ### **故障排查要点** 1. **节点无法加入集群** - 检查`group_replication_recovery`用户权限: ```sql CREATE USER 'repl'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; ``` - 验证网络连通性:`telnet node_ip 33061` 2. **脑裂问题处理** ```bash # 强制重新配置 > dba.rebootClusterFromCompleteOutage() ``` > **重要提示**:MySQL 8.4已弃用`group_replication_ip_whitelist`,改用`group_replication_group_seeds`[^2] --- ### **备选方案:Galera Cluster(需验证兼容性)** ```bash # 仅限测试环境(官方未正式支持MySQL 8.4) sudo apt-get install galera-4 mysql-wsrep-8.0 ``` > ⚠️ 注意:Galera对MySQL 8.4的兼容性需自行验证,生产环境建议优先使用InnoDB Cluster[^1] --- **相关问题** 1. InnoDB Cluster与Galera Cluster在事务处理机制上有何差异? 2. 如何监控MySQL 8.4集群的复制延迟? 3. MySQL Router故障时如何实现高可用连接? [^1]: Galera Cluster安装需依赖第三方适配,MySQL 8.4官方主推InnoDB Cluster方案 [^2]: MySQL 8.4废弃了部分复制参数,需使用`group_replication_group_seeds`替代旧配置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值