【0604】集羣架構、高可用、負載均衡(上)

18.1 集羣介紹html

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

  • 高可用集羣一般爲兩臺服務器,一臺工做,另一臺做爲冗餘,當提供服務的機器宕機,冗餘將接替繼續提供服務linux

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

  • 負載均衡集羣,須要有一臺服務器做爲分發器,它負責把用戶的請求分發給後端的服務器處理,在這個集羣裏,除了分發器外,就是給用戶提供服務的服務器了,這些服務器數量至少爲2算法

  • 實現負載均衡的開源軟件有 LVS、keepalived、haproxy、nginx,商業的有 F五、Netscalersql


18.2 keepalived介紹apache

  • 在這裏咱們使用 keepalived 來實現高可用集羣,由於 heartbeat 在 centos6 上有一些問題,影響實驗效果vim

  • keepalived經過 VRRP(Virtual Router Redundancy Protocl)來實現高可用。windows

  • 在這個協議裏會將多臺功能相同的路由器組成一個小組,這個小組裏會有1個 master 角色和N(N>=1)個backup角色。後端

  • master 會經過組播的形式向各個 backup 發送 VRRP 協議的數據包,當 backup 收不到master 發來的 VRRP 數據包時,就會認爲 master 宕機了。此時就須要根據各個 backup 的優先級來決定誰成爲新的 mater。

  • Keepalived 要有三個模塊,分別是 core、check 和 vrrp。其中 core 模塊爲 keepalived 的核心,負責主進程的啓動、維護以及全局配置文件的加載和解析,check 模塊負責健康檢查,vrrp 模塊是來實現 VRRP 協議的。


18.3/18.4/18.5 用keepalived配置高可用集羣

一、準備兩臺機器 130 和 132,130 爲 master,132 爲 backup

二、兩臺機器都安裝 keepalived

[root@arslinux-01 ~]# yum install -y keepalived
[root@arslinux-02 ~]# yum install -y keepalived

三、兩臺機器都須要安裝 nginx,130 以前已經編譯安裝過,132 須要 yum 安裝

[root@arslinux-02 ~]# yum install -y nginx

四、從新編輯主上的 /etc/keepalived/keepalived.conf

[root@arslinux-01 ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@arslinux-02 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
arslinux@arslinux.com
}
notification_email_from root@arslinux.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 ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux>com
}
virtual_ipaddress {
192.168.194.100
}
track_script {
chk_nginx
}
}

參考連接:http://note.youdao.com/noteshare?id=196f3a77c4d99a8c21286d50704690b9&sub=EEAC512A00D54B3B98BFCB6E0B67DE26


notification_email     有問題,發郵件給哪一個郵箱,能夠不定義

notification_email_from     有問題用哪一個郵箱發郵件,能夠不定義

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id LVS_DEVEL     均可以不定義

vrrp_script chk_nginx     檢測服務是否正常 interval 3 檢測間斷爲3秒

vrrp_instance VI_1     master相關的配置

state     角色是master,若是是從的話就是 backup

interface     發送廣播使用的網卡

virtual_router_id     路由id

priority 100     權重

authentication     認證相關信息

auth_type PASS 認證類型,密碼形式

auth_pass 密碼,定義一個字符串

virtual_ipaddress 主從共有ip,也就是vip,主宕機,從解析到該ip上去,兩個主機都194段

track_script 加載腳本,以前定義的chk_nginx檢查nginx


五、編輯檢查 nginx 是否正常的腳本

[root@arslinux-01 ~]# 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

執行ps -C nginx --no-heading|wc -l命令計算nginx進程數,若是進程數等於0,則說明nginx服務沒有啓動,那麼須要啓動nginx服務,啓動以後再查看進程數值,若是仍是0,說明nginx依然沒有啓動,那麼須要寫一個日期的錯誤提示到日誌裏,方便排查問題。以後中止keepalived,主keepalived一停,從就會自動起來服務,以避免主從都有keepalived啓動,產生紊亂,腦裂。

參考連接:https://note.youdao.com/ynoteshare1/index.html?id=17b7d082afd8d31b4fd5c48b5f93bcc1&type=note

六、給 /usr/local/sbin/check_ng.sh 更改權限 755

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

七、啓動 keepalived

