Linux集群架構
根據功能划分為兩大類:高可用和負載均衡
高可用集群通常為兩台服務器,一台工作,另外一台作為冗余,當提供服務的機器宕機,冗余將接替繼續提供服務
實現高可用的開源軟件有:heartbeat、keepalived
負載均衡集群,需要有一台服務器作為分發器,它負責把用戶的請求分發給后端的服務器處理,在這個集群里,除了分發器外,就是給用戶提供服務的服務器了,這些服務器數量至少為2
實現負載均衡的開源軟件有
LVS、keepalived、haproxy、nginx,商業的有F5、Netscaler
keepalived介紹
在這里我們使用keepalived來實現高可用集群,因為heartbeat在centos6上有一些問題,影響實驗效果
keepalived通過VRRP(Virtual Router Redundancy Protocl)來實現高可用。
在這個協議里會將多台功能相同的路由器組成一個小組,這個小組里會有1個master角色和N(N>=1)個backup角色。
master會通過組播的形式向各個backup發送VRRP協議的數據包,當backup收不到master發來的VRRP數據包時,就會認為master宕機了。此時就需要根據各個backup的優先級來決定誰成為新的mater。
Keepalived要有三個模塊,分別是core、check和vrrp。其中core模塊為keepalived的核心,負責主進程的啟動、維護以及全局配置文件的加載和解析,check模塊負責健康檢查,vrrp模塊是來實現VRRP協議的。
用keepalived配置高可用
准備兩台機器130和132,130作為master,132作為backup
兩台機器都執行
yum install -y keepalived
兩台機器都安裝nginx,其中130上已經編譯安裝過nginx,132上需要yum安裝nginx:
yum install -y nginx
設定vip為100
編輯130上keepalived配置文件,內容從
https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/master_keepalived.conf獲取
> /etc/keepalived/keepalived.conf
[root@131 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
}
notification_email_from
root@aminglinux.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh"
interval 3
}
vrrp_instance VI_1 {
state MASTER
interface eno16777736
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux>com
}
virtual_ipaddress {
192.168.0.100
}
track_script {
chk_nginx
}
}
130編輯監控腳本,內容從
https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/master_check_ng.sh獲取
vim /usr/local/sbin/check_ng.sh
#!/bin/bash
#時間變量,用於記錄日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#計算nginx進程數量
n=`ps -C nginx --no-heading|wc -l`
#如果進程為0,則啟動nginx,並且再次檢測nginx進程數量,
#如果還為0,說明nginx無法啟動,此時需要關閉keepalived
if [ $n -eq "0" ]; then
systemctl start nginx
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
給腳本755權限
systemctl start keepalived 130啟動服務
測試:
[root@131 sbin]# systemctl stop nginx
[root@131 sbin]# ps aux|grep nginx
root 18517 0.0 0.0 112644 952 pts/0 R+ 01:17 0:00 grep --color=auto nginx
[root@131 sbin]# ps aux|grep nginx
root 18518 0.0 0.1 122880 2100 ? Ss 01:17 0:00 nginx: master process /usr/sbin/nginx
nginx 18519 0.0 0.1 123344 3120 ? S 01:17 0:00 nginx: worker process
root 18524 0.0 0.0 112644 952 pts/0 R+ 01:17 0:00 grep --color=auto nginx
主上 關閉 nginx服務后 會自動拉起 nginx 服務
用keepalived配置高可用
132上編輯配置文件,內容從
https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/backup_keepalived.conf獲取
[root@132 ~]# > /etc/keepalived/keepalived.conf
[root@132 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
}
notification_email_from
root@aminglinux.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh"
interval 3
}
vrrp_instance VI_1 {
state BACKUP
interface eno16777736
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux>com
}
virtual_ipaddress {
192.168.0.100
}
track_script {
chk_nginx
}
}
132上編輯監控腳本,內容從
https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/backup_check_ng.sh獲取
vim /usr/local/sbin/check_ng.sh
#時間變量,用於記錄日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#計算nginx進程數量
n=`ps -C nginx --no-heading|wc -l`
#如果進程為0,則啟動nginx,並且再次檢測nginx進程數量,
#如果還為0,說明nginx無法啟動,此時需要關閉keepalived
if [ $n -eq "0" ]; then
systemctl start nginx
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
給腳本755權限
132上也啟動服務
systemctl start keepalived
測試高可用
先確定好兩台機器上nginx差異,比如可以通過curl -I 來查看nginx版本
測試1:關閉master上的nginx服務
測試2:在master上增加iptabls規則
iptables -I OUTPUT -p vrrp -j DROP
測試3:關閉master上的keepalived服務
[root@131 html]#
systemctl stop keepalived
[root@131 html]# ps aux|grep keep
root 30693 0.0 0.0 112644 952 pts/0 R+ 02:57 0:00 grep --color=auto keep
[root@131 html]# curl 192.168.0.100
this is a slave site.
虛擬ip 192.168.0.100 出現在從上
[root@132 html]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:2f:94:cf brd ff:ff:ff:ff:ff:ff
inet 192.168.0.132/24 brd 192.168.0.255 scope global eno16777736
valid_lft forever preferred_lft forever
inet
192.168.0.100/32 scope global eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe2f:94cf/64 scope link
valid_lft forever preferred_lft forever
測試4:啟動master上的keepalived服務
[root@131 html]#
systemctl start keepalived
[root@131 html]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:48:59:eb brd ff:ff:ff:ff:ff:ff
inet 192.168.0.131/24 brd 192.168.0.255 scope global eno16777736
valid_lft forever preferred_lft forever
inet
192.168.0.100/32 scope global eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe48:59eb/64 scope link
valid_lft forever preferred_lft forever
[root@131 html]# curl 192.168.0.100
this is a master nginx site
主上重新啟動 keepalived 服務后,虛擬 ip 192.168.0.100 又恢復到 主上面
負載均衡集群介紹
主流開源軟件LVS、keepalived、haproxy、nginx等
其中LVS屬於4層(網絡OSI 7層模型),nginx屬於7層,haproxy既可以認為是4層,也可以當做7層使用
keepalived的負載均衡功能其實就是lvs
lvs這種4層的負載均衡是可以分發除80外的其他端口通信的,比如MySQL的,而nginx僅僅支持http,https,mail,haproxy也支持MySQL這種
相比較來說,LVS這種4層的更穩定,能承受更多的請求,而nginx這種7層的更加靈活,能實現更多的個性化需求
LVS介紹
LVS是由國人章文嵩開發
流行度不亞於apache的httpd,基於TCP/IP做的路由和轉發,穩定性和效率很高
LVS最新版本基於Linux內核2.6,有好多年不更新了
LVS有三種常見的模式:NAT、DR、IP Tunnel
LVS架構中有一個核心角色叫做分發器(Load balance),它用來分發用戶的請求,還有諸多處理用戶請求的服務器(Real Server,簡稱rs)
LVS NAT模式


