Keepalived簡介html
Keepalived的做用是檢測服務器的狀態,若是有一臺web服務器宕機,或工做出現故障,Keepalived將檢測到,並將有故障的服務器從系統中剔除,同時使用其餘服務器代替該服務器的工做,當服務器工做正常後Keepalived自動將服務器加入到服務器羣中,這些工做所有自動完成,不須要人工干涉,須要人工作的只是修復故障的服務器。python
keepalived工做原理nginx
keepalived是以VRRP協議爲實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗餘協議。web
虛擬路由冗餘協議,能夠認爲是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組裏面有一個master和多個backup,master上面有一個對外提供服務的vip(該路由器所在局域網內其餘機器的默認路由爲該vip),master會發組播,當backup收不到vrrp包時就認爲master宕掉了,這時就須要根據VRRP的優先級來選舉一個backup當master。這樣的話就能夠保證路由器的高可用了。json
keepalived主要有三個模塊,分別是core、check和vrrp。core模塊爲keepalived的核心,負責主進程的啓動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各類檢查方式。vrrp模塊是來實現VRRP協議的。bash
keepalived三個主要功能服務器
管理LVS負載均衡軟件網絡
實現LVS集羣節點的健康檢查中app
做爲系統網絡服務的高可用性(failover)負載均衡
PS:本次主要介紹高可用功能
Keepalived安裝配置
安裝環境查看
本次試驗使用yum安裝
yum -y install keepalived
查看版本
配置文件爲/etc/keepalived/keepalived.conf
全局配置文件
lobal_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 lb01 vrrp_skip_check_adv_addr # vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 }
用來配置router_id(全局惟一) 以及郵箱等信息
PS:配置郵件用於出現故障發送郵件,工做中這個工做通常交由監控軟件zabbix等負責,能夠不配置
vrrp配置部分
vrrp_instance VI_1 { state MASTER #設備狀態是主 interface eth0 #綁定的網絡接口是eth0 virtual_router_id 55 #虛擬路由ID 主備這個ID必須一致 priority 150 #優先級數值越高優先級越高,備的優先級需低於此數值 advert_int 1 #主備同步間隔單位是秒 authentication { auth_type PASS auth_pass 1111 #主備認證方式,主備密碼須要一致 } virtual_ipaddress { #虛擬IP地址以及綁定的網卡 192.168.56.22/24 dev eth0 label eth0:1 } }
用於配置主備狀態,接口,優先級,認證方式IP信息等
高可用服務單實例實戰
圖示
192.168.56.11的keepalived配置
! Configuration File for keepalived global_defs { notification_email { liuym@abc.com } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lb01 # vrrp_strict } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 55 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.56.22/24 dev eth0 label eth0:1 } }
192.168.56.12的keepalived配置
! Configuration File for keepalived global_defs { notification_email { liuym@abc.com } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lb02 # vrrp_strict } vrrp_instance VI_1 { state BACKEND interface eth0 virtual_router_id 55 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.56.22/24 dev eth0 label eth0:1 } }
說明:router_id不同
主備狀態不同(一臺是MASTER一臺是BACKEDN在配置文件裏必須是大寫)
優先級不同
PS:vrrp_strict是默認的配置須要註釋,不然會致使VIP不通
啓動keepalived驗證兩臺主機均啓動
systemctl start keepalived
192.168.56.11生產了虛擬IP
192.168.56.12沒有虛擬IP
中止主keepalived責備機接管虛擬VIP
主節點沒有了虛擬VIP
主節點再次啓動keepalived 由於主節點優先級別高又會自動接管虛擬VIP
keepalived+nginx實現高可用集羣
圖示以下
1,對外提供的VIP是192.168.56.22
2,其中正常工做是由11提供服務
3,11宕機的狀況VIP會漂移至22主機,用戶無感知
11和12主機分別安裝nginx並設置反向代理,這裏爲了方便僅僅反向代理一臺主機,生產中是有多臺主機的
nginx.conf配置以下(兩臺主機nginx配置同樣反向代理了11的8080生產中是其餘應用的多臺主機)
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format access_log_json '{"user_ip":"$http_x_forwarded_for","lan_ip":"$remote_addr","log_time":"$time_iso8601","user_rqp":"$request","http_code":"$status","body_bytes_sent":"$body_bytes_sent","req_time":"$request_time","user_ua":"$http_user_agent"}'; sendfile on; keepalive_timeout 65; upstream www_server_pools { server 192.168.56.11:8080; } server { listen 192.168.56.22:80; server_name www.liuym.com; access_log /data/logs/nginx/http-access.log access_log_json; error_log /data/logs/nginx/http-error.log; location / { proxy_pass http://www_server_pools; proxy_set_header Host $host; proxy_set_header x-Forwarded-For $remote_addr; } } }
注意這裏server_name指定了VIP加端口進行綁定,其餘配置爲nginx基礎知識
客戶端設置hosts指向的ip是VIP192.168.56.22 生產中是DNS地址
web界面經過域名訪問(這裏使用一個8080端口啓動的jenkins做爲示例)
測試VIP漂移
在master中止keepalived客戶端仍是能夠繼續訪問該頁面
PS:備節點nginx配置了VIP綁定,可是實際主機並無該VIP在啓動nginx的時候會報錯
解決辦法,修改內核參數/etc/sysctl.conf增長一條
net.ipv4.ip_nonlocal_bind = 1
執行生效
sysctl -p
默認狀況下是keepalived軟件是在對方宕機或者keepalived中止狀況下才接管業務,假如是主節點的Nginx業務有問題呢
能夠寫一個腳本監控Nginx若是nginx中止服務就中止keepalived
check_nginx.sh
#!/bin/bash while true do if [ ` netstat -lntup|grep nginx|wc -l` -ne 1 ];then systemctl stop keepalived fi sleep 5 done
檢測若是nginx宕機則中止keepalived
後臺運行便可
sh check_nginx.sh &