MySQL的高可用+MHA

MySQL 主從復制高可用架構,是一套優秀的MySQL 高可用解決方案,由日本 DeNA 公司 youshimaton 開發,主要用于保障 MySQL 數據庫在主服務器出現故障時,能快速進行主從切換,減少數據庫服務中斷時間。

其核心特點包括:

  1. 自動故障檢測與切換:通過定期監控主庫狀態,當主庫出現故障(如宕機、網絡中斷等)時,能自動識別并在從庫中選擇最合適的節點提升為新主庫,整個過程無需人工干預。

  2. 數據一致性保障:在切換過程中,會盡量復制主庫未同步到從庫的binlog日志,最大程度減少數據丟失;支持GTID(全局事務標識),簡化binlog定位與同步流程。

  3. 靈活的候選主庫選擇:可通過配置指定優先成為新主庫的候選節點,優先選擇數據最新、負載較低的從庫,確保切換后服務穩定。

  4. 低性能損耗:監控過程對MySQL集群性能影響極小,僅通過SSH和MySQL賬號進行輕量通信。

  5. 架構簡潔:由Manager(管理節點)和Node(數據節點代理)兩部分組成,Manager負責監控和決策,Node部署在所有MySQL節點上執行具體操作(如復制管理、binlog處理等)

MHA實現原理

(1)從宕機崩潰的master保存二進制日志事件(binlog events);

(2)識別含有最新更新的slave;

(3)應用差異的中繼日志(relay log)到其他的slave;

(4)應用從master保存的二進制日志事件(binlog events);

(5)提升一個slave為新的master;

(6)使其他的slave連接新的master進行復制;


實驗步驟

1. 服務器規劃(至少3節點)
角色主機名IP地址說明
Mastermha-node1192.168.1.10主庫
Slave1mha-node2192.168.1.20從庫(候選主庫)
Slave2mha-node3192.168.1.60從庫
Managermha-manager192.168.1.40MHA管理節點(獨立服務器)
2. 基礎配置(所有節點)
# 關閉防火墻
systemctl stop firewalld && systemctl disable firewalld# 關閉SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config# 配置hosts(所有節點一致)cat >> /etc/hosts << EOF
192.168.1.10 mha-node1
192.168.1.20 mha-node2
192.168.1.60 mha-node3
192.168.1.40 mha-manager
EOF# 配置SSH免密登錄(manager節點需免密登錄所有數據庫節點,數據庫節點間也需互信)所有節點執行
ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa
nodes=("mha-manager" "mha-node1" "mha-node2" "mha-node3")
for host in "${nodes[@]}"; dossh-copy-id -i ~/.ssh/id_rsa.pub $host
done
執行時,會提示輸入目標節點的登錄密碼(每個節點第一次執行時需要)。
就是我們登錄不同設備的密碼

解釋上面的ssh免密登錄,不用做

在當前節點生成 SSH 密鑰對
登錄到一個節點(例如先在mha-manager執行,之后再依次在mha-node1、mha-node2、mha-node3重復),執行以下命令生成密鑰(無密碼):
bash
# 生成RSA密鑰對,-N ''表示空密碼,-f指定密鑰文件路徑
ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa執行后會在~/.ssh/目錄下生成id_rsa(私鑰)和id_rsa.pub(公鑰)。
將當前節點的公鑰分發到所有其他節點
同樣在當前節點,執行以下命令,將其公鑰復制到包括自身在內的所有節點(確保所有節點的 hostname 能被解析,或用 IP 替代):
bash
# 定義所有節點的列表(包括當前節點自己)
nodes=("mha-manager" "mha-node1" "mha-node2" "mha-node3")# 循環分發公鑰到每個節點
for host in "${nodes[@]}"; do# 輸入目標節點的密碼(首次需要,后續免密)ssh-copy-id -i ~/.ssh/id_rsa.pub $host
done執行時,會提示輸入目標節點的登錄密碼(每個節點第一次執行時需要)。
ssh-copy-id的作用是將當前節點的id_rsa.pub內容追加到目標節點的~/.ssh/authorized_keys文件中。
在所有節點重復上述步驟
登錄到下一個節點(例如mha-node1),重復步驟 1 和步驟 2,將其公鑰分發到包括mha-manager、mha-node2、mha-node3在內的所有節點。
依次對mha-node2、mha-node3執行相同操作。
驗證免密登錄
在任意節點上,嘗試 SSH 連接其他節點,若無需輸入密碼則表示配置成功:
bash
# 例如在mha-manager上測試連接mha-node1
ssh mha-node1# 在mha-node1上測試連接mha-node2
ssh mha-node2
注意事項
節點 hostname 解析:確保所有節點的/etc/hosts文件中配置了彼此的 hostname 和 IP 映射,例如:
bash
# 所有節點的/etc/hosts都添加以下內容(IP替換為實際地址)
192.168.1.10 mha-manager
192.168.1.11 mha-node1
192.168.1.12 mha-node2
192.168.1.13 mha-node3權限問題:SSH 對權限敏感,需確保相關文件權限正確:
bash
chmod 700 ~/.ssh               # .ssh目錄權限必須為700
chmod 600 ~/.ssh/authorized_keys  # 授權文件權限必須為600避免重復操作:如果節點數量較多,可編寫一個腳本批量執行(但首次仍需手動輸入各節點密碼)。

