故障分析 | MySQL 节点宕机分析一例

本文介绍了一次 MySQL MGR 环境故障切换的排查过程,详细分析了错误日志信息,定位到 InnoDB 并行读取时发生的断言失败问题,并追溯到了具体的代码行。

作者:周启超

爱可生北分团队 DBA,主要负责项目前期建设及后期疑难问题支持。做事认真,对事负责。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


之前遇到一个问题,用户反馈 MySQL MGR 环境发生了故障切换。作为一名运维,首先应该知道从日志信息里面去找信息。我们很幸运,在对应的时间点,有错误日志信息。而且可以明确的是,切换原因就在这段错误日志信息当中。错误日志中堆栈信息如下:

2022-04-12T03:03:36.435579+08:00 0 [ERROR][MY-013183][InnoDB]Assertion failure: row0pread.cc:727:!page_cur_is_after_last(&page_cursor) thread 140441717634816 
InnoDB: We intentionally generate a memory trap.
InnoDB: Submit a detailed bug report to http://bugs.mysql.com. 
InnoDB: If you get repeated assertion failures or crashes, even 
InnoDB: immediately after the mysqld startup, there may be 
InnoDB: corruption in the InnoDB tablespace. Please refer to
InnoDB: http://dev.mysql.com/doc/refman/8.0/en/forcing-innodb-recovery.html 
InnoDB:about forcing recovery.
19:03:36 UTC-mysqld got signal 6;
Most likely, you have hit a bug, but this error can also be caused by malfunctioning h
<think>好的,我现在需要帮助用户部署一个三节点MySQL集群。用户提到了最佳实践,所以我需要结合之前的引用内容,特别是引用[1]和引用[2]中提到的MySQLGroup Replication(MGR)和集群部署步骤。首先,我得确认用户的需求是部署三个节点的集群,而不是单机或非集群的K8s部署,引用[3]可能不太相关,但可以暂时忽略。引用[1]提到了MGR,这是一个基于组复制的高可用解决方案,支持多主或单主模式,适合三节点。引用[2]中提到了集群环境需要至少三台服务器,并推荐MySQL8.0,这应该作为基础。接下来,我需要整理部署步骤。根据引用[1]和引用[2],步骤可能包括环境准备、安装MySQL、配置MGR、初始化集群、验证等。需要确保每个节点的配置正确,比如server_id、group_replication变量,以及防火墙设置。同时,用户可能需要知道如何创建用户和授权,这部分在引用[2]中有示例,比如创建数据库用户并赋予权限,这里可能需要调整以适用于集群环境。另外,安全性方面,引用[2]提到了root密码设置和备份,这些在集群部署中同样重要。性能优化参数如innodb_buffer_pool_size也需要根据实际情况调整。可能遇到的问题包括节点间的网络通信,所以需要检查防火墙和SELinux设置。还有,如何启动组复制,以及添加节点到集群中的步骤是否清晰。用户可能还会关心故障转移和集群监控,这些可以作为相关问题提出。 最后,要确保提供的命令正确,比如CHANGE MASTER TO在MySQL8中的使用是否有变化,以及引导集群的正确步骤。可能需要引用官方文档或最佳实践来增强可靠性。同时,生成的相关问题需要围绕用户可能的后续疑问,比如性能调优、高可用测试、数据同步机制等。</think>### 部署MySQL节点集群(基于Group Replication)最佳实践 以下是基于MySQL Group Replication(MGR)的三节点集群部署指南,结合高可用性、数据一致性和简化运维的设计目标。 --- #### **一、环境准备** 1. **服务器要求** - 3台Linux服务器(推荐Ubuntu 20.04/CentOS 7+),网络互通。 - MySQL 8.0+版本(需支持Group Replication)。 - 开放端口:3306MySQL)、33061(Group Replication通信)[^1]。 2. **配置主机名与解析** 每台服务器配置`/etc/hosts`,例如: ```plaintext 192.168.1.101 node1 192.168.1.102 node2 192.168.1.103 node3 ``` --- #### **二、MySQL安装与基础配置** 1. **安装MySQL** ```bash # Ubuntu sudo apt update && sudo apt install mysql-server # CentOS sudo yum install mysql-server ``` 2. **配置my.cnf** 每台节点需配置以下参数(以`node1`为例): ```ini [mysqld] # 基础配置 server_id=1 # 节点唯一ID(node2=2,node3=3) datadir=/var/lib/mysql socket=/var/run/mysqld/mysqld.sock # Group Replication配置 plugin_load_add='group_replication.so' group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" # 唯一UUID group_replication_start_on_boot=OFF group_replication_local_address="node1:33061" group_replication_group_seeds="node1:33061,node2:33061,node3:33061" transaction_write_set_extraction=XXHASH64 ``` 3. **启动MySQL并初始化** ```bash sudo systemctl start mysql sudo mysql_secure_installation # 设置root密码并关闭匿名用户 ``` --- #### **三、配置Group Replication集群** 1. **创建复制用户** 在**所有节点**执行: ```sql CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES; ``` 2. **引导第一个节点(node1)** ```sql SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF; ``` 3. **添加其他节点(node2、node3)** ```sql START GROUP_REPLICATION USER='repl', PASSWORD='repl_password'; ``` 4. **验证集群状态** ```sql SELECT * FROM performance_schema.replication_group_members; ``` 输出应显示3个`ONLINE`成员[^1]。 --- #### **四、高可用与数据一致性保障** 1. **模式选择** - **单主模式**:自动选举主节点,适合写分离场景。 - **多主模式**:所有节点可写,需解决冲突(需业务层支持)[^2]。 2. **故障恢复** - 宕机节点重启后自动重新加入集群。 - 使用`SHOW GLOBAL STATUS LIKE 'group_replication%';`监控状态。 3. **数据备份** - 定期使用`mysqldump`或Percona XtraBackup进行物理备份。 --- #### **五、安全与优化建议** 1. **防火墙规则** ```bash sudo ufw allow 33061/tcp # Group Replication端口 ``` 2. **性能调参** ```ini # my.cnf innodb_buffer_pool_size=系统内存的70% max_connections=1000 ``` 3. **监控工具** - Prometheus + Grafana监控集群指标。 - MySQL Enterprise Monitor(商业版)[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值