linux集群架構


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
 
> /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
}
}
 
 
 
 
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配置高可用
 
 
[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
    }
}
 
 
 
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.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM