學習筆記0604----Linux集羣架構(一)

預習內容

18.1 集羣介紹
18.2 keepalived介紹
18.3/18.4/18.5 用keepalived配置高可用集羣
18.6 負載均衡集羣介紹
18.7 LVS介紹
18.8 LVS調度算法
18.9/18.10 LVS NAT模式搭建

1. 集羣介紹

高可用集羣通常爲兩臺服務器,一臺工作,另外一臺作爲冗餘,當提供服務的機器宕機,冗餘將接替繼續提供服務。集羣的特點:高性能(Performance)、價格有效(Cost-effectiveness)、可伸縮性(Scalability)、高可用性(Availability)、透明性(Traansparency)、可管理性(Manageability)、可編程性(Programmability)

根據功能劃分爲兩大類:高可用和負載均衡

  • 實現高可用的開源軟件有:heartbeat、keepalived

  • 負載均衡集羣,需要有一臺服務器作爲分發器,它負責把用戶的請求分發給後端的服務器處理,在這個集羣裏,除了分發器外,就是給用戶提供服務的服務器了,這些服務器數量至少爲2,實現負載均衡的開源軟件有LVS、keepalived、haproxy、nginx,商業的有F5、Netscaler

2. keepalived介紹

在這裏我們使用keepalived來實現高可用集羣,因爲heartbeat在centos6上有一些問題,影響實驗效果。

  • keepalived通過VRRP(VirtualRouterRedundancyProtocl)來實現高可用。在這個協議裏會將多臺功能相同的路由器組成一個小組,這個小組裏會有1個master角色N(N>=1)個backup角色。
  • master會通過組播的形式向各個backup發送VRRP協議的數據包,當backup收不master發來的VRRP數據包時,就會認爲master宕機了。此時就需要根據各個backup的優先級來決定誰成爲新的mater。
  • Keepalived要有三個模塊,分別是core、check和vrrp。其中core模塊爲keepalived的核心,負責主進程的啓動、維護以及全局配置文件的加載和解析,check模塊負責健康檢查,vrrp模塊是來實現VRRP協議的。

3. 用keepalived配置高可用集羣

  • 實驗環境:
  • 兩臺機器, 一臺IP爲:192.168.141.128 用作master ,另一臺IP爲:192.168.141.129 用作backup。
  • 兩臺服務器都已經安裝過nginx。

3.1 兩臺服務器分別安裝keepalived

[root@linux-001 ~]# yum instll -y keepalived
已加載插件:fastestmirror
沒有該命令:instll。請使用 /usr/bin/yum --help
[root@linux-001 ~]# yum install -y keepalived
已加載插件:fastestmirror
Repository base is listed more than once in the configuration
Repository updates is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
Determining fastest mirrors
epel/x86_64/metalink                                                                                          | 7.1 kB  00:00:00     
 * base: mirrors.cn99.com
 * epel: mirrors.tuna.tsinghua.edu.cn
 * extras: mirrors.cn99.com
 * updates: mirrors.zju.edu.cn
base                                                                                                          | 3.6 kB  00:00:00     
epel                                                                                                          | 5.3 kB  00:00:00     
extras                                                                                                        | 3.4 kB  00:00:00     
updates                                                                                                       | 3.4 kB  00:00:00     
(1/3): epel/x86_64/updateinfo                                                                                 | 977 kB  00:00:00     
(2/3): updates/7/x86_64/primary_db                                                                            | 5.0 MB  00:00:01     
(3/3): epel/x86_64/primary_db                                                                                 | 6.7 MB  00:00:05     
正在解決依賴關係
--> 正在檢查事務
---> 軟件包 keepalived.x86_64.0.1.3.5-8.el7_6 將被 安裝
--> 正在處理依賴關係 libnetsnmpmibs.so.31()(64bit),它被軟件包 keepalived-1.3.5-8.el7_6.x86_64 需要
--> 正在處理依賴關係 libnetsnmpagent.so.31()(64bit),它被軟件包 keepalived-1.3.5-8.el7_6.x86_64 需要
--> 正在處理依賴關係 libnetsnmp.so.31()(64bit),它被軟件包 keepalived-1.3.5-8.el7_6.x86_64 需要
--> 正在檢查事務
---> 軟件包 net-snmp-agent-libs.x86_64.1.5.7.2-37.el7 將被 安裝
---> 軟件包 net-snmp-libs.x86_64.1.5.7.2-37.el7 將被 安裝
--> 解決依賴關係完成

依賴關係解決

=====================================================================================================================================
 Package                                架構                      版本                              源                          大小
=====================================================================================================================================
正在安裝:
 keepalived                             x86_64                    1.3.5-8.el7_6                     updates                    329 k
