MySQL MHA+Keepalived

來源:互聯網
上載者:User

標籤:style   blog   http   io   ar   os   使用   sp   for   

一、MHA的簡單介紹
MHA是由perl語言編寫的,用外掛指令碼的方式實現mysql主從複製的高可用性。
MHA可以自動檢測mysql是否宕機,如果宕機,在10-30s內完成new master的選舉,應用所有差異的binlog日誌到所有slave,將所有的slave切換到新的master上來。
MHA除了自動檢測mysql是否宕機,還能夠互動切換master,在日常的資料庫維護中,這個功能還是挺有用的。
由於MHA本身只負責資料庫主從的切換,但是應用程式並不知道資料庫的master變了。針對這種情況,可以使用MHA預留的幾個指令碼介面,通過虛擬IP或者修改全域設定檔的方法通知應用程式,master資料庫已經改變。

MHA還是一個很活躍的項目,生產環境的使用者眾多,不乏大公司,MHA的版本也很快,MHA作者在持續更新版本,最新版本已經支援GTID了。

二、環境部署

OS : Centos /RedHat 6.x

Mysql: Percona 5.5/5.6

主機(hostname) 角色 IP 安裝
master.mysql.com Master 192.168.56.110 Mysq,mha node,keepalived
Slave1.mysq.com

Candidate master

( slave1 )

192.168.56.111

Mysql, MHA node,

keepalived

Slave2.mysql.com slave2 192.168.56.112 Mysql,keepalived
mha.mysql.com MHA manager 192.168.56.111 MHA manager
Vip 192.168.56.188    


三、軟體安裝

yum源準備(修改 /etc/yum.repos.d/)

epel yum源:http://blog.csdn.net/yiyuf/article/details/40148125

Percona yum源:http://blog.csdn.net/yiyuf/article/details/40148183

關閉selinux 

#cat  /etc/sysconfig/selinux

SELINUX=disabled

關閉 iptables

#service iptables stop

chkconfig iptables off

修改 /etc/hosts 增加如下:

192.168.56.110 master.mysql.com

192.168.56.112 slave1.mysql.com

192.168.56.113 slave2.mysql.com 

並scp /etc/hosts 到其它各個節點。

mysql 安裝:

yum -y install Percona-Server-server-55.x86_64  (5.5 版本)
yum -y install Percona-Server-server-56.x86_64  (5.6版本 )

搭建mysql 一主兩從配置 (略)

SSH互信配置:

在master(192.168.56.110)上執行:ssh-keygen (一路斷行符號)

# cd ~/.ssh

#cat id_rsa.pub >authorized_keys

#chmod 600 *

scp -r .ssh 192.168.56.111:~/

scp -r .ssh 192.168.56.112:~/

scp -r .ssh 192.168.56.113:~/

至此,mysql的主從也搭建好了,並可以正常運行了。接下來開始安裝MHA軟體:

1. mha manager節點安裝(192.168.56.111上):

 yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -----安裝perl相關庫檔案

從https://code.google.com/p/mysql-master-ha/wiki/Downloads上面下載:

MHA Manager 0.56 rpm RHEL6

MHA Node 0.56 rpm RHEL6

MHA Manager 0.56 tarball    #####下載此tar包的目的是為了copy相關的設定檔和scripts

在192.168.56.111上安裝:

#rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm 

#rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm

2. mha node節點安裝(192.168.56.110, 192.168.56.112,192.168.56.113):

# yum -y install perl-DBD-MySQL

#rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

3. MHA配置 (只需要在mha manager端配置即可):

該設定檔預設是分為兩個(appxxx.cnf ,masterha_default.cnf ),其中masterha_default.cnf 是屬於全域設定檔,當管理多個叢集時,就顯得特別有用。避免app.conf寫的太長。app1.conf作用範圍為master/slave結構,

全域參數檔案配置(masterha_default.cnf)

#cat /etc/masterha_default.cnf

[server default]

user=yyf    

password=yyf

ssh_user=root

repl_user=replica

repl_password=zjjzjj

master_binlog_dir=/var/lib/mysql3307

#monitor

ping_interval=1

shutdown_script=""

secondary_check_script="masterha_secondary_check -s 192.168.56.112 -s 192.168.56.113"  #此處 56.112和56.113在每次切換完後必須要調整。例:當前112和113是slave,110是master,如果MHA發生自動切換,master由110切換到112後,下次這部分就該修改為:-s 192.168.56.110 -s 192.168.56.113。否則下次切換時,將導致失敗。

master_ip_failover_script="/root/scripts/master_ip_failover.sh" ##  點擊開啟連結(master_ip_failover.sh)

參數解釋:

