轉自:曉嘆星沉 https://my.oschina.net/blueSky4Java/blog/1572905mysql
摘要: 隨着項目的發展,爲了提升程序的性能,數據庫層面或多或少的會用到HA、讀寫分離、集羣等功能,在選型時能夠考慮使用現成的雲服務,或者一些高可用軟件,亦或是利用一些開源軟件實現上述功能。這次將針對上述功能分篇幅進行整理,內容涉及HA、讀寫分離、集羣,以期使用時達到快速部署之效果。web
Keepalived的做用是檢測服務器的狀態,若是有一臺web服務器宕機,或工做出現故障,Keepalived將檢測到,並將有故障的服務器從系統中剔除。其使用 VRRP(Virtual Router Redundancy Protocol)虛擬路由冗餘協議,能夠經過在一個路由器組(一個VRRP組)之間共享一個虛擬IP(VIP), 即將N臺提供相同功能的路由器組成一個路由器組,這個組裏面有一個MASTER和多個BACKUP 。當master宕掉後, 根據VRRP的優先級來選舉一個BACKUP當MASTER,及時將業務切換到其它設備,從而保持通信的連續性和可靠性 。sql
Mysql HA的實現原理(此處以兩臺爲例),兩臺Mysql主主複製,使數據時刻保持一致,同時使用兩個keepalived監聽各自機器上的Mysql,當Mysql服務停掉後,執行腳本關掉keepalived服務,由另外一臺機器的keepalived接替。數據庫
實現此功能須要兩個步驟:服務器
環境信息:網絡
master:192.168.102.129(CentOS6.8,hostname爲master)oop
slave:192.168.102.130(CentOS6.8,hostname爲salve)性能
VIP:192.168.102.128測試
(1)修改mysql配置文件,開啓二進制文件.net
master的my.cnf
[mysqld] server_id = 1 #服務id,保證兩臺mysql惟一,不重複便可 log-bin = mysql-bin #開啓二進制日誌 relay-log = mysql-relay-bin replicate-wild-ignore-table=mysql.% #配置不須要複製的庫 replicate-wild-ignore-table=test.% replicate-wild-ignore-table=information_schema.%
slave的my.cnf
[mysqld] server_id = 2 log-bin = mysql-bin relay-log = mysql-relay-bin replicate-wild-ignore-table=mysql.% replicate-wild-ignore-table=test.% replicate-wild-ignore-table=information_schema.%
配置完成後,重啓兩個mysql。
(2)配置主主複製
鏈接mysql,使用show master status查看master和slave兩個mysql的二進制文件名稱和位置
master(192.168.102.129)以下:
slave(192.168.102.130)以下:
根據上述file和position互相配置主從
master(192.168.102.129)以下:
change master to master_host='192.168.102.130', master_user='root',master_password='123456',master_port=3306,master_log_file='mysql- bin.000002',master_log_pos=472; start slave;
slave(192.168.102.130)以下:
change master to master_host='192.168.102.129', master_user='root',master_password='123456',master_port=3306,master_log_file='mysql- bin.000002',master_log_pos=724; start slave;
(3)測試驗證是否同步
鏈接master,在jz.test中添加記錄m1
鏈接salve,在jz.test中添加記錄s1,結果以下
(1)keepalived安裝
使用yum能夠直接安裝yum install keepalived
網絡不容許的狀況下能夠下載tar或rpm進行離線安裝。本文使用yum直接安裝,安裝過程再也不贅述。
(2)keepalived配置
配置keepalived.conf文件
[root@master ~]# vi /etc/keepalived/keepalived.conf
master配置
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state BACKUP #master和slave都設置爲BACKUP, interface eth0 virtual_router_id 51 priority 100 #master和slave設置不一樣值,啓動時會將priority大的設置爲master advert_int 1 nopreempt #設置爲不搶佔模式,僅master配置。當master掛掉後,slave當選爲master,恢復後再也不切換 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.102.128 #虛擬ip } } virtual_server 192.168.102.128 3306 { delay_loop 2 #輪訓real_server時間間隔,此處設爲2秒 lb_algo rr lb_kind NAT nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.102.129 3306 { weight 1 notify_down /usr/local/mysql/checkMysql.sh #mysql掛掉時執行的腳本,需具有執行權限 TCP_CHECK { connect_timeout 10 bingto 192.168.102.128 nb_get_retry 3 delay_before_retry 3 connect_port 3306 } } }
slave配置
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.102.128 } } virtual_server 192.168.102.128 3306 { delay_loop 2 lb_algo rr lb_kind NAT nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.102.130 3306 { weight 1 notify_down /usr/local/mysql/checkMysql.sh TCP_CHECK { connect_timeout 10 bingto 192.168.102.128 nb_get_retry 3 delay_before_retry 3 connect_port 3306 } } }
在/usr/local/mysql/下增長checkMysql.sh,腳本以下(留意腳本權限,需具有執行權限):
pkill keepalived
keepalived加入開機啓動
chkconfig keepalived on
(3)測試keepalived是否生效
啓動master和slave的mysql、keepalived,
鏈接192.168.102.128的數據庫,查詢hostname,此時vip在master機器上
停掉master的mysql服務(service mysql stop)後,vip飄到了slave上。
經過上述配置可初步實現數據庫的高可用性,在Mysql服務出問題時實現自動切換,但在實際應用中應考慮服務宕掉時,應實現郵件通知功能,文中還沒有涉及,後期實現後再作更新。此外Mysql之間出現數據不一樣步問題,也要謹慎處理,暫停數據同步功能,將數據處理後,方可從新開啓同步。
© 著做權歸做者全部