keepalived
Keepalived軟件起初是專為LVS負載均衡軟件設計的,用來管理并監控LVS集群系統中各個服務節點的狀態,后來又加入了可以實現高可用的VRRP功能。因此,Keepalived除了能夠管理LVS軟件外,還可以作為其他服務(例如:Nginx、Haproxy、MySQL等)的高可用解決方案軟件。
Keepalived軟件主要是通過VRRP協議實現高可用功能的。VRRP是Virtual Router RedundancyProtocol(虛擬路由器冗余協議)的縮寫,VRRP出現的目的就是為了解決靜態路由單點故障問題的,它能夠保證當個別節點宕機時,整個網絡可以不間斷地運行。
Failover:故障切換,即某資源的主節點故障時,將資源轉移至其它節點的操作;
Failback:故障移回,即某資源的主節點故障后重新修改上線后,將轉移至其它節點的資源重新切回的過程;
keepalived官網http://www.keepalived.org
Keepalived高可用故障切換轉移原理
Keepalived高可用服務對之間的故障切換轉移,是通過 VRRP (Virtual Router Redundancy Protocol ,虛擬路由器冗余協議)來實現的。
在 Keepalived服務正常工作時,主 Master節點會不斷地向備節點發送(以多播的方式)心跳消息,用以告訴備Backup節點自己還活看,當主 Master節點發生故障時,就無法發送心跳消息,備節點也就因此無法繼續檢測到來自主 Master節點的心跳了,于是調用自身的接管程序,接管主Master節點的 IP資源及服務。而當主 Master節點恢復時,備Backup節點又會釋放主節點故障時自身接管的IP資源及服務,恢復到原來的備用角色。
vrrp協議:Virtual Redundant Routing Protocol
VRRP ,全 稱 Virtual Router Redundancy Protocol ,中文名為虛擬路由冗余協議 ,VRRP的出現就是為了解決靜態踣甶的單點故障問題,VRRP是通過一種競選機制來將路由的任務交給某臺VRRP路由器的。
虛擬路由器:Virtual Router
虛擬路由器標識:VRID(0-255)
master:主設備
backup:備用設備
priority:優先級
工作模式:
主/備: 一個主節點,一個備用節點
主/主: ?主/備(虛擬路徑器1),備/主(虛擬路徑器2)
vrrp協議的軟件實現,原生設計的目的為了高可用ipvs服務:
基于vrrp協議完成地址流動;
為vip地址所在的節點生成ipvs規則(在配置文件中預先定義);
為ipvs集群的各RS做健康狀態檢測;
基于腳本調用接口通過執行腳本完成腳本中定義的功能,進而影響集群事務;
keepalived安裝配置:yum install keepalived
keepalived的程序環境:
主配置文件:/etc/keepalived/keepalived.conf
主程序文件:/usr/sbin/keepalived
Unit File:keepalived.service
Unit File的環境配置文件:/etc/sysconfig/keepalived
配置文件組件部分:/etc/keepalived/keepalived.conf ? (各個配置模塊的信息詳解)
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_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_pmcast_group4 224.0.44.44 ? (添加組播地址,防止在同一網段的其他機器被多播影響)
vrrp_gna_interval 0
vrrp_iptables ? ? ? ? ? ? (可在默認的全局選項中添加此條選項,防止主節點在重啟后生成iptables規則,造成)
} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? (主節點的再次啟用失?。?/p>
vrrp_instance VI_1 { ? ? ? ? ? ? (虛擬IP地址的設置)
state MASTER ? ? ? ? ? (設置為主節點)
interface eth0 ? ? ? ? ? ? ? (作用哪個物理網卡上)
virtual_router_id 51 ? (路由器編號自定義,0-255之間的數字就可以)
priority 100 ? ? ? ? ? ? ? ? ? ? ? ?? (優先級的值0-255之間數字越大優先級越高)
advert_int 1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? (自己的心跳信息;每隔多少秒向外發布依次)
authentication { ? ? (認證)
auth_type PASS ? ? ? ? (認證方式:密碼認證)
auth_pass 1111 ? ? ? ? ? ? ? (輸入密碼;隨意字符和數字最長八位)
}
添加虛擬服務器的配置參數:
virtual_server 10.10.10.2 1358 {
delay_loop 6 ?? (服務輪詢的時間間隔)
lb_algo rr ? ? ? ? ?? (定義調度方法;LVS的 rr|wrr|lc|wlc|lblc|sh|dh)
lb_kind NAT ? ? ? ? ?? (LVS的模型 NAT|DR|TUN)
persistence_timeout 50 ?? (持久連接時長)
protocol TCP ? ? ? ? ? (服務協議,僅支持TCP)
sorry_server 192.168.200.200 1358 (備用服務器地址:當所有后臺web都宕機時提供sorry界面的服務器)
real_server 192.168.200.3 1358 { ? ? ? ? (后臺web服務器的IP地址)
weight 1 ? ? ? ? ?? (設定權重)
HTTP_GET {
url {
path /testurl/test.jsp ? ? ? ? ? ? (定義要監控的URL)
digest 640205b7b0fc66c1ea91c463fac6334c
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
HTTP_GET|SSL_GET:應用層檢測(7層檢測)
path <URL_PATH>:定義要監控的URL;
status_code <INT>:判斷上述檢測機制為健康狀態的響應碼;
digest <STRING>:判斷上述檢測機制為健康狀態的響應的內容的校驗碼;
}
nb_get_retry <INT>:重試次數;
delay_before_retry <INT>:重試之前的延遲時長;
connect_ip <IP ADDRESS>:向當前RS的哪個IP地址發起健康狀態檢測請求
connect_port <PORT>:向當前RS的哪個PORT發起健康狀態檢測請求
bindto <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址;
bind_port <PORT>:發出健康狀態檢測請求時使用的源端口;
connect_timeout <INTEGER>:連接請求的超時時長;向RS1服務器發送請求對方沒有響應,等待時長。
}
TCP_CHECK { ?? (tcp4層檢測)
connect_ip <IP ADDRESS>:向當前RS的哪個IP地址發起健康狀態檢測請求
connect_port <PORT>:向當前RS的哪個PORT發起健康狀態檢測請求
bindto <IP ADDRESS>:發出健康狀態檢測請求時使用的源地址;
bind_port <PORT>:發出健康狀態檢測請求時使用的源端口;
connect_timeout <INTEGER>:連接請求的超時時長;
}
實驗:實現單主配置的示例:(單個的虛擬VRRP IP地址,一個用作主節點,一個作為備用節點)
具體配置信息:(在同一個網路中實現)
實驗環境:selinux ;iptables;時間是否同步;(如果不同步:timedatectl set-timezone Asia/Shanghai可以用此命令設置僅在centos7上有此命令)
查看網卡信息:是否有以下信息多播方式(默認都有)
如果沒有此條信息:則需要手動開啟此選項
ip link set dev ens33 multicast on? (開啟多播方式)
ip link set dev ens33 multicast off? (關閉多播方式)
1 . 在主的機器上:
yum install keepalived ? (安裝包)
vim /etc/keepalived/keepalived.conf (修改配置文件)
后面的內容可以注釋掉
2 . 在從的機器上:
yum install keepalived ? (安裝包)
vim /etc/keepalived/keepalived.conf (修改配置文件)
后面的內容可以注釋掉
首先開啟從的keepalived服務:systemctl start keepalived
查看網卡狀態:ip a l
然后再將主節點的服務器開啟:systemctl start keepalived
查看網卡狀態:ip a l
由于是搶占模式,當主節點的服務器起來之后,發現自己的優先級高于從節點的服務器,所以將虛擬IP地址又搶占過來了。
總結:虛擬IP地址可以來回切換說明keepalived已經成功了。
實驗:實現多主配置的示例:(2個虛擬的VRRP IP地址,共同提供一個服務)
在dns解析上將兩個虛擬的VRRP地址指向同一個域名,在客戶端訪問此域名時就可以實現負載均衡和高可用的兩種模式:
實驗環境:selinux ;iptables;時間是否同步;(如果不同步:timedatectl set-timezone Asia/Shanghai可以用此命令設置僅在centos7上有此命令)
其他配置同上一個實驗
具體配置信息:(在同一個網路中實現)
1 . 在主機器上:
yum install keepalived (安裝包)
vim /etc/keepalived/keepalived.conf (修改配置文件)
在上述配置的基礎上添加第二個從虛擬IP地址作為備用的
vrrp_instance VI_2 { ? (第二個虛擬IP)
state BACKUP ? ? ? ? ? ? ? ?? (設定為備用的)是對于在從上在建一個主來說而不是對本機的主
interface ens33
virtual_router_id 55 ? ? ? ? ? (路由編號要更改)
priority 98 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? (優先級要低)
advert_int 1
authentication {
auth_type PASS
auth_pass qwert ? ? ? ? ? ? ? ? ? ?? (密碼從新設置)
}
virtual_ipaddress {
192.168.60.88 ? ? ? ? ? ? ? ? (新的虛擬IP地址)
}
}
2 . 在從機器上:
yum install keepalived (安裝包)
vim /etc/keepalived/keepalived.conf (修改配置文件)
在第一個實驗的基礎上,添加第二個虛擬地址的主
vrrp_instance VI_2 { ? ? ? ? ? (同主節點機器的第二個虛擬IP來設置的)
state MASTER ? ? ? ? ? ? ? ? ? ? ? ?? (作為主)
interface ens33
virtual_router_id 55
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass qwert
}
virtual_ipaddress {
192.168.60.88
}
}
最后測試:
首先將主機器的keepalived開啟服務:systemctl start keepalived
會發現ens33上開啟了兩個虛擬IP,分別是第一個虛擬IP的主和第二個虛擬IP的 備,因為此時第二個備主機未開啟所以第二個虛擬IP在主機器上作為備用模式也啟動了。
再將備用的主機開啟keepalived服務:systemctl start keepalived
由于備用主機上的的第二個IP地址在此機器上是作為主用的,所以開啟服務之后,主機器只有第一個虛擬IP地址,而備用機器上有第二個虛擬IP地址。
主用機器和備用機器都有一個虛擬IP地址,兩個虛擬IP地址指向同一個域名這樣就實現了互為主備模式,既可以實現高可用也能夠實現負載均衡的目的,將備用服務器利用起來了。
用戶自定義的通知腳本:(通過郵件的方式通知此節點現在所處于什么狀態)
在實現單主模式下的keepalived的基礎上添加的
notify_master <STRING>|<QUOTED-STRING>:當前節點成為主節點時觸發的腳本;
notify_backup <STRING>|<QUOTED-STRING>:當前節點轉為備節點時觸發的腳本;
notify_fault <STRING>|<QUOTED-STRING>:當前節點轉為“失敗”狀態時觸發的腳本;
notify <STRING>|<QUOTED-STRING>:通用格式的通知觸發機制,一個腳本可完成以上三種狀態的轉換時的通知;
在cd /etc/keepalived/下新建腳本:(兩個節點都做如下操作配置)
vim notify.sh
#!/bin/bash
#
contact=’root@localhost’
notify() {
local mailsubject=”$(hostname) to be $1, vip floating”
local mailbody=”$(date +’%F %T’): vrrp transition, $(hostname) changed to be $1″
echo “$mailbody” | mail -s “$mailsubject” $contact
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo “Usage: $(basename $0) {master|backup|fault}”
exit 1
;;
esac
yum install mailx -y (如果沒有mail命令則需要安裝)
chmod +x notify.sh (給腳本添加執行權限)
最后在keepalived的配置文件里調用此腳本;
腳本的調用方法: (將下面的內容寫到配置文件里去)
notify_master “/etc/keepalived/notify.sh master”
notify_backup “/etc/keepalived/notify.sh backup”
notify_fault “/etc/keepalived/notify.sh fault”
最后測試:systemctl start keepalived (啟動keepalived服務)
mail? (查看郵件信息,可以看到當前主備節點轉換的過程和當前所處的狀態信息)
小結:在上述實驗中可以發現,自定義的腳本可以執行你所自定義的任務,所以也可以定義其他的腳本來執行用戶所定義的要執行的內容。
實驗:結合keepalived來實現LVS的高可用:
模式:在同一網段下,LVS-DR模式下;keepalived為單主模式
實驗環境:selinux ;iptables;時間是否同步;(如果不同步:timedatectl set-timezone Asia/Shanghai可以用此命令設置僅在centos7上有此命令)
1 .在兩臺LVS機器上的配置:
在主節點LVS機器上配置:
首先參照單主模式實現單主模式再添加如下內容:
virtual_server 192.168.60.99 80 { ? ? ? ? ?? (自定義的LVS下的VIP地址;及配置)
delay_loop 2
lb_algo rr
lb_kind DR
persistence_timeout
protocol TCP
real_server 192.168.60.21 80 { ? ? ? ? ??(后端的的web服務器的IP地址,及參數配置)
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 1
}
}
real_server 192.168.60.22 80 { ? ?? (后端的的web服務器的IP地址,及參數配置)
weight 1
HTTP_GET {
url{
path /
status_code 200
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 1
}
}
}
yum install ipvsadm ? (安裝實現LVS的包)
ip a a 192.168.60.99/24 dev ens33:1 (將VIP地址綁定到LVS本機的DIP上)
systemctl start keepalived ? ? (啟動服務)
ip? a? l (查看虛擬IP和VIP是否已經添加到本機的網卡上了)
ipvsadm -Ln (查看ipvs規則是否生成了)
注意大括號的使用;可能會由于多了少了造成規則生成不了。
在備節點LVS機器上配置:
首先參照單主模式實現單主模式再添加如下內容:
virtual_server 192.168.60.99 80 { (自定義的LVS下的VIP地址;及配置)
delay_loop 2
lb_algo rr
lb_kind DR
persistence_timeout
protocol TCP
real_server 192.168.60.21 80 { (后端的的web服務器的IP地址,及參數配置)
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 1
}
}
real_server 192.168.60.22 80 { (后端的的web服務器的IP地址,及參數配置)
weight 1
HTTP_GET {
url{
path /
status_code 200
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 1
}
}
}
yum install ipvsadm (安裝實現LVS的包)
ip a a 192.168.60.99/24 dev ens33:1 (將VIP地址綁定到LVS本機的DIP上)
ip a ?? (查看VIP是否綁定到本機的網卡上了)
systemctl start keepalived (啟動服務作為備用模式)
ipvsadm -Ln ? ? (查看ipvs規則是否生成了)
注意大括號的使用;可能會由于多了少了造成規則生成不了。
2? . 在后臺web服務器上的配置:
RS1:
yum install httpd (安裝包)
echo test1 > /var/www/html/index.html ? ? ? (創建測試主頁面)
修改內核配置來防止VIP地址的相互沖突:
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce (臨時修改)
cat /proc/sys/net/ipv4/conf/all/arp_ignore ? (驗證修改的內核參數是否成功)
將VIP地址綁定到本機的回環網卡上:(可以不用添加新的網卡)
ip a a 192.168.60.99/32 dev lo 此種只是臨時綁定重啟服務就會失效的
RS2:
yum install httpd (安裝包)
echo test1 > /var/www/html/index.html (創建測試主頁面)
修改內核配置來防止VIP地址的相互沖突:
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce (臨時修改)
cat /proc/sys/net/ipv4/conf/all/arp_ignore (驗證修改的內核參數是否成功)
將VIP地址綁定到本機的回環網卡上:(可以不用添加新的網卡)
ip a a 192.168.60.99/32 dev lo 此種只是臨時綁定重啟服務就會失效的
3. 測試: 客戶端curl 192.168.60.99(此IP地址為VIP地址)
實驗:實現nginx的高可用:
1 . 在實現keepalived的主從模式的基礎上添加以下內容:
在主機器上:(確保又killall命令:沒有的話需要安裝yum install psmisc-22.20-15.el7.x86_64)
vim /etc/keepalived/keepalived.conf? (在實現主備的配置文件下添加的內容)
vrrp_script chk_nginx { ? ? ? ?? (定義一個小腳本,檢測本機的nginx程序,如果暫停則將本機的定義的)
script “killall -0 nginx && exit 0 || exit 1” ? ? ? ? (優先級-5;之后就小于備節點的優先級,將搶占虛擬IP)
interval 1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? (備用節點就開始接管后臺的程序了)
weight -5 ? ? ? (此數值要確保在主節點減去5后的優先級應該小于備用節點的優先級,只有這樣備用節點)
fall 2 ? ? ? ? ? ? ? ? ? ? ?? (的優先級高于此時的主節點的優先級才能開啟搶占模式)
rise 1
}
vrrp_instance VI_1 {
state master
interface ens33
virtual_router_id 16
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 12345
}
virtual_ipaddress {
192.168.60.77/24
}
track_script { ? ? ? ? (在此處調用剛才寫的腳本;此處調用必須要包含在vrrp_instance VI_1 里面)
chk_nginx
}
}
yum install nginx ? (裝包)
vim /etc/nginx/conf.d/test.conf ? ? ?? (創建nginx的配置文件)
server {
listen 80 default_server;
server_name www.a.com;
root /usr/share/nginx/html;
location / {
proxy_pass http://www;
}
}
vim /etc/nginx/nginx.conf (修改主配置文件)
upstream www {
server 192.168.60.21;
server 192.168.60.22;
}
nginx ?? (啟動nginx服務)
2 .在備用機器上:
yum install nginx (裝包)
vim /etc/nginx/conf.d/test.conf (創建nginx的配置文件)
server {
listen 80 default_server;
server_name www.a.com;
root /usr/share/nginx/html;
location / {
proxy_pass http://www;
}
}
vim /etc/nginx/nginx.conf (修改主配置文件)
upstream www {
server 192.168.60.21;
server 192.168.60.20;
}
nginx (啟動nginx服務)
(確保又killall命令:沒有的話需要安裝yum install psmisc-22.20-15.el7.x86_64)
vim /etc/keepalived/keepalived.conf? (在實現主備模式的配置文件下添加的內容)
此配置內容和主節點機器的配置內容相同。
3 .測試:訪問的時虛擬IP地址
依次將后臺的web服務開啟;再次將nginx程序開啟,最后再將keepalived服務開啟。此時如果將主節點的nginx程序手動停止,此時的虛擬IP地址將轉移到備用節點的機器上。由此實現了高可用。
實現不同網段
在不同網段的情況下,只需定義一個外網的虛擬IP地址然后將其綁定到外網的的網卡上就能實現不同網段的高可用。例如:將虛擬IP172.20.33.33綁定到ens37的網卡上,然后再客戶端訪問虛擬網卡的IP地址:
curl 172.20.33.33 就可以實現不同網段的高可用了。
總結:在編寫腳本時將其寫在默認的配置下面,但不要被默認的配置文件包括了,在引用腳本時,要將其包含在其虛擬示例的的里面。還有確定是否安裝killall命令了。
實驗:使用ansible實現自動化配置:
1 .編寫腳本實現基于key的免密登陸:和ansible的程序安裝并加入到主機清單里去。
vim .key.ssh
cat >> /data/ip.txt<<EOF
192.168.60.2
192.168.60.4
192.168.60.20
192.168.60.21
192.168.60.22
EOF
yum install expect -y
ssh-keygen -P “” -f “/root/.ssh/id_rsa”
password=511111
for ip in `cat /data/ip.txt`;do
expect <<EOF
spawn ssh-copy-id $ip
expect {
“yes/no” { send “yes\n”;exp_continue }
“password” { send “$password\n” }
}
expect eof
EOF
done
yum install ansible -y
cat >>/etc//ansible/hosts<<EOF
[nginx1]
192.168.60.4
[nginx2]
192.168.60.20
[web]
192.168.60.21
192.168.60.22
編寫劇本實現各機器的配置:
創建配置文件的腳本:
將nginx主從的配置文件生成,將keepalived的主從配置文件生成。
主nginx的劇本:
—
– host: nginx1
remote_user: root
tasks:
– name: install nginx package
yum: name=nginx
– name: install keepalived package
yum: name=keepalived
– name: chmod
– shell: chmod +x /data/file.sh
– name: curl jiaoben
– script: /data/file.sh
– name: copy file
copy: src=/root/templates/keepalived1 dest=/etc/keepalived/keepalived.conf
– name: copy file
copy: src=/root/templates/test.conf dest=/etc/nginx/conf.d/test.conf
– name: clean iptables
shell: iptables -F
– name: start service
service: name=nginx state=startd
– name: start service
service: name=keepalived state=startd
從nginx的劇本:
—
– host: nginx2
remote_user: root
tasks:
– name: install nginx package
yum: name=nginx
– name: install keepalived package
yum: name=keepalived
– name: copy file
copy: src=/root/templates/keepalived2 dest=/etc/keepalived/keepalived.conf
– name: copy file
copy: src=/root/templates/test.conf dest=/etc/nginx/conf.d/test.conf
– name: clean iptables
shell: iptables -F
– name: start service
service: name=nginx state=startd
– name: start service
service: name=keepalived state=startd
后端服務器的劇本:
—
– host: web
remote_user: root
tasks:
– name: install http package
yum: name=httpd
– name: copy file
copy: src=/root/templates/test.conf dest=/etc/nginx/conf.d/test.conf
– name: clean iptables
shell: iptables -F
– name: touch file
shell: echo rs1 >> /var/www/html/index.html
– name: start service
service: name=httpd state=startd
其他博客參考:
https://www.cnblogs.com/clsn/p/8052649.ht
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/102653