Linux集群實現高可用--keepalived
lvs本身不支持高可用;
在lvs集群中,可能有兩種故障: 1.Director故障不可用; keepalived:原生的lvs的Director高可用解決方案; heartbeat corosync/pacemaker:通用的高可用解決方案; 2.後端RS故障不可用; lvs的Director不考慮後端RS的可用與否,只是按照調度算法進行客戶端請求調度; 完整的實現:周期性的對各個RS進行健康狀態檢測; 檢測失敗:應該從lvs集群服務中將對應的RS移除; 檢測成功:將對應RS重新加入lvs集群服務中;重新創建lvs集群服務; 所有的RS檢測均失敗:臨時刪除lvs集群服務,並使調度器本地的web服務能夠響應一個相對比較友好的錯誤頁面,sorry_server; 檢測方式: 網絡層檢測;ping 傳輸層檢測:端口探測,nmap 應用層檢測:文件資源的存在性檢測;文件訪問權限檢測;文件內容有效性檢測; keepalived:後端RS的健康狀態檢測; 可用性: A=MTBF/(MTBF+MTTR) A ∈ (0,1) 50%, 90%, 95% 99%, 99.9%, 99.99%, 99.999% 提高可用性的有效的方案:降低MTTR; 方法:冗余 + 自動故障倒換; 高可用的內容: 服務高可用; 資源高可用;
HA Cluster實現方案:
基於VRRP協議的實現:
keepalived,專用於高可用lvs的Director;
基於AIS的實現:完備的HA集群;
heartbeat
corosync + pacemaker
keepalived:
VRRP協議:Virtual Redundancy Router Protocol,虛擬路由器冗余協議;
VRRP技術術語:
虛擬路由器:虛擬的路由器的接口;
VRID:虛擬路由器標識符,描述路由器的分組;並且可以確定虛擬路由器的虛擬MAC地址,取值範圍為:0-255(00-ff);
MASTER:虛擬IP地址的擁有者,可以利用虛擬IP地址接收用戶請求,並且能夠完成數據轉發功能;
虛擬IP地址:VIP,虛擬路由器接口的IP地址;
虛擬MAC地址:VMAC,00-00-5e-00-01-{VRID}
優先級:選舉成為MASTER的主要的參考標準,取值範圍為:0-255;
0:放棄MASTER選舉;
255:虛擬IP地址和某個路由器接口的IP地址相同,則該路由器會自動獲得255的優先級,從而直接成為MASTER;
1-254:越大越有可能成為MASTER;
非搶占式:如果MASTER故障導致狀態發生變化,則所有的BACKUP會重新選舉產生新的MASTER;此時,如果原來的MASTER從故障中恢復,則直接成為BACKUP狀態,直到當前的MASTER故障之後,所有的BACKUP重新選舉MASTER時,其才能重新稱為新的MASTER;
VRRP的認證方式:
無認證
簡單字符串認證
MD5
VRRP的工作模式:
單個實例:MASTER/BACKUP
多個實例:MASTER/BACKUP, MASTER/MASTER
keepalived:
VRRP協議在linux系統中的應用實現;最初的設計目的就是為了高可用ipvs調度器;某些場合,簡稱其為"ka";
keepalived通過調用內核中的系統調用接口完成ipvs的規則編寫,從而可以用於管理lvs集群服務;所有的規則,都定義在其配置文件中;
keepalived還可以對VIP地址進行浮動設置;
keepalived還可以為後端各RS提供健康狀態檢測,可以基於傳輸層及應用層實現;
keepalived還可以基於外部腳本調用接口完成腳本中定義的功能,甚至可以高可用其他的非lvs服務;
keepalived在RHEL 6.4+或CentOS 6.4+的發行版本的操作系統中,被收錄到官方系統光盤鏡像之中,直接基於本地Base源使用yum命令完成安裝即可;
keepalived的組件:
控制面板:配置文件分析器;
內存管理組件;
IO復用器組件;
核心組件:
VRRP Stack:實現VRRP協議功能的組件;
Checkers:後端RS做健康狀態檢測的組件;
SMTP:調用SMTP協議,將路由器狀態轉換的消息以郵件的形式發送到指定管理員郵箱;
Watch Dog:監控Checkers和VRRP Stack的工作狀態;如果異常,負責重新啟動keepalived進程;
ipvs wrapper:向內核中的ipvs框架傳輸ipvs規則,用於構建、管理、移除lvs集群服務及集群中的RS的組件;
netlink reflactor:管理虛擬路由器接口;
配置HA Cluster的前期準備:
1.各個節點主機之間時間必須同步,可以使用時間服務器,如ntp或chrony;
2.確保iptables和SELinux的規則不會阻礙各個節點之前的數據通信;
3.各個節點主機之間需要通過主機名互相通信(對ka並非必須);
4.出於安全考量,各個節點主機之間可以以root用戶的身份,基於密鑰認證的方式進行ssh通信(對於ka非必須);
keepalived安裝:
在CentOS 7.2中,直接使用光盤鏡像yum倉庫,使用yum install keepalived安裝即可;
程序環境:
主配置文件:/etc/keepalived/keepalived.conf
主程序文件:/usr/sbin/keepalived
Unit File:/usr/lib/systemd/system/keepalived.service
主配置文件的結構:
GLOBAL CONFIGURATION
Global definitions
global_defs {
notification_email {
root@localhost //配置接收郵件通知的郵箱地址;
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1 //設定用於發送電子郵件的郵件服務器;
smtp_connect_timeout 30 # integer, seconds
router_id my_hostname //設置路由器ID,僅僅為了區分不同的設備而已;如果不修改,也不會影響keepalived服務本身;
vrrp_mcast_group4 224.0.0.18 //設置發送VRRP協議通過的目標組播通信地址;必須保證所有參數選舉的路由器都必須有相同的組播通信地址;
}
VRRPD CONFIGURATION
vrrp_instance inside_network { //定義VRRP的實例及實例名稱;
state MASTER //指定當前設備的初始狀態;
interface eno16777736
//指定被VRRP協議綁定的網絡接口,即發送VRRP通過信息的網絡接口;
virtual_router_id 51 //指定虛擬路由器標識,用於確定VRRP備份組;
priority 100 //指定當前節點的優先級,指定的範圍為:1-254;
advert_int 1 //發送VRRP通過的時間間隔,單位是秒;
authentication {
auth_type PASS //設置VRRP協議各節點之間的認證方式,PASS表示簡單密碼
auth_pass MTUwPBjd //設置認證密碼,不超過8個字符;
}
virtual_ipaddress {
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
} //設置虛擬IP地址的專用上下文
nopreempt //設置當前節點為非搶占模式,默認為搶占模式;
preempt_delay 300 //搶占模式開始前的延遲時間;
notify_master <STRING>|<QUOTED-STRING>
notify_backup <STRING>|<QUOTED-STRING>
notify_fault <STRING>|<QUOTED-STRING>
//設置當當前服務器狀態發生變化時,所觸發的腳本文件的路徑及相關參數;
track_script {
SCRIPT_NAME
}
}
LVS CONFIGURATION
virtual server vip vport | fwmark <INT> {
delay_loop <INT> //服務輪詢的時間間隔設定;
lb_algo rr|wrr|lc|wlc|lblc|sh|dh //指定負載均衡調度算法;
lb_kind NAT|DR|TUN //指定負載均衡集群的類型;
persistence_timeout <INT> //啟用持久連接並設置超時時間;
protocol TCP //負載均衡服務支持的協議;目前僅支持TCP;
sorry_server <IPADDR> <PORT> //如果後端RS全部不可用,則需要臨時刪除lvs集群服務,並設置本地的http服務為sorry-server,提供友好的錯誤頁面;
real_server <IPADDR> <PORT> {
weight <INT> //指定當前RS的權重;
notify_up <STRING>|<QUOTED-STRING>
notify_down <STRING>|<QUOTED-STRING>
//當RS的狀態轉為UP或DOWN時,發送通知所使用的腳本路徑及參數設定;
HTTP_GET|SSL_GET {
url {
path <STRING> //指定進行後端RS健康狀態檢測的URL地址;
digest <STRING> //比較被檢測資源的md5值是否發生變化;
status_code <INT> //根據響應報文的狀態碼進行後端RS的健康狀態檢測;
}
nb_get_retry <INT> //指定對後端RS進行健康狀態檢測重試的次數上限;
delay_before_retry <INT> //每次重試之前的延遲時間;
connect_ip <IP ADDRESS>
connect_port <PORT>
//向後端RS的哪個IP地址和哪個端口發出健康狀態檢測請求;
bindto <IP ADDRESS>
bind_port <PORT>
//向後端RS發出健康狀態檢測請求的源IP地址和源端口號;
connect_timeout <INTEGER> //連接超時時間;
}
TCP_CHECK {
connect_ip <IP ADDRESS>
connect_port <PORT>
//向後端RS的哪個IP地址和哪個端口發出健康狀態檢測請求;
bindto <IP ADDRESS>
bind_port <PORT>
//向後端RS發出健康狀態檢測請求的源IP地址和源端口號;
connect_timeout <INTEGER> //連接超時時間;
}
}
}
Linux集群實現高可用--keepalived