linux集羣功能能夠分爲:HA高可用、負載均衡。mysql
高可用是:有兩臺機器,一臺做爲主用工做,一臺做爲冗餘備份。當主用機器宕機後,冗餘機器將接替,繼續提供服務。linux
開源的高可用軟件有:heartbeat、keepalived,如今基本上都使用keepalived。
負載均衡是:一臺機器做爲分發器,負責把用戶的請求分發給後端真正的處理服務器,除了分發器以外,其餘都是給用戶提供服務的後端機器,後端機器至少有2臺。nginx
開源的負載均衡軟件有:LVS、keepalived、haproxy、nginx等。
商業的負載均衡有:F五、Netscaler,優勢是穩定,支持高併發,可是價格昂貴。sql
HA高可用咱們重點學習keepalived。heartbeat因爲在Centos6上會有一些問題,偶爾會切換不及時,已經比較少使用。vim
keepalived:是使用VRRP(虛擬路由冗餘協議)實現的。後端
HA高可用:相似是多臺功能相同的路由器組成的一個小組,小組中有一臺master角色,N>=1個backup角色。centos
master會組播vrrp數據包給backup,當backup收不到master發送的數據包時,就認爲master宕機了,使用backup來充當新的master(經過backup的優先級來判斷哪一個backup成功新的master)bash
keepalived包含有3個模塊: 一、core:核心模塊,是主進程啓動和維護,全局配置文件加載解析等做用。 二、check:檢查模塊,負責健康檢查。 三、vrrp:實現vrrp協議的模塊。
準備兩臺機器:A和B。A爲:master角色(128)、B爲:backup角色(130)服務器
一、爲兩臺機器都安裝上keepalived:實現高可用的工具架構
[root@nginx ~]# yum install -y keepalived 已加載插件:fastestmirror Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was 12: Timeout on http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock: (28, 'Operation too slow. Less than 1000 bytes/sec transferred the last 30 seconds') base | 3.6 kB 00:00:00 epel/x86_64/metalink | 7.9 kB 00:00:00 epel | 3.2 kB 00:00:00 extras | 3.4 kB 00:00:00 updates | 3.4 kB 00:00:00 (1/3): epel/x86_64/updateinfo | 925 kB 00:00:01 (2/3): updates/7/x86_64/primary_db | 2.7 MB 00:00:10 (3/3): epel/x86_64/primary | 3.5 MB 00:00:11 Determining fastest mirrors * base: mirror.lzu.edu.cn * epel: mirrors.ustc.edu.cn * extras: mirrors.cqu.edu.cn * updates: centos.ustc.edu.cn epel 12607/12607 正在解決依賴關係 --> 正在檢查事務 ---> 軟件包 keepalived.x86_64.0.1.3.5-6.el7 將被 安裝 --> 正在處理依賴關係 libnetsnmpmibs.so.31()(64bit),它被軟件包 keepalived-1.3.5-6.el7.x86_64 須要 --> 正在處理依賴關係 libnetsnmpagent.so.31()(64bit),它被軟件包 keepalived-1.3.5-6.el7.x86_64 須要 --> 正在處理依賴關係 libnetsnmp.so.31()(64bit),它被軟件包 keepalived-1.3.5-6.el7.x86_64 須要 --> 正在檢查事務 ---> 軟件包 net-snmp-agent-libs.x86_64.1.5.7.2-33.el7_5.2 將被 安裝 ---> 軟件包 net-snmp-libs.x86_64.1.5.7.2-33.el7_5.2 將被 安裝 --> 解決依賴關係完成 依賴關係解決 ======================================================================================================================================================= Package 架構 版本 源 大小 ======================================================================================================================================================= 正在安裝: keepalived x86_64 1.3.5-6.el7 base 329 k 爲依賴而安裝: net-snmp-agent-libs x86_64 1:5.7.2-33.el7_5.2 updates 705 k net-snmp-libs x86_64 1:5.7.2-33.el7_5.2 updates 749 k 事務概要 ======================================================================================================================================================= 安裝 1 軟件包 (+2 依賴軟件包) 總下載量:1.7 M 安裝大小:6.0 M Downloading packages: (1/3): keepalived-1.3.5-6.el7.x86_64.rpm | 329 kB 00:00:01 (2/3): net-snmp-agent-libs-5.7.2-33.el7_5.2.x86_64.rpm | 705 kB 00:00:02 (3/3): net-snmp-libs-5.7.2-33.el7_5.2.x86_64.rpm | 749 kB 00:00:02 ------------------------------------------------------------------------------------------------------------------------------------------------------- 總計 659 kB/s | 1.7 MB 00:00:02 Running transaction check Running transaction test Transaction test succeeded Running transaction 正在安裝 : 1:net-snmp-libs-5.7.2-33.el7_5.2.x86_64 1/3 正在安裝 : 1:net-snmp-agent-libs-5.7.2-33.el7_5.2.x86_64 2/3 正在安裝 : keepalived-1.3.5-6.el7.x86_64 3/3 驗證中 : 1:net-snmp-agent-libs-5.7.2-33.el7_5.2.x86_64 1/3 驗證中 : keepalived-1.3.5-6.el7.x86_64 2/3 驗證中 : 1:net-snmp-libs-5.7.2-33.el7_5.2.x86_64 3/3 已安裝: keepalived.x86_64 0:1.3.5-6.el7 做爲依賴被安裝: net-snmp-agent-libs.x86_64 1:5.7.2-33.el7_5.2 net-snmp-libs.x86_64 1:5.7.2-33.el7_5.2 完畢!
二、爲兩臺機器都安裝上nginx:高可用的服務對象,能夠直接yum安裝用作試驗。
yum install -y nginx
三、master上修改keepalived的配置文件:
[root@nginx keepalived]# vim /etc/keepalived/keepalived.conf global_defs { notification_email { scause@163.com #定義接收告警的郵箱 } notification_email_from scause@163.com #定義發送郵件的地址 smtp_server 127.0.0.1 #定義發郵件地址,若爲127.0.0.1則使用本機自帶郵件服務器進行發送 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_nginx { #自定義檢查模塊名字 script "/usr/local/sbin/check_ng.sh" #自定義腳本,監控nginx服務的腳本 interval 3 #每3秒執行一次腳本 } vrrp_instance VI_1 { state MASTER #角色是master interface ens33 #指定發送vrrp的網卡,針對哪一個網卡監控VIP virtual_router_id 51 priority 100 #權重,master的要比backup的權重大 advert_int 1 authentication { auth_type PASS auth_pass 123456 #定義驗證密碼 } virtual_ipaddress { 192.168.87.100 //指定虛擬ip } track_script { chk_nginx #指定上面定義的監控模塊 } } [root@nginx keepalived]# ip addr //vip虛擬ip用ip addr才能看到,ifconfig看不到 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 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 qlen 1000 link/ether 00:0c:29:7c:0b:e2 brd ff:ff:ff:ff:ff:ff inet 192.168.87.128/24 brd 192.168.87.255 scope global ens33 valid_lft forever preferred_lft forever inet 192.168.87.100/32 scope global ens33 //虛擬ip已經綁定在ens33網卡上了 valid_lft forever preferred_lft forever inet6 fe80::2350:6934:56c7:a6c0/64 scope link valid_lft forever preferred_lft forever
四、編寫chk_nginx.sh監控腳本:修改權限
[root@nginx keepalived]# 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 //中止keepalived服務,不發送vrrp包給backup了 fi fi [root@nginx keepalived]# chmod 755 /usr/local/sbin/check_ng.sh
五、開啓keepalived服務:開啓監控的服務對象nginx
[root@nginx keepalived]# systemctl start keepalived [root@nginx keepalived]# ps aux|grep keepalived //查看keepalived是否啓動 root 1388 0.0 0.0 118652 1396 ? Ss 20:53 0:00 /usr/sbin/keepalived -D root 1389 0.0 0.1 122852 2392 ? S 20:53 0:00 /usr/sbin/keepalived -D root 1390 0.0 0.1 122852 2448 ? S 20:53 0:00 /usr/sbin/keepalived -D root 1396 0.0 0.0 112720 972 pts/0 S+ 20:53 0:00 grep --color=auto keepalived [root@nginx keepalived]# ps aux |grep nginx //查看nginx是否啓動 root 863 0.0 0.0 46040 1276 ? Ss 20:08 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf nobody 868 0.0 0.2 48528 3912 ? S 20:08 0:00 nginx: worker process nobody 869 0.0 0.2 48528 3912 ? S 20:08 0:00 nginx: worker process root 896 0.0 0.0 115432 1712 ? S 20:08 0:00 /bin/sh /usr/local/mysql//bin/mysqld_safe --datadir=/data/mysql/ --pid-file=/data/mysql//nginx.pid mysql 1119 0.3 24.5 1300896 458628 ? Sl 20:08 0:09 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql/nginx.err --pid-file=/data/mysql//nginx.pid root 1418 0.0 0.0 112724 972 pts/0 S+ 20:53 0:00 grep --color=auto nginx
六、關閉nginx,查看是否會自動從新啓動nginx服務:由於keepalived會3秒執行檢查腳本,若是nginx沒進程就會自動啓動。
[root@nginx keepalived]# /etc/init.d/nginx stop Stopping nginx (via systemctl): [ 肯定 ] [root@nginx keepalived]# ps aux |grep nginx //3秒後再ps一下,nginx又被啓動了,證實keepalived生效了。 root 896 0.0 0.0 115432 1712 ? S 20:08 0:00 /bin/sh /usr/local/mysql//bin/mysqld_safe --datadir=/data/mysql/ --pid-file=/data/mysql//nginx.pid mysql 1119 0.3 24.5 1300896 458628 ? Sl 20:08 0:09 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql/nginx.err --pid-file=/data/mysql//nginx.pid root 1567 0.0 0.0 46040 1276 ? Ss 20:54 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf nobody 1569 0.0 0.2 48528 3912 ? S 20:54 0:00 nginx: worker process nobody 1570 0.0 0.2 48528 3912 ? S 20:54 0:00 nginx: worker process root 1598 0.0 0.0 112720 972 pts/0 R+ 20:55 0:00 grep --color=auto nginx
七、配置backup機器的keepalived配置文件:檢查主和從上的selinux和iptables都要關閉。
[root@lgs keepalived]# vim keepalived.conf global_defs { notification_email { scause@163.com } notification_email_from scause@163.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" //監控nginx服務的腳本 interval 3 } vrrp_instance VI_1 { state BACKUP //backup角色 interface ens33 //指定 virtual_router_id 51 //虛擬路由id,與master必須同樣 priority 90 //權重比master小 advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 192.168.87.100 //虛擬ip } track_script { chk_nginx //指定監控模塊 } }
八、定義監控腳本:並改文件權限
[root@lgs keepalived]# 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 [root@lgs keepalived]# chmod 755 /usr/local/sbin/check_ng.sh
九、啓動keepalived服務:
[root@lgs keepalived]# systemctl start keepalived [root@lgs keepalived]# ps aux|grep keepalived root 1522 0.0 0.0 118608 1384 ? Ss 21:12 0:00 /usr/sbin/keepalived -D root 1523 0.4 0.1 127468 3296 ? S 21:12 0:00 /usr/sbin/keepalived -D root 1524 0.1 0.1 127408 2820 ? S 21:12 0:00 /usr/sbin/keepalived -D root 1556 0.0 0.0 112676 988 pts/0 R+ 21:12 0:00 grep --color=auto keepalived [root@lgs keepalived]# ps aux|grep nginx root 906 0.0 0.0 20504 628 ? Ss 20:08 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf nobody 910 0.0 0.1 22948 3468 ? S 20:08 0:00 nginx: worker process nobody 911 0.0 0.1 22948 3220 ? S 20:08 0:00 nginx: worker process root 1598 0.0 0.0 112676 988 pts/0 R+ 21:12 0:00 grep --color=auto nginx
十、驗證高可用是否生效:
一、單獨訪問master:192.168.87.128的nginx頁面,顯示:"This is HA master !"
二、單獨訪問backup:192.168.87.130的nginx頁面,顯示:This is HA backup !
三、訪問VIP:192.168.87.100,默認是訪問到master上,顯示:This is master!
四、把master的keepalived關閉,模擬master宕機 [root@nginx conf]# systemctl stop keepalived
五、master宕機後,訪問VIP:192.168.87.100,則backup接替了原來的master。成爲新的master,顯示:This is HA backup !