1、概述javascript
一、keepalived
php
Keepalived 是一個基於VRRP協議來實現的LVS服務高可用方案,能夠利用其來避免單點故障。一個LVS服務會有2臺服務器運行Keepalived,一臺爲主服務器(MASTER),一臺爲備份服務器(BACKUP),可是對外表現爲一個虛擬IP,主服務器會發送特定的消息給備份服務器,當備份服務器收不到這個消息的時候,即主服務器宕機的時候, 備份服務器就會接管虛擬IP,繼續提供服務,從而保證了高可用性。Keepalived是VRRP的完美實現 。css
二、Haproxyhtml
HAProxy是高性能的代理服務器,其能夠提供7層和4層代理,具備healthcheck,負載均衡等多種特性,性能卓越,包括Twitter,Reddit,StackOverflow,GitHub在內的多家知名互聯網公司在使用。前端
KeepAlived是一個高可用方案,經過VIP(即虛擬IP)和心跳檢測來實現高可用。其原理是存在一組(兩臺)服務器,分別賦予Master,Backup兩個角色,默認狀況下Master會綁定VIP到本身的網卡上,對外提供服務。Master,Backup會在必定的時間間隔向對方發送心跳數據包來檢測對方的狀態,這個時間間隔通常爲2秒鐘,若是Backup發現Master宕機,那麼Backup會發送ARP包到網關,把VIP綁定到本身的網卡,此時Backup對外提供服務,實現自動化的故障轉移,當Master恢復的時候會從新接管服務。java
2、實驗環境node
實驗環境:準備4臺服務器,2臺haproxy+keepalived服務器,分別做主備。1臺動態網站服務器,一臺靜態網站服務器。linux
實驗目的:實現外部用戶經過vip來訪問web服務器,而且可以根據訪問內容的不一樣來實現動靜分離,若是前端調度器宕機,能夠迅速切換,讓從服務器上線接管一切事務,進而不影響用戶訪問!web
服務器 | IP地址 | 系統版本 | 軟件版本 | |
前端主調度器 | eth0:172.16.8.5redis vip:172.16.8.1 |
Centos6.5 | keepalived-1.2.7-3.el6.x86_64 haproxy-1.4.24-2.el6.x86_64 |
|
前端備調度器 | eth0:172.16.8.8 vip:172.16.8.1 |
Centos6.5 | keepalived-1.2.7-3.el6.x86_64 haproxy-1.4.24-2.el6.x86_64 |
|
靜態服務器 | eth0:172.16.8.7 | Centos6.5 | httpd | |
動態服務器 | eth0:172.16.8.9 | Centos6.5 | httpd php |
關閉每一個服務器的防火牆
//關閉iptables和SELINUX # service iptables stop # setenforce 0 # vim /etc/sysconfig/selinux --------------- SELINUX=disabled
3、haproxy與keepalived的安裝配置
一、時間同步:
[root@node1 ~]# ntpdate 172.16.0.1 //172.16.0.1爲時間服務器 [root@node2 ~]# ntpdate 172.16.0.1
二、在2臺主備服務器上安裝keepalived與haproxy
[root@node1 ~]# yum -y install haproxy keepalived [root@node2 ~]# yum -y install haproxy keepalived
三、keepalived安裝配置
3.一、在主調度服務器上配置:
修改keepalived配置文件
[root@node1 ~]# vim /etc/keepalived/keepalived.conf //修改以下: ! Configuration File for keepalived global_defs { notification_email { root@localhost //配置管理員郵箱 } notification_email_from kaadmin@localhost //配置發件人 smtp_server 127.0.0.1 //配置郵件服務器 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_mantaince_down { script "[[ -e /etc/keepalived/down ]] && exit 1 || exit 0" interval 1 weight -150 //此腳本的意思是若是在/etc/keepalived/目錄下有down文件,則把此主服務器的優先級下降150(能夠自行設定),讓別的從服務器變成主服務器 } vrrp_instance VI_1 { state MASTER //配置模式 master爲主服務器 interface eth0 virtual_router_id 51 //虛擬路由id號 priority 220 //優先級,各個節點優先級越高,更加有可能成爲主服務器 advert_int 1 authentication { auth_type PASS //認證方式 auth_pass 1111 } virtual_ipaddress { 172.16.8.1 //配置虛擬ip,vip } track_script { chk_mantaince_down //檢查腳本 } //當主服務器狀態發生變化時,發送變化信息給郵件服務器,能夠經過mail命令查看 notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }
建立notify.sh腳本
[root@node1 ~]# vim /etc/keepalived/notify.sh //添加以下內容: #!/bin/bash # Author: MageEdu <linuxedu@foxmail.com> # description: An example of notify script # vip=172.16.8.1 contact='root@localhost' notify() { mailsubject="`hostname` to be $1: $vip floating" mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1" echo $mailbody | mail -s "$mailsubject" $contact } case "$1" in master) notify master exit 0 ;; backup) notify backup exit 0 ;; fault) notify fault exit 0 ;; *) echo 'Usage: `basename $0` {master|backup|fault}' exit 1 ;; esac
將此腳本發往從服務器:
[root@node1 ~]# scp /etc/keepalived/notify.sh root@172.16.8.8:/etc/keepalived/
3.二、在從服務器上配置
修改keepalived配置文件
! Configuration File for keepalived global_defs { notification_email { root@localhost } notification_email_from kaadmin@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_mantaince_down { script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0" interval 1 weight -150 } vrrp_instance VI_1 { state BACKUP //修改成BACKUP interface eth0 virtual_router_id 51 priority 160 //優先級要低於主的 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 172.16.8.1 } track_script { chk_mantaince_down } notify_master "/etc/keepalived/notify.sh master" notify_backup "/etc/keepalived/notify.sh backup" notify_fault "/etc/keepalived/notify.sh fault" }
3.三、測試
分別啓動主備的keepalived
[root@node1 ~]# service keepalived start [root@node2 ~]# service keepalived start
查看ip
在主服務器上建立down文件
[root@node1 ~]# touch /etc/keepalived/down [root@node1 ~]# ip a [root@node1 ~]# mail
三、配置haprox
主從服務器的haproxy配置文件都要同樣
[root@node1 ~]# vim /etc/haproxy/haproxy.cfg //修改以下: #--------------------------------------------------------------------- # Example configuration for a possible web application. See the # full configuration options online. # # http://haproxy.1wt.eu/download/1.4/doc/configuration.txt # #--------------------------------------------------------------------- #--------------------------------------------------------------------- # Global settings #--------------------------------------------------------------------- global # to have these messages end up in /var/log/haproxy.log you will # need to: # # 1) configure syslog to accept network log events. This is done # by adding the '-r' option to the SYSLOGD_OPTIONS in # /etc/sysconfig/syslog # # 2) configure local2 events to go to the /var/log/haproxy.log # file. A line like the following can be added to # /etc/sysconfig/syslog # # local2.* /var/log/haproxy.log # //上面的註釋是告訴咱們怎麼配置日誌的 log 127.0.0.1 local2 //日誌輸出配置,全部日誌都記錄在本機,經過local2輸出 chroot /var/lib/haproxy //改變當前工做目錄,安全模式 pidfile /var/run/haproxy.pid //pid文件 maxconn 4000 //最大鏈接數 user haproxy //用戶 group haproxy //組 daemon //之後臺形式運行haproxy # turn on stats unix socket stats socket /var/lib/haproxy/stats #--------------------------------------------------------------------- # common defaults that all the 'listen' and 'backend' sections will # use if not designated in their block #--------------------------------------------------------------------- defaults //配置默認參數的,這些參數能夠被利用配置到frontend,backend,listen組件 mode http //默認的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK(注,health已經廢棄) log global //採用全局定義的日誌 option httplog //日誌類別http日誌格式 option dontlognull //不記錄健康檢查的日誌信息 option http-server-close //每次請求完畢後主動關閉http通道 option forwardfor except 127.0.0.0/8 //不記錄本機轉發的日誌 option redispatch //serverId對應的服務器掛掉後,強制定向到其餘健康的服務器 retries 3 //3次鏈接失敗就認爲服務不可用,也能夠經過後面設置 timeout http-request 10s //請求超時 timeout queue 1m //隊列超時 timeout connect 10s //鏈接超時 timeout client 1m //客戶端鏈接超時 timeout server 1m //服務器鏈接超時 timeout http-keep-alive 10s //長鏈接超時 timeout check 10s //檢查超時 maxconn 3000 //最大鏈接數 listen stats //listen是Frontend和Backend的組合體。這裏定義的是haproxy監控! mode http //模式http bind *:80 //綁定的監控ip與端口 stats enable //啓用監控 stats hide-version //隱藏haproxy版本 stats uri /haproxyadmin?stats //定義的uri stats realm Haproxy\ Statistics //統計頁面密碼框上提示文本 stats auth admin:admin //認證 stats admin if TRUE //啓用管理界面 frontend http //接收請求的前端虛擬節點,Frontend能夠根據規則直接指定具體使用後端的 backend(可動態選擇)。這裏定義的是http服務! bind *:80 //綁定的監控ip與端口 mode http //模式http acl url_static path_beg -i /static /p_w_picpaths /javascript /stylesheets //acl後面是規則名稱,定義訪問控制 acl url_static path_end -i .jpg .gif .png .css .js .html acl url_dynamic path_end -i .php use_backend static if url_static //知足url_static這個條件,則啓用static的backend use_backend dynamic if url_dynamic ////知足url_dynamic這個條件,則啓用dynamic的backend default_backend dynamic //定義的默認backend backend static //static的做用域 mode http balance roundrobin //banlance roundrobin 輪詢,balance source 保存session值,支持static-rr,leastconn,first,uri等參數 option httpchk /index.html //檢測文件,若是分發到後臺index.html訪問不到就再也不分發給它 server web1 172.16.8.7:80 check inter 2000 rise 2 fall 3 backend dynamic mode http balance roundrobin option httpchk /index.php server web2 172.16.8.9:80 check inter 2000 rise 2 fall 3
3.一、修改日誌文件
//修改系統日誌的配置文件 [root@haproxy ~]# vim /etc/sysconfig/rsyslog # Options for rsyslogd # Syslogd options are deprecated since rsyslog v3. # If you want to use them, switch to compatibility mode 2 by "-c 2" # See rsyslogd(8) for more details SYSLOGD_OPTIONS="-c 2 -r"
3.二、增長日誌設備
[root@haproxy ~]# vim /etc/rsyslog.conf #增長一行 local2.* /var/log/haproxy.log
3.三、從新啓動一下日誌服務
[root@haproxy ~]# service rsyslog restart
3.四、檢查配置文件語法
[root@haproxy ~]# haproxy -c -f /etc/haproxy/haproxy.cfg Configuration file is valid
3.五、將此配置文件發往從服務器:
[root@node1 haproxy]# scp /etc/haproxy/haproxy.cfg root@172.16.8.8:/etc/haproxy/
四、建立haproxy+keepalived腳本:
此腳本實現當haproxy掛掉後,能再次啓動haproxy,若沒法再次啓動則完全關閉keepalived將VIP交給
從機處理。
[root@node1 ~]# vim /etc/keepalived/check_haproxy.sh //添加以下內容 --------------------- #!/bin/bash while : do hapid=`ps -C haproxy --no-header |wc -l` if [ $hapid -eq 0 ];then /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg sleep 5 if [ $hapid -eq 0 ];then /etc/init.d/keepalived stop fi fi sleep 5 done -------------------- [root@node1 ~]# chmod 755 /etc/keepalived/check_haproxy.sh [root@node1 ~]# nohup sh /etc/keepalived/check_haproxy.sh &
把此腳本發往從服務器
[root@node1 ~]# scp /etc/keepalived/check_haproxy.sh root@172.16.8.8:/etc/keepalived/
五、配置動靜服務器
靜態服務器(172.16.8.7)
[root@master html]# yum -y install httpd
添加測試頁面:
#vim /var/www/html/index.html //添加以下內容 <h1>www.web1.com</h1>
動態服務器(172.16.8.9)
# yum -y install httpd php
添加測試頁面:
# vim /var/www/html/index.php //添加以下內容: <h1>www.web2.com</h1> <?php phpinfo(); ?>
4、模擬故障測試
//主從服務器都啓動keepalived與haproxy [root@node1 ~]# service keepalived start [root@node1 ~]# service haproxy start [root@node2 ~]# service keepalived start [root@node2 ~]# service haproxy start //後端服務器啓動web [root@master ~]# service httpd start [root@station142 ~]# service httpd start
在遊覽器輸入 http://172.16.8.1/haproxyadmin?stats,帳戶密碼都爲admin
這樣咱們能夠經過這個stats界面來管理後端服務器了!
動靜分離測試
訪問靜態頁面時,跳到web1服務器上(172.16.8.7)
訪問動態頁面時跳到web2上,(172.16.8.9)
把主服務器的haproxy服務中止,看是否影響訪問!
[root@node1 keepalived]# service haproxy stop
check_haproxy.sh腳本檢測到haproxy服務中止,就把keepalived服務中止,從而vip從主服務器轉移到從服務器,用戶訪問無影響!
至此,基於keepalived與haproxy搭建的高可用web集羣已經完成,讀者若是有足夠多的主機的話,後面動靜頁面服務器能夠有多個,還能夠加個緩存服務器,加速用戶訪問!