這種模式借助iptables的nat表來實現
用戶的請求到分發器后,通過預設的iptables規則,把請求的數據包轉發到后端的rs上去
rs需要設定網關為分發器的內網ip
用戶請求的數據包和返回給用戶的數據包全部經過分發器,所以分發器成為瓶頸
在nat模式中,只需要分發器有公網ip即可,所以比較節省公網ip資源
LVS IP Tunnel模式


這種模式,需要有一個公共的IP配置在分發器和所有rs上,我們把它叫做vip
客戶端請求的目標IP為vip,分發器接收到請求數據包后,會對數據包做一個加工,會把目標IP改為rs的IP,這樣數據包就到了rs上
rs接收數據包后,會還原原始數據包,這樣目標IP為vip,因為所有rs上配置了這個vip,所以它會認為是它自己
LVS DR模式


這種模式,也需要有一個公共的IP配置在分發器和所有rs上,也就是vip
和IP Tunnel不同的是,它會把數據包的MAC地址修改為rs的MAC地址
rs接收數據包后,會還原原始數據包,這樣目標IP為vip,因為所有rs上配置了這個vip,所以它會認為是它自己
LVS調度算法
輪詢 Round-Robin rr
加權輪詢 Weight Round-Robin wrr
最小連接 Least-Connection lc
加權最小連接 Weight Least-Connection wlc
基於局部性的最小連接 Locality-Based Least Connections lblc
帶復制的基於局部性最小連接 Locality-Based Least Connections with Replication lblcr
目標地址散列調度 Destination Hashing dh
源地址散列調度 Source Hashing sh
NAT模式搭建 – 准備工作
三台機器
分發器,也叫調度器(簡寫為dir)
內網:133.130,外網:147.144(vmware僅主機模式)
rs1
內網:133.132
rs2
內網:133.133
三台機器
分發器,也叫調度器(簡寫為dir)
內網:133.130,外網:142.147(vmware僅主機模式)
rs1
內網:133.132,設置網關為133.130
rs2
內網:133.133,設置網關為133.130
三台機器上都執行執行
systemctl stop firewalld; systemc disable firewalld
systemctl start iptables-services; iptables -F; service iptables save
在dir上安裝ipvsadm
yum install -y ipvsadm
在dir上編寫腳本,vim /usr/local/sbin/lvs_nat.sh//內容如下
#! /bin/bash
# director 服務器上開啟路由轉發功能
echo 1 > /proc/sys/net/ipv4/ip_forward
# 關閉icmp的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
# 注意區分網卡名字,阿銘的兩個網卡分別為ens33和ens37
echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects
# director 設置nat防火牆
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.133.0/24 -j MASQUERADE
# director設置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.147.144:80 -s wlc -p 3
$IPVSADM -a -t 192.168.147.144:80 -r 192.168.133.132:80 -m -w 1
$IPVSADM -a -t 192.168.147.144:80 -r 192.168.133.133:80 -m -w 1
sh /usr/local/sbin/lvs_nat.sh 執行下腳本
NAT模式效果測試
兩台rs上都安裝nginx
設置兩台rs的主頁,做一個區分,也就是說直接curl兩台rs的ip時,得到不同的結果
瀏覽器里訪問192.168.142.147,多訪問幾次看結果差異
[root@131 sbin]# sh lvs_nat.sh
[root@131 sbin]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.142.128:80 rr
-> 192.168.0.132:80 Masq 1 1 0
-> 192.168.0.133:80 Masq 1 0 1
[root@131 sbin]# !curl
curl 192.168.142.128
this is 133 site
[root@131 sbin]# curl 192.168.142.128
this is a slave site.
[root@131 sbin]# curl 192.168.142.128
this is 133 site
[root@131 sbin]# curl 192.168.142.128
this is a slave site.
[root@131 sbin]# curl 192.168.142.128
this is 133 site
DR模式搭建 – 准備工作
三台機器
分發器,也叫調度器(簡寫為dir)
133.130
rs1
133.132
rs2
133.133
vip
133.200
DR模式搭建
dir上編寫腳本
vim /usr/local/sbin/lvs_dr.sh //內容如下
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/usr/sbin/ipvsadm
vip=192.168.133.200
rs1=192.168.133.132
rs2=192.168.133.133
#注意這里的網卡名字
ifdown ens33
ifup ens33
ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev ens33:2
$ipv -C
$ipv -A -t $vip:80 -s wrr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
兩台rs上也編寫腳本
vim /usr/local/sbin/lvs_rs.sh//內容如下
#/bin/bash
vip=192.168.133.200
#把vip綁定在lo上,是為了實現rs直接把結果返回給客戶端
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作為更改arp內核參數,目的是為了讓rs順利發送mac地址給客戶端
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
分別在dir上和兩個rs上執行這些腳本
測試
再開啟一台linux 服務器 用 curl來測試
[root@centos6 ~]# curl 192.168.0.200
this is 133 site
[root@centos6 ~]# curl 192.168.0.200
this is a slave site.
[root@centos6 ~]# curl 192.168.0.200
this is 133 site
[root@centos6 ~]# curl 192.168.0.200
this is a slave site.
[root@centos6 ~]# curl 192.168.0.200
this is 133 site
[root@centos6 ~]# curl 192.168.0.200
this is a slave site.
[root@centos6 ~]# curl 192.168.0.200
this is 133 site
Keepalived+LVS DR
完整架構需要兩台服務器(角色為dir)分別安裝keepalived軟件,目的是實現高可用,但keepalived本身也有負載均衡的功能,所以本次實驗可以只安裝一台keepalived
keepalived內置了ipvsadm的功能,所以不需要再安裝ipvsadm包,也不用編寫和執行那個lvs_dir的腳本
三台機器分別為:
dir(安裝keepalived)133.130
rs1 133.132
rs2 133.133
vip 133.200
編輯keepalived配置文件
vim /etc/keepalived/keepalived.conf//內容請到https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/lvs_keepalived.conf 獲取
需要更改里面的ip信息
vrrp_instance VI_1 {
#備用服務器上為 BACKUP
state MASTER
#綁定vip的網卡為ens33,你的網卡和阿銘的可能不一樣,這里需要你改一下
interface eno16777736
virtual_router_id 51
#備用服務器上為90
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux
}
virtual_ipaddress {
192.168.0.200
}
}
virtual_server 192.168.0.200 80 {
#(每隔10秒查詢realserver狀態)
delay_loop 10
#(lvs 算法)
lb_algo wlc
#(DR模式)
lb_kind DR
#(同一IP的連接60秒內被分配到同一台realserver)
persistence_timeout 0
#(用TCP協議檢查realserver狀態)
protocol TCP
real_server 192.168.0.132 80 {
#(權重)
weight 100
TCP_CHECK {
#(10秒無響應超時)
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.0.133 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
執行ipvsadm -C 把之前的ipvsadm規則清空掉
systemctl restart network 可以把之前的vip清空掉
兩台rs上,依然要執行/usr/local/sbin/lvs_rs.sh腳本
keepalived有一個比較好的功能,可以在一台rs宕機時,不再把請求轉發過去
測試
[root@centos6 ~]# curl 192.168.0.200
this is 133 site
[root@centos6 ~]# curl 192.168.0.200
this is a slave site.
[root@centos6 ~]# curl 192.168.0.200
this is 133 site
[root@centos6 ~]# curl 192.168.0.200
this is a slave site.
若關閉 rs2
測試:
[root@centos6 ~]# curl 192.168.0.200
this is a slave site.
[root@centos6 ~]# curl 192.168.0.200
this is a slave site.
[root@centos6 ~]# curl 192.168.0.200
this is a slave site.
[root@centos6 ~]# curl 192.168.0.200
this is a slave site.
[root@centos6 ~]# curl 192.168.0.200
this is a slave site.