二、部署MySQL 8.0主從復制

安裝好mysql

配置MySQL(主從差異化配置)
建議采用GTID依賴:建議開啟GTID,減少MHA切換時的binlog定位復雜度。
Master(mha-node1)配置
vim  /etc/my.cnf
[mysqld]
# ...
# 在默認配置下方添加:
server-id=11  # 唯一ID
log_bin=mysql-bin  # 開啟binlog
binlog_format=ROW  # ROW模式(MHA推薦)
gtid_mode=ON  # 開啟GTID
enforce_gtid_consistency=ON  # 強制GTID一致性
log_slave_updates=ON  # 從庫同步時記錄binlog(用于級聯復制)
skip_name_resolve=ON  # 跳過域名解析systemctl restart mysqld可直接復制
server-id=11
log_bin=mysql-bin  
binlog_format=ROW  
gtid_mode=ON  
enforce_gtid_consistency=ON  
log_slave_updates=ON  
skip_name_resolve=ON
Slave(mha-node2/mha-node3)配置
# mha-node2(server-id=12)
vim  /etc/my.cnf
[mysqld]
# ...
server-id=12  # 唯一ID(mha-node3設為13)
log_bin=mysql-bin
binlog_format=ROW
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
skip_name_resolve=ON
relay_log=relay-bin  # 開啟中繼日志
read_only=ON  # 從庫只讀(可選)systemctl restart mysqld可復制
server-id=12
log_bin=mysql-bin
binlog_format=ROW
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
skip_name_resolve=ON
relay_log=relay-bin
read_only=ONserver-id=14
log_bin=mysql-bin
binlog_format=ROW
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
skip_name_resolve=ON
relay_log=relay-bin
read_only=ON
3. 搭建主從復制(基于GTID)
在Master(mha-node1)創建復制用戶
-- MySQL 8.0默認認證插件為caching_sha2_password,MHA需用mysql_native_password
CREATE USER 'repl'@'192.168.1.%' IDENTIFIED WITH mysql_native_password BY 'Repl@123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%';
FLUSH PRIVILEGES;
在Slave(mha-node2/mha-node3)配置復制
-- 登錄Slave的MySQL
CHANGE MASTER TOMASTER_HOST='mha-node1',MASTER_USER='repl',MASTER_PASSWORD='Repl@123',MASTER_PORT=3306,MASTER_AUTO_POSITION=1;  # 基于GTID自動定位-- 啟動復制
START SLAVE;-- 檢查復制狀態(確保Slave_IO_Running和Slave_SQL_Running均為Yes)
SHOW SLAVE STATUS\G;可復制
CHANGE MASTER TOMASTER_HOST='mha-node1',MASTER_USER='repl',MASTER_PASSWORD='Repl@123',MASTER_PORT=3306,MASTER_AUTO_POSITION=1;

三、部署MHA

1. 安裝依賴(所有節點)

CentOS7安裝依賴

# 安裝wget
yum install -y wget
這時候需要先把ip改成dhcp
# 配置網絡Yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 配置Yum擴展源
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
# 安裝Perl依賴(MHA基于Perl開發)
yum install -y perl-DBD-MySQL perl-CPAN perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
yum install -y perl-Email-Sender perl-Email-Valid perl-Mail-Sender

Ubuntu22.04安裝依賴包

