Mysql数据库(十一)——MHA高可用集群部署及故障切换
生活随笔
收集整理的這篇文章主要介紹了
Mysql数据库(十一)——MHA高可用集群部署及故障切换
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Mysql數據庫(十一)——MHA高可用集群部署及故障切換
- 一、MHA概述
- 二、MHA的組成
- 三、MHA的特點
- 四、案例環境
- 1、服務器配置
- 2、思路
- 3、關閉防火墻和安全機制,并進行主從配置
- 4、配置MHA
- 5、配置無密碼認證
- 6、配置MHA
- 7、測試
- 8、模擬故障驗證
- 總結
- MHA的原理
- 5、MHA工具的優缺點
- 優點:
- 缺點
一、MHA概述
- MHA(MasterHigh Availability)是一套優秀的MySQL高可用環境下故障切換和主從復制的軟件。
- MySQL故障切換過程中,MHA能做到0-30秒內自動完成故障切換操作。
二、MHA的組成
- MHA Node(數據節點)
- MHA Node 運行在每臺 MySQL 服務器上。
- MHA Manager(管理節點)
- MHA Manager 可以單獨部署在一臺獨立的機器上,管理多個 master-slave 集群;也可以部署在一臺 slave 節點上
- MHA Manager 會定時探測集群中的 master 節點。當 master 出現故障時,它可以自動將最新數據的 slave 提升為新的 master, 然后將所有其他的 slave 重新指向新的 master。整個故障轉移過程對應用程序完全透明。
三、MHA的特點
- 自動故障切換過程中,MHA試圖從宕機的主服務器上保存二進制日志,最大程度的保證數據不丟失
- 使用半同步復制,可以大大降低數據丟失的風險
- 目前MHA支持一主多從架構,最少三臺服務,即一主兩從
四、案例環境
1、服務器配置
| manager | 192.168.184.70 | manager管理節點 | manager組件,node組件 |
| master | 192.168.184.10 | mysql主數據庫 | node組件 |
| slave1 | 192.168.184.20 | mysql從數據庫 | node組件( 主-備 ) |
| slave2 | 192.168.184.40 | mysql從數據庫 | node組件 |
2、思路
- 1、先使用三臺mysql服務器,配置一主兩從,實現主從復制
- 2、安裝MHA軟件
- 3、配置免密登錄和MHA的高可用
- 4、模擬故障并進行查看
3、關閉防火墻和安全機制,并進行主從配置
#安裝編譯依賴環境(三臺MySQL服務器) yum -y install ncurses-devel gcc-c++ perl-Module-Install#安裝cmake編譯工具 cd /opt tar zxvf cmake-2.8.6.tar.gz cd /opt/cmake-2.8.6/ ./configure gmake && gmake install#安裝mysql5.6 cd /mnt/mha tar zxvf mysql-5.6.36.tar.gz -C /opt cd /opt/mysql-5.6.36/ cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_EXTRA_CHARSETS=all \ -DSYSCONFDIR=/etcmake && make install #復制啟動腳本與配置文件 #/etc/init.d/ :各種服務器和程序的二進制文件存放目錄。 #/etc/rc.d/: 各個啟動級別的執行程序連接目錄。里頭的文件很多都是指向init.d/的一些軟連接 cp support-files/my-default.cnf /etc/my.cnf cp:是否覆蓋"/etc/my.cnf"? y cp support-files/mysql.server /etc/rc.d/init.d/mysqld chmod +755 /etc/rc.d/init.d/mysqld chkconfig --add /etc/init.d/mysqld chkconfig mysqld --level 35 onecho 'PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile source /etc/profile tail /etc/profileuseradd -s /sbin/nologin mysql chown -R mysql.mysql /usr/local/mysql##mysql_install_db 初始化,目錄文件basedir和數據文件datadir都必須要有 /usr/local/mysql/scripts/mysql_install_db \ --basedir=/usr/local/mysql \ --datadir=/usr/local/mysql/data \ --user=mysql#修改master的主配置文件 #開啟二進制日志log_bin,允許從服務器同步log-slave-updates 22行之后 cat /etc/my.cnf [mysqld]vim server-id = 1 log_bin = master-bin log-slave-updates = true#配置從服務器 #在/etc/my.cnf 中修改或者增加下面內容 #開啟中繼日志,創建索引,同步主服務器 #slave 1 vim /etc/my.cnf server-id = 2 log_bin = master-bin relay-log = relay-log-bin relay-log-index = slave-realy-bin.index#slave 2 vim /etc/my.cnf server-id = 3 log_bin = master-bin relay-log = relay-log-bin relay-log-index = slave-realy-bin.index#第一步關鍵點 #master、slave1、slave2分別做兩個軟鏈接 第一個是mysql命令文件 #第二個mysqlbinlog可用于斷點恢復 ln -s /usr/local/mysql/bin/mysql /usr/sbin ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin#在后臺啟動mysql服務() /usr/local/mysql/bin/mysqld_safe --user=mysql &#netstat -natp | grep 3306systemctl stop firewalld.service setenforce 0mysqladmin -uroot -p password '010230'#配置MySQL 一主兩從 #在所有數據庫節點上授權兩個用戶,一個是從庫同步使用,另一個是manager使用 第四個賬戶managter 管理mysql集群使用(監控) grant replication slave on *.* to 'myslave'@'192.168.184.%' identified by '010230'; grant all privileges on *.* to 'mha'@'192.168.184.%' identified by 'manager'; flush privileges;#下面三條授權,理論上不用添加,但是實驗環境通過MHA檢查MySQL主從報錯, 報兩個從庫通過主機名連接不上主庫,所有數據庫都需要添加以下授權 grant all privileges on *.* to 'mha'@'master' identified by 'manager'; grant all privileges on *.* to 'mha'@'slave1' identified by 'manager'; grant all privileges on *.* to 'mha'@'slave2' identified by 'manager';flush privileges;通過mha檢查的時候,是通過主機名的形式進行監控,這種情況會容易報錯#在master上查看二進制文件和同步點 show master status;#在兩臺slave節點服務器進行同步 change master to master_host='192.168.184.10',master_user='myslave',master_password='010230',master_log_file='master-bin.000001',master_log_pos=1499;start slave; show slave status\G#必須設置兩個從庫為只讀模式 set global read_only=1;flush privileges;4、配置MHA
#所有節點配置 systemctl stop firewalld systemctl disable firewllad vi /etc/sysconfig/selinux SELINUX=disabledsetenforce 0#在所有服務器上安裝MHA依賴環境,首先安裝epel源,只有安裝了源 perl才會有 #安裝epel源,并且不進行gph檢查 yum install epel-release --nogpgcheck -y#perl針對于mysql數據庫 #從配置文件中提拿其中的值 #log-日志 #多線程管理 #擴展工具CBuilder MakeMaker #cpan perl中的數據庫 yum install -y perl-DBD-MySQL \ perl-Config-Tiny \ perl-Log-Dispatch \ perl-Parallel-ForkManager \ perl-ExtUtils-CBuilder \ perl-ExtUtils-MakeMaker \ perl-CPAN#MHA 軟件包對于每個操作系統版本不一樣,這里Centos7.4必須選擇0.57版本 #在所有服務器上必須先安裝node組件,最后在MHA-manager節點上安裝manager組件 因為manager依賴node組件,####所有節點安裝node組件 cd /mnt tar zxvf /mnt/mha4mysql-node-0.57.tar.gz -C /root cd /root/mha4mysql-node-0.57 perl Makefile.PL make && make install#在MHA(manager)節點上安裝manager組件(必須先安裝node才能安裝manager組件)tar zxvf /mnt/mha4mysql-manager-0.57.tar.gz -C /root cd /root/mha4mysql-manager-0.57 perl Makefile.PL make && make install#manager 安裝后在/usr/local/bin目錄下會生成幾個工具,主要包括以下:masterha-check_ssh 檢查MHA的SSH配置狀況 masterha_check_repl 檢查MySQL復制狀況 masterha_manager 啟動manager的腳本 masterha_check_status 檢查當前MHA運行狀態 masterha_master_monitor 檢查master是否宕機 masterha_master_switch 控制故障轉移(自動或者手動) masterha_conf_host 添加或刪除配置的server信息 masterha_stop 關閉manager#node 安裝后也會在/usr/local/bin目錄下生成幾個腳本,需要進行檢查,主要包括以下 save_binary_logs #保存和復制master的二進制日志 apply_diff_relay_logs #識別差異的中繼日志事件,并將其差異的事件應用于其他的slave filter_mysqlbinlog #去除不必要的ROLLBACK回滾事件(MHA 已不適用這個工具) purge_relay_logs #清除中繼日志(不會阻塞SQL線程)5、配置無密碼認證
#一、在mannager上配置到所有數據庫節點的無密碼認證 #一路回車 ssh-keygen -t rsa ssh-copy-id 192.168.184.10 ssh-copy-id 192.168.184.20 ssh-copy-id 192.168.184.40#二、在master上配置到slave1和salve2的無密碼認證 ssh-keygen -t rsa ssh-copy-id 192.168.184.20 ssh-copy-id 192.168.184.40#三、在slave1上配置到master和salve2的無密碼認證 ssh-keygen -t rsa ssh-copy-id 192.168.184.10 ssh-copy-id 192.168.184.40#四、在slave2上配置到master和salve1的無密碼認證 ssh-keygen -t rsa ssh-copy-id 192.168.184.10 ssh-copy-id 192.168.184.20
6、配置MHA
1、在MHA節點上復制相關腳本到/usr/local/bin目錄 cp -ra /root/mha4mysql-manager-0.57/samples/scripts/ /usr/local/bin #拷貝后會有四個執行文件 ll /usr/local/bin/scripts/master_ip_failover #自動切換時 VIP管理的腳本(故障轉移) master_ip_online_change #在線切換時 VIP的管理 power_manager #故障發生后關閉主機的腳本 send_report #因故障切換后發送報警的腳本#復制上述的master_ip_failover(自動切換時VIP管理的腳本) 到/usr/local/bin目錄 這里使用腳本管理VIPcp /usr/local/bin/scripts/master_ip_failover /usr/local/bin cp /usr/local/bin/scripts/master_ip_online_change /usr/local/bin#修改master_ip_failover內容(刪除原有內容,直接復制) #以下部分配置故障轉移#!/usr/bin/env perl use strict; use warnings FATAL => 'all';use Getopt::Long;my ( $command, $ssh_user, $orig_master_host, $orig_master_ip, $orig_master_port, $new_master_host, $new_master_ip, $new_master_port ); my $vip = '192.168.184.200'; #浮動IP my $brdc = '192.168.184.255'; #廣播地址 my $ifdev = 'ens33'; #使用的網卡為ens33 my $key = '1'; #虛擬接口 my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip"; #使用ifoconfig命令將其啟動,同時設置浮動地址 my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down"; #可以使用ifconfig命令將其down掉(關閉) my $exit_code = 0; #正常退出(返回狀態碼) #my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;"; #my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key"; 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, );exit &main();sub main {print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";if ( $command eq "stop" || $command eq "stopssh" ) {my $exit_code = 1; eval { print "Disabling the VIP on old master: $orig_master_host \n"; &stop_vip(); $exit_code = 0; }; if ($@) { warn "Got Error: $@\n"; exit $exit_code; } exit $exit_code; } elsif ( $command eq "start" ) {my $exit_code = 10; eval { print "Enabling the VIP - $vip on the new master - $new_master_host \n"; &start_vip(); $exit_code = 0; }; if ($@) { warn $@; exit $exit_code; } exit $exit_code; } elsif ( $command eq "status" ) { print "Checking the Status of the script.. OK \n"; exit 0; } else { &usage(); exit 1; } } sub start_vip() { `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`; } # A simple system call that disable the VIP on the old_master sub stop_vip() { `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`; }sub usage { print "Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n"; }% s /#//g#創建MHA軟件目錄并拷貝配置文件 mkdir /etc/masterha cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/ vim /etc/masterha/app1.cnf #以下部分配置節點相關信息[server default] manager_log=/var/log/masterha/app1/manager.log manager_workdir=/var/log/masterha/app1 master_binlog_dir=/usr/local/mysql/data master_ip_failover_script=/usr/local/bin/master_ip_failover master_ip_online_change_script=/usr/local/bin/master_ip_online_change password=manager user=mha ping_interval=1 remote_workdir=/tmp repl_password=010230 repl_user=myslave secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.184.20 -s 192.168.184.40 shutdown_script="" ssh_user=root [server1] hostname=192.168.184.10 port=3306[server2] candidate_master=1 hostname=192.168.184.20 check_repl_delay=0 port=3306[server3] hostname=192.168.184.40 port=3306#manager工作目錄 manager_log=/var/log/masterha/app1/manager.log#manager日志 manager_workdir=/var/log/masterha/app1#master保存binlog的位置,這里的路徑要于master里配置的binlog(相同?) master_binlog_dir=/usr/local/mysql/data#設置自動failover時候切換腳本,也就是上一個配置的腳本 master_ip_failover_script=/usr/local/bin/master_ip_failover#設置手動切換時候的切換腳本 master_ip_online_change_script=/usr/local/bin/master_ip_online_change#此處密碼為之前創建監控用戶的密碼 password=manager#設置監控用戶 user=mha#設置監控主庫,發送ping包的事件間隔,默認為3秒,嘗試三次沒有回應的時候自動進性failover ping_interval=1#設置遠端的MySQL在發生切換時binlog的(臨時)保存位置 remote_workdir=/tmp#設置復制(slaves)用戶的密碼 repl_password=123456#設置復制用戶的賬戶 repl_user=myslave#設置發生切換后發送的報警的腳本 report_script=/usr/local/send_report#設置檢查從服務器的腳本 secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.184.20 -s 192.168.184.40#設置故障發生后關閉故障主機腳本 shutdown_script=""#設置ssh的登錄用戶名 ssh_user=root[server2] #設置候選master,如果設置了此參數,發生主從切換后,會將此庫提升為主庫 candidate_master=1 #支持復制的檢查,默認情況下如果一個slave落后master 100M的relay logs(中繼日志)的話, MHA將不會選擇該slave作為新的master,設置為0的話會忽略此規則 check_repl_delay=0hostname=192.168.184.20 port=33067、測試
#測試無密碼認證,如果正常會輸出successfully masterha_check_ssh -conf=/etc/masterha/app1.cnf#測試主從復制 masterha_check_repl -conf=/etc/masterha/app1.cnf#易錯的位置: 軟連接不創建的話,無法開啟故障檢測#需注意:第一次配置需要在master節點上手動開啟虛擬IP /sbin/ifconfig ens33:1 192.168.184.200/24#啟動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 &nohup #選項masterha_manager #開啟–conf=/etc/masterha/app1.cnf #指定配置文件–remove_dead_master_conf #當master服務器失效時,發生主從切換后,會把舊的master的ip從主配置文件刪除–ignore_last_failover #忽略故障轉移,忽略掉總是宕機不夠可靠的服務器在缺省情況下,如果MHA檢測到連續發生宕機,且兩次宕機間隔不足8小時的話,則不會進行Failover, 之所以這樣限制是為了避免ping-pong效應。該參數代表忽略桑次MHA出發切換產生的文件,默認情況下 ,MHA發生切換后會在日志記錄下,也就是上面設置的日志app1.failover.complete文件, 下次再次切換的時候如果發現該目錄下存在該文件將不允許觸發切換,除非在第一次切換后收到刪除該文件; 為了方便,這里設為為–ignore_last_failover< /dev/null > #生成的所有信息會導到null下或者/var/log/masterha/app1/manager.log日志文件中2>&1 & #把2錯誤性的輸出從定向為標準性輸出,開啟后臺運行#查看到當前的master節點是誰 masterha_check_status --conf=/etc/masterha/app1.cnf #查看當前日志信息' cat /var/log/masterha/app1/manager.log #查看MySQL的VIP地址 192.168.184.200是否存在,這個VIP地址不會因為manager節點停止MHA服務而消失 ifconfig
8、模擬故障驗證
#manager服務器上啟用監控觀察日志 tailf /var/log/masterha/app1/manager.log #模擬故障查看master變化 pkill -9 mysqlVIP地址消失、主備服務器查看ifconfig ,同時查看日志#重啟開啟一個客戶端(manater),安裝mariadb,然后到當前的“master服務器”給與root權限 grant all on *.* to 'root'@'%' identified by '010230';#此時從manager 遠程登陸數據庫(通過vip登陸) mysql -h 192.168.184.20 -p010230① 創建表、插入數據② 到當前的主數據庫中查看數據③ 到slave 上show slave status#模擬故障: #在主庫pkill -9 mysql #可以看到從庫的狀態,其中之一肯定由切換為主庫的 #切換備選主庫的算法 #1一般判斷從庫是從(position/GTID)判斷優劣,數據有差異,最接近于master的slave,稱為備選主 #2、數據一致的情況下,按照配置文件順序選擇備選主庫 #3、設定有權重(candidate_master=1),按照權重強制指定備選主 #1)默認情況下,如果一個slave落后master 100M的relay logs(中繼日志)的話,即使有權重,也會失效 #2)如果check_repl_delay=0的話,即使落后很多日志,也強制選擇其為備選主 #故障修復步驟: #1、修復db /etc/init.d/mysqld start #2、修復主從(現主數據庫輸入show master status;) 從數據庫輸入: change master to master_host='192.168.184.20',master_port=3306,master_auto_position=1,master_user='myslave',master_password='010230',master_log_file='master-bin.000001',master_log_pos=1845; start slave; #3、修改配置文件(再把這個記錄添加進去,因為它檢測到失效時候會自動消失) vi /etc/masterha/app1.cnf [server1] hostname=192.168.184.10 port=3306 #4、啟動manager(在manager那臺機器上) 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 &#解決中英字不兼容報錯的問題 dos2unix /usr/local/bin/master_ip_failover
總結
MHA的原理
- 1、從宕機崩潰的 Master 保存二進制日志事件(binlog event);
- 2、識別含有最新更新的 Slave;
- 3、應用差異的中繼日志(relay log)到其他 Slave;
- 4、應用從 Master 保存的二進制日志事件;
- 5、提升一個 Slave 為新的 Master;
- 6、使其他的 Slave 連接新的 Master 進行復制;
5、MHA工具的優缺點
優點:
- 同樣是由Perl語言開發的開源工具,可以支持基于GTID的復制模式,MHA在進行故障轉移時更不易產生數據丟失,同一個監控節點可以監控多個集群,
缺點
- 需要編寫腳本或利用第三方工具來實現vip的配置,MHA啟動后只會對數據庫進行監控,需要基于ssh免認證配置,存在一定的安全隱患,沒有提供從服務器的讀負載均衡的功能。
總結
以上是生活随笔為你收集整理的Mysql数据库(十一)——MHA高可用集群部署及故障切换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AMD内存双通道技术:让你的电脑速度翻倍
- 下一篇: 集群(一)——LVS负载均衡集群