MySQL高可用羣集之MHA
相比MMM的優勢:節約資源,不像MMM還需要再要一臺Master服務器,這個可以直接把從服務器備用成主服務器
安裝配置MHA高可用環境(環境如下圖所示)
只需要一臺服務器來管理,當Master主服務器故障時vip虛擬ip會自動偏移到從服務器上,從服務器會頂當主服務器
MHA的工作原理:1.從宕機崩潰的master保存二進制日誌事件(binlog events)
2.識別含有最新更新的slave
3.應用差異的中繼日誌(relay log)到其他的slave
4.應用從master保存的二進制日誌事件(binlog events)
5.提升一個slave爲新的master
6.使其他的slave連接新的master進行復制
安裝包自帶的工具
Manager工具包主要包括以下幾個工具:
masterha_check_ssh:檢查MHA的SSH配置狀況
masterha_check_repl:檢查MySQL複製狀況
masterha_manger:啓動MHA
masterha_check_status:檢測當前MHA運行狀態
masterha_master_monitor:檢測master是否宕機
masterha_master_switch:控制故障轉移(自動或者手動)
masterha_conf_host:添加或刪除配置的server信息
Node工具包(這些工具通常由MHA Manager的腳本觸發,無需人爲操作)主要包括以下幾個工具:
save_binary_logs:保存和複製master的二進制日誌
apply_diff_relay_logs:識別差異的中繼日誌事件並將其差異的事件應用於其他的slave
filter_mysqlbinlog:去除不必要的ROLLBACK事件(MHA已不再使用這個工具)
purge_relay_logs:清除中繼日誌(不會阻塞SQL線程)
MHA配置搭建
1.三臺服務器下載安裝數據庫
yum -y install mysql mysql-server mysql-devel
2.修改配置文件/etc/my.cnf
vim /etc/my.cnf
注意:3臺服務器的server-id這個參數不能一樣,其他一樣,配置完記得重啓服務
3.分別都創建登錄數據庫用戶,主服務器授權,從服務器同步數據,實現主從複製
mysqladmin -u root -h localhost -p'123456'
mysql -uroot -p123456
主服務器:
查詢二進制文件和位置變量:mysql> show master status;
主服務器授權:mysql> grant all on *.* to 'test'@'192.168.0.%' identified by '123456';
兩臺從服務器:mysql>change master to master_host='192.168.0.101',master_user='test',master_password='123456',master_log_file='mysql-bin.000018',master_log_pos=107;
mysql> start slave;
兩臺從服務器授權爲了後面配置MHA檢測主從測試
mysql>grant all on *.* to 'test'@'192.168.0.%' identified by '123456';
查看slave狀態,再測試是否主從複製成功
4.設置無密碼密鑰通信
在四臺服務器上都要做其他三臺服務器的無密碼密鑰通信,讓每臺主機都可以互相無密碼密鑰進行遠程連接
下面以MHA-manger主機192.168.0.110爲例子
ssh-keygen -t rsa(一直按回車)
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
每次輸入本機的root用戶密碼即可,其他三臺類似
補充:出現以下錯誤解決方式
ssh -o StrictHostKeyChecking=no 192.168.0.101
想要以後不會出現這種問題或者修改配置文件/etc/ssh/ssh_config
最後添加
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
5.安裝node組件
所有服務器上都安裝MHA依賴環境,就是perl模塊(首先需要先安裝epel源)
epel源下載安裝
wget http://mirrors.yun-idc.com/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
安裝依賴包perl模塊
yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN
所有(四臺)服務器安裝node組件
注意:manager 依賴 node 組件,CentOS7.3 必須選擇 0.57 版本
解壓編譯安裝node組件
tar zxvf mha4mysql-node-0.56.tar.gz》cd mha4mysql-node-0.56》perl Makefile.PL》make && make install
6.在MHA-manger主機上安裝manger組件
在manger主機上編譯安裝manager組件
tar zxvf mha4mysql-manger-0.56.tar.gz》cd mha4mysql-manger-0.56》perl Makefile.PL》make && make install
7.MHA-manger主機上配置MHA
把解壓包裏面的相關腳本複製到/usr/local/bin目錄
cp -ra samples/scripts /usr/local/bin/
複製上述的自動切換時 VIP 管理的腳本到/usr/local/bin目錄,這裏使用腳本管理VIP,也是推薦的一種方式,生產環境不太建議使用 keepalived,再進行修改
cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
vim /usr/local/bin/master_ip_failover
添加以下部分
my $vip = '192.168.100.200/24';
my $key = "1";
my $ssh_start_vip = "/sbin/ifconfig eth1:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth1:$key down";
my $exit_code = 0;
創建目錄,從解壓包裏複製配置文件模板使用修改
mkdir /etc/masterha
cp samples/conf/app1.cnf /etc/masterha/
vim /etc/masterha/app1.cnf
8.使用工具檢測配置連接的狀況
測試SSH無密碼登錄,如果正常如下圖所示
masterha_check_ssh -conf=/etc/masterha/app1.cnf
測試mysql主從連接情況:masterha_check_repl -conf=/etc/masterha/app1.cnf
下圖爲成功
補充:可能出現的錯誤解決方法
★測試SSH無密碼登陸報錯
檢查是否每臺機器都給其他三臺主機發送的密鑰
★測試 mysq 主從連接情況報錯
如果不是給的所有權限注意3臺mysql數據庫應該給那些數據庫的操作權限,操作權限是否沒有給夠,少了什麼權限
注意檢查你的/etc/masterha/app1.cnf配置文件是否是用戶和密碼設置的跟授權時的不一致
9.開啓服務查看狀態測試溼粉撲成功
開啓MHA服務:nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
--remove_dead_master_conf:該參數代表當發生主從切換後,老的主庫的 ip 將會從配置文件中移除。
--manger_log:設置日誌存放位置
--ignore_last_failover:在缺省情況下,如果 MHA 檢測到連續發生宕機,且兩次宕機間隔不足 8 小時的話,則不會進行 Failover,之所以這樣限制是爲了避免 ping-pong 效應。該參數代表忽略上次 MHA 觸發切換產生的文件,默認情況下, MHA 發生切換後會在日誌記目錄,也就是上面設置的日誌 app1.failover.complete 文件,下次再次切換的時候如果發現該目錄下存在該文件將不允許觸發切換,除非在第一次切換後收到刪除該文件,爲了方便,這裏設置爲–ignore_last_failover
查看狀態是否成功:masterha_check_status --conf=/etc/masterha/app1.cnf
測試關閉掉主服務器看是否移動到備用master服務器上(查詢日誌查看狀態)
cat /var/log/masterha/app1/manager.log
說明實驗成功