[root@arslinux-01 ~]# systemctl start keepalived
[root@arslinux-01 ~]# ps aux|grep keepalived
root       8138  0.0  0.1 122980  1412 ?        Ss   22:43   0:00 /usr/sbin/keepalived -D
root       8139  0.0  0.3 133940  3328 ?        S    22:43   0:00 /usr/sbin/keepalived -D
root       8140  0.1  0.2 133880  2860 ?        S    22:43   0:00 /usr/sbin/keepalived -D
root       8174  0.0  0.0 112724   992 pts/0    R+   22:43   0:00 grep --color=auto keepalived

八、查看 nginx 是否會自動加載

[root@arslinux-01 ~]# ps aux|grep nginx
root       7988  0.0  0.1  46052  1292 ?        Ss   21:48   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody     7989  0.0  0.3  48540  3932 ?        S    21:48   0:00 nginx: worker process
nobody     7990  0.0  0.3  48540  3932 ?        S    21:48   0:00 nginx: worker process
root       8357  0.0  0.0 112724   988 pts/0    R+   22:45   0:00 grep --color=auto nginx
[root@arslinux-01 ~]# /etc/init.d/nginx stop
Stopping nginx (via systemctl):                            [  肯定  ]
[root@arslinux-01 ~]# ps aux|grep nginx
root       8395  0.0  0.0 112724   984 pts/0    S+   22:45   0:00 grep --color=auto nginx
[root@arslinux-01 ~]# ps aux|grep nginx
root       8417  0.0  0.1  46052  1296 ?        Ss   22:45   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody     8421  0.0  0.3  48540  3932 ?        S    22:45   0:00 nginx: worker process
nobody     8422  0.0  0.3  48540  3932 ?        S    22:45   0:00 nginx: worker process
root       8466  0.0  0.0 112724   988 pts/0    R+   22:46   0:00 grep --color=auto nginx

九、https://blog.51cto.com/11530642/2096227

十、日誌都在 /var/log/messages 下

十一、vip 不能用 ipconfig 查看,只能用 ip add 看到

[root@arslinux-01 ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:24:ea:f2 brd ff:ff:ff:ff:ff:ff
inet 192.168.194.130/24 brd 192.168.194.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.194.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.194.150/24 brd 192.168.194.255 scope global secondary noprefixroute ens33:0
valid_lft forever preferred_lft forever
inet6 fe80::c905:5e78:b916:41da/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:24:ea:fc brd ff:ff:ff:ff:ff:ff
inet 192.168.100.1/24 brd 192.168.100.255 scope global noprefixroute ens37
valid_lft forever preferred_lft forever
inet6 fe80::f41:9da7:d8e3:10ba/64 scope link noprefixroute
valid_lft forever preferred_lft forever

十二、配置以前,必定要檢查防火牆主從 iptables 和 getenforce 是否關閉

1三、編輯從上的配置文件 /etc/keepalived/keepalived.conf

[root@arslinux-02 ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@arslinux-02 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
aming@aminglinux.com
}
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 ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux>com
}
virtual_ipaddress {
192.168.194.100
}
track_script {
chk_nginx
}
}

參考連接:https://note.youdao.com/ynoteshare1/index.html?id=b12b72e89f72aca6896e4f250f7b4ce2&type=note


state         爲BACKUP

virtual_router_id,vip     都和主一致

priority         主是100,從是90,要低於主


1四、編輯檢查 nginx 是否正常的腳本

[root@arslinux-02 ~]# 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

若是nginx是yum 安裝的,能夠用systemctl start nginx爲啓動命令

參考連接:http://note.youdao.com/noteshare?id=abf23beadd51b4ec2a510b5e395f9d46&sub=C046236E7A14453FADEF8DADDD81C840

1五、給 /usr/local/sbin/check_ng.sh 更改權限 755

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

1六、啓動 keepalived

[root@arslinux-02 ~]# systemctl start keepalived
[root@arslinux-02 ~]# ps aux|grep keepalived
root       7836  0.0  0.1 122876  1412 ?        Ss   23:14   0:00 /usr/sbin/keepalived -D
root       7837  0.0  0.3 133836  3340 ?        S    23:14   0:00 /usr/sbin/keepalived -D
root       7838  0.0  0.2 133776  2872 ?        S    23:14   0:00 /usr/sbin/keepalived -D
root       7878  0.0  0.0 112724   992 pts/0    S+   23:14   0:00 grep --color=auto keepalived