sudo apt install -y perl libdbi-perl libdbd-mysql-perl libperl-dev libconfig-tiny-perl liblog-dispatch-perl libparallel-forkmanager-perl
2. 安裝MHA包
下載MHA源碼包
# 在教室可以使用局域網下載
# 管理節點下載
wget http://192.168.56.200/Software/mha4mysql-manager-0.58.tar.gz
# 所有節點下載
wget http://192.168.56.200/Software/mha4mysql-node-0.58.tar.gz# github下載
# 管理節點下載
# wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz
# 所有節點下載
# wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gz
安裝MHA Node(所有節點)管理節點也要做這個不然下一個步驟裝不成功
tar -zxvf mha4mysql-node-0.58.tar.gz
cd mha4mysql-node-0.58
perl Makefile.PL
make && make install
安裝MHA Manager(僅manager節點)
tar -zxvf mha4mysql-manager-0.58.tar.gz
cd mha4mysql-manager-0.58
perl Makefile.PL
make && make install# 創建MHA工作目錄
mkdir -p /etc/mha/mha_cluster /var/log/mha/mha_cluster
創建MHA配置文件(manager節點)
vim /etc/mha/mha_cluster.cnf 
[server default]
user=mha_user        # MHA管理用戶(需在所有MySQL節點創建)
password=Mha@123
ssh_user=root        # SSH登錄用戶
repl_user=repl        # MySQL復制用戶
repl_password=Repl@123
ping_interval=1        # 健康檢查間隔(秒)
master_binlog_dir=/usr/local/mysql/data        # master的binlog目錄
remote_workdir=/tmp        # 遠程節點臨時目錄
secondary_check_script=masterha_secondary_check -s mha-node2 -s mha-node3        # 二次檢查節點
manager_workdir=/var/log/mha/mha_cluster        # manager工作目錄
manager_log=/var/log/mha/mha_cluster/manager.log        # manager日志[server1]
hostname=mha-node1
port=3306
candidate_master=0        # 不優先作為候選主庫[server2]
hostname=mha-node2
port=3306
candidate_master=1        # 優先作為候選主庫(數據最新時)
check_repl_delay=0        # 忽略復制延遲,強制作為候選[server3]
hostname=mha-node3
port=3306
candidate_master=0可復制
[server default]
user=mha_user
password=Mha@123
ssh_user=root
repl_user=repl
repl_password=Repl@123
ping_interval=1
master_binlog_dir=/usr/local/mysql/data
remote_workdir=/tmp
secondary_check_script=masterha_secondary_check -s mha-node2 -s mha-node3
manager_workdir=/var/log/mha/mha_cluster
manager_log=/var/log/mha/mha_cluster/manager.log[server1]
hostname=mha-node1
port=3306
candidate_master=0
[server2]
hostname=mha-node2
port=3306
candidate_master=1
check_repl_delay=0
[server3]
hostname=mha-node3
port=3306
candidate_master=0
?創建MHA管理用戶,因為前面做了主從所以只在主上做就好了(所有MySQL節點)
CREATE USER 'mha_user'@'192.168.1.%' IDENTIFIED BY 'Mha@123';
GRANT ALL PRIVILEGES ON *.* TO 'mha_user'@'192.168.1.%';
FLUSH PRIVILEGES;

四、驗證MHA配置

1. 檢查SSH連接(manager節點)
masterha_check_ssh --conf=/etc/mha/mha_cluster.cnf
# 輸出"All SSH connection tests passed successfully."即為正常
2. 檢查主從復制(manager節點)
masterha_check_repl --conf=/etc/mha/mha_cluster.cnf
# 輸出"MySQL Replication Health is OK."即為正常

五、啟動MHA Manager

# 前臺啟動(測試用,日志實時輸出)
masterha_manager --conf=/etc/mha/mha_cluster.cnf# 后臺啟動(生產用)
nohup masterha_manager --conf=/etc/mha/mha_cluster.cnf > /var/log/mha/mha_cluster/nohup.log 2>&1 &# 檢查MHA狀態
masterha_check_status --conf=/etc/mha/mha_cluster.cnf
# 輸出"mha_cluster (pid: xxxx) is running(0:PING_OK)"即為正常運行

GTID依賴:建議開啟GTID,減少MHA切換時的binlog定位復雜度。

啟動報錯:排錯(因為這個版本我做的時候主從復制采用的二進制,出了一堆錯,現在還沒解決所以我打算換一種復制方法。重新做)我現在照著前面文檔做了一次,做成功了,有機會再拍這個錯~(其實是失去了所有力氣和手段了,算了吧,能做出來就可以了)

錯誤1:

他顯示刪除用戶失敗,這個用戶是我之前創的,沒用我就直接刪了,但是反而報錯了,這時候需要檢查是否真的刪除了。這時候看了一下主從復制這里也報錯了,所以直接排查主從復制的錯誤。最后我通過跳過執行成功了,因為真的沒有這個用戶了。

1. 確認用戶是否真的不存在

先通過更全面的查詢確認是否有類似用戶:

-- 檢查所有以'rep'為用戶名的記錄
SELECT user, host FROM mysql.user WHERE user LIKE 'rep';-- 檢查權限表中是否有殘留記錄
SELECT * FROM mysql.db WHERE user = 'rep';
SELECT * FROM mysql.tables_priv WHERE user = 'rep';
SELECT * FROM mysql.columns_priv WHERE user = 'rep';