user  用於管理MySQL的使用者名稱。這個最後需要root使用者,因為它需要執行:stop slave; change master to , reset slave. 預設: root
password  MySQL的系統管理使用者的密碼。 預設是空的
ssh_user 當前使用的系統使用者,用於ssh登入檢測狀態
repl_user MySQL用於複製的使用者
repl_password MySQL用於複製的使用者的密碼
ping_interva l                       設定MHA Manager多長時間去ping一下master(執行一些SQL語句). 當3次ping失敗後,MHA Manager會認為MySQL Master死掉了。也就是說,最大的故障切換時間是4次ping_interval的時間,預設是3秒。
shutdown_script 定義關掉主master的指令碼
secondary_check_script 當MHA Manager檢測master失敗後,不會立即判斷該master已宕機,而是通過ssh到secondary_check_script定義的主機再次進行檢測失敗後,方可認為master無法響應。這從一定程度上也防止腦裂的現象出現。
master_ip_failover_script

failvoer時,控制VIP轉移的指令碼。通常有兩種方式實現:

(1)通過命令 "/sbin/ifconfig eth1:1  192.168.56.188";

(2) 結合keepalived 來實現

master_binlog_dir  用於儲存binary日誌的全路徑。這個參數用於當master上mysql死掉後,通過ssh連到mysql伺服器上,找到需要binary日誌事件。這個參數可以協助用於無法找到master進程死掉後binary日誌儲存位置。可以設定多個存放位置用逗號隔開如:/var/lib/mysql , /var/lib/mysql3307

app1.conf參數檔案介紹(作用於某組master / slave結構)

#cat /etc/app1.conf

[server default]

manager_log=/var/log/masterha/app1/app1.log

manager_workdir=/var/log/masterha/app1

remote_workdir=/var/log/masterha/app1

[server1]

candidate_master=1

check_repl_delay=0

hostname=192.168.56.112

port=3306

[server2]

candidate_master=1

check_repl_delay=0

hostname=192.168.56.110

port=3306

[server3]

check_repl_delay=0

hostname=192.168.56.113

ignore_fail=1

no_master=1

port=3306

參數解釋:

manager_log 指定MHA manager的絕對路徑的檔案名稱記錄檔
manager_workdir 指定MHA manager產生相關狀態檔案全路徑。 如果沒設定 預設是/var/tmp
remote_workdir MHA node上工作目錄的全路徑名。如果不存在,MHA node會自動建立,如果不允許建立,MHA Node自動異常退出
[server1] [server2] [server3] 在各個APP中所包含,定義每個主機的屬性。
candidate_master 作用是當設計candidate_master = 1時,這個伺服器有較高的優先權提升為新的master(條件:開啟binglog,服務無延遲)如果設定了多台機器的caddidate_master = 1 , 優先策略依賴於塊名字([server_xxx]),如:[server_1] 優銜權高於[server_2]
check_repl_delay 在預設情況下,當一個slave同步延遲超過100M relay log(需要應用超過100M relay log), MHA在做故障切換時不會選擇這個slave做為新的master,因為恢複需要經過很長時間.當設定了check_repl_delay = 0, MHA將忽略被選擇的slave上的同步延遲。 這個選項在設定了candidate_master = 1特聲明的期望這台機器成為master的情況下特別有用。
hostname 配置MySQL伺服器的機器名或是IP地址,這個配置項是必須的,而且只能配置在[server_xxx]這個塊下面。
ignore_fail 在預設情況下,MHA manager不會在slave存在故障的情況下進行Master的故障切換。當設定了ignore_fail = 1時,MHA會在所有的機器有問題的時間也會進行故障切換。 預設是0.
no_master 當設定了no_master = 1的伺服器,這個伺服器永遠不會提升為新的master
port db的連接埠號碼,預設是3306 :port=3307

中繼日誌的處理:

預設情況下,從伺服器上的中繼日誌在SQL線程執行完後會被自動刪除的。但是這些中繼日誌在恢複其他從伺服器時候可能會被用到,

因此需要禁用中繼日誌的自動清除和定期清除舊的中繼日誌。定期清除中繼日誌需要考慮到複製延時的問題。在ext3檔案系統下,

刪除大的檔案需要一定的時間,會導致嚴重的複製延時。為了避免複製延時,暫時為中繼日誌建立永久連結。

MHA節點包含pure_relay_logs命令工具,它可以為中繼日誌建立永久連結,執行SET GLOBAL relay_log_purge=1,等待幾秒中以便SQL線程切換到新的中繼日誌,

再執行SET GLOBAL relay_log_purge=0。

pure_relay_logs參數如下所示:

–user mysql使用者名稱

–password mysql密碼

–host mysql伺服器位址

–port 連接埠號碼

–workdir 建立和刪除中繼日誌永久連結目錄。成功執行指令碼後,永久連結的中繼記錄檔將被刪除。預設目錄是/var/tmp。

因此purge_relay_logs指令碼刪除中繼日誌不會阻塞SQL線程,在每台從節點上設定計劃任務

