OpenStack:MariaDB 问题排查

1. 问题现象分析

1.1 故障表现

  • MariaDB 集群持续重启循环

  • 虚拟机无法正常使用

  • 错误日志显示集群节点连接失败

1.2 根本原因

  • 三节点集群中一台物理机宕机
  • 剩余两个节点无法达成共识(脑裂问题)
  • Galera 集群无法正常选举主节点

2. 临时解决方案

2.1 停止所有节点服务

1
2
# 在所有控制节点执行
docker stop mariadb

2.2 调整集群启动顺序

  1. 选择最新的节点作为引导节点(非原第一个节点)
  2. 修改引导节点的配置文件 /etc/kolla/mariadb/config.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
"command": "/usr/bin/mysqld_safe --wsrep_cluster_address=gcomm://",
"config_files": [
{
"source": "/var/lib/kolla/config_files/galera.cnf",
"dest": "/etc/mysql/my.cnf",
"owner": "mysql",
"perm": "0600"
},
{
"source": "/var/lib/kolla/config_files/wsrep-notify.sh",
"dest": "/usr/local/bin/wsrep-notify.sh",
"owner": "mysql",
"perm": "0700"
}
],
"permissions": [
{
"path": "/var/log/kolla/mariadb",
"owner": "mysql:mysql",
"recurse": true
},
{
"path": "/var/lib/mysql",
"owner": "mysql:mysql",
"recurse": true
}
]
}

2.3 清理缓存文件

1
2
3
# 在所有节点执行
cd /var/lib/docker/volumes/mariadb/_data/
rm -f galera.cache grastate.dat

2.4 设置安全引导标志

1
2
# 在引导节点执行
sed -i 's/safe_to_bootstrap: 0/safe_to_bootstrap: 1/g' /var/lib/docker/volumes/mariadb/_data/grastate.dat

2.5 重启集群服务

  1. 首先启动引导节点:
1
docker start mariadb
  1. 等待引导节点完全启动后,启动其他节点:
1
docker start mariadb

3. 网络服务恢复

3.1 检查网络状态

1
2
ip a
ip route

3.2 重启网络组件

1
docker restart neutron_dhcp_agent neutron_l3_agent neutron_metadata_agent neutron_openvswitch_agent neutron_server

3.3 验证虚拟机功能

  1. 尝试登录现有虚拟机
  2. 创建新虚拟机测试功能
  3. 检查网络连通性

4. 根本解决方案

4.1 修复宕机物理节点

  1. 硬件诊断:检查电源、内存、磁盘状态
  2. 系统恢复:修复或重装操作系统
  3. 服务恢复:重新加入集群

4.2 集群配置优化

1
2
3
4
5
# /etc/kolla/mariadb/galera.cnf
[galera]
wsrep_provider_options="gcache.size=2G; pc.weight=1"
wsrep_cluster_name="openstack_cluster"
wsrep_sst_method=rsync

4.3 高可用性增强

  1. 配置奇数节点集群(3或5节点)

  2. 设置节点权重:

    1
    2
    3
    # 在/etc/kolla/mariadb/galera.cnf
    wsrep_provider_options="pc.weight=3" # 主节点
    wsrep_provider_options="pc.weight=1" # 备用节点
  3. 启用自动故障转移

5. 预防措施

5.1 监控配置

1
2
3
4
5
6
7
8
9
10
11
12
# Prometheus监控规则示例
groups:
- name: galera_alerts
rules:
- alert: GaleraClusterSize
expr: galera_cluster_size < 3
for: 5m
labels:
severity: critical
annotations:
summary: "Galera cluster size below threshold"
description: "Cluster size is {{ $value }} nodes"

5.2 定期维护

  1. 每月集群健康检查:

    1
    docker exec mariadb mysqlcheck --all-databases --optimize
  2. 季度故障转移演练

  3. 年度硬件健康检查

5.3 备份策略

1
2
# 每日全量备份脚本
docker exec mariadb mysqldump --all-databases --single-transaction | gzip > /backup/mariadb-$(date +%F).sql.gz

6. 高级诊断工具

6.1 集群状态检查

1
docker exec -it mariadb mysql -e "SHOW STATUS LIKE 'wsrep%'"

6.2 日志分析技巧

1
2
3
4
5
# 查看实时错误日志
docker logs -f mariadb | grep -E 'ERROR|WARNING'

# 分析启动问题
docker logs mariadb | grep 'WSREP'

6.3 网络诊断

1
2
3
4
5
6
# 检查集群通信
nc -zv <节点IP> 4567
nc -zv <节点IP> 4444

# 检查防火墙规则
iptables -L -n | grep 4567

7. 故障恢复流程图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
graph TD
A[集群故障] --> B{节点状态检查}
B -->|有节点宕机| C[停止所有节点服务]
B -->|全节点在线| D[检查网络连接]
C --> E[选择引导节点]
E --> F[修改引导节点配置]
F --> G[清理缓存文件]
G --> H[设置安全引导标志]
H --> I[启动引导节点]
I --> J[启动其他节点]
J --> K[验证集群状态]
K --> L[恢复网络服务]
L --> M[验证虚拟机功能]
D -->|网络问题| N[修复网络配置]
N --> K
D -->|配置问题| O[修复集群配置]
O --> K

8. 关键配置文件说明

8.1 galera.cnf 核心配置

1
2
3
4
5
6
7
8
9
[mysqld]
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://node1_ip,node2_ip,node3_ip"
wsrep_cluster_name='openstack_cluster'
wsrep_node_address='current_node_ip'
wsrep_node_name='node1'
wsrep_sst_method=rsync
wsrep_sst_auth=root:password

8.2 config.json 参数说明

参数 说明 关键值
command 启动命令 --wsrep_cluster_address=gcomm:// 表示创建新集群
config_files 配置文件映射 包含galera.cnf和通知脚本
permissions 目录权限 确保mysql用户有权访问数据和日志目录