MHA原理:
MHA的目的在于維持MySQL Replication中master庫的高可用性, 其最大的特點是可以修復多個slave之間的差異日志,最終使所有slave保持數據一致, 然后從中選擇一個充當新的master,并將其他slave指向它。 當master出現故障時,可以通過對比slave之前IO thread讀取主庫binlog的position號, 選擇最接近的slave作為備選主庫(備胎)。 其他的從庫可以通過與備選主庫對比生成差異的中繼日志, 在備選主庫上應用從原來master保存的binlog,同時將備選主庫提升為master。 最后在其他slave上應用相應的差異中繼日志并從新的master開始復制。
manager節點發送心跳信息監測


以下是以前做實驗的筆記,可參考。
1.0 主從架構要求
(1)3個以上的節點,1主2從,不能是多實例
(2)多節點SSH互信1.1 軟件結構
# Manager : 管理軟件
masterha_manger 啟動MHA
masterha_check_ssh 檢查MHA的SSH配置狀況
masterha_check_repl 檢查MySQL復制狀況
masterha_master_monitor 檢測master是否宕機
masterha_check_status 檢測當前MHA運行狀態
masterha_master_switch 控制故障轉移(自動或者手動)
masterha_conf_host 添加或刪除配置的server信息# Node : 被管理端軟件
這些工具通常由MHA Manager的腳本觸發,無需人為操作
save_binary_logs 保存和復制master的二進制日志
apply_diff_relay_logs 識別差異的中繼日志事件并將其差異的事件應用于其他的
purge_relay_logs 清除中繼日志(不會阻塞SQL線程)2. MHA基礎架構規劃和實施
2.1 節點準備
192.168.1.10 Master
192.168.1.11 Slave1
192.168.1.20 Slave2 2.2 準備環境(略。1主2從GTID)
CHANGE MASTER TO MASTER_HOST='192.168.1.10', MASTER_USER='repl', MASTER_PASSWORD='123', MASTER_PORT=3307, MASTER_AUTO_POSITION=1; start slave ;
2.3 配置關鍵程序軟連接(所有節點)
ln -s /data/soft/mysql57/bin/mysqlbinlog /usr/bin/mysqlbinlog
ln -s /data/soft/mysql57/bin/mysql /usr/bin/mysql2.4 配置各節點互信(密鑰對)
node01:
rm -rf /root/.ssh
ssh-keygen
cd /root/.ssh
mv id_rsa.pub authorized_keys
scp -r /root/.ssh 192.168.1.11:/root
scp -r /root/.ssh 192.168.1.20:/root 2.5 安裝軟件
#下載mha軟件
mha官網:https://code.google.com/archive/p/mysql-master-ha/
github下載地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads
# 說明:
8.0 的版本:
1. 密碼加密模式 sha2 ---> native
2. 使用0.58 版本MHA軟件
# 所有節點安裝Node軟件依賴包
yum install perl-DBD-MySQL -y
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
# 在主庫中創建mha需要的用戶
grant all privileges on *.* to mha@'192.168.1.%' identified by 'mha';
# Manager軟件安裝(node03)
yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm2.6 Manager配置文件準備(db03)
#創建配置文件目錄
mkdir -p /etc/mha
#創建日志目錄
mkdir -p /var/log/mha/app1
#編輯mha配置文件
cat > /etc/mha/app1.cnf <<EOF
[server default]
manager_log=/var/log/mha/app1/manager
manager_workdir=/var/log/mha/app1
master_binlog_dir=/data/binlog
user=mha
password=mha
ping_interval=2
repl_password=123
repl_user=repl
ssh_user=root
[server1]
hostname=192.168.1.10
port=3306
[server2]
hostname=192.168.1.11
port=3306
[server3]
hostname=192.168.1.20
port=3306
EOF2.7 狀態檢查
masterha_check_ssh --conf=/etc/mha/app1.cnf masterha_check_repl --conf=/etc/mha/app1.cnf 2.8 開啟MHA-manager
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/app1/manager.log 2>&1 &2.9 查看MHA狀態
masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:4719) is running(0:PING_OK), master:192.168.1.113. MHA Failover 過程原理
高可用:
最擅長解決物理損壞
0、啟動MHA
masterha_manger 啟動MHA
1、監控
數據庫節點,主要監控主庫
masterha_master_monitor 心跳檢測、檢測master是否宕機
默認探測4次,每隔ping_interval=2秒,如果主庫還沒有心跳,任務主庫宕機
進入failover過程
2、選主
#優先級 節點配置candidate_master=1參數,如果備選主,日志量落后master太多
也不會被選擇新主(100M relaylog)。
可以通過check_repl_delay=0,不檢查日志落后情況。
#日志量最接近主庫
#日志量一樣,配置文件順序
3、日志補償
#情況1:ssh能連上,立即保存缺失部分的日志從從庫并恢復
save_binary_logs 立即保存缺失部分的master的二進制日志到從庫/var/tmp目錄下,并恢復
#情況2:ssh不能連上,兩個從庫進行日志diff差異補償
apply_diff_relay_logs 識別差異的中繼日志事件并將其差異的事件應用于其他的從庫
4、主從切換,所有從庫取消和原有主庫的復制關系。重新構建主從關系
5、故障庫自動被剔除集群(masterrha_conf_host配置信息去掉)
6、MHA是一次性高可用,failover后,manager自動退出。
不足的地方有哪些?
0. 應用透明
1. 日志補償
2. 自動提醒
3. 自愈功能 待開發....
思路:
MHA + k8s + Operator 官方
8.0 MGR + 8.0.17 clone plugin
4. 應用透明vip功能
說明: 只能同機房使用,無法跨機房跨網絡。
# 添加以下參數:
master_ip_failover_script=/usr/local/bin/master_ip_failover
# 修改腳本內容
上傳腳本:
vim /usr/local/bin/master_ip_failover
my $vip = '192.168.1.55/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
[root@db03 ~]# dos2unix /usr/local/bin/master_ip_failover
[root@db03 ~]# chmod +x /usr/local/bin/master_ip_failover
# 主庫上(db01),手工生成第一個vip地址
ifconfig ens33:1 192.168.1.55/24
# 重啟mha(db03)
masterha_stop --conf=/etc/mha/app1.cnf
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
# 檢測狀態:
[root@db03 data]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:6640) is running(0:PING_OK), master:192.168.1.11
# 注意:
keepAlive的話 ,需要 candidate_master=1和check_repl_delay=0進行配合。防止vip和主庫選擇不在一個節點。
5.binlog server
# 參數:
vim /etc/mha/app1.cnf
[binlog1]
no_master=1
hostname=192.168.1.20
master_binlog_dir=/data/mysql/binlog
# 創建必要目錄
mkdir -p /data/mysql/binlog
chown -R mysql.mysql /data/*
# 拉取主庫binlog日志
cd /data/mysql/binlog -----》必須進入到自己創建好的目錄
mysqlbinlog -R --host=192.168.1.10 --user=mha --password=mha --raw --stop-never mysql-bin.000001 &
#注意:
拉取日志的起點,需要按照目前從庫的已經獲取到的二進制日志點為起點
需要在主庫中查詢位置點:
db01 [(none)]>show master status ;
# 重啟MHA
masterha_stop --conf=/etc/mha/app1.cnf
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
6. 測試MHA Failover的功能
1. 主庫宕機模擬
node01: pkill mysqld
2. 查看日志
vim /var/log/mha/app1/manager
3. 切換的現象
vip 漂移
binlog宕掉
manager程序宕掉
主從,1主2從
配置文件,自動剔除故障節點
4. 修復過程
4.1 修復1主2從環境
CHANGE MASTER TO
MASTER_HOST='192.168.1.11',
MASTER_USER='repl',
MASTER_PASSWORD='123',
MASTER_PORT=3307,
MASTER_AUTO_POSITION=1;
start slave ;
4.2 binlog server修復
cd /data/mysql/binlog
rm -rf *
mysqlbinlog -R --host=192.168.1.11 --port=3307 --user=mha --password=mha --raw --stop-never mysql-bin.000001 &
4.3 檢查vip
ip a
4.4 檢查配置文件
[server1]
hostname=192.168.1.10
port=3307
4.5 預檢查狀態
masterha_check_ssh --conf=/etc/mha/app1.cnf
masterha_check_repl --conf=/etc/mha/app1.cnf
4.6 啟動MHA manager
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
「喜歡這篇文章,您的關注和贊賞是給作者最好的鼓勵」
關注作者
【版權聲明】本文為墨天輪用戶原創內容,轉載時必須標注文章的來源(墨天輪),文章鏈接,文章作者等基本信息,否則作者和墨天輪有權追究責任。如果您發現墨天輪中有涉嫌抄襲或者侵權的內容,歡迎發送郵件至:contact@modb.pro進行舉報,并提供相關證據,一經查實,墨天輪將立刻刪除相關內容。




