標籤:分組 inter 修改 off 訪問 image nlog mysql資料庫 公司
一、簡介
MHA:
你可以把它看做是一個監控MySQL的工具,當master掛了之後,起一個slave作為master,另外一台slave重新作為新master的備庫;
所以MHA的架構做好是三台資料庫,並且已經提前做好了主從模式(一主兩從),MHA可以管理多組MySQL主從叢集;VIP的跳轉也
是通過keepalived來實現的,總體的架構設計如所示(藉助網上的圖片):
Mycat:
實現讀寫分離、分庫分表的一個開源的工具,我這裡沒有使用到分庫分表的功能,只是單純的做讀寫分離;mycat實現讀寫分離是在設定檔
中配置的,配置起來也比較的簡單,下面會詳細介紹,架構方面則是採用的如所示的架構模式:
二、MHA搭建安裝
2.1 搭建(一主兩從已經實現,這裡不做闡述)
包分為兩部分,一個是manager的包,另外一個是node包;包的為:https://pan.baidu.com/s/1D6v6yPeCTecaB68LwPZJ2A,密碼:oyez
所有的節點都需要安裝node包,然後所有的節點你都需要安裝Perl的依賴包:perl-DBD-MySQL
如果還缺少其它包的話,那就見招拆招唄!!
還有一點需要注意:那個manager包你可以單獨部署在一台伺服器上,也可以部署在其中一台node節點上
所有的伺服器建立key登入,互信任
2.1.1 manager節點
mkdir -p /etc/masterha && cp mha4mysql-manager-0.53/samples/conf/app1.cnf /etc/masterha/
1 [server default] 2 manager_workdir=/var/log/masterha/app1.log //設定manager的工作目錄 3 manager_log=/var/log/masterha/app1/manager.log //設定manager的日誌 4 master_binlog_dir=/data/mysql //設定master 儲存binlog的位置,以便MHA可以找到master的日誌,我這裡的也就是mysql的資料目錄 5 master_ip_failover_script= /usr/local/bin/master_ip_failover //設定自動failover時候的切換指令碼 6 master_ip_online_change_script= /usr/local/bin/master_ip_online_change //設定手動切換時候的切換指令碼 7 password=123456 //設定mysql中root使用者的密碼,這個密碼是前文中建立監控使用者的那個密碼 8 user=root 設定監控使用者root 9 ping_interval=1 //設定監控主庫,發送ping包的時間間隔,預設是3秒,嘗試三次沒有回應的時候自動進行railover10 remote_workdir=/tmp //設定遠端mysql在發生切換時binlog的儲存位置11 repl_password=123456 //設定複製使用者的密碼12 repl_user=repl //設定複製環境中的複製使用者名稱13 report_script=/usr/local/send_report //設定發生切換後發送的警示的指令碼14 secondary_check_script= /usr/local/bin/masterha_secondary_check -s server03 -s server02 15 shutdown_script="" //設定故障發生後關閉故障主機指令碼(該指令碼的主要作用是關閉主機放在發生腦裂,這裡沒有使用)16 ssh_user=root //設定ssh的登入使用者名稱17 18 [server1]19 hostname=192.168.0.5020 port=330621 22 [server2]23 hostname=192.168.0.6024 port=330625 candidate_master=1 //設定為候選master,如果設定該參數以後,發生主從切換以後將會將此從庫提升為主庫,即使這個主庫不是叢集中事件最新的slave26 check_repl_delay=0 //預設情況下如果一個slave落後master 100M的relay logs的話,MHA將不會選擇該slave作為一個新的master,因為對於這個slave的恢複需要花費很長時間,通過設定check_repl_delay=0,MHA觸發切換在選擇一個新的master的時候將會忽略複製延時,這個參數對於設定了candidate_master=1的主機非常有用,因為這個候選主在切換的過程中一定是新的master27 28 [server3]29 hostname=192.168.0.7030 port=3306
app1.conf
注意:
MHA在發生切換的過程中,從庫的恢複過程中依賴於relay log的相關資訊,所以這裡要將relay log的自動清除設定為OFF,採用手動清除relay log的方式。在預設情況下,從伺服器上的中繼日誌會在SQL線程執行完畢後被自動刪除。但是在MHA環境中,這些中繼日誌在恢複其他從伺服器時可能會被用到,因此需要禁用中繼日誌的自動刪除功能。定期清除中繼日誌需要考慮到複製延時的問題。在ext3的檔案系統下,刪除大的檔案需要一定的時間,會導致嚴重的複製延時。為了避免複製延時,需要暫時為中繼日誌建立永久連結,因為在linux系統中通過永久連結刪除大檔案速度會很快。(在mysql資料庫中,刪除大表時,通常也採用建立永久連結的方式)
MHA節點中包含了pure_relay_logs命令工具,它可以為中繼日誌建立永久連結,執行SET GLOBAL relay_log_purge=1,等待幾秒鐘以便SQL線程切換到新的中繼日誌,再執行SET GLOBAL relay_log_purge=0
檢查各節點間的ssh通訊:
masterha_check_ssh --conf=/etc/masterha/app1.cnf ;顯示所有的都成功,才算是成功,不然就檢查錯誤原因;我這裡有兩台節點之間總是檢測不通過,手動測試互相串連都沒問題,但就是通過這個指令碼沒法通過,我的解決辦法是刪除.ssh目錄,重建公開金鑰和秘鑰,重建立立信任
然後再檢查複製情況:
masterha_check_repl --conf=/etc/masterha/app1.cnf
在執行這個指令碼之前,你需要先配置好keepalived,因為master_ip_failover這個指令碼會去尋找keepalived的VIP,如果沒有配置好keepalived,就先把master_ip_failover_script= /usr/local/bin/master_ip_failover這行給注釋掉(app1.conf檔案)
2.2 MHA引入keepalived(MySQL服務進程掛掉時通過MHA 停止keepalived)
要想把keepalived服務引入MHA,我們只需要修改切換是觸發的指令檔master_ip_failover即可,在該指令碼中添加在master發生宕機時對keepalived的處理。
#!/usr/bin/env perluse 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.0.88‘;my $ssh_start_vip = "/etc/init.d/keepalived start";my $ssh_stop_vip = "/etc/init.d/keepalived stop";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 ([email protected]) { warn "Got Error: [email protected]\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 ([email protected]) { warn [email protected]; exit $exit_code; } exit $exit_code; } elsif ( $command eq "status" ) { print "Checking the Status of the script.. OK \n"; #`ssh $ssh_user\@cluster1 \" $ssh_start_vip \"`; exit 0; } else { &usage(); exit 1; }}# A simple system call that enable the VIP on the new mastersub start_vip() { `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;}# A simple system call that disable the VIP on the old_mastersub stop_vip() { return 0 unless ($ssh_user); `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";}
master_ip_failover
因為我不懂Perl,這個配置文法也是從網上找的,沒有測試好使不好使;我這裡使用zabbix的監控,觸發指令碼實現MySQL-master異常時,殺掉keepalived,使VIP跳轉到新的master上
2.3 總結:
目前高可用方案可以一定程度上實現資料庫的高可用,比如MMM,heartbeat+drbd,Cluster等。還有percona的Galera Cluster等。這些高可用軟體各有優劣。在進行高可用方案選擇時,主要是看業務還有對資料一致性方面的要求。最後出於對資料庫的高可用和資料一致性的要求,推薦使用MHA架構。
三、mycat搭建
3.1 搭建
mycat的搭建比較容易,直接解壓出來就可以了,主要就是看下設定檔的配置,主要就是server.xml和schema.xml
server.xml:(主要是配置mycat的使用者名稱和密碼,以及可以管理的庫)
schema.xml:(配置讀寫分離)
3.2 叢集搭建
兩台或者多台mycat伺服器配置都是一樣的,中間也沒有直接的聯絡,簡介中的那個圖說明的已經很明確了,是通過keepalived+nginx來實現代理轉寄到mycat,實現的高可用,這裡就不做過多的闡述了
四、附加項
想必有的同學會問,為啥不使用四台伺服器,兩台master互為主備,中間通過keepalived實現VIP跳轉,兩台slave都change master to VIP,這樣的話,也能實現高可用,而且不需要第三方的工具去監控跳轉
缺點:
1、比如你們公司訪問量很大,應用程式層已經針對不同的業務模組分組了,那麼資料庫這塊也得分組,如果分三組的話,MHA的方案,最多使用十台伺服器,而下面這種方案的話,需要12台伺服器
2、MySQL master互為主從的話,對伺服器的效能考驗比較大,也容易出現各種問題,有一點資料不同步的話,slave就沒法擷取完整的資料
優點:
1、不需要第三方工具的依賴
2、學習成本也比較的低
五、總結
綜上所述,建議大家搭建MHA的監控,實現宕機跳轉的目的(這裡說一下那個中繼日誌的作用就是用於恢複slave資料使用的)
mysql之MHA、Mycat綜合分析