2. 清理殘留權限記錄(如果有)

如果上述查詢發現殘留記錄,手動刪除并刷新權限:

-- 刪除殘留的數據庫級權限
DELETE FROM mysql.db WHERE user = 'rep';-- 刪除殘留的表級權限
DELETE FROM mysql.tables_priv WHERE user = 'rep';-- 刷新權限
FLUSH PRIVILEGES;

3. 解決復制環境中的問題

如果這是從庫(slave)的錯誤,可能是主庫執行過?DROP USER?但從庫無此用戶導致的復制中斷:

方法 A:跳過這個錯誤(臨時解決)
-- MySQL 5.6及以下
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;-- MySQL 5.7及以上(GTID模式)
STOP SLAVE;
SET GTID_NEXT = 'AUTOMATIC';
START SLAVE;
方法 B:在從庫手動創建再刪除用戶
-- 在從庫執行
CREATE USER 'rep'@'%' IDENTIFIED BY '任意密碼';
DROP USER 'rep'@'%';
FLUSH PRIVILEGES;-- 然后重啟復制
STOP SLAVE;
START SLAVE;
錯誤2

主要問題是?masterha_manager?啟動后立即停止(狀態為?NOT RUNNING,結合提示和常見 MHA 啟動失敗場景,可從以下方面排查:

查看報錯日志:/var/log/mha/mha_cluster/manager.log

Thu Aug 21 09:34:50 2025 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln359] Slave configurations is not valid.
Thu Aug 21 09:34:50 2025 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations.  at /usr/local/bin/masterha_manager line 50.
Thu Aug 21 09:34:50 2025 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.
Thu Aug 21 09:34:50 2025 - [info] Got exit code 1 (Not master dead).

六、測試故障切換

1. 模擬Master故障(在mha-node1執行)
systemctl stop mysqld  # 停止主庫服務
2. 觀察故障切換(manager節點日志)
tail -f /var/log/mha/mha_cluster/manager.log
# 正常情況下,日志會顯示:
# - 檢測到master故障
# - 提升mha-node2為新master
# - 其他slave(mha-node3)指向新master

3. 驗證切換結果
# 在新master(mha-node2)查看狀態
mysql -uroot -p -e "SELECT @@server_id, @@read_only;"
# 應顯示server_id=12,read_only=OFF 或者0# 在mha-node3查看復制狀態
mysql -uroot -p -e "SHOW SLAVE STATUS\G"
# 應顯示Master_Host為mha-node2,且復制正常

七、故障恢復后處理

  1. 修復原master(mha-node1),重新安裝MySQL并配置為新master(mha-node2)的從庫。
  2. 重新啟動MHA Manager(故障切換后Manager會自動退出):
nohup masterha_manager --conf=/etc/mha/mha_cluster.cnf > /var/log/mha/mha_cluster/nohup.log 2>&1 &

恢復步驟

mha-node1啟動服務

獲取?mha-node2?的 binlog 位置
在?mha-node2?上執行,記錄?File?和?Position(用于?mha-node1?同步起點):

SHOW MASTER STATUS;

在?mha-node1?上配置從庫同步

登錄?mha-node1?的 MySQL,設置同步源為?mha-node2

CHANGE MASTER TOMASTER_HOST = '192.168.1.20', MASTER_USER = 'repl',MASTER_PASSWORD = 'Repl@123',MASTER_PORT = 3306,MASTER_LOG_FILE = 'mysql-bin.000001',MASTER_LOG_POS = 2866;  

驗證同步狀態
在?mha-node1?上執行,確保?Slave_IO_Running?和?Slave_SQL_Running?均為?Yes

SHOW SLAVE STATUS\G

四、手動觸發主庫切換(可選,若需立即切回)

若需主動將主庫切回?mha-node1,在?manager?節點執行手動故障轉移(模擬主庫故障,強制切換):

# 停止當前 MHA Manager(若正在運行)
masterha_stop --conf=/etc/mha/mha_cluster.cnf# 執行手動故障轉移,指定目標主庫為 mha-node1
masterha_master_switch --conf=/etc/mha/mha_cluster.cnf \--master_state=alive \--new_master_host=mha-node1 \--interactive=0

五、重啟 MHA Manager 監控

故障切換后,重啟 MHA Manager 以監控新的主從架構:

nohup masterha_manager --conf=/etc/mha/mha_cluster.cnf > /var/log/mha/mha_cluster/nohup.log 2>&1 &

六、驗證最終主庫狀態

在?manager?節點檢查 MHA 狀態,確認主庫已切回?mha-node1

masterha_check_status --conf=/etc/mha/mha_cluster.cnf