定期清除中繼日誌
0 15 * * *  /usr/bin/purge_relay_logs  -user=yyf -password=yyf -disable_relay_log_purge -port=3307 -host=192.168.56.110 >> /var/log/masterha/app1/purge_relay_logs.log 2>&1

至此,MHA的配置已經完成。很簡單吧。設定檔只需存在於MHA Manager端即可。相關測試:將在下篇文章介紹,請戳開:點擊開啟連結

接下來就可以啟動 MHA 監控了:

[[email protected] scripts]#nohup masterha_manager --conf=/etc/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/app1.log 2>&1 &

查看MHA狀態:

[[email protected] ~]# masterha_check_status  --conf=/etc/app1.cnf 
app1 (pid:9130) is running(0:PING_OK), master:192.168.56.110

停止MHA監控:

[[email protected] ~]# masterha_stop  --conf=/etc/app1.cnf

解釋:

--conf 一組master/slave的設定檔,會同時讀取全域設定檔 

/etc/masterha_default.cnf

--remove_dead_master_conf  該參數代表當發生主從切換後,老的主庫的IP將會從設定檔(app1.conf)中移除.

--ignore_last_failover  在預設情況下,如果MHA檢測到連續發生宕機,且兩次宕機間隔不足8小時的話,則不會進行Failover.這樣限制是為了避免ping-pong效應。該參數代表忽略上次MHA觸發切換產生的檔案,預設情況下,MHA發生切換後會在日誌目錄,也就是上面我設定的/var/log/masterha/app產生app1.failover.complete檔案,下次再次切換的時候如果發現該目錄下存在該檔案將不允許觸發切換,除非在第一次切換後收到刪除該檔案,為了方便,這裡設定為--ignore_last_failover。

監控開啟後,就可以做相關測試了,把master上的mysql進程kill掉(pkill mysql )。測試下會不會自動進行failover測試,為了縮短文章篇幅,相關測試

請戳開:點擊開啟連結

keepalived 安裝:

軟體下載最新版本:http://www.keepalived.org/software/

keepalived-1.2.13.tar.gz

#yum -y install openssl-devel 

#tar -zxvf keepalived-1.2.13.tar.gz

# cd keepalived-1.2.13

    #./configure  --prefix=/usr/local/keepalived

#make && make install

#cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

#cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

#mkdir /etc/keepalived

#cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/

#cp /usr/local/sbin/keepalived /usr/sbin/

keepalived配置及設定檔(在主master 192.168.56.110上的配置)

[[email protected] ~]# cat /etc/keepalived/keepalived.conf 

! Configuration File for keepalived

global_defs {

   notification_email {

     [email protected]

     [email protected]

     [email protected]

   }

   notification_email_from [email protected]

   smtp_server 192.168.200.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

vrrp_instance VI_1 {

    state backup

    interface eth1

    nopreempt

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.56.188

    }

  notify_master "/etc/keepalived/arp.sh"

}

其中router_id MySQL HA表示設定keepalived組的名稱,將192.168.56.188這個虛擬ip綁定到該主機的eth1網卡上,並且設定了狀態為backup模式,將keepalived的模式設定為非搶佔模式(nopreempt),priority 150表示設定的優先順序為150。下面的配置略有不同,但是都是一個意思。

在候選master上配置(192.168.56.112)如下:

[[email protected] ~]# cat /etc/keepalived/keepalived.conf 

! Configuration File for keepalived

global_defs {

   notification_email {

     [email protected]

     [email protected]

     [email protected]

   }

   notification_email_from [email protected]

   smtp_server 192.168.200.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

vrrp_instance VI_1 {

    state master

    interface eth1

         nopreempt

    virtual_router_id 51

    priority 100  #此處很重要,一定要低於當前master的優先順序別。值比主master小即可

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.56.188

    }

  notify_master "/etc/keepalived/arp.sh"   ###定義的清除arp路由的指令碼。

}

至此,依次把主master和候選master上的keepalived進程開啟:

service keepalived start|stop|restart

#ip add 命令查看VIP的綁定情況:

[[email protected] keepalived]# ip add

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host 

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 08:00:27:70:b3:d8 brd ff:ff:ff:ff:ff:ff

    inet 192.168.2.40/24 brd 192.168.2.255 scope global eth0

    inet6 fe80::a00:27ff:fe70:b3d8/64 scope link 

       valid_lft forever preferred_lft forever

3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 08:00:27:75:5b:94 brd ff:ff:ff:ff:ff:ff

    inet 192.168.56.110/24 brd 192.168.56.255 scope global eth1

    inet 192.168.56.188/32 scope global eth1

    inet6 fe80::a00:27ff:fe75:5b94/64 scope link 

       valid_lft forever preferred_lft forever

MySQL MHA+Keepalived

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.