1、高可用集群介紹
集群Cluster
集群類型:
LB lvs/nginx(http/upstream, stream/upstream)
HA 高可用性
SPoF: Single Point of Failure 單點失效
HPC
系統(tǒng)可用性的公式:A=MTBF/(MTBF+MTTR)
(0,1), 95%
幾個9(指標): 99%, ..., 99.999%,99.9999%;
系統(tǒng)故障:
硬件故障:設計缺陷、wear out(損耗)、自然災害……
軟件故障:設計缺陷 4 集群Cluster
提升系統(tǒng)高用性的解決方案之降低MTTR:
手段:冗余redundant
active/passive 主備
active/active 雙主
active --> HEARTBEAT --> passive
active <--> HEARTBEAT <--> active
高可用的是“服務”:
HA nginx service:
vip/nginx process[/shared storage]
資源:組成一個高可用服務的“組件”
(1) passive node的數(shù)量
(2) 資源切換 5 集群Cluste
shared storage:
NAS:文件共享服務器;
SAN:存儲區(qū)域網(wǎng)絡,塊級別的共享
Network partition:網(wǎng)絡分區(qū)
quorum:法定人數(shù)
with quorum: > total/2
without quorum: <= total/2
隔離設備: fence
node:STONITH = Shooting The Other
Node In The Head,斷電重啟
資源:斷開存儲的連接
TWO nodes Cluster
輔助設備:ping node, quorum disk
Failover:故障切換,即某資源的主節(jié)點故障時,將資源轉(zhuǎn)移 至其它節(jié)點的操作
Failback:故障移回,即某資源的主節(jié)點故障后重新修改上線 后,將之前已轉(zhuǎn)移至其它節(jié)點的資源重新切回的過程
HA Cluster實現(xiàn)方案:
vrrp協(xié)議的實現(xiàn)
keepalived
ais:應用接口規(guī)范 完備HA集群
RHCS:Red Hat Cluster Suite紅帽集群套件
heartbeat
corosync
2、KeepAlived
keepalived:
vrrp協(xié)議:Virtual Router Redundancy Protocol
術(shù)語:
虛擬路由器:Virtual Router
虛擬路由器標識:VRID(0-255),唯一標識虛擬路由器
物理路由器:
master:主設備
backup:備用設備
priority:優(yōu)先級
VIP:Virtual IP
VMAC:Virutal MAC (00-00-5e-00-01-VRID)
通告:心跳,優(yōu)先級等;周期性
工作方式:搶占式,非搶占式
安全工作:
認證:
無認證
簡單字符認證:預共享密鑰
MD5
工作模式:
主/備:單虛擬路徑器
主/主:主/備(虛擬路徑器1),備/主(虛擬路徑器2)
keepalived:
vrrp協(xié)議的軟件實現(xiàn),原生設計目的為了高可用ipvs服務
功能:
? vrrp協(xié)議完成地址流動
? 為vip地址所在的節(jié)點生成ipvs規(guī)則(在配置文件中預先定義)
? 為ipvs集群的各RS做健康狀態(tài)檢測
? 基于腳本調(diào)用接口通過執(zhí)行腳本完成腳本中定義的功能, 進而影響集群事務,以此支持nginx、haproxy等服務 10 KeepAlived
組件:
? 核心組件: vrrp stack
ipvs wrapper
checkers
? 控制組件:配置文件分析器
?IO復用器
?內(nèi)存管理組件
KeepAlived組成:

