叢集介紹、keepalived介紹、用keepalived配置高可用叢集、負載均衡叢集介紹、LVS介紹 、LVS排程演算法、LVS NAT模式搭建
一、叢集介紹
Linux叢集根據功能劃分為兩大類:高可用和負載均衡。
高可用叢集
高可用叢集通常為2臺伺服器,一臺工作,另一臺作為冗餘,當提供服務的機器宕機時,冗餘將接替繼續提供服務。
實現高可用的開源軟體有:heartbeat、Keepalived,其中heartbeat已無人維護,所以今後使用Keepalived來搭建高可用叢集。
負載均衡叢集
負載均衡叢集,需要有1臺伺服器作為分發器,它負責把使用者的請求分發給後端的伺服器處理,在這個叢集裡, 除了分發器外就是給使用者提供服務的伺服器了,這些伺服器數量至少為2臺,所以負載均衡叢集至少要3臺伺服器。 實現負載均衡的開源軟體有:LVS、Keepalived、haproxy、nginx;商業軟體有:F5、Netscaler。
二、 Keepalived介紹
Keepalived通過VRRP(virtual router redundancy protocol)虛擬路由冗餘協議來實現高可用。 在這個協議裡會將多臺功能相同的路由器組成一個小組,這個小組會有1個master角色和N(N≥1)個backup角色。
Keepalived有三個模組:core、check、vrrp。其中core模組為Keepalived的核心,負責主程序的啟動、維護以及全域性配置檔案的載入和解析;check模組負責健康檢查,vrrp負責實現vrrp協議。
三、用keepalived配置高可用叢集
1、準備兩臺機器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) 130編輯監控指令碼,(https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/master_check_ng.sh) 給指令碼755許可權 systemctl start keepalived 130啟動服務 132上編輯配置檔案,(https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/backup_keepalived.conf) 132上編輯監控指令碼,(https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/backup_check_ng.sh) 給指令碼755許可權 132上也啟動服務 systemctl start keepalived
首先準備兩臺機器,都安裝keepalived
keepalived,實際是包含一個服務的,也就是說這個服務用來實現高可用
yum install -y keepalive
2、這裡使用 nginx ,把它作為一個高可用的物件——>使用nginx作為演示物件的原因,因為nginx在工作中,在生產環境中,很多企業把nginx做一個負載均衡器
假設nginx一旦掛掉,那麼後端所有的web,即使說是正常的,那也無法訪問到
3、若是A、B機器沒有裝nginx服務,可以直接 yum安裝
若是lnmp安裝過nginx,則不需要安裝了(原始碼包安裝的nginx)
直接yum安裝的nginx,兩者很容易區分(PS:有時直接yum安裝不了,需要安裝yum擴充套件源——>yum install -y epel-release)
yum install -y epel-release
yum install -y nginx
systemctl start nginx
ps aux |grep nginx
預設的配置檔案路徑在/etc/keepalived/keepalived.conf
清空檔案的快捷鍵方法 > !$
A機器更改配置檔案
[[email protected] ~]# ls /etc/keepalived/keepalived.conf
/etc/keepalived/keepalived.conf
[[email protected] ~]# > !$ //直接清空檔案內容了
> /etc/keepalived/keepalived.conf
[[email protected] ~]# cat /etc/keepalived/keepalived.conf
[[email protected] ~]# vim /etc/keepalived/keepalived.conf //去檔案地址去下載內容
將拷貝的內容複製進去
只需要改網絡卡名字和飄逸IP為192.168.133.100
####################### # 全域性配置 #######################
global_defs { //global_defs 全域性配置標識
notification_email { //notification_email用於設定報警郵件地址
[email protected] //可以設定多個,每行一個
}
notification_email_from [email protected] //設定郵件傳送地址
smtp_server 127.0.0.1 //設定郵件的smtp server地址
smtp_connect_timeout 30 //設定連線smtp sever超時時間
router_id LVS_DEVEL
}
###################### # VRRP配置 ######################
vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh" //檢查服務是否正常,通過寫指令碼實現,指令碼檢查服務健康狀態
interval 3 //檢查的時間間斷是3秒
}
vrrp_instance VI_1 { //VRRP配置標識 VI_1是例項名稱
state MASTER //定義master相關
interface eno16777736 //通過vrrp協議去通訊、去發廣播。配置時,需注意自己的網絡卡名稱
virtual_router_id 51 //定義路由器ID ,配置的時候和從機器一致
priority 100 //權重,主角色和從角色的權重是不同的
advert_int 1 //設定MASTER與BACKUP主機質檢同步檢查的時間間隔,單位為秒
authentication { //認證相關資訊
auth_type PASS //這裡認證的型別是PASS
auth_pass aminglinux>com //密碼的形式是一個字串
}
virtual_ipaddress { //設定虛擬IP地址 (VIP),又叫做漂移IP地址
192.168.74.100 //更改為192.168.74.100
}
track_script { //載入指令碼
chk_nginx
}
}
儲存退出
virtual_ipaddress:簡稱VIP,這個vip,兩臺機器,一個主,一個從,正常的情況是主在服務,主宕掉了,從起來了,從啟動服務,從啟動nginx以後,,啟動以後,訪問那個IP呢?把域名解析到那個IP上呢?假如解析到主上,主宕掉了,所以這個,需要定義一個公有IP(主上用的IP,從上也用的IP);這個IP是隨時可以夏掉,去配置的
5、定義監控指令碼
指令碼路徑在keepalived配置檔案中有定義,路徑為/usr/local/sbin/check_ng.sh
A機器定義監控指令碼
[[email protected] ~]# 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
/etc/init.d/nginx start
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
儲存退出
“腦裂”,在高可用(HA)系統中,當聯絡2個節點的“心跳線”斷開時,本來為一整體、動作協調的HA系統,就分裂成為2個獨立的個體。由於相互失去了聯絡,都以為是對方出了故障。兩個節點上的HA軟體像“裂腦人”一樣,爭搶“共享資源”、爭起“應用服務”,就會發生嚴重後果——或者共享資源被瓜分、2邊“服務”都起不來了;或者2邊“服務”都起來了,但同時讀寫“共享儲存”,導致資料損壞
如何判斷腦裂?
分別在兩臺機檢視當前伺服器是否擁有虛擬IP,如果兩臺伺服器都擁有,則說明發生了腦裂,
證明目前雙機通訊出現問題,產生此問題的原有在於 兩臺伺服器都探測不到組內其他伺服器的狀態(心跳請求無法正常響應),
私自判定另一臺伺服器掛起,則搶佔虛擬IP,腦裂的出現是不被允許的,解決此問題的方法為檢查防火牆設定(關閉防火牆)或者使用串列埠通訊。
6、指令碼建立完之後,還需要改變指令碼的許可權(不更改許可權,就無法自動載入指令碼,那就無法啟動keepalived服務)
chmod 755 /usr/local/sbin/check_ng.s
7、啟動keepalived服務,並檢視是否啟動成功(PS:啟動不成功,有可能是防火牆未關閉或者規則限制導致的)
systemctl stop firewalld 關閉firewalld
iptables -nvL
setenforce 0 臨時關閉selinux
getenforce命令檢視是否為Permissive
這時再來啟動keepalived,就會看到keepalived程序服務了
[[email protected] ~]#systemctl start keepalived
[[email protected] ~]# ps aux |grep keepalived
root 2970 0.0 0.1 121324 1404 ? Ss 07:14 0:00 /usr/sbin/keepalived -D
root 2971 0.0 0.2 123396 2356 ? S 07:14 0:00 /usr/sbin/keepalived -D
root 2972 0.0 0.2 123396 2384 ? S 07:14 0:00 /usr/sbin/keepalived -D
root 2974 0.0 0.0 112672 988 pts/1 R+ 07:14 0:00 grep --color=auto keepalived
8、檢視nginx服務程序
ps aux |grep nginx
root 3004 0.0 0.2 123372 2108 ? Ss 07:18 0:00 nginx: master process /usr/sbin/nginx
nginx 3005 0.0 0.3 123836 3148 ? S 07:18 0:00 nginx: worker process
root 3007 0.0 0.0 112672 984 pts/1 R+ 07:19 0:00 grep --color=auto nginx
9、停止nginx服務 /etc/init.d/nginx stop
[[email protected] ~]# /etc/init.d/nginx stop
Stopping nginx (via systemctl):
10、再來檢視nginx服務程序,會看到自動載入
ps aux |grep nginx
root 6238 0.0 0.0 20996 628 ? Ss 08:07 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody 6242 0.0 0.3 23440 3212 ? S 08:07 0:00 nginx: worker process
nobody 6243 0.0 0.3 23440 3212 ? S 08:07 0:00 nginx: worker process
root 6263 0.0 0.0 112676 980 pts/0 R+ 08:07 0:00 grep --color=auto nginx
11、keepalived日誌檔案路徑
/var/log/messages
12、檢視ip地址,使用 ip add 命令,而不能使用ifconfig命令,因為 ifconfig命令 是無法檢視到vip192.168.133.100這個IP的
[[email protected] ~]# ip add
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:c7:05:28 brd ff:ff:ff:ff:ff:ff
inet 192.168.74.130/24 brd 192.168.74.255 scope global dynamic eno16777736
valid_lft 1158sec preferred_lft 1158sec
inet 192.168.133.100/32 scope global eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fec7:528/64 scope link
valid_lft forever preferred_lft forever
13、檢查A、B 機器下防火牆和selinux是否關閉了,若沒有關閉,可能會導致實驗失敗
systemctl stop firewalld 關閉firewalld
iptables -nvL
setenforce 0 臨時關閉selinux
getenforce命令檢視是否為Permissive
以上就是主機器A的配置
backup 機器配置 1、在B機器yum安裝nginx和keepalived
yum install -y epel-release
yum install -y nginx
2、關閉B機器的防火牆和selinux
iptables -F 清空規則
setenforce 0 臨時關閉selinux
3、自定義B機器keepalived配置檔案
首先清空B機器keepalived裡面自帶的配置檔案
[[email protected] ~]# > /etc/keepalived/keepalived.conf
[[email protected] ~]# cat !$
cat /etc/keepalived/keepalived.conf
[[email protected] ~]#
然後複製配置檔案並貼上進去,更改虛擬IP和主一樣的
[[email protected] ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
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 //這裡 和master不一樣的名字
interface eno16777736 //網絡卡和當前機器一致,否則無法啟動keepalived服務
virtual_router_id 51 //和主機器 保持一致
priority 90 //權重,要比主機器小的數值
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux>com
}
virtual_ipaddress {
192.168.74.100 //這裡更改為192.168.74.100
}
track_script {
chk_nginx
}
}
儲存退出
4、定義監控指令碼,路徑在keepalived裡面已定義過
這個指令碼和主上的指令碼有一點區別,啟動nginx的命令不同,因為一個是yum安裝,一個是原始碼包安裝
[[email protected] ~]# 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
儲存退出
5、改動指令碼的許可權,設定為755許可權
chmod 755 /usr/local/sbin/check_ng.sh
6、B機器啟動keepalived服務
systemctl start keepalived
[[email protected] ~]# systemctl start keepalived
[[email protected]~]# ps aux |grep keep
root 2814 0.0 0.1 121324 1396 ? Ss 07:10 0:00 /usr/sbin/keepalived -D
root 2815 0.0 0.2 121324 2740 ? S 07:10 0:00 /usr/sbin/keepalived -D
root 2816 0.0 0.2 121324 2324 ? S 07:10 0:00 /usr/sbin/keepalived -D
root 2827 0.0 0.0 112672 980 pts/0 R+ 07:10 0:00 grep --color=auto keep
如何區分主和從上的nginx?
A機器,是原始碼包安裝的nginx(PS:這是lnmp配置好的環境虛擬主機內容)
[[email protected] ~]# cat /usr/local/nginx/conf/vhost/aaa.com.conf
server
{
listen 80 default_server;
server_name aaa.com;
index index.html index.htm index.php;
root /data/wwwroot/default;
location ~ \.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/champ.sock;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name;
}
}
[[email protected] ~]# cat /data/wwwroot/default/index.html
This is the default sete.
[[email protected] ~]# vim /data/wwwroot/default/index.html
B機器是yum安裝的nginx
預設的索引頁在 /usr/share/nginx/html/index.html
四、負載均衡叢集介紹
實現負載均衡叢集的軟體有:LVS、Keepalived、Nginx、haproxy等。其中LVS屬於四層(網路OSI模型);Nginx屬於七層;
haproxy既可以認為是四層,也可以當做是七層使用。
LVS、haproxy這種四層負載均衡可以分發除80埠以外的通訊,如MySQL-3306;而Nginx僅僅支援http,https,mail。
相對來說,LVS這種四層的更加穩定,能承受更多的請求,而Nginx這種七層的更加靈活,能實現更多的個性化需求。
五、LVS介紹
LVS是基於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 # 輪詢演算法,均衡的將使用者請求分發到每一個rs上
Weight Round-Robin wrr # 加權輪詢 ,帶權重的輪循,依照指定的權重比來分發請求
Least-Connection lc # 最小連線 ,將請求分發到連線數比較少的rs上
Weight Least-Connection wlc # 帶權重的最小連線,
Locality-Based Least Connections lblc # 基於區域性性的最小連線
Locality-Based Least Connections with Replication lblcr # 帶複製的基於區域性性最小連線
Destination Hashing dh # 目標地址雜湊排程
Source Hashing sh # 源地址雜湊排程
LVS相關術語
DS:Director Server。指的是前端負載均衡器節點。
RS:Real Server。後端真實的工作伺服器。
VIP:向外部直接面向用戶請求,作為使用者請求的目標的IP地址。
DIP:Director Server IP,主要用於和內部主機通訊的IP地址。
RIP:Real Server IP,後端伺服器的IP地址。
CIP:Client IP,訪問客戶端的IP地址。
七、LVS NAT模式搭建
網路準備,三臺機器。
分發器(排程器director) 內網:192.168.8.133 外網:192.168.75.128
real server1(real1) 內網:192.168.8.134 設定閘道器為: 192.168.8.133
real server2(real2) 內網:192.168.8.135 設定閘道器為: 192.168.8.133
防火牆
關閉系統防火牆:
[[email protected] ~]# systemctl stop firewalld
[[email protected] ~]# systemctl disable firewalld
關閉SELinux:
[[email protected] ~]# setenforce 0
[[email protected] ~]# vim /etc/selinux/config
SELINUX=disabled
注: 分別在三臺機器進行上述操作。
以下操作在real1和real2中進行:
安裝iptables服務:
[[email protected] ~]#yum install -y iptables-services
設定iptables服務:
[[email protected] ~]# iptables -F
[[email protected] ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ 確定 ]
說明: 進行該設定的原因是NAT模式是基於防火牆nat表的一種模式,所以會使用iptables規則。
1、開始搭建
配置director:
安裝ipvsadm工具:
[[email protected] ~]# yum install -y ipvsadm
配置ipvsadm指令碼:
[[email protected] ~]# 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
# 注意區分網絡卡名字,adai的兩個網絡卡分別為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.8.0/24 -j MASQUERADE
# director設定ipvsadm規則
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
#-C=clear,清除規則
$IPVSADM -A -t 192.168.75.128:80 -s rr
#-A:=add,新增規則;-t:=tcp;-s 指定演算法;
#在此可以新增-p:指定超時時間(解決session問題:保證同一請求被分發到同一rs上)
#因為新增-p選項後會影響測試效果,所以在此不加該引數(注:時間不能設定為0)
$IPVSADM -a -t 192.168.75.128:80 -r 192.168.8.134:80 -m -w 1
$IPVSADM -a -t 192.168.75.128:80 -r 192.168.8.135:80 -m -w 1
#-a:=add,增加nat架構中的rs;-r:指定rs的IP;-m:指定LVS模式為NAT(masquerade)
#-w:=weight,指定權重
執行該指令碼:
[[email protected] ~]# sh /usr/local/sbin/lvs_nat.sh
#注:執行該指令碼時無錯誤輸出說明沒問題。
檢視ipvsadm規則:
[[email protected] ~]# 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.75.128:80 rr
-> 192.168.8.134:80 Masq 1 1 3
-> 192.168.8.135:80 Masq 1 0 4
2、配置rs: 在兩臺rs上安裝Nginx,並分別設定其主頁用來區分兩臺機器。
[[email protected] ~]# yum install -y nginx
[[email protected] ~]# systemctl start nginx
編輯rs1主頁:
[[email protected] ~]# vim /usr/share/nginx/html/index.html
This is real server 1.
編輯rs2主頁:
[[email protected] ~]# vim /usr/share/nginx/html/index.html
This is real server 2.
3、測試
訪問公網IP:192.168.75.128。
[[email protected] ~]# curl 192.168.75.128
This is real server 2.
[[email protected] ~]# curl 192.168.75.128
This is real server 1.
[[email protected] ~]# curl 192.168.75.128
This is real server 2.
[[email protected] ~]# curl 192.168.75.128
This is real server 1.
[[email protected] ~]# curl 192.168.75.128
搭建成功