參考:http://www.cnblogs.com/gomysql/p/3675429.htmlhtml
1.在全部節點安裝MHA node所需的perl模塊(DBD:mysql):node
yum install perl-DBD-MySQL -y
2.在全部的節點安裝mha node:mysql
wget http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.53.tar.gz
(http://ftp.debian.org/debian/pool/main/m/mha4mysql-node/mha4mysql-node_0.54.orig.tar.gz)
tar xf mha4mysql-node-0.53.tar.gz cd mha4mysql-node-0.53 perl Makefile.PL make && make install
執行 perl Makefile.PL 時報錯: Can't locate CPAN.pm in @INC sql
這是沒有安裝perl-CPAN形成的,解決方法: yum -y install perl-CPAN bash
安裝完成後會在/usr/local/bin目錄下生成如下腳本文件:app
apply_diff_relay_logs 識別差別的中繼日誌事件並將其差別的事件應用於其餘的slave filter_mysqlbinlog 去除沒必要要的ROLLBACK事件(MHA已再也不使用這個工具) purge_relay_logs 清除中繼日誌(不會阻塞SQL線程) save_binary_logs 保存和複製master的二進制日誌
3.安裝MHA Managerless
MHA Manager中主要包括了幾個管理員的命令行工具,例如master_manger,master_master_switch等。MHA Manger也依賴於perl模塊,具體以下:ssh
- 安裝MHA Node軟件包以前須要安裝依賴。這裏使用yum完成,沒有epel源的可使用上面提到的腳本(epel源安裝也簡單)。注意:在MHA Manager的主機也是須要安裝MHA Node。
yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes -y wget http://ftp.debian.org/debian/pool/main/m/mha4mysql-manager/mha4mysql-manager_0.55.orig.tar.gz tar zxvf mha4mysql-manager_0.55.orig.tar.gz cd mha4mysql-manager-0.55 perl Makefile.PL make && make install
- 安裝完成後會在/usr/local/bin目錄下面生成如下腳本
apply_diff_relay_logs 識別差別的中繼日誌事件並將其差別的事件應用於其餘的slave filter_mysqlbinlog 去除沒必要要的ROLLBACK事件(MHA已再也不使用這個工具) 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信息 purge_relay_logs 清除中繼日誌(不會阻塞SQL線程) save_binary_logs 保存和複製master的二進制日誌
- 可選步驟,拷貝相關腳本。這些腳本不完整,須要本身修改,若是開啓下面的任何一個腳本對應的參數,而對應這裏的腳本又沒有修改,則會拋錯:
cp ./samples/scripts/* /usr/local/bin/
4.配置SSH登陸無密碼驗證ide
5.搭建主從複製環境工具
注意:binlog-do-db 和 replicate-ignore-db 設置必須相同。 MHA 在啓動時候會檢測過濾規則,若是過濾規則不一樣,MHA 不啓動監控和故障轉移。
- 備份主庫
-
mysqldump -uroot -p --master-data=2 -A > /data/all.sql
- 在主庫建立複製用戶
grant replication slave on *.* to 'my-slave'@'%' identified by '123456'; flush privileges;
- 定位binlog
head -n 30 all.sql | grep 'CHANGE MASTER TO'
- 將all.sql導入備機
- 開啓備份
CHANGE MASTER TO MASTER_HOST='*.*.*.*',MASTER_USER='my-slave', MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000010',MASTER_LOG_POS=112; start slave;
- 手動設置read-only
mysql -uroot -p -e 'set global read_only=1'
- 添加監控帳戶
grant all on *.* to 'root'@'%' IDENTIFIED by '123456' flush privileges
6.配置MHA
- 拷貝配置文件
-
mkdir -p /etc/masterha cp mha4mysql-manager-0.55/samples/conf/app1.cnf /etc/masterha/
- 修改配置文件/etc/masterha/app1.cnf,將註釋刪掉
-
[server default] manager_workdir=/var/log/masterha //設置manager的工做目錄 manager_log=/var/log/masterha/app1/manager.log //設置manager的日誌 master_binlog_dir=/data/mysql //設置master 保存binlog的位置,以便MHA能夠找到master的日誌,我這裏的也就是mysql的數據目錄 master_ip_failover_script= /usr/local/bin/master_ip_failover //設置自動failover時候的切換腳本 master_ip_online_change_script= /usr/local/bin/master_ip_online_change //設置手動切換時候的切換腳本 password=123456 //設置mysql中root用戶的密碼,這個密碼是前文中建立監控用戶的那個密碼 user=root 設置監控用戶root ping_interval=1 //設置監控主庫,發送ping包的時間間隔,默認是3秒,嘗試三次沒有迴應的時候自動進行railover remote_workdir=/tmp //設置遠端mysql在發生切換時binlog的保存位置 repl_password=123456 //設置複製用戶的密碼 repl_user=repl //設置複製環境中的複製用戶名 report_script=/usr/local/send_report //設置發生切換後發送的報警的腳本 secondary_check_script= /usr/local/bin/masterha_secondary_check -s server03 -s server02 shutdown_script="" //設置故障發生後關閉故障主機腳本(該腳本的主要做用是關閉主機放在發生腦裂,這裏沒有使用) ssh_user=root //設置ssh的登陸用戶名 [server1] hostname=192.168.0.50 port=3306 [server2] hostname=192.168.0.60 port=3306 candidate_master=1 //設置爲候選master,若是設置該參數之後,發生主從切換之後將會將此從庫提高爲主庫,即便這個主庫不是集羣中事件最新的slave check_repl_delay=0 //默認狀況下若是一個slave落後master 100M的relay logs的話,MHA將不會選擇該slave做爲一個新的master,由於對於這個slave的恢復須要花費很長時間,經過設置check_repl_delay=0,MHA觸發切換在選擇一個新的master的時候將會忽略複製延時,這個參數對於設置了candidate_master=1的主機很是有用,由於這個候選主在切換的過程當中必定是新的master [server3] hostname=192.168.0.70 port=3306
- 注:這裏有個坑,就是secondary_check_script,徹底不知道這個腳本幹嗎的,而後還報錯說不認識server03和server02,改爲server3和server2也沒用,索性將它註釋了,一切太平
- 在每一個slave節點上設置relay log的清除方式
mysql -uroot -p -e 'set global relay_log_purge=0'
- 建立purge_relay_log.sh腳本
#!/bin/bash user=root passwd=123456 port=3306 log_dir='/data/masterha/log' work_dir='/data' purge='/usr/local/bin/purge_relay_logs' if [ ! -d $log_dir ] then mkdir $log_dir -p fi $purge --user=$user --password=$passwd --disable_relay_log_purge --port=$port --workdir=$work_dir >> $log_dir/purge_relay_logs.log 2>&1
- crontab裏添加
0 4 * * * /bin/bash /root/purge_relay_log.sh
7.檢查SSH配置
masterha_check_ssh --conf=/etc/masterha/app1.cnf
8.檢查複製情況(確保主庫沒有slave信息,不然會報錯)
需註釋掉 master_ip_failover_script= /usr/local/bin/master_ip_failover ,等到編輯了master_ip_failover腳本之後再開啓
masterha_check_repl --conf=/etc/masterha/app1.cnf
若是報mysqlbinlong version not found
ln -s {mysql_home}/bin/mysqlbinlog /usr/local/bin/mysqlbinlog ln -s {mysql_home}/bin/mysql /usr/local/bin/mysql
我這邊還報了個unknown variable 'default-character-set=utf8mb4',解決方法:修改my.cnf
#default-character-set=utf8mb4
loose-default-character-set=utf8mb4
9.開啓MHA 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 &
啓動參數介紹:
--remove_dead_master_conf 該參數表明當發生主從切換後,老的主庫的ip將會從配置文件中移除。
--manger_log 日誌存放位置
--ignore_last_failover 在缺省狀況下,若是MHA檢測到連續發生宕機,且兩次宕機間隔不足8小時的話,則不會進行Failover,之因此這樣限制是爲了不ping-pong效應。該參數表明忽略上次MHA觸發切換產生的文件,默認狀況下,MHA發生切換後會在日誌目錄,也就是上面我設置的/data產生app1.failover.complete文件,下次再次切換的時候若是發現該目錄下存在該文件將不容許觸發切換,除非在第一次切換後收到刪除該文件,爲了方便,這裏設置爲--ignore_last_failover。
關閉命令: masterha_stop --conf=/etc/masterha/app1.cnf
10.檢查MHA Manager的狀態
masterha_check_status --conf=/etc/masterha/app1.cnf
華麗的分割線,作到這就不作了,由於用不了VIP.......
11.配置虛擬ip
- 安裝keepalived(主庫,備選主庫)
wget http://www.keepalived.org/software/keepalived-1.2.12.tar.gz tar zxvf keepalived-1.2.12.tar.gz cd keepalived-1.2.12 ./configure --prefix=/usr/local/keepalived make && make install
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ - 在主庫上配置keepalived
global_defs { notification_email { saltstack@163.com } notification_email_from dba@dbserver.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MySQL-HA } vrrp_instance VI_1 { state BACKUP interface eth1 virtual_router_id 51 priority 150 advert_int 1 nopreempt authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.0.88 } }
- 在備選主庫上配置keepalived
global_defs { notification_email { saltstack@163.com } notification_email_from dba@dbserver.com smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MySQL-HA } vrrp_instance VI_1 { state BACKUP interface eth1 virtual_router_id 51 priority 120 advert_int 1 nopreempt authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.0.88 } }
- 啓動keepalive
service keepalived start
-
MHA引入keepalived
#!/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.0.88'; my $ssh_start_vip = "service keepalived start"; my $ssh_stop_vip = "service 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 ($@) { 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"; #`ssh $ssh_user\@cluster1 \" $ssh_start_vip \"`; exit 0; } else { &usage(); exit 1; } } # A simple system call that enable the VIP on the new master 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() { 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"; }
- 再次檢查集羣狀態
masterha_check_repl --conf=/etc/masterha/app1.cnf