IPVS:
IPVS基本上是一種高效的Layer-4交換機,它提供負載平衡的功能。當一個TCP連接的初始SYN報文到達時,IPVS就選擇一臺服務器,將報文轉(zhuǎn)發(fā)給它。此后通過查發(fā)報文的IP和TCP報文頭地址,保證此連接的后繼報文被轉(zhuǎn)發(fā)到相同的服務器。這樣,IPVS無法檢查到請求的內(nèi)容再選擇服務器,這就要求后端的服務器組是提供相同的服務,不管請求被送到哪一臺服務器,返回結(jié)果都應該是一樣的。
3、KeepAlived實現(xiàn)
? HA Cluster 配置準備:
(1) 各節(jié)點時間必須同步
ntp, chrony
eg:
CentOS6:
#vim /etc/ntp.conf
添加 server 172.18.0.1 iburst
#ntpdate 172.18.0.1
#chkconfig --list ntp
#chkconfig --list ntp on
#service ntpd start
或者#crontab -e 做計劃任務
CentOS7:
#vim /etc/chrony.conf
添加 server 192.168.25.106(對方的服務器地址) iburst
#systemctl is-enabled chronyd
#systemctl enable chronyd 設為開機啟動
#systemctl start chronyd
(2) 確保iptables及selinux不會成為阻礙
注意:CentOS7上面清除firewalld
(3) 各節(jié)點之間可通過主機名互相通信(對KA并非必須)
建議使用/etc/hosts文件實現(xiàn)
eg:
#hostnamectl set-hostname node1
#vim /etc/hosts
192.168.25.108 node2(對方的ip和主機名)
(4) 各節(jié)點之間的root用戶可以基于密鑰認證的ssh服務完
成互相通信(對KA并非必須)
eg:
node1:
#ssh-keygen
#ssh-copy-id -i id_rsa.pub root@node2 (把公鑰文件拷貝到對方的服務器上去)
node2:
#cd .ssh
#ls (如果有authorized_keys即成功)
#ssh-keygen
#ssh-copy-id -i id_rsa.pub root@node1 (把公鑰文件拷貝到對方的服務器上去)
(5) keepalived安裝配置:
#yum -y install keepalived
CentOS 6.4+ Base源
程序環(huán)境:
主配置文件:/etc/keepalived/keepalived.conf
主程序文件:/usr/sbin/keepalived
Unit File:/usr/lib/systemd/system/keepalived.service
Unit File的環(huán)境配置文件:/etc/sysconfig/keepalived
4.KeepAlived配置
? 配置文件組件部分:
TOP HIERACHY
GLOBAL CONFIGURATION
Global definitions
Static routes/addresses
VRRPD CONFIGURATION
VRRP synchronization group(s):vrrp同步組
VRRP instance(s):即一個vrrp虛擬 路由器
LVS CONFIGURATION
Virtual server group(s)
Virtual server(s):ipvs集群的vs和rs
5.配置語法:
(1)配置虛擬路由器:
vrrp_instance {
...
}
專用參數(shù):
state MASTER|BACKUP:當前節(jié)點在此虛擬路由器上的初始狀態(tài); 只能有一個是MASTER,余下的都應該為BACKUP
interface IFACE_NAME:綁定為當前虛擬路由器使用的物理接口
virtual_router_id VRID:當前虛擬路由器惟一標識,范圍是0-255
priority 100:當前物理節(jié)點在此虛擬路由器中的優(yōu)先級;范圍1-254
advert_int 1:vrrp通告的時間間隔,默認1s
(2)authentication { #認證機制
auth_type AH|PASS
auth_pass 僅前8位有效
}
(3)virtual_ipaddress { #虛擬IP
<IPADDR> / <MASK> brd <IPADDR> dev <STRING> scope <SCPOPE> label <LABEL>
192.168.200.17/24 dev eth1
192.168.200.18/24 dev eth2 label eth2:1
}
track_interface { #配置監(jiān)控網(wǎng)絡接口,一旦出現(xiàn)故障,則轉(zhuǎn)為FAULT狀態(tài) 實現(xiàn)地址轉(zhuǎn)移
eth0
eth1
…
}
? nopreempt:定義工作模式為非搶占模式
? preempt_delay 300:搶占式模式,節(jié)點上線后觸發(fā)新選舉操作的延遲時長,默認模式
? 定義通知腳本:
notify_master |:
當前節(jié)點成為主節(jié)點時觸發(fā)的腳本
notify_backup |:
當前節(jié)點轉(zhuǎn)為備節(jié)點時觸發(fā)的腳本
notify_fault |:
當前節(jié)點轉(zhuǎn)為“失敗”狀態(tài)時觸發(fā)的腳本
notify <STRING>|<QUOTED-STRING>:
通用格式的通知觸發(fā)機制,一個腳本可完成以上三 種狀態(tài)的轉(zhuǎn)換時的通知
6.單主配置示例:

