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 } }
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爲啓動命令
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八、瀏覽器訪問主
此時訪問的是主的默認虛擬服務器,在 nginx 中定義
1九、從上的默認頁在 /usr/share/nginx/html/index.html ,將默認頁改成 backup,backup
[root@arslinux-02 ~]# cat /usr/share/nginx/html/index.html backup,backup
20、瀏覽器訪問從
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 上
2三、測試高可用
測試1:關閉 主上 nginx,會從新啓動,由於 keepalived
測試2:增長規則:iptables -I OUTPUT -p vrrp -j DROP,從上出現出現了 vip ,但 主上 vip 依然沒有釋放
訪問 vip,依然是主上的默認虛擬服務器
測試3:中止主上的 keepalived,主上的 vip 被釋放了
此時訪問 vip 則是 從上的默認虛擬服務器
測試4:重啓主上的 keepalived,訪問 vip,立刻回到了主上的默認虛擬服務器
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臺如下)
這種模式藉助 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,因此它會認爲是它本身
結果反饋給客戶端
NAT 就是 iptables 轉發,IP Tunnel 把模板 ip 作更改
LVS DR模式
這種模式,也須要有一個公共的 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 通
三、三臺機器上所有關閉 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
四、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四種集羣有點及使用場景