1. 程式人生 > >叢集介紹、keepalived介紹、用keepalived配置高可用叢集、負載均衡叢集介紹、LVS介紹 、LVS排程演算法、LVS NAT模式搭建

叢集介紹、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

搭建成功