keepalived是如何實現MySQL高可用的?
首先我們來看一下通過Keepalived實現,需要對MySQL有什麼要求
MySQL需要采用MM複製結構,也就是master-master。當一台為主庫的時候,備庫開啟隻讀模式(set global read_only=1)
然後我們來看一下數據庫在不同情況下,切換是如何進行的:
MySQL切換無非兩種,一種是人為切換,一種是天災。也就是一種是正常切換一種是異常切換。
正常切換
正常切換是指主庫能正常訪問 切換的時候保證主備數據庫一致
正常切換的流程
1 主庫設置隻讀 kill主庫進程
2 備庫上等待主庫將所有binlog都已經傳過來 並且binlog執行完成
3 備庫上關閉隻讀模式(set global read_only=0)
上麵步驟任何步驟失敗 則切換失敗 在有些情況下 無法將主庫設置成隻讀 則備庫延遲時間太長 則無法進行正常的主備切換
異常切換
異常切換是指主庫發生異常 無法連接到主庫的情況
異常切換的情況下 無法保證數據嚴格一致 有幾種方式保證主備庫數據盡可能一致
1 已經傳輸到備庫的binlog必須執行完成
2 主庫開啟心跳 定期更新一跳心跳記錄 備庫上查看心跳記錄的時間戳和係統當前時間的差異 如果差異超過一定時間 則不能切換到主庫
主庫切換之後 還需要將應用程序的數據庫切換備庫,可以通過以下途徑來實現切換:
1 手動修改應用配置
2 使用dns 主備切換後 將dns指向新的主庫
3 使用VIP
手動修改數據庫連接配置顯然不是很好的辦法 修改時間不可控
dns切換避免了上麵這些問題
而是用Keepalived,就可以解決主庫掛掉之後,我的代碼找不到目的地的情況。其實就是給了這兩台數據庫一個IP,供大家訪問
工作原理:VRRP(vritual router redundancy protocol)虛擬路由冗餘協議
vrrp路由器是指運行的vrrp路由器是物理實體 虛擬路由器是指vrrp協議創建的 是邏輯概念
一組vrrp路由協同工作共同構成一台虛擬路由器 vrrp中存在一種選舉機製 用以選出提供服務的路由 即主控路由 其他則成了備份路由 當主控路由失效後 備份路由中會重新選舉出一個主控路由來繼續工作 來保障不間斷
keepalived原理:
keepalived安裝在兩台物理服務器上 並互相監控對方是否正常運行
當A工作正常的時候 會將VIP對應的MAC地址為節點A網卡的MAC地址
當A發生故障的時候 節點B上的keepalived會檢測到 並將VIP的MAC等於B的MAC地址
Keepalived的部署比較容易,直接可以yum 安裝,主要的就是他的參數文件,參數文件是如何控製主備的。
vrrp_script chk_port_3306 {
script "/opt/dtstack/dtagent/agent/mysqlha_check_alive.py 3306"
interval 11 # check every 2 seconds
fall 3 # require 2 failures for KO
rise 3 # require 2 successes for OK
timeout 11
}
先看第一部分,檢測係統上3306端口,監控的途徑是通過/opt/dtstack/dtagent/agent/mysqlha_check_alive.py 3306這條命令來判斷的,就是判斷係統3306端口是否存在,如果你的MySQL是別的端口,那麼就需要作下更改,腳本是一大神寫的,就不貼出來了。
如果一台機器上起著多個MySQL端口,也可以多些一部分,缺檢測不同端口是否存活。
vrrp_instance mysql_3306 {
state MASTER
interface eth0 #檢測eth0
garp_master_delay 5
virtual_router_id 231 #路由組
priority 251 #權重
advert_int 1
再來看第二部分,這一部分主要決定的你這台機器上的3306端口是否是主庫,而且這台機器的外網是不是eth0網卡上。virtual_router_id這個參數主庫跟備庫必須要一樣,這樣告知Keepalived他需要看到是那一個路由組的機器。priority權重約大,那麼主庫的方向就越往哪台機器上偏。
authentication {
auth_type PASS
auth_pass PASS3306
}
virtual_ipaddress {
192.168.40.231/24 dev eth0 # vip是192.168.40.231/24 起在eth0上
}
track_script {
chk_port_3306 # 檢測3306端口
}
然後看第三部分,這一部分就是實現2變1的地方,起一個vip到eth0網卡上,當某台數據庫為主庫的時候,那麼這個vip就會票到這個台機器的eth0網卡上。
最後一部分就是debug的地方了,就不詳細說明了。
部署完Keepalived,然後修改完對應的參數文件後,我們啟用VIP
啟動Keepalived
[root@iZ25u0bag2mZ ~]service keepalived start
使用腳本測試是否成功
[root@iZ25u0bag2mZ ~]/opt/dtstack/dtagent/agent/mysqlha_check_alive.py 3306
check_read
check_read: {'data': (1L,), 'success': 1}
然後我們查看一下主庫的IP上是否飄著我們的VIP
[root@iZ25u0bag2mZ ~]ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 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 fa:16:3e:71:75:2f brd ff:ff:ff:ff:ff:ff
inet 192.168.40.32/24 brd 192.168.40.255 scope global eth0
inet 192.168.40.231/24 scope global secondary eth0
inet6 fe80::f816:3eff:fe71:752f/64 scope link
valid_lft forever preferred_lft forever
可以看到eth0網卡上起著2個IP,一個是本機IP,另一個就是VIP,這時候,我們就可以通過這個VIP對我們的MySQL數據進行訪問了。
最後更新:2017-08-20 20:34:54