同時在從庫mha-node3執行?SHOW SLAVE STATUS\G,確保同步源已指向?mha-node1

如果我們想讓2接著當備胎,那么就是重復上述步驟,將2設置為1的備重新再配置一下

CHANGE MASTER TOMASTER_HOST='mha-node1',MASTER_USER='repl',MASTER_PASSWORD='Repl@123',MASTER_PORT=3306,MASTER_AUTO_POSITION=1;

現在就恢復到了第五大步做完時候的樣子了!!喜大普奔

報錯提示:

Last_Error: Error 'Operation CREATE USER failed for 'mha_user'@'192.168.68.%'' on query. Default database: ''. Query: 'CREATE USER 'mha_user'@'192.168.68.%' IDENTIFIED WITH 'mysql_native_password' AS '*B0878D325DEBC019F3AB1BC3522CC9310F887A9B'

這時候我們需要哦

SHOW SLAVE STATUS\G

找到?Retrieved_Gtid_Set: c81dbb0b-7c0f-11f0-ab4d-000c296e2d0c:1-6

Executed_Gtid_Set: c81dbb0b-7c0f-11f0-ab4d-000c296e2d0c:1-6,
e64cc74a-79a3-11f0-aa84-000c29ad973b:1-3

1. 已獲取的 GTID 范圍(Retrieved_Gtid_Set)
從 SHOW SLAVE STATUS\G 中可知:
plaintext
Retrieved_Gtid_Set: c81dbb0b-7c0f-11f0-ab4d-000c296e2d0c:1-6
這表示從庫已經從主庫完整接收了 GTID 為 c81dbb0b-... 的 1-6 號事務(即主庫執行過這 6 個事務,且從庫已下載到本地)。
2. 已執行的 GTID 范圍(Executed_Gtid_Set)
同時,從庫已執行的事務是:
plaintext
Executed_Gtid_Set: c81dbb0b-7c0f-11f0-ab4d-000c296e2d0c:1-3, ...這表示從庫只成功執行了 GTID 為 c81dbb0b-... 的 1-3 號事務,而 4-6 號事務尚未執行(或執行失敗)。
3. 錯誤位置推斷
結合錯誤信息 Last_SQL_Error 可知,從庫在執行某條 SQL 時失敗(創建用戶沖突)。由于:
1-3 號事務已成功執行(Executed_Gtid_Set 包含)
4-6 號事務已接收但未執行(Retrieved_Gtid_Set 包含,Executed_Gtid_Set 不包含)
因此,第一個執行失敗的事務必然是第 4 號事務,對應的 GTID 就是 c81dbb0b-7c0f-11f0-ab4d-000c296e2d0c:4。
簡單說就是:已接收的事務范圍(1-6)減去已成功執行的范圍(1-3),第一個未執行的就是失敗的事務(4)。
-- 停止從庫復制
STOP SLAVE;-- 指定要跳過的GTID事務
SET GTID_NEXT = 'c81dbb0b-7c0f-11f0-ab4d-000c296e2d0c:4';-- 執行空事務跳過該GTID
BEGIN; COMMIT;-- 恢復自動同步模式
SET GTID_NEXT = 'AUTOMATIC';-- 重啟復制
START SLAVE;-- 驗證同步狀態(確保Slave_SQL_Running變為Yes)
SHOW SLAVE STATUS\G

注意事項

  1. MySQL 8.0兼容性:需使用MHA 0.58版本,且用戶認證插件必須為mysql_native_password
  2. GTID依賴:建議開啟GTID,減少MHA切換時的binlog定位復雜度。
  3. 候選主庫選擇candidate_master=1的節點應盡量與原master數據一致(復制延遲小)。
  4. 日志監控:定期檢查MHA日志,及時發現潛在問題(如SSH連接失敗、復制延遲等)。

后面的內容我沒試,可以看一下了解一下

MHA與VIP(虛擬IP)集成配置

在MHA架構中,雖然其核心功能是實現主從自動切換,但應用程序通常通過固定IP地址連接數據庫。為避免主庫切換后需手動修改應用連接地址,可引入VIP(虛擬IP)?實現IP漂移——VIP始終綁定當前主庫節點,切換時自動遷移至新主庫,確保應用無感知。

“虛擬 IP”(Virtual IP,簡稱 VIP)是一個在網絡技術中常見的概念,指的是不直接綁定到特定物理網絡接口(如網卡)的 IP 地址,而是通過軟件或網絡設備(如路由器、負載均衡器)邏輯分配和管理的 IP 地址。它的核心作用是實現網絡服務的高可用性、負載均衡、故障轉移等功能。

一、VIP規劃與原理