! Configuration File for keepalived
global_defs {
notification_email {
root@localhost 收郵件建的郵箱
}
notification_email_from keepalived@localhost 發(fā)郵件的郵箱
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1 #主機名,在另一結(jié)點為node2
vrrp_mcast_group4 224.100.100.100 多播地址
}
vrrp_instance VI_1 {
state MASTER #在另一個結(jié)點上為BACKUP
interface eth0
virtual_router_id 6 #多個節(jié)點必須相同
priority 100 #優(yōu)先級,在另一個結(jié)點上為90
advert_int 1 #通告間隔1s
authentication {
auth_type PASS #預共享密鑰認證
auth_pass 571f97b2 秘鑰,自己定義,兩邊一直即可,最多八位
}
virtual_ipaddress {
172.18.100.66/16 dev eth0 label eth0:0
}
track_interface {
eth0
}
}
#systemctl start keepalived.service 啟動服務
測試:
# tcpdump -i eth0 -m host 224.100.100.100
#systemctl status keepalived.service 查看keepalived狀態(tài)


日志記錄在指定文件中


更換時觸發(fā)腳本,并且發(fā)郵件




7.KeepAlived雙主配置

雙主模型示例:
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.100
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 6
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
172.16.0.10/16 dev eth0
}
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 8
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass 578f07b2
}
virtual_ipaddress {
172.16.0.11/16 dev eth0
}
}
再主從基礎上再添加


