MySQL雙主Keepalived主備搶占配置手冊
MySQL雙主Keepalived主備搶占配置手冊
以下是為服務器(192.168.43.218 和 192.168.43.219)配置Keepalived高可用的完整手冊,虛擬IP(VIP)為 192.168.43.222,并已按要求將虛擬路由器ID設置為 222。此配置能確保當一臺MySQL服務器故障時,VIP自動漂移到另一臺,實現(xiàn)高可用。
配置規(guī)劃
|
組件 |
服務器 1 (Master-1) |
服務器 2 (Master-2) |
說明 |
|
真實IP |
192.168.43.218 |
192.168.43.219 |
服務器的固定IP |
|
虛擬IP (VIP) |
192.168.43.222 (主) |
192.168.43.222 (備) |
對應用層提供服務的浮動IP |
|
Keepalived角色 |
|
|
初始狀態(tài) |
|
優(yōu)先級 (priority) |
150 |
100 |
MASTER優(yōu)先級需高于BACKUP |
|
虛擬路由器ID |
222 |
222 |
關鍵修改點,確保全網唯一 |
|
網卡接口 |
需根據實際修改(如ens160、eth0) |
需根據實際修改(如ens160、eth0) |
使用 |
安裝Keepalived
在兩臺服務器上執(zhí)行
# 安裝Keepalived yum install -y keepalived #yum -y install keepalived ipvsadm mailx systemctl enable keepalived # 設置開機自啟(暫不啟動) #systemctl enable keepalived #groupadd -r keepalived_script #useradd -r -g keepalived_script -s /sbin/nologin keepalived_script
配置Keepalived
主節(jié)點配置 (192.168.43.218)
編輯配置文件 /etc/keepalived/keepalived.conf,內容如下:
cat > /etc/keepalived/keepalived.conf << 'EOF'
# ================================================================
# db218 節(jié)點 keepalived 配置文件
# 角色:MASTER(初始寫入節(jié)點)
# 虛擬 IP:192.168.43.222
# ================================================================
global_defs {
# 本機唯一標識,日志中便于定位
router_id mysql_218
# 啟用性能優(yōu)化選項
max_auto_priority
# 以 root 身份運行腳本,并啟用腳本安全檢查
script_user root
enable_script_security
# 跳過對通告地址的校驗,加速切換
vrrp_skip_check_adv_addr
}
# ------------------------------------------------------------
# MySQL 健康檢查腳本定義
# ------------------------------------------------------------
vrrp_script chk_mysql {
# 檢查腳本路徑
script "/etc/keepalived/check_mysql.sh"
interval 10 # 腳本執(zhí)行間隔:給足MySQL啟停時間
timeout 7 # 腳本超時時間:小于interval,預留3秒緩沖
weight -60 # 故障時降低60優(yōu)先級,確保node2優(yōu)先級更高
fall 2 # 連續(xù)2次失敗判定為故障(減少誤判)
rise 3 # 連續(xù)3次成功判定為恢復(確保穩(wěn)定)
}
# 實例名字(自定義),同一對主備須同名,否則互相認不到。
vrrp_instance VI_1 {
state MASTER # 初始狀態(tài):BACKUP
interface ens160 # 綁定網卡,需與 ip a 看到的名稱一致
virtual_router_id 222 # 主備必須相同,范圍 1-255
priority 150 # 優(yōu)先級,高于 BACKUP(100)
advert_int 2 # 心跳間隔 2 秒
#nopreempt # 非搶占式
# 優(yōu)化ARP發(fā)送策略
garp_master_delay 5 # 成為主節(jié)點后延遲5秒發(fā)送ARP
garp_master_repeat 3 # 成為主節(jié)點后發(fā)送3次ARP
# 認證方式:簡單密碼(主備必須一致)
authentication {
auth_type PASS
auth_pass 8888
}
# 虛擬 IP/掩碼及標簽(label 方便 ip addr 查看)
virtual_ipaddress {
192.168.43.222/24 dev ens160 label ens160:1
}
# 使用單播代替組播,防止交換機禁組播,指向對端
unicast_src_ip 192.168.43.218 # 本地IP
unicast_peer {
192.168.43.219 # 對端IP
}
# 關聯(lián)健康檢查腳本
track_script {
chk_mysql weight 0 # weight 0:僅觸發(fā)狀態(tài)判定,不疊加權重
}
}
EOF
備節(jié)點配置 (192.168.43.219)
配置文件路徑相同,內容如下(注意修改router_id和優(yōu)先級):
cat > /etc/keepalived/keepalived.conf << 'EOF'
# ================================================================
# db219 節(jié)點 keepalived 配置文件
# 角色:BACKUP(初始只讀節(jié)點)
# 虛擬 IP:192.168.43.222(故障時漂移到本機)
# ================================================================
global_defs {
# 本機唯一標識,日志中便于定位
router_id mysql_219
# 啟用性能優(yōu)化選項
max_auto_priority
# 以 root 身份運行腳本,并啟用腳本安全檢查
script_user root
enable_script_security
# 跳過對通告地址的校驗,加速切換
vrrp_skip_check_adv_addr
}
# ------------------------------------------------------------
# MySQL 健康檢查腳本定義
# ------------------------------------------------------------
vrrp_script chk_mysql {
# 檢查腳本路徑
script "/etc/keepalived/check_mysql.sh"
interval 10 # 腳本執(zhí)行間隔:給足MySQL啟停時間
timeout 7 # 腳本超時時間:小于interval,預留3秒緩沖
weight -60 # 故障時降低60優(yōu)先級,確保node2優(yōu)先級更高
fall 2 # 連續(xù)2次失敗判定為故障(減少誤判)
rise 3 # 連續(xù)3次成功判定為恢復(確保穩(wěn)定)
}
# 實例名字(自定義),同一對主備須同名,否則互相認不到。
vrrp_instance VI_1 {
state BACKUP # 初始狀態(tài):BACKUP
interface ens160 # 綁定網卡,需與 ip a 看到的名稱一致
virtual_router_id 222 # 主備必須相同,范圍 1-255
priority 100 # 優(yōu)先級低于 MASTER (150)
advert_int 2 # 心跳間隔 2 秒
#nopreempt # 非搶占式
# 優(yōu)化ARP發(fā)送策略
garp_master_delay 5 # 成為主節(jié)點后延遲5秒發(fā)送ARP
garp_master_repeat 3 # 成為主節(jié)點后發(fā)送3次ARP
# 認證方式:簡單密碼(主備必須一致)
authentication {
auth_type PASS
auth_pass 8888
}
# 虛擬 IP/掩碼及標簽(label 方便 ip addr 查看)
virtual_ipaddress {
192.168.43.222/24 dev ens160 label ens160:1
}
# 使用單播代替組播,防止交換機禁組播,指向對端
unicast_src_ip 192.168.43.219 # 本地IP
unicast_peer {
192.168.43.218 # 對端IP
}
# 關聯(lián)健康檢查腳本
track_script {
chk_mysql weight 0 # weight 0:僅觸發(fā)狀態(tài)判定,不疊加權重
}
}
EOF
配置MySQL健康檢查腳本(關鍵步驟)
為確保VIP僅在MySQL服務正常時切換,需創(chuàng)建健康檢查腳本。在兩臺服務器上創(chuàng)建 /etc/keepalived/check_mysql.sh
# 創(chuàng)建專用賬號 CREATE USER 'checkuser'@'localhost' IDENTIFIED BY 'xrvLovfnp$4%svbS'; GRANT USAGE ON *.* TO 'checkuser'@'localhost'; # 測試是否可以成功執(zhí)行 mysql -hlocalhost -ucheckuser -p'xrvLovfnp$4%svbS' -e "select 1"
cat >/etc/keepalived/check_mysql.sh << 'EOF' #!/bin/bash # MySQL健康檢查腳本:測試MySQL連接是否正常 MYSQL_CMD=$(which mysql) MYSQL_HOST="localhost" MYSQL_PORT="3306" MYSQL_USER="checkuser" CHECK_SQL="SELECT 1;" if $MYSQL_CMD -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p'xrvLovfnp$4%svbS' -e "$CHECK_SQL" > /dev/null 2>&1; then exit 0 # MySQL正常,腳本返回0 else exit 1 # MySQL異常,腳本返回非0,觸發(fā)優(yōu)先級降低 fi EOF chmod 755 /etc/keepalived/check_mysql.sh
啟動服務與驗證
驗證keepalived服務
# 主節(jié)點(218)啟動 systemctl start keepalived # 在備節(jié)點(219)啟動 systemctl start keepalived
驗證VIP綁定
# 在主節(jié)點執(zhí)行,應看到VIP綁定在網卡上 ip addr|grep 192 # 在備節(jié)點執(zhí)行,不應看到VIP ip addr|grep 192
檢查服務狀態(tài)
systemctl status keepalived # 查看服務是否活躍 tail -f /var/log/messages # 監(jiān)控Keepalived日志,確認無錯誤
故障轉移測試
模擬主節(jié)點故障-keepalived關閉
# 在主節(jié)點停止Keepalived: systemctl stop keepalived #觀察備節(jié)點日志:應看到VIP漂移到備節(jié)點. tail -f /var/log/messages, 在備節(jié)點執(zhí)行,確認VIP已綁定。 ip addr|grep 192
恢復測試-keepalived開啟
# 重啟主節(jié)點的Keepalived: systemctl start keepalived # 由于主節(jié)點優(yōu)先級更高,VIP應自動漂回(搶占模式)。 ip addr|grep 192
模擬主節(jié)點故障-mysqld關閉
# 在主節(jié)點查看 systemctl stop mysqld systemctl status mysqld ip addr|grep 192 tail -f /var/log/messages # 在備節(jié)點查看 ip addr|grep 192 tail -f /var/log/messages
恢復測試-mysqld開啟
# 在主節(jié)點查看 systemctl start mysqld systemctl status mysqld ip addr|grep 192 tail -f /var/log/messages # 在備節(jié)點查看 ip addr|grep 192 tail -f /var/log/messages
# 快捷命令 systemctl status mysqld systemctl status keepalived.service systemctl start mysqld systemctl start keepalived.service systemctl stop mysqld systemctl stop keepalived.service systemctl restart mysqld systemctl restart keepalived.service ip addr|grep 192
經多次測試,已經達到預期效果!

浙公網安備 33010602011771號