1.VIP設定:為MHA集群分配一個獨立的虛擬IP(如192.168.8.100),不直接綁定到某臺物理機,而是隨主庫節點動態遷移。

2.實現邏輯:通過MHA的master_ip_failover腳本,在主庫故障切換時自動執行以下操作:

  • 從原主庫(故障節點)移除VIP;
  • 在新主庫(提升的slave)綁定VIP;
  • 確保VIP在網絡中唯一,避免沖突。
二、VIP配置步驟
1. 環境準備(所有節點)

確保所有節點支持VIP配置,關閉網絡管理工具(如NetworkManager)對VIP的干擾:

# 關閉NetworkManager(避免自動清理VIP)
systemctl stop NetworkManager && systemctl disable NetworkManager# 安裝arping工具(用于發送ARP廣播,刷新網絡緩存)
# CentOS
yum install -y arping
# Ubuntu
apt install -y arping
2. 編寫VIP切換腳本

在MHA Manager節點創建master_ip_failover腳本(用于控制VIP漂移),路徑為/etc/mha/master_ip_failover

#!/usr/bin/perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;# VIP配置
my $vip = '192.168.8.100/24';  # 虛擬IP及子網掩碼
my $key = '0';                 # 虛擬網卡標識(如需)
my $dev = 'eth0';              # 物理網卡名稱(根據實際環境修改)# 解析MHA傳遞的參數
my ($command, $ssh_user, $orig_master_host, $orig_master_ip, $orig_master_port, $new_master_host, $new_master_ip, $new_master_port);
GetOptions('command=s' => \$command,'ssh_user=s' => \$ssh_user,'orig_master_host=s' => \$orig_master_host,'orig_master_ip=s' => \$orig_master_ip,'orig_master_port=i' => \$orig_master_port,'new_master_host=s' => \$new_master_host,'new_master_ip=s' => \$new_master_ip,'new_master_port=i' => \$new_master_port,
);# 執行VIP操作的函數
sub exec_cmd {my $cmd = shift;my $result = system($cmd);if ($result != 0) {die "Failed to execute: $cmd\n";}
}# 從原主庫移除VIP
if ($command eq "stop" || $command eq "stopssh") {print "Removing VIP $vip from old master $orig_master_host...\n";exec_cmd("ssh $ssh_user\@$orig_master_host \"ip addr del $vip dev $dev; arping -c 3 -I $dev $vip\"");
}# 在新主庫綁定VIP
elsif ($command eq "start") {print "Adding VIP $vip to new master $new_master_host...\n";exec_cmd("ssh $ssh_user\@$new_master_host \"ip addr add $vip dev $dev; arping -c 3 -I $dev $vip\"");
}# 忽略其他命令
elsif ($command eq "status") {exit 0;
}exit 0;

給腳本添加執行權限:

chmod +x /etc/mha/master_ip_failover
3. 集成VIP腳本到MHA配置

修改MHA配置文件/etc/mha/mha_cluster.cnf,添加VIP腳本路徑:

[server default]
# ... 原有配置 ...
# 添加VIP切換腳本
master_ip_failover_script=/etc/mha/master_ip_failover
4. 初始化VIP(首次部署)

手動在當前主庫(mha-node1)綁定VIP:

# 在mha-node1執行
ip addr add 192.168.8.100/24 dev eth0  # 綁定VIP到網卡
arping -c 3 -I eth0 192.168.8.100     # 發送ARP廣播,通知網絡設備更新緩存

驗證VIP綁定:

ip addr show eth0 | grep 192.168.8.100
# 輸出包含"192.168.8.100/24"即為成功
三、驗證VIP漂移功能
1. 重啟MHA Manager

使VIP配置生效:

# 先停止原有MHA進程
masterha_stop --conf=/etc/mha/mha_cluster.cnf# 后臺重啟
nohup masterha_manager --conf=/etc/mha/mha_cluster.cnf > /var/log/mha/mha_cluster/nohup.log 2>&1 &
2. 模擬主庫故障(同前文步驟)

在原主庫(mha-node1)停止MySQL服務:

systemctl stop mysqld
3. 檢查VIP漂移結果
  • 查看MHA日志:確認腳本執行成功
tail -f /var/log/mha/mha_cluster/manager.log
# 應包含"Removing VIP from old master"和"Adding VIP to new master"的成功日志
  • 驗證新主庫VIP:在mha-node2(新主庫)執行
ip addr show eth0 | grep 192.168.8.100
# 輸出包含VIP即為漂移成功
  • 應用連接測試:通過VIP連接數據庫,驗證可用性
