各位观众老爷们,晚上好!我是你们今晚的MySQL讲师,咱们今天不聊源码八卦,专啃硬骨头,聊聊如何打造一个坚如磐石,刀枪不入,没了谁地球都照常转的MySQL Galera Cluster
集群。
先说清楚,今天讲的是“无单点故障”,不是绝对意义上的“永生不死”。 毕竟,理论上讲,太阳系毁灭了,集群也得跟着凉凉。 但在可接受的范围内,我们要让这个集群尽可能皮实,能扛住各种突发情况。
一、Galera Cluster 是个什么玩意儿?
Galera Cluster 简单来说,就是一个多主复制(Multi-Master Replication)的解决方案。 传统的MySQL主从复制,主挂了,就得手动切换,费时费力。 Galera不一样,每个节点都可以读写,数据实时同步,某个节点挂了,应用可以自动切换到其他节点,基本无感。
想象一下:你有三台服务器,分别叫 node1, node2, node3。 它们都安装了MySQL,并且组成了Galera Cluster。 你往node1里插入一条数据,这条数据会立刻同步到node2和node3。 如果node1突然宕机了,你的应用可以立刻连接到node2或者node3,继续愉快地工作,完全不用担心数据丢失。
二、设计理念:不仅仅是安装
很多人觉得Galera Cluster就是装几个MySQL,改几个配置那么简单。 图样图森破! 要想打造一个真正的无单点故障集群,需要从架构、硬件、网络、监控、备份、容灾等多个维度进行考虑。
1. 硬件选型:别省那点钱!
服务器配置越高越好? 不一定。 关键在于均衡。 CPU、内存、磁盘IO,都要匹配。 比如,CPU太弱,同步数据慢; 内存太小,扛不住高并发; 磁盘IO不行,写入速度慢。
- CPU: 至少8核,主频越高越好。
- 内存: 至少16GB,推荐32GB或更高。
- 磁盘: SSD是王道! IOPS越高越好。 RAID10可以考虑,兼顾性能和冗余。
2. 网络:高速公路,畅通无阻
Galera Cluster 对网络要求非常高。 节点之间需要高速、低延迟的网络连接。
- 带宽: 至少千兆,推荐万兆。
- 延迟: 越低越好。 同机房最佳,跨机房延迟是噩梦。
- 专用网络: 强烈建议使用专用网络,避免与其他业务争抢带宽。
3. 架构设计:三节点起步,多多益善?
- 节点数量: 至少3个节点。 为什么? 2个节点会遇到“脑裂”问题,谁说了算? 3个节点可以投票,少数服从多数。 奇数个节点更好,可以避免平票。
- 节点分布: 尽量分散在不同的物理机房或者可用区,避免单点故障。
- 负载均衡: 使用HAProxy或者Keepalived等负载均衡器,将读写请求分发到不同的节点。
三、实战演练:手把手教你搭建
假设我们有三台服务器,IP地址分别是:
- node1: 192.168.1.101
- node2: 192.168.1.102
- node3: 192.168.1.103
1. 安装MySQL (以CentOS 7为例)
# 安装MySQL Yum Repository
sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
# 安装MySQL Server
sudo yum install -y mysql-community-server
2. 安装Galera Cluster
# 安装Galera Cluster
sudo yum install -y galera mariadb-wsrep-galera-server
3. 配置MySQL (所有节点)
修改 /etc/my.cnf.d/server.cnf
文件 (路径可能略有不同,取决于你的MySQL版本):
[mysqld]
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0 # 允许所有IP连接,生产环境请限制IP
wsrep_on=ON
wsrep_cluster_name=galera_cluster # 集群名称,所有节点必须一致
wsrep_cluster_address="gcomm://192.168.1.101,192.168.1.102,192.168.1.103" # 集群节点IP地址
wsrep_node_address=@@SERVER_IP@@ # 当前节点IP地址,需要替换成实际IP
wsrep_node_name=@@SERVER_HOSTNAME@@ # 当前节点主机名,需要替换成实际主机名
wsrep_sst_method=rsync # SST方法,建议使用rsync或者xtrabackup
wsrep_provider=/usr/lib64/galera/libgalera_smm.so # Galera Provider路径
innodb_flush_log_at_trx_commit=1 # 确保数据一致性
注意:
@@SERVER_IP@@
和@@SERVER_HOSTNAME@@
需要替换成实际的IP地址和主机名。wsrep_sst_method
是State Snapshot Transfer的方法,用于新节点加入集群时的数据同步。rsync
简单易用,但是速度较慢。xtrabackup
速度快,但是需要安装Percona XtraBackup。innodb_flush_log_at_trx_commit=1
确保数据一致性,但是会降低性能。 在对数据一致性要求不高的场景下,可以考虑设置为2,提高性能。
4. 启动集群 (只在一个节点上执行)
在第一个节点 (比如 node1) 上执行:
sudo systemctl stop mysql
sudo galera_new_cluster
sudo systemctl start mysql
5. 启动其他节点 (在其他节点上执行)
在其他节点 (比如 node2 和 node3) 上执行:
sudo systemctl start mysql
6. 验证集群状态
连接到任意一个节点,执行以下SQL语句:
SHOW STATUS LIKE 'wsrep%';
关注以下几个关键参数:
wsrep_cluster_size
: 集群节点数量,应该等于3wsrep_cluster_status
: 集群状态,应该是Primary
wsrep_ready
: 节点状态,应该是ON
四、高可用架构:负载均衡,自动切换
仅仅搭建一个Galera Cluster 还不够,还需要一个负载均衡器,将读写请求分发到不同的节点,并且在节点宕机时自动切换。
1. HAProxy
HAProxy是一个高性能的TCP/HTTP负载均衡器。 它可以监控后端节点的健康状态,并且自动将请求转发到健康的节点。
安装HAProxy (以CentOS 7为例)
sudo yum install -y haproxy
配置HAProxy
修改 /etc/haproxy/haproxy.cfg
文件:
frontend mysql_frontend
bind *:3306 # 监听所有IP的3306端口
mode tcp
option tcplog
default_backend mysql_backend
backend mysql_backend
mode tcp
balance roundrobin # 轮询算法
option tcp-check
server node1 192.168.1.101:3306 check inter 2000 rise 2 fall 3 # 节点1
server node2 192.168.1.102:3306 check inter 2000 rise 2 fall 3 # 节点2
server node3 192.168.1.103:3306 check inter 2000 rise 2 fall 3 # 节点3
注意:
check inter 2000 rise 2 fall 3
表示每2秒检查一次节点健康状态,连续2次成功认为节点健康,连续3次失败认为节点宕机。balance roundrobin
表示使用轮询算法分发请求。 也可以使用其他算法,比如leastconn
(最少连接数)。
启动HAProxy
sudo systemctl start haproxy
sudo systemctl enable haproxy
2. Keepalived
Keepalived是一个VRRP (Virtual Router Redundancy Protocol) 协议的实现。 它可以创建一个虚拟IP地址,并且在主节点宕机时自动切换到备节点。
安装Keepalived (在两台服务器上安装)
sudo yum install -y keepalived
配置Keepalived (Master节点)
修改 /etc/keepalived/keepalived.conf
文件:
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script chk_haproxy {
script "killall -0 haproxy" # cheaper than pidof
interval 2 # check every 2 seconds
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0 # 网卡名称,需要替换成实际网卡名称
virtual_router_id 51 # VRRP ID,Master和Backup必须一致
priority 100 # 优先级,Master必须高于Backup
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100/24 # 虚拟IP地址
}
track_script {
chk_haproxy
}
}
配置Keepalived (Backup节点)
修改 /etc/keepalived/keepalived.conf
文件:
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script chk_haproxy {
script "killall -0 haproxy" # cheaper than pidof
interval 2 # check every 2 seconds
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0 # 网卡名称,需要替换成实际网卡名称
virtual_router_id 51 # VRRP ID,Master和Backup必须一致
priority 90 # 优先级,Backup必须低于Master
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100/24 # 虚拟IP地址
}
track_script {
chk_haproxy
}
}
注意:
interface eth0
需要替换成实际的网卡名称。virtual_ipaddress
是虚拟IP地址,客户端连接时应该连接这个IP地址。priority
优先级,Master必须高于Backup。track_script
监控HAProxy的健康状态,如果HAProxy宕机,Keepalived会切换到Backup节点。
启动Keepalived
sudo systemctl start keepalived
sudo systemctl enable keepalived
五、监控与告警:防患于未然
没有监控的集群,就像没有眼睛的士兵,随时可能掉进坑里。 需要对集群的各个方面进行监控,并且设置告警,及时发现问题。
1. 监控指标
- MySQL:
- CPU 使用率
- 内存使用率
- 磁盘 IO
- QPS (Queries Per Second)
- TPS (Transactions Per Second)
- 连接数
- Galera Cluster 状态 (wsrep_cluster_size, wsrep_cluster_status, wsrep_ready)
- HAProxy:
- CPU 使用率
- 内存使用率
- 连接数
- 后端节点健康状态
- 服务器:
- CPU 使用率
- 内存使用率
- 磁盘使用率
- 网络流量
2. 监控工具
- Prometheus + Grafana: 强大的监控和可视化工具。
- Zabbix: 企业级的监控解决方案。
- Nagios: 老牌的监控工具。
3. 告警方式
- 邮件: 简单易用。
- 短信: 紧急告警。
- 电话: 最高级别的告警。
六、备份与恢复:数据是命根子
即使集群再坚固,也难免遇到意外。 定期备份数据,是保证数据安全的重要手段。
1. 备份策略
- 全量备份: 定期进行全量备份,比如每周一次。
- 增量备份: 每天进行增量备份,只备份自上次全量备份以来修改的数据。
2. 备份工具
- mysqldump: MySQL自带的备份工具,简单易用。
- Percona XtraBackup: 高性能的备份工具,支持在线备份。
3. 备份存储
- 本地磁盘: 速度快,但是存在单点故障风险。
- 远程存储: 安全性高,但是速度较慢。
七、容灾演练:模拟故障,检验成果
定期进行容灾演练,模拟各种故障场景,检验集群的容灾能力。
1. 模拟场景
- 节点宕机: 模拟某个节点突然宕机。
- 网络故障: 模拟节点之间的网络连接中断。
- 磁盘故障: 模拟某个节点的磁盘损坏。
2. 演练步骤
- 停止节点: 使用
systemctl stop mysql
停止某个节点。 - 断开网络: 使用
iptables
模拟网络连接中断。 - 模拟磁盘损坏: 使用
dd
命令向磁盘写入垃圾数据。
3. 观察结果
- 应用是否正常运行?
- 数据是否丢失?
- 切换时间是否符合预期?
八、总结:无单点故障,任重道远
打造一个无单点故障的Galera Cluster集群,不是一蹴而就的事情,需要从架构、硬件、网络、监控、备份、容灾等多个维度进行考虑。 希望今天的讲座能帮助大家更好地理解Galera Cluster,并且能够应用到实际工作中。
记住,没有银弹! 只有不断学习,不断实践,才能打造一个真正坚如磐石的MySQL集群。
今天的讲座就到这里,谢谢大家! 散会! 别忘了点赞,关注,投币三连哦! (咳咳,串台了…)