在 MySQL 的高可用性架构中,结合 Keepalived 和 双主架构(Master-Master Replication) 是一种常见的设计方法,以提高系统的可用性和负载均衡能力。以下将详细讲解这一架构的概念、工作原理、设置步骤、使用场景及其优势与局限性。
1. 概述
1.1 双主架构
双主架构是指在一个 MySQL 集群中存在两个主服务器,两台服务器之间实现双向的主从复制。每台服务器既可以接收写请求,也能够将数据同步给另一台主服务器。这种模式的优点是可以实现负载均衡并提高系统的容错能力。
1.2 Keepalived
Keepalived 是一种基于 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)的高可用性解决方案。它可以监控和管理网络服务的可用性,并在主服务器发生故障时自动切换流量到备用服务器。在 MySQL 环境中,Keepalived 可以配置虚拟 IP 地址(VIP),确保数据库服务在多台主服务器之间无缝切换。
2. 架构图示
双主架构结合 Keepalived 的示意图:
+-----------------------+
| Keepalived |
+-----------+-----------+
|
| Virtual IP (VIP)
|
+---------+---------+
| |
| |
+---+---+ +---+---+
| Master 1| | Master 2|
+---------+ +---------+
| ^ | ^
| | | |
| +-------------------+ |
| |
+----+-------+ +-----+-------+
| Slave 1 | | Slave 2 |
+------------+ +-------------+
3. 工作原理
- 数据同步:在双主架构中,Master 1 和 Master 2 之间通过双向复制进行数据同步。它们各自接收写请求并将数据同步给对方。
- VIP 管理:Keepalived 管理一个虚拟 IP(VIP),该 IP 可以在主服务器发生故障时自动切换到备用服务器。这意味着客户端始终使用同一个 IP 地址来访问数据库服务。
- 故障转移:当 Master 1 发生故障时,Keepalived 会通过 VRRP 协议检测到故障,并将 VIP 迁移到 Master 2。这时,所有的数据库请求将通过 Master 2 继续服务。
- 健康检查:Keepalived 定期检查数据库节点的健康状况,确保系统的可用性和一致性。
4. 设置步骤
以下是在 Linux 环境中配置 Keepalived 和双主架构的详细步骤:
4.1 环境准备
确保你有两个安装了 MySQL 的服务器(例如,Master 1 和 Master 2),以及安装了 Keepalived 的环境。
4.2 安装 Keepalived
在每个主服务器上安装 Keepalived:
sudo apt-get update
sudo apt-get install keepalived
4.3 配置双主复制
4.3.1 配置 MySQL
在 Master 1 和 Master 2 中进行以下配置:
- 在 master1.cnf 和 master2.cnf 中设置:
# Master 1 Configuration
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-do-db = your_database # 需要同步的数据库
auto-increment-increment = 2
auto-increment-offset = 1
# Master 2 Configuration
[mysqld]
server-id = 2
log-bin = mysql-bin
binlog-do-db = your_database # 需要同步的数据库
auto-increment-increment = 2
auto-increment-offset = 2
- 重启 MySQL 服务:
sudo systemctl restart mysql
- 创建复制用户:
在 Master 1 上执行:
CREATE USER 'replication_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
FLUSH PRIVILEGES;
在 Master 2 上执行相同的操作,确保复制用户相同。
4.3.2 配置复制
在 Master 1 和 Master 2 中执行以下步骤:
- 获取 Master 1 的状态(在 Master 1 上执行):
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
记下 File
和 Position
的值。
- 在 Master 2 上执行配置:
CHANGE MASTER TO
MASTER_HOST='master1_ip',
MASTER_USER='replication_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.xxxxxx', -- 记下的 File
MASTER_LOG_POS=xxxx; -- 记下的 Position
START SLAVE;
- 获取 Master 2 的状态(在 Master 2 上执行):
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
记下 File
和 Position
的值,然后在 Master 1 上执行相同的配置:
CHANGE MASTER TO
MASTER_HOST='master2_ip',
MASTER_USER='replication_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.xxxxxx', -- 记下的 File
MASTER_LOG_POS=xxxx; -- 记下的 Position
START SLAVE;
4.4 配置 Keepalived
4.4.1 配置 Keepalived
在每个主服务器上创建和编辑 Keepalived 配置文件 /etc/keepalived/keepalived.conf
:
在 Master 1 上:
vrrp_instance VI_1 {
state MASTER
interface eth0 # 根据实际网卡调整
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass YourAuthPass # 设置认证密码
}
virtual_ipaddress {
192.168.1.100 # VIP 地址
}
}
在 Master 2 上:
vrrp_instance VI_1 {
state BACKUP
interface eth0 # 根据实际网卡调整
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass YourAuthPass # 设置认证密码
}
virtual_ipaddress {
192.168.1.100 # VIP 地址
}
}
4.4.2 启动 Keepalived
在每个主服务器上启动并设置 Keepalived 为自启动:
sudo systemctl start keepalived
sudo systemctl enable keepalived
4.5 验证配置
- 检查 Keepalived 状态:
使用以下命令确认 VIP 已分配至 Master 1:
ip addr show
- 检查 MySQL 主从复制状态:
在 Master 1 和 Master 2 上执行:
SHOW SLAVE STATUS\G;
确保 Slave_IO_Running
和 Slave_SQL_Running
都是 Yes
,表明复制正常。
5. 使用场景
- 高可用性数据库:对可用性要求高的业务场景,可以暑以双主架构搭配 Keepalived 提升可靠性。
- 读写分离:在确保可用性的同时,实现读取负载的分散,双主架构允许同时处理写请求。
- 容灾备份:在一台主服务器发生故障时,另一台主服务器可即时接管服务。
6. 优势与局限性
6.1 优势
- 自动故障转移:借助 Keepalived 实现自动故障转移,减少了人工干预的需要。
- 负载均衡:双主架构能够在多台服务器之间分担负载,提高整体性能。
- 高可用性:保持较高的可用性和恢复能力,适用于关键业务系统。
6.2 局限性
- 数据冲突:双主架构可能会在写入操作上产生数据冲突,需谨慎设计应用的写入逻辑。
- 复杂性:相较于单主单从架构,双主架构的配置和维护会更加复杂。
- 网络瓶颈:网络延迟和带宽可能会成为性能瓶颈,影响主从之间的同步速度。