mysql -h 192.168.8.100 -u root -p
# 能成功登錄即表示應用無感知切換
四、VIP配置注意事項
  1. 網絡兼容性:確保交換機、防火墻支持VIP漂移(允許同一IP在不同節點間切換),避免因網絡策略導致VIP不可用。
  2. ARP緩存刷新:腳本中arping命令用于強制更新網絡中其他設備的ARP緩存,必須添加,否則可能出現VIP切換后短時間無法訪問的問題。
  3. 腳本權限master_ip_failover腳本需保證MHA Manager用戶(通常為root)有執行權限,且SSH免密登錄對所有節點生效(否則腳本無法遠程執行命令)。
  4. 故障恢復后處理:原主庫修復后,需手動將其作為新主庫的從庫,不要手動綁定VIP(VIP應由MHA腳本自動管理)。

通過集成VIP,MHA集群可實現“主庫切換+IP漂移”全自動化,進一步降低故障對應用的影響,提升整體高可用能力。

8.21 超級不開心的一上午,好累

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/920013.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/920013.shtml
英文地址,請注明出處:http://en.pswp.cn/news/920013.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

淘寶pc端首頁做了哪些性能優化?

淘寶PC端首頁作為中國電商領域流量最大的頁面之一&#xff0c;其性能優化手段可以說是業界標桿&#xff0c;非常全面和深入。這些優化不是單一技術&#xff0c;而是一個完整的體系。 我們可以從以下幾個層面來分析和理解淘寶首頁所做的性能優化&#xff1a; 一、核心指標與整體…

讓醫學數據更直觀——MedCalc 23.1.7 最新版使用體驗

軟件介紹 MedCalc 23.1.7是一款功能強大的生物醫學研究統計軟件&#xff0c;專為醫學科研人員和醫療保健專家設計。它提供了豐富的統計分析工具和方法&#xff0c;旨在幫助用戶更好地分析和解釋醫學數據。以下是該軟件的一些主要特點&#xff1a; 一、數據導入和管理 支持導…

Text2SQL、ChatBI簡介

概述 傳統BI的三大核心瓶頸&#xff1a; 問數之難&#xff1a;不同用戶往往存在個性化的分析邏輯&#xff0c;盡管企業內部已經創建大量報表和看板&#xff0c;但仍然無法完全滿足業務部門對數據的個性化需求。但傳統BI門檻較高&#xff0c;非技術人員在統一培訓前&#xff0…

神經網絡中 標量求導和向量求導

0. 引出問題 在神經網絡反向傳播過程中 loss [loss?,loss?, loss?]&#xff0c;為什么 ?loss/?w ?loss?/?w ?loss?/?w ?loss?/?w ?loss?/?w 和 loss 維度一樣都是三位向量 &#xff0c;[?loss?/?w, ?loss?/?w, ?loss?/?w] 就變成3*3的矩陣 如下所…

tcpdump命令打印抓包信息

tcpdump命令打印抓包信息 下面是在服務器抓取打印服務端7701端口打印 rootgb:/home/gb# ifconfig -a eth0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 10.250.251.197 netmask 255.255.255.0 broadcast 10.250.251.255inet6 fe80::76fe:48ff:fe94:5a5 …

Mysql-經典實戰案例(13):如何通過Federated實現跨實例訪問表

實現原理&#xff1a;使用Federated引擎本創建一個鏈接表實現&#xff0c;但是Federated 引擎只是一個按列的順序和類型解析遠程返回的數據流準備工作&#xff1a; 1. 本地庫啟用 Federated 引擎查看是否已啟用&#xff1a; SHOW ENGINES;如果Federated 引擎的 Support 是 YES …

Linux -- 動靜態庫

一、什么是庫1、動靜態庫概念# 庫是寫好的現有的&#xff0c;成熟的&#xff0c;可以復?的代碼。現實中每個程序都要依賴很多基礎的底層庫&#xff0c;不可能每個?的代碼都從零開始&#xff0c;因此庫的存在意義?同尋常。# 本質上來說庫是?種可執?代碼的?進制形式&#x…

Linux筆記---單例模式與線程池

1. 單例模式單例模式是一種常用的設計模式&#xff0c;它確保一個類只有一個實例&#xff0c;并提供一個全局訪問點來獲取這個實例。這種模式在需要控制資源訪問、管理共享狀態或協調系統行為時非常有用。單例模式的核心特點&#xff1a;私有構造函數&#xff1a;防止外部通過n…

Linux中的指令

1.adduseradduser的作用是創立一個新的用戶。當我們在命令行中輸入1中的指令后&#xff0c;就會彈出2中的命令行&#xff0c;讓我們設立新的密碼&#xff0c;緊接著就會讓我們再次輸入新的密碼&#xff0c;對于密碼的輸入它是不會顯示出來的&#xff0c;如果輸入錯誤就會讓我們…

