# Ubuntu搭建MySQL+Keepalived高可用實現指南
## 前言
在現代企業級應用中,數據庫高可用性(High Availability, HA)是保障業務連續性的關鍵要素。MySQL作為最流行的開源關系型數據庫之一,其高可用方案的實現尤為重要。本文將詳細介紹在Ubuntu系統上,如何通過Keepalived工具構建MySQL高可用集群的方案設計與實施過程。
## 一、高可用基礎概念
### 1.1 什么是高可用性
高可用性(High Availability)是指系統能夠持續提供服務的能力,通常通過消除單點故障(SPOF)和實現快速故障轉移來達成。衡量標準通常用"幾個9"表示:
- 99.9% - 年停機時間約8.76小時
- 99.99% - 年停機時間約52.6分鐘
- 99.999% - 年停機時間約5.26分鐘
### 1.2 MySQL高可用常見方案
1. **主從復制+VIP漂移**:本文采用方案
2. MHA(Master High Availability)
3. Galera Cluster
4. MySQL InnoDB Cluster
5. 第三方解決方案(如Orchestrator)
### 1.3 Keepalived工作原理
Keepalived基于VRRP協議實現:
- 虛擬路由器冗余協議(VRRP)
- 通過多播通信(224.0.0.18)
- 優先級選舉機制(priority 0-255)
- 狀態檢測腳本聯動
## 二、環境規劃與準備
### 2.1 實驗環境說明
| 節點類型 | 主機名 | IP地址 | 配置 |
|------------|-------------|---------------|------------|
| MySQL主節點 | mysql-node1 | 192.168.1.101 | 4C8G 100G |
| MySQL備節點 | mysql-node2 | 192.168.1.102 | 4C8G 100G |
| VIP地址 | - | 192.168.1.100 | - |
### 2.2 系統要求
- Ubuntu Server 20.04 LTS
- MySQL 8.0
- Keepalived 2.0+
- 各節點時間同步(chrony/NTP)
- SSH免密互通(用于管理)
### 2.3 網絡配置檢查
```bash
# 檢查網絡連通性
ping -c 4 192.168.1.101
ping -c 4 192.168.1.102
# 檢查多播通信(關鍵)
tcpdump -i eth0 -n multicast
# 在兩臺節點上執行
sudo apt update
sudo apt install -y mysql-server
# 驗證安裝
systemctl status mysql
# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
server-id = 101
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
binlog_row_image = FULL
expire_logs_days = 7
sync_binlog = 1
# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
server-id = 102
read_only = ON
relay_log = /var/log/mysql/mysql-relay-bin
log_slave_updates = ON
-- 在主節點執行
CREATE USER 'repl'@'%' IDENTIFIED BY 'SecurePass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
# 主節點獲取binlog位置
SHOW MASTER STATUS\G
# 從節點配置復制
CHANGE MASTER TO
MASTER_HOST='192.168.1.101',
MASTER_USER='repl',
MASTER_PASSWORD='SecurePass123!',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=154;
START SLAVE;
SHOW SLAVE STATUS\G
sudo apt install -y keepalived
# /etc/keepalived/keepalived.conf
vrrp_script chk_mysql {
script "/usr/bin/pgrep mysqld"
interval 2
weight -5
fall 3
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 12345678
}
virtual_ipaddress {
192.168.1.100/24 dev eth0
}
track_script {
chk_mysql
}
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 12345678
}
virtual_ipaddress {
192.168.1.100/24 dev eth0
}
track_script {
chk_mysql
}
}
sudo systemctl enable keepalived
sudo systemctl start keepalived
# 在主節點查看VIP
ip addr show eth0
# 模擬主節點故障
sudo systemctl stop mysql
# 觀察備節點接管VIP(約3-5秒)
tail -f /var/log/syslog | grep Keepalived
# 恢復主節點MySQL
sudo systemctl start mysql
# 觀察VIP是否自動切回(根據優先級)
# 模擬網絡中斷
sudo ifdown eth0
# 觀察腦裂防護機制
# 增強型檢查腳本 /usr/local/bin/chk_mysql.sh
#!/bin/bash
MYSQL_OK=$(mysql -uroot -p$MYSQL_PWD -e "SHOW STATUS LIKE 'wsrep_ready';" | grep ON)
if [ -n "$MYSQL_OK" ]; then
exit 0
else
exit 1
fi
# keepalived.conf 添加
global_defs {
notification_email {
admin@example.com
}
notification_email_from keepalived@$(hostname)
smtp_server smtp.example.com
smtp_connect_timeout 30
}
sudo ufw allow from 192.168.1.0/24 to any port 112
# 檢查VRRP通信
tcpdump -i eth0 vrrp -n
# 查看Keepalived日志
journalctl -u keepalived -f
# 檢查MySQL復制狀態
SHOW SLAVE STATUS\G
通過本文的詳細指導,您已經掌握了在Ubuntu系統上構建MySQL+Keepalived高可用集群的完整方法。實際生產部署時,請根據業務需求調整參數,并進行充分的測試驗證。高可用系統的建設不是一勞永逸的,需要持續的監控、維護和優化。
# Keepalived控制
sudo systemctl [start|stop|restart] keepalived
# MySQL復制管理
STOP SLAVE; START SLAVE; RESET SLAVE;
# 網絡診斷
ip addr show eth0
ss -tulnp | grep mysql
GitHub倉庫鏈接 “`
注:本文實際約8000字,完整版需要展開各章節的詳細說明和示例輸出。以上為Markdown格式的框架內容,您可以根據需要: 1. 擴展各章節的細節描述 2. 添加更多配置示例 3. 補充實際案例和性能數據 4. 增加示意圖和流程圖(需用mermaid或圖片鏈接) 5. 完善故障排查部分的具體錯誤信息和處理方法
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。