(一)keepalived概述html
Keepalived經過VRRP(虛擬路由冗餘協議)協議實現虛擬IP的漂移。當master故障後,VIP會自動漂移到backup,這時通知下端主機刷新ARP表,若是業務是經過VIP鏈接到服務器的,則此時依然可以鏈接到正常運行的主機,RedHat給出的VRRP工做原理以下圖:mysql
原本對VIP漂移有必定了解的我,看了上面的圖後,愈來愈懵了。所以只能根據個人我的理解,來對keepalived的VIP漂移作一個解釋了,假設我如今有一套這樣的環境:
主機A的IP地址爲:192.168.10.11
主機B的IP地址爲:192.168.10.12linux
咱們再單獨定義一個keepalived使用的VIP:192.168.10.10sql
當2臺主機安裝了keepalive並正常運行時,keepalive會選擇一個節點作爲主節點(這裏假設爲主機A,IP爲192.168.10.11),因爲A是主節點,因此主機A上還會生成一個IP地址192.168.10.10,即虛擬IP(Virtual IP,也稱VIP),此時咱們使用192.168.10.10訪問主機,訪問到的主機是A;假如A主機上的keepalived因爲某些緣由(例如服務器宕機、用戶主動關閉…)關閉了,keepalived備用節點會檢查與主節點keepalived的通訊是否正常,檢測到不正常,則會提高一個備節點爲主節點,相應的虛擬IP也會在對應的主機上生成,從而實現高可用的目的。
數據庫
(二)MySQL是如何結合keepalived實現高可用的服務器
在MySQL中,經過搭建MySQL雙主複製,保持2臺主機上的MySQL數據庫如出一轍,並在2臺主機上安裝keepalived軟件,啓用VIP,用戶應用程序經過VIP訪問數據庫。當包含VIP的主機上的數據庫發生故障時,關閉keepalived,從而將VIP漂移到另外一個節點,用戶依然能夠正常訪問數據庫。 (這裏須要注意,雖然MySQL架構雙主複製,2個節點均可以寫入數據,可是咱們在使用的時候,是經過VIP訪問其中一個實例,並無2個數據庫實例一塊兒使用)。這裏我簡單畫了一個流程圖,來講明keepalive與MySQL實現高可用的過程:架構
(三)keepalived+MySQL實現高可用過程實現ide
基礎環境規劃:測試
主機名 | IP地址 | 備註 | |
服務器A | hosta | 192.168.10.11 | keepalive主節點 |
服務器B | hostb | 192.168.10.12 | keepalive備節點 |
192.168.10.10 | 虛擬IP,會在keepalive啓動後分配到上面2臺機器的主節點上 |
(3.1)搭建MySQL雙主複製環境spa
STEP1:安裝MySQL過程見:http://www.javashuo.com/article/p-krjrnwbf-k.html
STEP2:配置雙主複製參數
服務器A | 服務器B |
[mysqld] server_id = 1 |
[mysqld] server_id = 2 |
STEP3:建立複製用戶,2個數據庫上都要建立
grant replication slave on *.* to 'rep'@'%' identified by '123';
STEP4:將hosta的數據拷貝到hostb,並應用
[root@hostb ~]# mysqldump -uroot -p123456 -h 192.168.10.11 --single-transaction --all-databases --master-data=2 > hosta.sql [root@hostb ~]# mysql -uroot -p123456 < hosta.sql
STEP5:hostb上開啓複製,如下腳本在hostb上執行
-- 配置複製 mysql> CHANGE MASTER TO -> master_host='192.168.10.11', -> master_port=3306, -> master_user='rep', -> master_password='123', -> MASTER_AUTO_POSITION = 1; Query OK, 0 rows affected, 2 warnings (0.01 sec) -- 開啓複製 mysql> start slave; Query OK, 0 rows affected (0.00 sec) -- 查看複製狀態 mysql> show slave status \G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.10.11 Master_User: rep Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000001 Read_Master_Log_Pos: 322 Relay_Log_File: hostb-relay-bin.000002 Relay_Log_Pos: 417 Relay_Master_Log_File: master-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes
STEP6:hosta上開啓複製,如下腳本在hosta上執行
mysql> CHANGE MASTER TO -> master_host='192.168.10.12', -> master_port=3306, -> master_user='rep', -> master_password='123', -> MASTER_AUTO_POSITION = 1; Query OK, 0 rows affected, 2 warnings (0.01 sec) mysql> start slave; Query OK, 0 rows affected (0.01 sec) mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.10.12 Master_User: rep Master_Port: 3306 Connect_Retry: 60 Master_Log_File: master-bin.000001 Read_Master_Log_Pos: 154 Relay_Log_File: hosta-relay-bin.000002 Relay_Log_Pos: 369 Relay_Master_Log_File: master-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes
STEP7:測試雙主複製
在hosta上建立數據庫testdb,到hostb服務器上查看數據庫是否已經建立
-- hosta上建立數據庫 create database testdb; --hostb上查看數據庫,發現已經建立 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | db1 | | lijiamandb | | mysql | | performance_schema | | sbtest | | sys | | testdb | +--------------------+ 8 rows in set (0.01 sec)
在hostb的testdb數據庫上建立表t1,並插入數據,到hosta上查看是否複製過來
-- 在hostb上建立表並插入數據 mysql> use testdb Database changed mysql> create table t1(id int,name varchar(20)); Query OK, 0 rows affected (0.01 sec) mysql> insert into t1 values(1,'a'); Query OK, 1 row affected (0.01 sec) -- 在hosta上查看數據,數據已通過來 mysql> select * from testdb.t1; +------+------+ | id | name | +------+------+ | 1 | a | +------+------+ 1 row in set (0.00 sec)
到這,雙主複製已經搭建完成,接下來安裝配置keepalived。
(3.2)安裝配置keepalived
(3.2.1)keepalived的安裝與管理
keepalived可使用源碼安裝,也可使用yum在線安裝,這裏直接使用yum在線安裝:
[root@hosta data]# yum install -y keepalived
使用以下命令查看安裝路徑:
[root@hosta data]# rpm -ql keepalived /etc/keepalived /etc/keepalived/keepalived.conf /etc/sysconfig/keepalived /usr/bin/genhash /usr/lib/systemd/system/keepalived.service /usr/libexec/keepalived /usr/sbin/keepalived /usr/share/doc/keepalived-1.3.5
… 略
使用以下命令管理keepalived
# 開啓keepalived
systemctl start keepalived 或者 service keepalived start
# 關閉keepalived
systemctl stop keepalived 或者 service keepalived stop
# 查看keepalived運行狀態
systemctl status keepalived 或者 service keepalived status
# 從新啓動keepalived
systemctl restart keepalived 或者 service keepalived restart
(3.2.2)keepalived的配置
keepalived的配置文件爲:/etc/keepalived/keepalived.conf,個人配置文件以下:
【hosta主機的配置文件】
[root@hosta keepalived]# cat keepalived.conf ! Configuration File for keepalived global_defs { notification_email { ops@wangshibo.cn tech@wangshibo.cn } notification_email_from ops@wangshibo.cn smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MASTER-HA } vrrp_script chk_mysql_port { #檢測mysql服務是否在運行。有不少方式,好比進程,用腳本檢測等等 script "/mysql/chk_mysql.sh" #這裏經過腳本監測 interval 2 #腳本執行間隔,每2s檢測一次 weight –5 #腳本結果致使的優先級變動,檢測失敗(腳本返回非0)則優先級 -5 fall 2 #檢測連續2次失敗纔算肯定是真失敗。會用weight減小優先級(1-255之間) rise 1 #檢測1次成功就算成功。但不修改優先級 } vrrp_instance VI_1 { state BACKUP #這裏全部節點都定義爲BACKUP interface ens34 #指定虛擬ip的網卡接口 mcast_src_ip 192.168.10.11 #本地IP virtual_router_id 51 #路由器標識,MASTER和BACKUP必須是一致的 priority 101 #定義優先級,數字越大,優先級越高,在同一個vrrp_instance下,MASTER的優先級必須大於BACKUP的優先級。 advert_int 1 nopreempt #不搶佔模式,在優先級高的機器上設置便可,優先級低的機器可不設置 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.10.10 #虛擬IP } track_script { chk_mysql_port } }
【hostb主機的配置文件】
[root@hostb keepalived]# cat keepalived.conf ! Configuration File for keepalived global_defs { notification_email { ops@wangshibo.cn tech@wangshibo.cn } notification_email_from ops@wangshibo.cn smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id MASTER-HA } vrrp_script chk_mysql_port { script "/mysql/chk_mysql.sh" interval 2 weight -5 fall 2 rise 1 } vrrp_instance VI_1 { state BACKUP interface ens34 mcast_src_ip 192.168.10.12 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.10.10 } track_script { chk_mysql_port } }
須要特別注意:nopreempt這個參數只能用於state爲BACKUP的狀況,因此在配置的時候要把master和backup的state都設置成BACKUP,這樣纔會實現keepalived的非搶佔模式!
在配置完成以後,啓動MySQL數據庫和keepalive,須要注意,先啓動MySQL,再啓動keepalive,由於keepalive啓動後會檢測MySQL的運行狀態,若是MySQL運行異常,keepalive會自動關閉。
(3.3)高可用測試
時間軸 (時間遞增) |
hosta操做 | hostb操做 |
時間1 | # 數據庫運行正常 #keepalived運行正常 # 此時虛擬IP在hosta上 |
# 數據庫運行正常 [root@hostb ~]# service mysqld status #keepalived運行正常 [root@hostb ~]# service keepalived status [root@hostb ~]# ip addr |
時間2 | # 經過VIP訪問數據庫,訪問到的都是hosta上的實例 |
# 經過VIP訪問數據庫,訪問到的都是hosta上的實例 |
時間3 | # 主節點關閉MySQL |
|
時間4 | # keepalived檢測到MySQL關閉後,會自動關閉 # 此時VIP已經不存在 |
# hostb上的keepalived運行正常 # 發現VIP已經切換到了hostb |
時間5 | # 經過VIP訪問數據庫,訪問到的都是hosta上的實例 |
# 經過VIP訪問數據庫,訪問到的都是hosta上的實例 |
時間6 | # 重啓MySQL # 重啓keepalived # 由於使用了非搶佔模式,VIP不會漂回來 |
【完】