【n8n】Docker容器中安裝ffmpeg

容器化部署 n8n 時&#xff0c;常常會遇到一些環境依賴問題。缺少 docker 命令或無法安裝 ffmpeg 是較為常見的場景&#xff0c;如果處理不當&#xff0c;會導致流程執行受限。 本文介紹如何在 n8n 容器中解決 docker 命令不可用和 ffmpeg 安裝受限的問題&#xff0c;并給出多…

【基礎算法】初識搜索:遞歸型枚舉與回溯剪枝

文章目錄一、搜索1. 什么是搜索&#xff1f;2. 遍歷 vs 搜索3. 回溯與剪枝二、OJ 練習1. 枚舉子集 ?(1) 解題思路(2) 代碼實現2. 組合型枚舉 ?(1) 解題思路請添加圖片描述(2) 代碼實現3. 枚舉排列 ?(1) 解題思路(2) 代碼實現4. 全排列問題 ?(1) 解題思路(2) 代碼實現一、搜…

Node.js異步編程——async/await實現

一、async/await基礎語法 在Node.Js編程中,async關鍵字用于定義異步函數,這個異步函數執行完會返回一個Promise對象,異步函數的內部可以使用await關鍵字來暫停當前代碼的繼續執行,直到Promise操作完成。 在用法上,async關鍵字主要用于聲明一個異步函數,await關鍵字主要…

搭建一個簡單的Agent

準備本案例使用deepseek&#xff0c;登錄deepseek官網&#xff0c;登錄賬號&#xff0c;充值幾塊錢&#xff0c;然后創建Api key可以創建虛擬環境&#xff0c;python版本最好是3.12&#xff0c;以下是文件目錄。test文件夾中&#xff0c;放一些txt文件做測試&#xff0c;main.p…

uv,下一代Python包管理工具

什么是uv uv&#xff08;Universal Virtual&#xff09;是由Astral團隊&#xff08;知名Python工具Ruff的開發者&#xff09;推出的下一代Python包管理工具&#xff0c;使用Rust編寫。它集成了包管理、虛擬環境、依賴解析、Python版本控制等功能&#xff0c;它聚焦于三個關鍵點…

單片機的輸出模式推挽和開漏如何選擇呢?

推挽和開漏是單片機的輸出模式&#xff0c;屬于I/O口配置的常見類型。開漏&#xff08;Open-Drain&#xff09;和推挽&#xff08;Push-Pull&#xff09;是兩種根本不同的輸出電路結構&#xff0c;理解它們的區別是正確使用任何單片機&#xff08;包括51和STM32&#xff09;GPI…

java18學習筆記-Simple Web Server

408:Simple Web Server Python、Ruby、PHP、Erlang 和許多其他平臺提供從命令行運行的開箱即用服務器。這種現有的替代方案表明了對此類工具的公認需求。 提供一個命令行工具來啟動僅提供靜態文件的最小web服務器。沒有CGI或類似servlet的功能可用。該工具將用于原型設計、即…

深度解析Atlassian 團隊協作套件(Jira、Confluence、Loom、Rovo)如何賦能全球分布式團隊協作

無窮無盡的聊天記錄、混亂不堪的文檔、反饋信息分散在各個不同時區……在全球分布式團隊中開展真正的高效協作&#xff0c;就像是一場不可能完成的任務。 為什么會這樣&#xff1f;因為即使是最聰明的團隊&#xff0c;也會遇到類似的障礙&#xff1a; 割裂的工作流&#xff1a…

理解AI 智能體:智能體架構

1. 引言 智能體架構&#xff08;agent architecture&#xff09;是一份藍圖&#xff0c;它定義了AI智能體各組件的組織方式和交互機制&#xff0c;使智能體能夠感知環境、進行推理并采取行動。本質上&#xff0c;它就像是智能體的數字大腦——整合了“眼睛”&#xff08;傳感器…

Spring Cloud系列—SkyWalking鏈路追蹤

上篇文章&#xff1a; Spring Cloud系列—Seata分布式事務解決方案TCC模式和Saga模式https://blog.csdn.net/sniper_fandc/article/details/149947829?fromshareblogdetail&sharetypeblogdetail&sharerId149947829&sharereferPC&sharesourcesniper_fandc&…

機器人領域的算法研發

研究生期間學習大模型&#xff0c;可投遞機器人領域的算法研發、技術支持等相關崗位&#xff0c;以下是具體推薦&#xff1a; AI算法工程師&#xff08;大模型方向-機器人應用&#xff09;&#xff1a;主要負責大模型開發與優化&#xff0c;如模型預訓練、調優及訓練效率提升等…