8.示例通知腳本
#vim /etc/keepalived/notify.sh
#!/bin/bash
#
contact='root@localhost'
notify() {
mailsubject="$(hostname) to be $1, vip floating"
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
腳本的調(diào)用方法:
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"

9.KeepAlived支持IPVS
? 虛擬服務器:
? 配置參數(shù):
virtual_server IP port |
virtual_server fwmark int
{
...
real_server {
...
}
...
}
常用參數(shù)
? delay_loop :檢查后端服務器的時間間隔
? lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定義調(diào)度方法
1..靜態(tài)調(diào)度算法:
RR:Round-robin:輪循
WRR:Weighted round-robin:加權(quán)輪循-----按照性能分配,為其計算出權(quán)重
DH:Destination hashing:目標地址hashing-----將某個固定IP的請求轉(zhuǎn)發(fā)給一個相同的real server,用于具有緩存服務器的
SH:Source hashing:源地址hashing
2.動態(tài)調(diào)度算法:根據(jù)分發(fā)算法和real server的負載狀態(tài)設置出調(diào)度決策,Director對每一個連接進行追蹤監(jiān)控是否處于活動狀態(tài)(ESTABLESHED)
LC:Least connection:最少連接-----監(jiān)控每一個real server當前處于活動狀態(tài)連接和非活動狀態(tài)連接數(shù),然后計算出其當前負載:active*256+inactive=overhead
WLC:Weighted least connection:加權(quán)最少連接------overhead/weight,考慮到real serverd的性能,默認集群算法
SED:Shortest Expected Delay:最短的期望的延遲----不考慮非活動狀態(tài)的連接,算法:(active+1)*256/weight=overhead
NQ:Never Queue:永不排隊-----沒有連接時,直接轉(zhuǎn)發(fā)
LBLC:Locality-Based Least-Connection:基于本地的最少連接,動態(tài)DH算法
LBLCR:Locality-Based Least-Connection with replication Scheduling:帶復制的基于本地最少連接,緩存是共享的
? lb_kind NAT|DR|TUN:集群的類型
? persistence_timeout :持久連接時長
? protocol TCP:服務協(xié)議,僅支持TCP
? sorry_server :所有RS故障時,備用服務器地址
? real_server <IPADDR> <PORT>
{
weight <INT> RS權(quán)重
notify_up <STRING> | <QUOTED-STRING> RS上線通知腳本
notify_down <STRING> | <QUOTED-STRING> RS下線通知腳本
HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHEC K { ... }:定義當前主機的健康狀態(tài)檢測方法
}
KeepAlived配置檢測
HTTP_GET|SSL_GET:應用層檢測
HTTP_GET|SSL_GET {
url {
path :定義要監(jiān)控的URL
status_code :判斷上述檢測機制為健康狀態(tài)的響應碼
digest :判斷為健康狀態(tài)的響應的內(nèi)容的校驗碼
}
connect_timeout :連接請求的超時時長
nb_get_retry :重試次數(shù)
delay_before_retry :重試之前的延遲時長
connect_ip :向當前RS哪個IP地址發(fā)起健康狀態(tài)檢測請求
connect_port :向當前RS的哪個PORT發(fā)起健康狀態(tài)檢測請求
bindto :發(fā)出健康狀態(tài)檢測請求時使用的源地址
bind_port :發(fā)出健康狀態(tài)檢測請求時使用的源端口
}
TCP_CHECK {
connect_ip :向當前RS的哪個IP地址 發(fā)起健康狀態(tài)檢測請求
connect_port :向當前RS的哪個PORT發(fā)起健 康狀態(tài)檢測請求
bindto :發(fā)出健康狀態(tài)檢測請求時使用的源地址
bind_port :發(fā)出健康狀態(tài)檢測請求時使用的源端口
connect_timeout :連接請求的超時時長
}
10.單主模型IPVS示例
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost }
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.10
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 6
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
172.16.0.10/16 dev eth0
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
virtual_server 172.16.0.10 80 {
delay_loop 3
lb_algo rr
lb_kind DR (Designated Router指定路由器)
protocol TCP
sorry_server 127.0.0.1 80
real_server 172.16.0.11 80 {
weight 1
HTTP_GET {
url {
path /
tatus_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 172.16.0.12 80 {
weight 1
HTTP_GET {
url {
path /
satus_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
VIP:192.168.25.100

安裝http


#bash lvs_dr_rs.sh

#yum install ipsadm



測試:
#curl 192.168.25.100

11.雙主模式的lvs集群,拓撲、實現(xiàn)過程

配置示例(一個節(jié)點):
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from kaadmin@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.100
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 6
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass f1bf7fde
}
virtual_ipaddress {
172.16.0.80/16 dev eth0 label eth0:0
}
track_interface {
eth0
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
vrrp_instance VI_2 {
state BACKUP
interface eth0
virtual_router_id 8
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass f2bf7ade
}
virtual_ipaddress {
172.16.0.90/16 dev eth0 label eth0:1
}
track_interface {
eth0
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
virtual_server fwmark 3 {
delay_loop 2
lb_algo rr
lb_kind DR
nat_mask 255.255.0.0
protocol TCP
sorry_server 127.0.0.1 80
real_server 172.16.0.11 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.16.0.12 80 {
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 3
}
}
}

建立基于IP地址虛擬主機(Apache)








測試:



12.keepalived調(diào)用腳本進行資源監(jiān)控
? keepalived調(diào)用外部的輔助腳本進行資源監(jiān)控,并根據(jù)監(jiān)控的結(jié)果狀態(tài)能實現(xiàn)優(yōu)先動態(tài)調(diào)整
? vrrp_script:自定義資源監(jiān)控腳本,vrrp實例根據(jù)腳本返回值,公共定義 ,可被多個實例調(diào)用,定義在vrrp實例之外
? track_script:調(diào)用vrrp_script定義的腳本去監(jiān)控資源,定義在實例之內(nèi) ,調(diào)用事先定義的vrrp_script
? 分兩步:(1) 先定義一個腳本;(2) 調(diào)用此腳本
vrrp_script <SCRIPT_NAME> {
script ""
interval INT
weight -INT
}
track_script {
SCRIPT_NAME_1
SCRIPT_NAME_2
}
13.KeepAlived實現(xiàn)Nginx高可用集群
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id node1
vrrp_mcast_group4 224.0.100.100
}
示例:高可用nginx服務
vrrp_script chk_down {
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"
interval 1
weight -20
}
vrrp_script chk_nginx {
script "killall -0 nginx && exit 0 || exit 1"
interval 1
weight -20
fall 2 #2次檢測失敗為失敗
rise 1 #1次檢測成功為成功
}
示例:高可用nginx服務
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 14
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 571f97b2
}
virtual_ipaddress {
172.18.0.93/16 dev eth0
}
track_script {
chk_down
chk_nginx
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
11:RS1 22:RS2 123:測試 107,108 前端調(diào)度器




啟用反向代理功能

