0604課的預習任務 + 課堂筆記

18.1 集羣介紹

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

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

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

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

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


18.2 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 協議的。


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

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

2、兩臺機器都安裝 keepalived

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

3、兩臺機器都需要安裝 nginx,130 之前已經編譯安裝過,132 需要 yum 安裝


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

4、重新編輯主上的 /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 {
[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 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


5、編輯檢查 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

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

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

7、啓動 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

8、查看 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

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

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

11、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

12、配置之前,一定要檢查防火牆主從 iptables 和 getenforce 是否關閉

13、編輯從上的配置文件 /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 {

[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

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,要低於主

14、編輯檢查 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

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

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

16、啓動 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

17、檢查從上的 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

18、瀏覽器訪問主

1.png

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

2.png

19、從上的默認頁在 /usr/share/nginx/html/index.html ,將默認頁改爲 backup,backup

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

backup,backup

20、瀏覽器訪問從

3.png

21、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

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

4.png

23、測試高可用

測試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

24、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模式搭建

準備工作

1、準備三臺機器

分發器,簡稱 dir 192.168.194.130

rs1 192.168.194.132

rs2 192.168.194.133

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

ens37:192.168.174.100,本地 windows 上能 ping 通

14.png

15.png

16.png

3、三臺機器上全部關閉 firewalld

4、三臺機器安裝 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

5、關閉selinux,編輯 /etc/selinux/config,狀態改爲 disable

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


搭建工作

1、在 dir 上安裝 ipvsadm

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

2、寫腳本vim /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 wlc -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

3、測試

rs1 上

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

rs2 上

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

4、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

5、可能連續幾次訪問該ip結果都是RS2,也許是緩存的原因

可以把lvs_nat.sh的IPVSADM規則第一條改爲:輪詢

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

6、重新sh一下

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

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

訪問還是非常平均的,這是rr起作用了

實驗成功!



課堂筆記

1、集羣以及分類

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

2、高可用架構的意義

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

3、Keepalived 的實現原理

VRRP協議 虛擬路由協議

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

https://blog.csdn.net/u013920085/article/details/21184143

4、LVS 三種模式圖解

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

5、fullnat 模式

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

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

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



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