雙主KeepAlivedhtml
利用KeepAlived實現故障轉移(功能上相似於MSSQL的鏡像,形式上相似於windows的故障轉移羣集)mysql
參考:(5.1)mysql高可用系列——高可用架構方案概述 中的【4】雙主keepalive算法
(1.1.1)Keepalived服務的工做原理sql
Keepalived服務對之間經過VRRP進行通訊的,VRRP是經過競選機制來肯定主備的(有點像故障轉移羣集中的投票仲裁形式),主的優先級高於備,所以工做時主會優先得到全部的資源,備節點處於等待狀態,當主掛了的時候,備節點就會接管主節點的資源,而後頂替主節點對外服務。數據庫
在Keepalived服務對之間,只有做爲主的服務器會一直髮送VRRP廣播包,告訴備它還活着,此時備不會搶佔主,當主不可用(也就是備沒有受到VRRP廣播包信息),就會啓動相關服務接管資源,保證業務的連續性,接管速度最快能夠小於1秒。vim
(1.1.2)keepalived 的三個核心模塊windows
分別是core/check/vrrp設計模式
core:keepalived的核心,負責主進程的啓動、維護以及全局配置文件的加載和解析。bash
check:負責健康檢查,包括常見的各類檢查方式。服務器
vrrp:是用來實現VRRP協議的;(VRRP:全稱 virtual router redundancy protocol,虛擬路由冗餘協議)
(1.1.3)什麼是VRRP?
VRRP,全稱 virtual router redundancy protocol,虛擬路由冗餘協議。
VRRP的出現就是爲了解決靜態路由的單點故障問題,VRRP是經過一種競選機制來將路由的任務交給某臺VRRP路由器的。
Keepalived經過組播(默認)、單播(自定義),實現keepalived主備推選,工做模式分爲搶佔和非搶佔。
《1》搶佔模式
主服務器正常工做時,虛擬IP會在主上,備不提供服務,當主服務優先級低於備的時候,備會自動搶佔虛擬IP,這時,主不供服務,備提供服務。
也就是說,搶佔模式下,不分主備,只管優先級。
無論 keepalived.conf 裏的 state 配置成 master 仍是 backup ,只看誰的priority 優先級高, priority 優先級高的那一個,在故障恢復後,會自動將VIP資源再次搶回來。
舉例:
1)倆臺都爲master/backup時,好比server1的優先級大於server2,keepalived啓動後server1得到master,server2自動降級爲backup。
此時server1宕機的話,server2接替 服務,當server1恢復後,server1又變爲master,從新接管服務,server2變爲backup。屬於搶佔式。
2) server1爲master,server2位backup,且master優先級大於backup。keepalived啓動後server1得到master,server2爲backup。
當server1宕機後, server2接管服務。當server1恢復後,server1從新接管服務變爲master,而server2變爲backup。屬於搶佔式
3) server1爲master,server2位backup,且master優先級低於backup。keepalived啓動後server2得到master,server1爲backup。
當server2宕機後, server1接管服務。此時server2恢復後搶佔服務,得到master,server1降級將爲backup。屬於搶佔式
《2》非搶佔模式
這種方式經過參數nopreempt(通常設置在advert_int 的那一行下面)來控制。無論priority優先級,只要master機器發生故障,VIP資源就會被切換到backup上。
而且,當master機器恢復後,也不會將VIP資源搶回來。除非Backup機器發生故障,才能自動把VIP等資源切換會主庫。
nopreempt 這個參數只能用戶state爲backup的狀況,因此在配置的時候要把master和backup的state都設置成backup,這樣纔會實現keepalived的非搶佔模式!
也就是說
d) 當state狀態都爲master或者都爲backup的時候,沒有加nopreempt參數,那麼
a)當state狀態一個爲master,一個爲backup的時候,加不加nopreempt 這個參數都是同樣的效果。
即都是根據priority優先級來決定誰搶佔VIP資源,屬於搶佔模式!
b)當state狀態都設置成backup,若是不配置nopreempt參數。
也是根據priority優先級來決定誰搶佔VIP資源,屬於搶佔模式!
c)當state狀態都設置成backup,若是配置了 nopreempt 參數,那麼久不會去考慮priority優先級了。
是非搶佔模式! 即只有VIP當前所在機器發生故障,另外一臺機器才能接管VIP。 不考慮優先級問題。
注意:這樣配置後,咱們要注意啓動服務的順序,優先啓動的獲取master權限,與優先級沒有關係了
mysql雙主複製,即互爲Master-Slave(只有一個Master提供寫操做),能夠實現數據庫服務器的熱備。
但一個Master宕機後不能實現動態切換,使用Keepalived,能夠經過虛擬IP,實現雙主對外的統一接口以及自動檢查、失敗切換機制,從而實現MySQL數據庫的高可用方案。
Keepalived是一個高度模塊化設計的軟件,從源代碼結構彷佛也很容易看出這一點。Keepalived 1.2.13源代碼中只有以下目錄:check core etc include libipvs-2.4 libipvs-2.6 vrrp
check:Keepalived的healthchecker子進程的目錄,包括了全部的健康檢查方式以及對應配置的解析,LVS的配置解析也在這個裏面。
core:Keepalived的核心程序,如全局配置的解析,進程啓動等等。
etc:包含Keepalived的配置模板和啓動腳本等文件。
include:頭文件目錄。
libipvs*:LVS使用的庫文件。
vrrp:Keepalived的vrrpd子進程以及相關的代碼。
(1) 多進程模式
Keepalived採用了多進程的設計模式,每一個進程負責不一樣的功能,咱們在使用LVS的機器上一般能夠看到三個Keepalived進程:
111 keepalived < 父進程,負責內存管理、監控子進程等
112 \_ keepalived < VRRP子進程
113 \_ keepalived < healthchecker子進程
(2) 控制面板
這裏所謂的控制面板就是對配置文件的編譯和解析。Keepalived的配置文件解析比較另類,並非一次解析全部配置,而是隻在用到某模塊時才解析相應的配置。在源文件裏面能夠看到相似XXX_parser.c的文件,就是作這個用的。
(3) 看門狗
WatchDog框架提供了對VRRP和healthchecker子進程的監控。
(4)IPVS封裝
Keepalived裏面全部對LVS的相關操做並不直接使用ipvsadm客戶端程序,而是使用IPVS提供的函數進行操做,這些代碼都在check/ipwrapper.c中。
操做系統:CentOS7.5
mysql:5.7.24
Mysql master DB3: 192.168.135.173
Mysql slave DB4: 192.168.135.174
keepalived:https://www.keepalived.org/software/keepalived-1.3.3.tar.gz
先搭建好mysql主從,這裏略
#(1)添加非本機IP綁定支持 echo "net.ipv4.ip_nonlocal_bind=1" >> /etc/sysctl.conf sysctl -p #(2)配置iptables,添加VRRP通信支持 -A INPUT -d 224.0.0.18 -j ACCEPT #容許組播地址訪問本機,組播地址用於keepalived互相檢測心跳
-A INPUT -s 192.168.1.0/24 -d 224.0.0.18 -j ACCEPT #容許組播地址通訊
-A INPUT -s 192.168.1.0/24 -p vrrp -j ACCEPT #容許VRRP(虛擬路由器冗餘協議)通訊
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCPET #開發mysql3306端口
#(3)開啓路由轉發功能
#臨時
echo "1">/proc/sys/net/ipv4/ip_forward
#永久
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p
#(1)下載
官網:https://www.keepalived.org/download.html
wget https://www.keepalived.org/software/keepalived-1.3.3.tar.gz
#(2)安裝前置依賴包
mount /dev/cdrom /mnt #加載本地源,有網絡直接配置也可(參考:yum源配置、epel源配置)
yum install kernel-devel openssl-devel popt-devel -y
#(3)安裝
cd /soft/
tar -zxvf keepalived-1.3.3.tar.gz
cd keepalived-1.3.4
./configure --prefix=/usr/local/keepalived/
make && make install
#(4)設置keepalived開機自啓
systemctl enable keepalived
------------下面(5)(6)能夠忽略------------------------
#(5)若是不設置自定義目錄,默認目錄以下
#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/
#(5)構建keepalived 配置文件目錄與文件
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
#(6)基本配置文件複製
cp usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
參考:https://blog.csdn.net/shmnh/article/details/42000615
vim /usr/local/keepalived/etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs { #全局定義, notification_email {#郵件通知,下面的是收件人郵件地址,須要開啓sendmail服務 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 #路由id,隨便取名字但同一個鏈接網絡要惟一 vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 {#配置虛擬實例,這個名字任意取 state MASTER #角色狀態,能夠是 MASTER/BACKUP,具體狀況見 1.1.3下標紅字體 interface eth0 #指定HA檢測網絡的接口 virtual_router_id 51 #路由id priority 100 #優先級 advert_int 1 #廣播頻率,單位是秒
#nopreempt #默認搶佔模式,這個參數設置非搶佔模式,須要主從state 都爲BACKUP 才生效 authentication {#身份驗證 auth_type PASS #驗證類型 PASS爲密碼驗證 auth_pass 1111 #驗證密碼,主從同樣就行了 } virtual_ipaddress {#虛擬IP,咱們啓動後虛擬IP是多少 192.168.200.16 #192.168.1.210/24 192.168.200.17 192.168.200.18 } } virtual_server 192.168.200.100 443 {#虛擬服務器,IP+端口,以空格分隔 delay_loop 6 #運行狀況檢查,IP+端口是否可用,單位是秒 lb_algo rr #設置負載調度算法,這裏設置rr,即輪詢算法 lb_kind NAT #設置LVS實現負載均衡機制,有NAT、TUN、DR(直接路由)三個模式可選 persistence_timeout 50 #會話保持單位時間,單位是秒 protocol TCP #指定轉發協議類型,有TCP和UDP兩種 real_server 192.168.201.100 443 {#虛擬服務器對應的實際服務器、端口 weight 1 #配置服務節點的權值,權值數字越大,權值越高 SSL_GET {#獲取ssl鏈接信息 url { path / digest ff20ad2481f97b1754ef3e12ecd3a9cc } url { path /mrtg/ digest 9b3a0c85a887a256d6939da88aabd8cd }
#notify_down /etc/keepalived/keepalived_stop.sh #若是這個server down掉以後這個服務器執行的內容
#notify_master /home/mysql/master.sh #若是這個server down掉以後,新主服務器執行這個腳本 connect_timeout 3 #tcp檢測參數,表示3秒無響應超時 retry 3 #表示最大重試次數 delay_before_retry 3 #表示重試間隔秒數
#connect_port 3306 #表示鏈接檢測的端口爲3306 } } }
#後面同樣的就不贅述了。
參考代碼:
global_defs {#全局定義 router_id MySQL-HA #全局路由ID,主從須要相同 } vrrp_script check_run {#VRRP自定義腳本,check_run自定義名稱 script "/etc/keepalived/mysql_check.sh" #調用的腳本文件URL interval 60 #運行間隔,單位爲秒 } vrrp_sync_group VG1 {#vrrp同步組,VG1是自定義名稱 group {#組內成員 VI_1 } } vrrp_instance VI_1 {#vrrp虛擬實例 state BACKUP #從 interface ens34 #針對監聽的網絡接口 virtual_router_id 51 #惟一路由ID,主從要一致 priority 90 #權限 advert_int 1 #廣播頻率,單位是秒 nopreempt #非搶佔模式 authentication {#同一組keepalived的驗證方式 auth_type PASS auth_pass 1234 } track_script {#定義跟蹤使用腳本 check_run #這裏就是咱們上面本身定義的腳本
}
notify_master /etc/keepalived/master.sh #當本機換爲Master狀態時,會呼叫執行 notify_master
notify_stop /etc/keepalived/stop.sh #當本機終止keepalived 時,會呼叫執行 notify_stop
notify_backup /etc/keepalived/backup.sh #當本機進入Backup狀態時,會呼叫執行 notify_backup
notify_fault /etc/keepalived/fault.sh #當本機發現異常狀況進入Fault狀態時,會呼叫執行 notify_fault
virtual_ipaddress { #設置虛擬IP
192.168.1.210
}
}
個人實際代碼:
#主 global_defs { router_id MySQL-HA } vrrp_script check_run { script "/etc/keepalived/mysql_check.sh" interval 60 } vrrp_sync_group VG1 { group { VI_1 } } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 100 advert_int 1 nopreempt authentication { auth_type PASS auth_pass 1234 } track_script { check_run } notify_master /etc/keepalived/master.sh notify_stop /etc/keepalived/stop.sh virtual_ipaddress { 192.168.135.180 } } #從 global_defs { router_id MySQL-HA } vrrp_script check_run { script "/etc/keepalived/mysql_check.sh" interval 60 } vrrp_sync_group VG1 { group { VI_1 } } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 90 advert_int 1 nopreempt authentication { auth_type PASS auth_pass 1234 } track_script { check_run } notify_master /etc/keepalived/master.sh notify_stop /etc/keepalived/stop.sh virtual_ipaddress { 192.168.135.180 } }
/etc/keepalived/mysql_check.sh的做用是爲了沒分鐘判斷一次mysql服務是否存活
#!/bin/bash
source /etc/profile count=1 while true do
mysql -uroot -p123456 -S /tmp/mysql_3306.sock -e "show status;" > /dev/null 2>&1 i=$? ps aux | grep mysqld | grep -v grep > /dev/null 2>&1 j=$? if [ $i = 0 ] && [ $j = 0 ] then exit 0 else if [ $i = 1 ] && [ $j = 0 ] then exit 0 else if [ $count -gt 5 ] then break fi count=$((${count}+1)) continue fi fi done systemctl stop keepalived
other
#!/bin/bash count=1 while true do ps aux | grep mysqld | grep -v grep > /dev/null 2>&1 j=$? if [ $j = 0 ] then exit 0 else sleep 1 if [ $count -gt 5 ] then break fi count=$((${count}+1)) continue fi done systemctl stop keepalived
/etc/keepalived/master.sh 的做用是狀態改成master之後執行的腳本。
首先判斷複製是否有延遲,若是有延遲,等1分鐘後,不管是否有延遲,都並中止複製,而且記錄binlog和pos點。文件內容以下。
#!/bin/bash
source /etc/profile Master_Log_File=$(mysql -uroot -S /tmp/mysql_3306.sock -e "show slave status\G" | grep -w Master_Log_File | awk -F": " '{print $2}') Relay_Master_Log_File=$(mysql -uroot -S /tmp/mysql_3306.sock -e "show slave status\G" | grep -w Relay_Master_Log_File | awk -F": " '{print $2}') Read_Master_Log_Pos=$(mysql -uroot -S /tmp/mysql_3306.sock "show slave status\G" | grep -w Read_Master_Log_Pos | awk -F": " '{print $2}') Exec_Master_Log_Pos=$(mysql -uroot -S /tmp/mysql_3306.sock "show slave status\G" | grep -w Exec_Master_Log_Pos | awk -F": " '{print $2}') i=1 while true do if [ $Master_Log_File = $Relay_Master_Log_File ] && [ $Read_Master_Log_Pos -eq $Exec_Master_Log_Pos ] then echo "ok" break else sleep 1 if [ $i -gt 60 ] then break fi continue let i++ fi done mysql -uroot -S /tmp/mysql_3306.sock -e "stop slave;" mysql -uroot -S /tmp/mysql_3306.sock -e "reset slave all;" mysql -uroot -S /tmp/mysql_3306.sock -e "reset master;"
/etc/keepalived/stop.sh 主庫 keepalived 中止之後須要執行的腳本。檢查是否還有複製寫入操做,最後不管是否執行完畢都退出。文件內容以下。
#!/bin/bash source /etc/profile M_File1=$(mysql -uroot -S /tmp/mysql_3306.sock -e "show master status\G" | awk -F': ' '/File/{print $2}') M_Position1=$(mysql -uroot -S /tmp/mysql_3306.sock -e "show master status\G" | awk -F': ' '/Position/{print $2}') sleep 1 M_File2=$(mysql -uroot -S /tmp/mysql_3306.sock -e "show master status\G" | awk -F': ' '/File/{print $2}') M_Position2=$(mysql -uroot -S /tmp/mysql_3306.sock -e "show master status\G" | awk -F': ' '/Position/{print $2}') i=1 while true do if [ $M_File1 = $M_File1 ] && [ $M_Position1 -eq $M_Position2 ] then echo "ok" break else sleep 1 if [ $i -gt 60 ] then break fi continue let i++ fi done
#默認錯誤日誌位置:/var/log/messages
#(1)修改文件
vim /usr/local/keepalived/etc/sysconfig/keepalived
#左邊改爲右邊
KEEPALIVED_OPTIONS="-D" =》 KEEPALIVED_OPTIONS="-D -d -S 0"
# --dont-release-ipvs -I Dont remove IPVS topology on daemon stop.
# --dump-conf -d Dump the configuration data.
# --log-detail -D Detailed log messages.
# --log-facility -S 0-7 Set local syslog facility (default=LOG_DAEMON)
#(2)修改日誌級別參數文件
vi /etc/rsyslog.conf
#在最後一行加上
local0.* /var/log/keepalived.log
#(3)重啓日誌服務
systemctl restart rsyslog
systemctl daemon-reload #從新裝載服務 systemctl start keepalived #啓動服務 systemctl enable keepalived #設置服務開機自啓 systemctl status keepalived #查看服務狀態,有沒有報錯最快能夠看這裏 ps -ef|grep keepalived|grep -v "grep" #查看服務進程
查看VIP所在。
用mysql鏈接虛擬IP地址,查看是哪一個機器。
果真是DB3。
(1)查看當前運行狀況,確保keepalived和mysql都在運行
(2)查看當前誰是 keepalived 的 master
很明顯,如今173是 master
(3)關閉 mysql 服務模擬故障轉移
由上圖能夠看到,咱們關閉了 173(keepalived master) 機器的 mysql服務後,keepalived也跟着關閉了。
(4)故障轉移查看
《1》IP地址查看
而且,咱們的 master.sh 腳本 還生成了一個txt文件,它記錄該機器所在 mysql 實例的 binlog 信息
《2》鏈接查看,我還特意搞了個 其餘機器來鏈接 VIP,結果成功。
操做系統:CentOS7.5
mysql:5.7.24
Mysql master DB1: 192.168.1.201
Mysql slave DB2: 192.168.1.202
keepalived:https://www.keepalived.org/software/keepalived-1.3.3.tar.gz
先搭建好mysql主從,這裏略
#(1)添加非本機IP綁定支持 echo "net.ipv3.ip_nonlocal_bind=1" >> /etc/sysctl.conf sysctl -p #(2)配置iptables,添加VRRP通信支持 -A INPUT -d 223.0.0.18 -j ACCEPT #容許組播地址訪問本機
-A INPUT -s 192.168.1.0/24 -d 223.0.0.18 -j ACCEPT #容許組播地址通訊
-A INPUT -s 192.168.1.0/24 -p vrrp -j ACCEPT #容許VRRP(虛擬路由器冗餘協議)通訊
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCPET #開發mysql3306端口
#(3)開啓路由轉發功能
echo "1">/proc/sys/net/ipv4/ip_forward
#(1)下載
官網:https://www.keepalived.org/download.html
wget https://www.keepalived.org/software/keepalived-1.3.3.tar.gz
#(2)安裝前置依賴包
mount /dev/cdrom /mnt #加載本地源,有網絡直接配置也可(參考:yum源配置、epel源配置)
yum install kernel-devel openssl-devel popt-devel -y
#(3)安裝
cd /soft/
tar -zxvf keepalived-1.3.3.tar.gz
cd keepalived-1.3.4
./configure --prefix=/usr/local/keepalived/
make && make install
#(4)設置keepalived開機自啓
systemctl enable keepalived
#(5)若是不設置自定義目錄,默認目錄以下
#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/
#(5)構建keepalived 配置文件目錄與文件
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
參考:https://blog.csdn.net/shmnh/article/details/42000615
vim /usr/local/keepalived/etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs { #全局定義, notification_email {#郵件通知,下面的是收件人郵件地址,須要開啓sendmail服務 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 #路由id,隨便取名字但同一個鏈接網絡要惟一 vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_instance VI_1 {#配置虛擬實例,這個名字任意取 state MASTER #角色狀態,能夠是 MASTER/BACKUP,具體狀況見 1.1.3下標紅字體 interface eth0 #指定HA檢測網絡的接口 virtual_router_id 51 #路由id priority 100 #優先級 advert_int 1
#nopreempt #默認搶佔模式,這個參數設置非搶佔模式,須要主從state 都爲BACKUP 才生效 authentication {#身份驗證 auth_type PASS #驗證類型 PASS爲密碼驗證 auth_pass 1111 #驗證密碼,主從同樣就行了 } virtual_ipaddress {#虛擬IP,咱們啓動後虛擬IP是多少 192.168.200.16 #192.168.1.210/24 192.168.200.17 192.168.200.18 } } virtual_server 192.168.200.100 443 {#虛擬服務器,IP+端口,以空格分隔 delay_loop 6 #運行狀況檢查,IP+端口是否可用,單位是秒 lb_algo rr #設置負載調度算法,這裏設置rr,即輪詢算法 lb_kind NAT #設置LVS實現負載均衡機制,有NAT、TUN、DR(直接路由)三個模式可選 persistence_timeout 50 #會話保持單位時間,單位是秒 protocol TCP #指定轉發協議類型,有TCP和UDP兩種 real_server 192.168.201.100 443 {#虛擬服務器對應的實際服務器、端口 weight 1 #配置服務節點的權值,權值數字越大,權值越高 SSL_GET {#獲取ssl鏈接信息 url { path / digest ff20ad2481f97b1754ef3e12ecd3a9cc } url { path /mrtg/ digest 9b3a0c85a887a256d6939da88aabd8cd }
#notify_down /etc/keepalived/keepalived_stop.sh #若是這個server down掉以後這個服務器執行的內容
#notify_master /home/mysql/master.sh #若是這個server down掉以後,新主服務器執行這個腳本 connect_timeout 3 #tcp檢測參數,表示3秒無響應超時 retry 3 #表示最大重試次數 delay_before_retry 3 #表示重試間隔秒數
#connect_port 3306 #表示鏈接檢測的端口爲3306 } } }
#後面同樣的就不贅述了。 virtual_server 10.10.10.2 1358 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP sorry_server 192.168.200.200 1358 real_server 192.168.200.2 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 retry 3 delay_before_retry 3 } } real_server 192.168.200.3 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334c } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334c } connect_timeout 3 retry 3 delay_before_retry 3 } } } virtual_server 10.10.10.3 1358 { delay_loop 3 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.200.4 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 retry 3 delay_before_retry 3 } } real_server 192.168.200.5 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 retry 3 delay_before_retry 3 } } }
參考:
global_defs { notification_email { xxxxxx@sina.com #設置報警郵件地址,能夠設置多個,每行一個。須要開啓sendmail服務。 } notification_email_from keepalived@localhost #設置郵件的發送地址 smtp_server 127.0.0.1 #設置SMTP Server地址 smtp_connect_timeout 30 #設置SMTP Server的超時時間 router_id LVS_DEVEL #表示運行Keepalived服務器的一個標識。發郵件時顯示大郵件主題中的信息 } vrrp_instance VI_1 { #vrrp 實例定義部分 state MASTER #指定Keepalived的角色,MASTER表示些主機是主服務器。BACKUP表示此主機是備用服務器 interface eth1 #指定HA監測網絡的接口 virtual_router_id 51 #虛擬路由標識,這個標識是一個數字,同一個vrrp實例使用惟一的標識,即同一個vrrp_instance下MASTER與BACKUP必須是一致的 priority 50 #定義優先級,數字越大,優先級越高 authentication { auth_type PASS #設置驗證類型和密碼,MASTER和BACKUP必須使用相同的密碼才能正常通訊 auth_pass 1111 } virtual_ipaddress { #設置虛擬IP地址,能夠設置多個虛擬IP地址,每行一個 192.168.100.250 } } virtual_server 192.168.100.250 80 { #設置虛擬服務器,須要指定虛擬IP地址和服務端口,IP與端口之間用空格隔開 delay_loop 6 #設置運行狀況檢查時間,單位爲秒 lb_algo rr #設置負載調度算法,這裏設置rr,即輪詢算法 lb_kind DR #設置LVS實現負載均衡機制,有NAT、TUN、DR三個模式可選 persistence_timeout 60 #會話保持單位時間,單位是秒 protocol TCP #指定轉發協議類型,有TCP和UDP兩種 real_server 192.168.100.60 80 { #配置服務節點1,須要指定real server的真實IP地址和端口 weight 1 #配置服務節點的權值,權值數字越大,權值越高 TCP_CHECK { #relserve的狀態檢測設置部分,單位是秒 connect_timeout 10 #表示10秒無響應超時 retry 3 #表示重試次數 delay_before_retry 3 #表示重試間隔 } } real_server 192.168.100.80 80 { weight 1 TCP_CHECK { connect_timeout 10 #表示10秒無響應超時 retry 3 #表示重試次數 delay_before_retry 3 #表示重試間隔 } } }
個人配置文件
#master global_defs { router_id mysql_ha } vrrp_instance VI_1 { state BACKUP interface ens34 virtual_router_id 51 priority 100 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.210 } } virtual_server 192.168.1.201 3306 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 60 protocol TCP real_server 192.168.1.201 3306 { weight 1 notify_down /etc/keepalived/keepalived_stop.sh TCP_CHECK { connect_timeout 3 retry 3 delay_before_retry 3 connect_port 3306 } } } #slave global_defs { router_id mysql_ha } vrrp_instance VI_1 { state BACKUP interface ens34 virtual_router_id 51 priority 100 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.210 } } virtual_server 192.168.1.202 3306 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 60 protocol TCP real_server 192.168.1.202 3306 { weight 1 notify_down /etc/keepalived/keepalived_stop.sh TCP_CHECK { connect_timeout 3 retry 3 delay_before_retry 3 connect_port 3306 } } }
殺死keepalived的腳本,防止腦裂
/etc/keepalived/keepalived_stop.sh
echo '#!/bin/bash' >/etc/keepalived/keepalived_stop.sh echo "pkill keepalived" >>/etc/keepalived/keepalived_stop.sh chmod u+x /etc/keepalived/keepalived_stop.sh
#默認錯誤日誌位置:/var/log/messages
#(1)修改文件
vim /usr/local/keepalived/etc/sysconfig/keepalived
#左邊改爲右邊
KEEPALIVED_OPTIONS="-D" =》 KEEPALIVED_OPTIONS="-D -d -S 0"
# --dont-release-ipvs -I Dont remove IPVS topology on daemon stop.
# --dump-conf -d Dump the configuration data.
# --log-detail -D Detailed log messages.
# --log-facility -S 0-7 Set local syslog facility (default=LOG_DAEMON)
#(2)修改日誌級別參數文件
vi /etc/rsyslog.conf
#在最後一行加上
local0.* /var/log/keepalived.log
#(3)重啓日誌服務
systemctl restart rsyslog
systemctl daemon-reload #從新裝載服務 systemctl start keepalived #啓動服務 systemctl enable keepalived #設置服務開機自啓 systemctl status keepalived #查看服務狀態,有沒有報錯最快能夠看這裏 ps -ef|grep keepalived|grep -v "grep" #查看服務進程
先看看機器信息
用mysql鏈接虛擬IP地址,查看是哪一個機器。
mysql -uroot -p123456 -h192.168.1.210
果真是DB1。
由於咱們設置的是經過3306端口去作鏈接訪問操做,因此只要mysql掛掉,3306端口也就不可訪問了,就能夠故障轉移了。
咱們實踐一下,以下圖,先關閉DB1的mysql
systemctl stop mysql
(1)查看IP地址,是否有虛擬IP
由上圖可知,很明顯已經飄到DB2機器上來了。
(2)用鏈接虛擬IP mysql
mysql -uroot -p123456 -h192.168.1.210
結果是DB2,證實連上的確實是咱們想要的結果。
使用Keepalived實現MySQL主從高可用:http://www.javashuo.com/article/p-mauhzhkx-ep.html
keepalived.conf詳細參考:https://blog.csdn.net/shmnh/article/details/42000615