爲依賴而安裝:
 net-snmp-agent-libs                    x86_64                    1:5.7.2-37.el7                    base                       705 k
 net-snmp-libs                          x86_64                    1:5.7.2-37.el7                    base                       749 k

事務概要
=====================================================================================================================================
安裝  1 軟件包 (+2 依賴軟件包)

總下載量:1.7 M
安裝大小:6.0 M
Downloading packages:
(1/3): net-snmp-agent-libs-5.7.2-37.el7.x86_64.rpm                                                            | 705 kB  00:00:00     
(2/3): net-snmp-libs-5.7.2-37.el7.x86_64.rpm                                                                  | 749 kB  00:00:00     
(3/3): keepalived-1.3.5-8.el7_6.x86_64.rpm                                                                    | 329 kB  00:00:00     
-------------------------------------------------------------------------------------------------------------------------------------
總計                                                                                                 1.8 MB/s | 1.7 MB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在安裝    : 1:net-snmp-libs-5.7.2-37.el7.x86_64                                                                              1/3 
  正在安裝    : 1:net-snmp-agent-libs-5.7.2-37.el7.x86_64                                                                        2/3 
  正在安裝    : keepalived-1.3.5-8.el7_6.x86_64                                                                                  3/3 
  驗證中      : 1:net-snmp-libs-5.7.2-37.el7.x86_64                                                                              1/3 
  驗證中      : keepalived-1.3.5-8.el7_6.x86_64                                                                                  2/3 
  驗證中      : 1:net-snmp-agent-libs-5.7.2-37.el7.x86_64                                                                        3/3 

已安裝:
  keepalived.x86_64 0:1.3.5-8.el7_6                                                                                                  

作爲依賴被安裝:
  net-snmp-agent-libs.x86_64 1:5.7.2-37.el7                            net-snmp-libs.x86_64 1:5.7.2-37.el7                           

完畢!
[root@linux-001 ~]# 

3.2 master端進行設置

3.2.1 修改 keepalived 配置文件

[root@linux-001 ~]# mv /etc/keepalived/keepalived.conf    /etc/keepalived/keepalived.conf.bak
[root@linux-001 ~]# vim /etc/keepalived/keepalived.conf

global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_nginx {
    script "/usr/local/sbin/check_nginx.sh"
    interval 3
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.141.100
    }
    track_script {
        chk_nginx
    }
}

3.2.2 定義監控nginx的腳本

[root@linux-001 ~]# vim /usr/local/sbin/check_nginx.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

[root@linux-001 ~]# chmod 755 /usr/local/sbin/check_ng.sh 

3.2.3 啓動keepalived服務

爲了做實驗,啓動keepalived服務的時候,關閉防火牆firewalld,iptables規則清空,selinux也關閉。

[root@linux-001 ~]# getenforce 
Disabled
[root@linux-001 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 3866   15M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
    1    84 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
    1    52 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
   26  4211 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 3102 packets, 234K bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@linux-001 ~]# iptables -F
[root@linux-001 ~]# systemctl stop firewalld


[root@linux-001 ~]# /etc/init.d/nginx start
Reloading systemd:                                         [  確定  ]
Starting nginx (via systemctl):                            [  確定  ]
[root@linux-001 ~]# !ps
ps aux | grep nginx
root       8150  0.0  0.0  20544   600 ?        Ss   03:33   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody     8154  0.0  0.0  20984  1060 ?        S    03:33   0:00 nginx: worker process
root       8160  0.0  0.0 112724   988 pts/0    R+   03:33   0:00 grep --color=auto nginx
[root@linux-001 ~]# systemctl start keepalived
[root@linux-001 ~]# ps aux |grep kee
root       7948  0.0  0.0 122980  1412 ?        Ss   03:31   0:00 /usr/sbin/keepalived -D
root       7949  0.0  0.1 133940  3328 ?        S    03:31   0:00 /usr/sbin/keepalived -D
root       7950  0.0  0.1 133812  2604 ?        S    03:31   0:00 /usr/sbin/keepalived -D
root       8269  0.0  0.0 112724   984 pts/0    S+   03:34   0:00 grep --color=auto kee

3.2.4 修改nginx啓動頁面

由於nginx沒有配置虛擬主機,使用的默認配置文件,網頁在nginx根目錄下的html目錄下。

[root@linux-001 ~]# cd /usr/local/nginx/html/
[root@linux-001 html]# mv index.html  index.html.bak
[root@linux-001 html]# vim index.html

THIS IS MASTER KEEPALVED!

3.3 backup端設置

3.3.1 修改 keepalived 配置文件

[root@linux-02 ~]# vim /etc/keepalived/keepalived.conf

