前面文章介紹了MySQL的讀寫分離及分庫分表過程。對於分庫和分表,實現策略有好多種,須要根據業務來肯定最適合的分庫分表架構,文章中還有好多未涉及到的,讀者能夠本身找資料學習。分庫分表完成以後,數據容量及性能增長了,可是緊接着會面臨着可用性的問題。從本篇文章開始,將會介紹MySQL的高可用實現方案!
一、什麼是高可用mysql
"高可用性"(High Availability),簡稱HA,一般來描述一個系統通過專門的設計,從而減小停工時間,而保持其服務的高度可用性。 --來自"百度百科"算法
二、高可用架構的工做方式sql
(1)主從
服務同時部署在主從服務器上。初始,主服務器上的服務正常運行,從服務器經過心跳等方式實時監測主服務器的運行狀態,一旦出現主服務器宕機或者主服務器上的服務異常終止等故障,從服務器會自動接管主服務器的工做,對外提供服務。數據庫
(2)雙主
服務同時部署在兩臺主服務器上。起初,只有一臺主服務器對外提供服務,另一臺服務器只處於實時監聽狀態,當其中的一臺主服務器宕機或者服務不可用時,另一臺主服務器會馬上接管出故障的主服務器,對外提供服務,通常經過VIP自動切換來實現。segmentfault
(3)集羣
服務同時部署在多臺服務器上。多臺服務器共同工做,每個服務器都有一臺或者多臺備機。起初,多臺服務器能夠經過反向代理共同對外提供服務,當某一臺服務器出現故障或者其上的服務不可用時,其餘服務能夠馬上進行接管,對外提供服務,一般可使用Nginx,HaProxy,LVS等代理實現服務的高可用。可是,Nginx,HaProxy,LVS自己也是單點,須要實現高可用,後面介紹Web應用高可用時會詳細介紹。windows
三、高可用的衡量指標-系統可用率bash
計算方法:可用率=系統無端障運行時間/(系統無端障運行時間+系統故障維護時間)
根據可用率估計系統可用性指標以下:
服務器
(1)KeepAlived+MySQL+MM複製
實現方法:經過雙主複製,在每一個節點上部署Keepalived,經過vip向外提供服務,當某個節點故障時,vip自動轉移到可用的節點上。架構
(2)HeartBeat+DRBD+MySQL
實現方法:分佈式複製塊設備,相似於RAID1,當數據保存到一臺服務器上的時候,會同時將數據冗餘備份一份到另一臺服務器,經過HeartBeat向服務器發送心跳信息監聽服務器的存活狀態,當一臺服務器故障時,服務會自動轉移到另一個服務器上。負載均衡
(3)MySQL Cluster
實現方法:MySQL集羣是由一組服務器組成,每一個服務器上都運行着多個服務進程,MySQL的數據節點,MySQL的管理服務,以及轉們的數據訪問程序,搭建起來十分複雜。時間成本特別高,可是能夠經過MySQL Cluster Manager來快速完成搭建,可是這個軟件是收費的,因此這種方案使用的特別少。
(4)MySQL主從+讀寫分離+自定義腳本
實現方法:插入數據的時候,經過MySQL的主從複製將數據分別保存到兩個服務器上,當其中某一臺服務器出現故障時,會自動將其中的一臺從庫提高爲主庫,對外提供服務器。
一、環境準備
(1)服務器:CenterOS6.9
(2)MySQL環境
版本:mysql-5.6.39
節點一:192.168.0.4(mysql-master01)
節點二:192.168.0.5(mysql-master02)
二、搭建過程
(1)創建複製用戶,在節點一上創建一個複製用戶'repl'@'192.168.0.%'
#登錄mysql [root@mysql-master01 ~]# mysql -uroot -proot -h127.0.0.1 -P3306 #創建複製用戶,注意主機權限是'192.168.0.%',由於等會須要導入數據到節點二上 mysql> grant all on *.* to 'repl'@'192.168.0.%' identified by 'repl';
(2)全備節點一的全部數據,而後發送到節點二上
[root@mysql-master01 ~]# mysqldump -uroot -proot -h127.0.0.1 -P3306 --all-databases --flush-logs --single-transaction --triggers --routines --master-data=2 --events --hex-blob > /tmp/mysql_all_data.sql [root@mysql-master01 ~]# scp /tmp/mysql_all_data.sql 192.168.0.5:/tmp/
(3)在節點二所在的服務器上導入節點一備份的數據
[root@mysql-master02 ~]# mysql -uroot -proot -h127.0.0.1 -P3306 < /tmp/mysql_all_data.sql
(4)修改節點一的配置文件,添加以下內容
[mysqld] server_id = 4 log_bin=/mysql_data/mysql-bin log_bin_index=/mysql_data/mysql-bin.index #讓主節點同時做爲其餘節點的從節點 log_slave_updates = 1 binlog_format = mixed relay_log = /mysql_data/mysql-relay relay_log_index = /mysql_data/mysql-relay.index
(5)修改節點二的配置文件,添加以下內容
[mysqld] server_id = 5 log_bin = /mysql_data/mysql-bin log_bin_index = /mysql_data/mysql-bin.index log_slave_updates = 1 relay_log = /mysql_data/mysql-relay relay_log_index = /mysql_data/mysql-relay.index
(6)重啓節點一和節點二
(7)登錄節點一中,而後查看當前二進制日誌的位置點及日誌文件
root@127.0.0.1 (none)> show master status \G *************************** 1. row *************************** File: mysql-bin.000075 Position: 120 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.10 sec)
(8)登錄節點二中,執行"change master"命令,將節點二配置爲節點一的從庫,而後啓動複製
mysql> change master to master_host='192.168.0.4',master_port=3306,master_user='repl',master_password='repl',master_log_file='mysql-bin.000075',master_log_pos=120; mysql> start slave; #查看複製狀態 mysql> show slave status \G #看到輸出結果中以下兩個參數的值爲Yes,表示節點二到節點一的複製配置成功 Slave_IO_Running: Yes Slave_SQL_Running: Yes
(9)在節點二中查看當前二進制日誌的位置點及日誌文件
root@127.0.0.1 (none)> show master status \G *************************** 1. row *************************** File: mysql-bin.000050 Position: 160 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.00 sec)
(10)在節點一中執行"change master"命令,將節點一配置爲節點二的從庫,而後啓動複製
mysql> change master to master_host='192.168.0.5',master_port=3306,master_user='repl',master_password='repl',master_log_file='mysql-bin.000050',master_log_pos=160; mysql> start slave; #查看略,同上
(11)驗證,在節點一上建立一張表,而後登錄節點二查看。而後在節點二上建立一張表,而後登錄節點一查看,正常的話,會相互複製,驗證過程省略。
至此,MySQL的雙主複製搭建完成。
(1)在節點一上,掛載CentOS6.9的鏡像,而後使用yum方式安裝keepalived,對於鏡像的掛載,能夠參考以前的博客:https://segmentfault.com/a/11... 此處再也不贅述。安裝過程以下:
[root@mysql-master01 ~]# yum install -y keepalived #安裝完成以後,使用該命令查看是否安裝成功 [root@mysql-master01 ~]# rpm -qa | grep keep keepalived-1.2.13-5.el6_6.x86_64
(2)在節點二上,一樣掛載CentOS6.9的鏡像,而後安裝keepalived。此處略。
(3)keepalived安裝完成以後,配置文件默認在/etc/keepalived目錄下,首先配置節點一上的keepalived,以下:
[root@mysql-master01 ~]# cd /etc/keepalived/ #備份配置文件,須要養成習慣 [root@mysql-master01 keepalived]# cp keepalived.conf keepalived.conf.bak
寫入以下內容:
! 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 } !定義VRR實例 vrrp_instance VI_1 { state BACKUP !指定主節點和備節點,此處都是用BACKUP備機 interface eth0 !虛擬IP綁定的網卡,根據本身的狀況而定 virtual_router_id 51 !同一個VRR實例下virtual_router_id必須相同 priority 100 !節點的優先級(範圍爲:1-254之間),備用節點必須比主節點優先級低 advert_int 1 !組播信息發送間隔,兩個節點設置必須同樣 nopreempt !表示不搶佔的模式,只須要在優先級高的機器上設置便可,優先級低的機器可不設置 !設置驗證信息,兩個節點必須一致,不一致會失敗 authentication { auth_type PASS auth_pass 1111 } !配置VIP,能夠隨意取,可是須要和數據庫所在服務器在同一個IP端內,兩個節點必須相同 virtual_ipaddress { 192.168.0.100 } } !配置監聽的VIP及端口 virtual_server 192.168.0.100 3306 { delay_loop 2 !健康檢查時間間隔,單位爲s lb_algo wrr !調度算法權重輪訓Weight Round robin lb_kind DR !LVS實現負載均衡的機制,能夠有NAT、TUN和DR三個模式能夠選擇 nat_mask 255.255.255.0 persistence_timeout 60 !回話保持時間 protocol TCP !轉發協議類型,有tcp和udp兩種 real_server 192.168.0.4 3306 { weight 1 #權重,此處和第二個節點設置的相同,表示均衡輪訓 notify_down /server/scripts/shutdown.sh !檢測到服務故障以後執行的腳本 TCP_CHECK { connect_timeout 10 !鏈接超時時間 nb_get_retry 3 !重連次數 delay_before_retry 3 !重連間隔時間 connect_port 3306 !健康檢查端口 } } }
shutdown.sh的內容請繼續往下看。
(4)配置節點二上的keepalived配置文件
[root@mysql-master02 ~]# cd /etc/keepalived/ [root@mysql-master02 keepalived]# cp keepalived.conf keepalived.conf.bak
寫入以下內容:
! Configuration File for keepalived !注意,global_defs能夠徹底不用動 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.0.100 } } ! 配置VIP及監聽的端口 virtual_server 192.168.0.100 3306 { delay_loop 2 lb_algo wrr lb_kind DR nat_mask 255.255.255.0 persistence_timeout 60 protocol TCP real_server 192.168.0.5 3306 { weight 1 notify_down /server/scripts/shutdown.sh TCP_CHECK { connect_timeout 10 nb_get_retry 3 delay_before_retry 3 connect_port 3306 } } }
shutdown.sh的內容以下,主要是用來關閉keepalived進程的:
[root@mysql-master01 keepalived]# cat /server/scripts/shutdown.sh #!/bin/bash # killall keepalived #注意,編輯完成以後,須要受權,不然不能執行,節點二上的腳本與此相同 [root@mysql-master01 keepalived]# chmod +x /server/scripts/shutdown.sh
(5)keepalived安裝完成以後,默認會生成Sysv腳本,使用service命令啓動節點一上的keepalived,並監控試試日誌,以下:
[root@mysql-master01 keepalived]# service keepalived start [root@mysql-master01 keepalived]# tail -f /var/log/messages #若是未看到錯誤消息,就是好消息。正常的話,能夠在啓動日誌中看到VIP的啓動信息。 #查看進程 [root@mysql-master01 keepalived]# ps -ef | grep keep root 8258 1 0 May20 ? 00:00:02 /usr/sbin/keepalived -D root 8260 8258 0 May20 ? 00:00:07 /usr/sbin/keepalived -D root 8261 8258 0 May20 ? 00:00:12 /usr/sbin/keepalived -D root 9434 8463 1 04:08 pts/0 00:00:00 grep keep
(6)啓動節點二上的keepalived
[root@mysql-master02 keepalived]# service keepalived start
(7)驗證主從功能是否正常,驗證方法爲在節點一上建立數據庫,觀察節點二上是否同步;而後在節點二上建立數據庫,觀察節點一上是否同步。驗證過程此處略。
(8)兩個節點都啓動以後,在先啓動的節點上查看VIP,以下:
[root@mysql-master01 keepalived]# ip addr | grep "0.100" inet 192.168.0.100/32 scope global eth0
(9)驗證高可用
在另外一個客戶端上使用VIP鏈接數據庫,好比windows上(VIP須要和windows宿主機在同一個ip段內,不然沒法鏈接),而後查看當前的主機名稱,以下:
C:\Users\wangbin>mysql -uroot -proot -h192.168.0.100 -P3306 #查看主機名 mysql> show variables like 'hostname'; +---------------+----------------+ | Variable_name | Value | +---------------+----------------+ | hostname | mysql-master01 | +---------------+----------------+ 1 row in set (0.00 sec)
關閉節點一上的數據庫服務:
[root@mysql-master01 keepalived]# service mysqld stop #過5秒左右,查看VIP,能夠發現,ip已經不在了 [root@mysql-master01 keepalived]# ip addr | grep "0.100"
此時再查看主機名稱,以下:
mysql> show variables like 'hostname'; +---------------+----------------+ | Variable_name | Value | +---------------+----------------+ | hostname | mysql-master02 | +---------------+----------------+ 1 row in set (0.00 sec) #發現已經變成server02了,VIP已經能夠自動切換了
建立一個數據庫,而後從新啓動節點一上的mysql服務和keepalived服務,登錄節點一查看建立的數據庫是否複製。
[root@mysql-master01 keepalived]# service keepalived start [root@mysql-master01 keepalived]# service mysqld start
通過查看,發現已經複製,在數據庫節點從新啓動以後,會開始同步節點二上的數據。
後續更多文章將更新在我的小站上,歡迎查看。
另外提供一些優秀的IT視頻資料,可免費下載!如須要請查看https://www.592xuexi.com
至此,MySQL的高可用概念及使用(Keepalived+MySQL)實現的MySQL高可用已經搭建驗證完畢,篇幅較長,不免有筆誤,歡迎評論轉發!