1七、檢查從上的 nginx 是否啓動

[root@arslinux-02 ~]# ps aux|grep nginx
root       7813  0.0  0.2 125004  2108 ?        Ss   23:11   0:00 nginx: master process /usr/sbin/nginx
nginx      7814  0.0  0.3 125392  3148 ?        S    23:11   0:00 nginx: worker process
root       7976  0.0  0.0 112724   984 pts/0    R+   23:15   0:00 grep --color=auto nginx

1八、瀏覽器訪問主

1.png

此時訪問的是主的默認虛擬服務器,在 nginx 中定義

2.png

1九、從上的默認頁在 /usr/share/nginx/html/index.html ,將默認頁改成 backup,backup

[root@arslinux-02 ~]# cat /usr/share/nginx/html/index.html
backup,backup

20、瀏覽器訪問從

3.png

2一、ip add 查看從上 ip

[root@arslinux-02 ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:14:4f:d9 brd ff:ff:ff:ff:ff:ff
inet 192.168.194.132/24 brd 192.168.194.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::4c99:ed43:5757:e772/64 scope link noprefixroute
valid_lft forever preferred_lft forever

2二、瀏覽器訪問 vip 192.168.194.100,實際上就是 master,vip 在 master 上

4.png

2三、測試高可用

測試1:關閉 主上 nginx,會從新啓動,由於 keepalived

測試2:增長規則:iptables -I OUTPUT -p vrrp -j DROP,從上出現出現了 vip ,但 主上 vip 依然沒有釋放

5.png

6.png

訪問 vip,依然是主上的默認虛擬服務器

測試3:中止主上的 keepalived,主上的 vip 被釋放了

7.png

8.png

9.png

此時訪問 vip 則是 從上的默認虛擬服務器

測試4:重啓主上的 keepalived,訪問 vip,立刻回到了主上的默認虛擬服務器

10.png

2四、mysql 也能夠弄高可用,可是要確保兩邊數據一致


18.6 負載均衡集羣介紹

  • 主流開源軟件 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層的更加靈活,能實現更多的個性化需求


18.7 LVS介紹

  • LVS 是由國人章文嵩開發

  • 流行度不亞於 apache 的 httpd,基於 TCP/IP 作的路由和轉發,穩定性和效率很高

  • LVS 最新版本基於 Linux 內核2.6,有好多年不更新了

  • LVS 有三種常見的模式:NAT、DR、IP Tunnel

  • LVS 架構中有一個核心角色叫作分發器(Load balance),它用來分發用戶的請求,還有諸多處理用戶請求的服務器(Real Server,簡稱 rs)


LVS NAT模式(10臺如下)

11.png

  • 這種模式藉助 iptables 的 nat 表來實現

  • 用戶的請求到分發器後,經過預設的 iptables 規則,把請求的數據包轉發到後端的 rs 上去

  • rs 須要設定網關爲分發器的內網 ip

  • 用戶請求的數據包和返回給用戶的數據包所有通過分發器,因此分發器成爲瓶頸

  • 在 nat 模式中,只須要分發器有公網 ip 便可,因此比較節省公網 ip 資源


LVS IP Tunnel模式

12.png

  • 這種模式,須要有一個公共的 IP 配置在分發器和全部rs上,咱們把它叫作 vip

  • 客戶端請求的目標 IP 爲 vip,分發器接收到請求數據包後,會對數據包作一個加工,會把目標 IP 改成 rs 的 IP,這樣數據包就到了 rs 上

  • rs 接收數據包後,會還原原始數據包,這樣目標 IP 爲 vip,由於全部 rs 上配置了這個 vip,因此它會認爲是它本身

  • 結果反饋給客戶端

NAT 就是 iptables 轉發,IP Tunnel 把模板 ip 作更改


LVS DR模式

1523371556386328.png

  • 這種模式,也須要有一個公共的 IP 配置在分發器和全部 rs 上,也就是 vip

  • 和IP Tunnel 不一樣的是,它會把數據包的 MAC 地址修改成 rs 的 MAC 地址

  • rs接收數據包後,會還原原始數據包,這樣目標 IP 爲 vip ,由於全部 rs 上配置了這個 vip,因此它會認爲是它本身

  • 結果反饋給客戶端


18.8 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


18.9/18.10 LVS NAT模式搭建

準備工做

一、準備三臺機器

分發器,簡稱 dir 192.168.194.130

rs1 192.168.194.132

rs2 192.168.194.133

二、給分發器添加一塊網卡

ens37:192.168.174.100,本地 windows 上能 ping 通

14.png

15.png

16.png

三、三臺機器上所有關閉 firewalld

四、三臺機器安裝 iptables-services,保存空規則

[root@arslinux-02 ~]# yum install -y iptables-services

[root@arslinux-02 ~]# systemctl start iptables

[root@arslinux-02 ~]# systemctl enable iptables

[root@arslinux-02 ~]# iptables -F

[root@arslinux-02 ~]# service iptables save

五、關閉selinux,編輯 /etc/selinux/config,狀態改成 disable

六、將 rs1 和 rs2 的網關設置爲分發器的 ip 地址 192.168.194.130


搭建工做

一、在 dir 上安裝 ipvsadm

[root@arslinux-01 ~]# yum install -y ipvsadm

二、主上寫腳本 /usr/local/sbin/lvs_nat.sh

[root@arslinux-01 ~]# 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.194.0/24  -j MASQUERADE
# director設置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.174.100:80 -s lc -p 3
$IPVSADM -a -t 192.168.174.100:80 -r 192.168.194.132:80 -m -w 1
$IPVSADM -a -t 192.168.174.100:80 -r 192.168.194.133:80 -m -w 1

三、測試

確保 rs1 和 rs2 上 nginx 都已經啓動,並已監聽 80端口

rs1 上

[root@arslinux-02 ~]# curl localhost
backup,backup

rs2 上

rs2 上的默認頁要和 rs1 上區分開,先編輯默認頁,再 curl

[root@arslinux-03 ~]# mv /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.bak
[root@arslinux-03 ~]# vim /usr/share/nginx/html/index.html
backup2,backup2
[root@arslinux-03 ~]# curl localhost
backup2,backup2

訪問 192.168.174.100

clipboard.png


四、ipvsadm的規則:

[root@arslinux-01 ~]# 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.174.174:80 wlc persistent 3
-> 192.168.65.132:80            Masq    1      0          0
-> 192.168.65.133:80            Masq    1      0          1

五、可能連續幾回訪問該ip結果都是RS2,也許是緩存的緣由

能夠把lvs_nat.sh的IPVSADM規則第一條改成:輪詢

$IPVSADM -A -t 192.168.174.100:80 -s rr

六、從新sh一下

[root@arslinux-01 ~]# sh /usr/local/sbin/lvs_nat.sh

七、用curl來連外網ip,看看結果

[root@arslinux-01 ~]# curl 192.168.174.100
backup2,backup2
[root@arslinux-01 ~]# curl 192.168.174.100
backup,backup
[root@arslinux-01 ~]# curl 192.168.174.100
backup2,backup2
[root@arslinux-01 ~]# curl 192.168.174.100
backup,backup
[root@arslinux-01 ~]# curl 192.168.174.100
backup2,backup2
[root@arslinux-01 ~]# curl 192.168.174.100
backup,backup
[root@arslinux-01 ~]# curl 192.168.174.100
backup2,backup2
[root@arslinux-01 ~]# curl 192.168.174.100
backup,backup

訪問仍是很是平均的,這是 rr 起做用了

實驗成功!



課堂筆記

一、集羣以及分類

高可用、負載均衡、分佈式

二、高可用架構的意義

保證服務長久可用,穩定性,雙機熱備

三、Keepalived 的實現原理

VRRP協議 虛擬路由協議

A 工做中,B C 探測 A 是否正常工做,A 出現問題,會從 B/C 中根據權重選一個頂上

http://www.javashuo.com/article/p-fbeyqjra-ek.html

四、LVS 三種模式圖解

http://www.javashuo.com/article/p-mnskecwn-m.html

五、fullnat 模式

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

lvs四種集羣有點及使用場景

https://www.jianshu.com/p/ce7ba9dfe103

相關文章
相關標籤/搜索