global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_nginx {
    script "/usr/local/sbin/check_nginx.sh"
    interval 3
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 55  //在同一網段內virtual_router_id 值不能相同,如果相同會在messages中收到VRRP錯誤包 所以需要更改
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.141.100
    }
    track_script {
        chk_nginx
    }
}

3.3.2 定義監控nginx的腳本

[root@linux-02 ~]# !vim
vim /usr/local/sbin/check_nginx.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


[root@linux-02 ~]# chmod 755 /usr/local/sbin/check_ng.sh

3.3.3 啓動keepalived服務

[root@linux-02 ~]# systemctl stop firewalld
[root@linux-02 ~]# iptables -F
[root@linux-02 ~]# 
[root@linux-02 ~]# getenforce 
Disabled

[root@linux-02 ~]# systemctl start keepalived
[root@linux-02 ~]# ps aux |grep keep
root       7596  0.0  0.0 122980  1412 ?        Ss   03:55   0:00 /usr/sbin/keepalived -D
root       7597  0.0  0.1 133940  3316 ?        S    03:55   0:00 /usr/sbin/keepalived -D
root       7598  0.0  0.1 133812  2600 ?        S    03:55   0:00 /usr/sbin/keepalived -D
root       7644  0.0  0.0 112724   984 pts/0    R+   03:57   0:00 grep --color=auto keep

3.3.4 修改nginx默認虛擬主機


[root@linux-02 vhost]# vim /data/wwwroot/test.com/index.html 

THIS IS BACKUP DEEPALIVED !

3.4 測試頁面

3.4.1 master使用ens33 ip訪問

在這裏插入圖片描述

3.4.2 master使用虛擬vip測試訪問

在這裏插入圖片描述

3.4.3 backup端訪問頁面

在這裏插入圖片描述

3.5 master 停止keepalived

master端停止keepalived的服務,訪問vip地址測試,如下,我們可以查看到訪問192.168.141.100地址已經跳轉到backup機器上了。

在這裏插入圖片描述在這裏插入圖片描述
查看/var/log/message日誌
在這裏插入圖片描述

3.6 出問題的點

如果日誌中有以下的日誌說明在keepalived的配置文件中virtual_router_id的值設置有問題。在同一網段內virtual_router_id 值不能相同,如果相同會在messages中收到VRRP錯誤包,所以需要更改。
在這裏插入圖片描述

4. 負載均衡集羣介紹

  • 主流的負載均衡開源軟件:LVS、keepalived、haproxy、nginx等
  • keepalived的負載均衡功能其實就是lvs。
  • LVS屬於4層(網絡OSI7層模型),nginx屬於7層,haproxy即可以是4層,也可以是7層。LVS屬於4層(網絡OSI7層模型),nginx屬於7層,haproxy即可以是4層,也可以是7層。
  • lvs這種4層的負載均衡是可以分發除80外的其他端口通信,比如mysql,而nginx僅僅支持http、https、mail。
  • 4層和7層負載比較:
    • LVS4層的更穩定,能承受更多的請求
    • nginx 7層的更加靈活,能實現更多的個性化需要

4.1 網絡七層圖

在這裏插入圖片描述

5. lVS介紹

LVS:Linux Virtuer Server,即Linux虛擬服務器,是一個虛擬的服務器集羣系統,基於TCP/IP做的路由和轉發,穩定性和效率很高。本項目在1998年5月由章文嵩博士成立,是中國國內最早出現的開源軟件項目之一。

LVS集羣採用IP負載均衡技術和基於內容請求分發技術。調度器具有很好的吞吐率,將請求均衡地轉移到不同的服務器上執行,且調度器自動屏蔽掉服務器的故障,從而將一組服務器構成一個高性能的、高可用的虛擬服務器。整個服務器集羣的結構對客戶是透明的,而且無需修改客戶端和服務器端的程序。爲此,在設計時需要考慮系統的透明性、可伸縮性、高可用性和易管理性。

一般來說,LVS集羣採用三層結構
A、負載調度器(load balancer)或者叫分發器(Load Runner),它是整個集羣對外面的前端機,負責將客戶的請求發送到一組服務器上執行,而客戶認爲服務是來自一個IP地址(我們可稱之爲虛擬IP地址)上的。
B、服務器池(server pool),是一組真正執行客戶請求的服務器,執行的服務有WEB、MAIL、FTP和DNS等。
C、共享存儲(shared storage),它爲服務器池提供一個共享的存儲區,這樣很容易使得服務器池擁有相同的內容,提供相同的服務。

5.1 LVS NAT模式

在這裏插入圖片描述

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

5.2 LVS IP Tunnel模式

在這裏插入圖片描述

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

5.3 LVS DR模式

在這裏插入圖片描述

  • 這種模式,也需要有一個公共的IP配置在分發器和所有rs上,也就是vip
  • 和IP Tunnel不同的是,它會把數據包的MAC地址修改爲rs的MAC地址
  • rs接收數據包後,會還原原始數據包,這樣目標IP爲vip,因爲所有rs上配置了這個vip,所以它會認爲是它自己

6. LVS調度算法

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

7. LVS NAT模式搭建

7.1 準備工作

  • 準備三臺虛擬機

  • 三臺機器上都執行關閉防火牆firewalld,開啓iptables

    • systemctl stop firewalld; systemc disable firewalld
    • systemctl start iptables-services; iptables -F; service iptables save
  • 設置虛擬機的ip和網關

    • 分發器,也叫調度器(簡寫爲dir)內網:192.168.141.128,外網:192.168.23.88(vmware僅主機模式)
    • rs1 內網:192.168.141.129,設置網關爲 192.168.141.128
    • rs2 內網:192.168.141.130,設置網關爲 192.168.141.128

7.2 dir 端安裝ipvsadm

使用的源碼安裝,下載地址:http://www.linuxvirtualserver.org/software/ipvs.html

[root@linux-001 ~]# yum -y install popt popt-devel libnl libnl-devel popt-static
安裝省略

[root@linux-001 ~]# cd /usr/local/src/  
tar -zxvf ipvsadm-1.26.tar.gz

[root@linux-001 src]#  mv ipvsadm-1.26  /usr/local/ipvsadm

[root@linux-001 src]#  cd !$
cd /usr/local/ipvsadm

[root@linux-001 ipvsadm]#  make && make install
安裝省略

ipvsadm工具常用的參數選項有:

-A --add-service添加一條新的虛擬服務
-E --edit-service編輯虛擬服務
-D --delete-service刪除虛擬服務
-C --clear清除所有的虛擬服務規則
-R --restore恢復虛擬服務規則
-a --add-server在一個虛擬服務中添加一個新的真實服務器
-e --edit-server編輯某個真實服務器
-d --delete-server刪除某個真實服務器
-L | -l --list顯示內核中的虛擬服務規則
-n --numeric以數字形式顯示IP端口
-c --connection顯示ipvs中目前存在的連接,也可以用於分析調度情況
-Z --zero將轉發消息的統計清零
-p --persistent配置持久化時間
–set tcp tcpfin udp配置三個超時時間(tcp/tcpfin/udp)
-t | -uTCP/UDP協議的虛擬服務
-g | -m | -iLVS模式爲:DR | NAT | TUN
-w 配置真實服務器的權重
-s 配置負載均衡算法,如:rr, wrr, lc等
–timeout 顯示配置的tcp/tcpfin/udp超時時間
–stats 顯示歷史轉發消息統計(累加值)
–rate 顯示轉發速率信息(瞬時值)

7.3 編寫腳本

[root@linux-001 ipvsadm]# 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.141.0/24  -j MASQUERADE
# director設置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.23.88:80 -s rr
$IPVSADM -a -t 192.168.23.88:80 -r 192.168.141.129:80 -m -w 1
$IPVSADM -a -t 192.168.23.88:80 -r 192.168.141.130:80 -m -w 1


7.4 測試結果

[root@linux-001 ipvsadm]# sh  /usr/local/sbin/lvs_nat.sh 
[root@linux-001 ipvsadm]# curl 192.168.23.88
linux-003
[root@linux-001 ipvsadm]# curl 192.168.23.88
linux-002
[root@linux-001 ipvsadm]# curl 192.168.23.88
linux-003
[root@linux-001 ipvsadm]# curl 192.168.23.88
linux-002
[root@linux-001 ipvsadm]# curl 192.168.23.88
linux-003
[root@linux-001 ipvsadm]# 

課後總結

1. 集羣以及分類

高可用(雙機熱備)
負載均衡
分佈式集羣

2 高可用架構的意義

高可用可以保證業務的穩定性

3 Keepalived的實現原理

VRRP協議
https://blog.csdn.net/u013920085/article/details/21184143

4 LVS 三種模式圖解

  • nat模式適用於局域網,使用一臺雙網卡的服務器做iptables設置,其他局域網內的電腦通過iptables可以訪問外網。

  • DR模式適用於局域網,只不過是通過mac地址尋址。分發服務期只需要接收到來源的數據傳輸給rs,rs處理好數據發送給源地址客戶端

  • IP Tunnel模式是和dr類似,只不過是rs端設置一個vip地址

http://blog.51cto.com/jiekeyang/1839583

5 fullnat模式

  • fullnat模式使用與廣域網,不限制與局域網,通過在分發器設置dnat和snat,發送給rs。

https://ieevee.com/tech/2015/12/08/fullnat.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章