1、前言:html
在互聯網上面,網站爲用戶提供原始的內容訪問,同時爲用戶提供交互操做。提供穩定可靠的服務,能夠給用戶帶來良好的體驗,保證用戶的正常訪問使用,在網站的可靠性方面,有不少的技術能夠來提供,這類技術能夠分爲:前端
高可用:保證服務的可靠,穩定,實現故障的屏蔽,避免了單點故障。node
高性能:多臺服務器鏈接起來,處理一個複雜的計算問題。linux
負載均衡:將用戶請求引導到後端多臺服務器,實現服務器請求的負載。nginx
咱們將這類技術稱之爲集羣負載均衡,能夠提供負載均衡和高可用的有硬件和軟件,軟件方面有haproxy,lvs,keepalived,nginx,heartbeat,corosync等等,而這裏咱們採用的是nginx-keepalived來構建。c++
Nginx有很強的代理功能,可是一臺nginx 就造成了單點,如今使用keepalived來解決這個問題,keepalived能夠實現故障轉移切換,實現後端的健康檢查,前端的高可用,使網站故障記錄大大下降,避免了單點故障形成網站沒法訪問的問題,確保了網站業務的正常運行。web
2、Nginx+keepalived有兩種配置方案:apache
2.1、Nginx+keepalived 主從配置vim
這種方案,使用一個vip地址,前端使用2臺機器,一臺作主,一臺作備,但同時只有一臺機器工做,另外一臺備份機器在主機器不出現故障的時候,永遠處於浪費狀態,對於服務器很少的網站,該方案不經濟實惠,因此本次不予採用。後端
2.2、Nginx+keepalived 雙主配置
這種方案,使用兩個vip地址,前端使用2臺機器,互爲主備,同時有兩臺機器工做,當其中一臺機器出現故障,兩臺機器的請求轉移到一臺機器負擔,很是適合於當前架構環境,故本次採用此方案對網站進行高可用架構。
3、Nginx+keepalived 主從配置
3.1、Nginx+keepalived 主從配置詳情請見http://kling.blog.51cto.com/3320545/1240359
這裏不作重點介紹。
4、Ningx+Keepalived 雙主配置
4.1、拓撲結構
4.二、測試環境以下:
系統:Ceentos 6.4 64位
前端node1服務器:
DIP: 192.168.122.2
VIP: 192.168.122.22
前端node2服務器:
DIP: 192.168.122.3
VIP:192.168.122.23
後端服務器:
web server01:192.168.122.4
web server02:192.168.122.5
web server03:192.168.122.6
4.三、軟件安裝
分別在兩臺前端服務器上安裝nginx+keepalived,使用腳本以下:
#!/bin/bash # author: kuangl # mail: kuangl@orient-media.com # description: The installation of Nginx files. # -------------------------------------------------------- # ## Nginx_install # -------------------------------------------------------- # # Nginx installation #CURRENT_PATH=$(pwd) for i in $(rpm -q gcc gcc-c++ kernel-devel openssl-devel zlib-devel popt-devel popt-static libnl-devel wget make |grep 'not installed' | awk '{print $2}') do yum -y install $i done [ -d /root/software ] [ "$?" != 0 ] && mkdir /root/software cd /root/software [ ! -e pcre-8.33.tar.gz ] && wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.33.tar.gz tar -zxvf pcre-8.33.tar.gz cd pcre-8.33 ./configure make && make install echo $? || [ $? != 0 ] || echo " installation pcre failed" || exit 1 cd /root/software [ ! -e nginx-1.2.9.tar.gz ] && wget http://nginx.org/download/nginx-1.2.9.tar.gz tar -zxvf nginx-1.2.9.tar.gz cd nginx-1.2.9 ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_sub_module --with-http_stub_status_module --with-http_gzip_static_module make && make install echo $? || [ $? != 0 ] || echo " installation nginx failed" || exit 1 # -------------------------------------------------------- # ## Keepalived_intsall # -------------------------------------------------------- # # Keepalived installation cd /root/softwarae [ ! -e keepalived-1.2.4.tar.gz ] && wget http://www.keepalived.org/software/keepalived-1.2.4.tar.gz tar -zxvf keepalived-1.2.4.tar.gz cd keepalived-1.2.4 ln -s /usr/src/kernels/$(uname -r) /usr/src/kernels/linux ./configure --prefix=/usr --bindir=/usr/bin --sbindir=/usr/bin --libexecdir=/usr/libexec --localstatedir=/var --libdir=/lib64 --infodir=/usr/share/info --sysconfdir=/etc --mandir=/usr/local/share/man --with-kernel-dir=/usr/src/kernels/linux make && make install echo $? || [ $? != 0 ] || print " installation keepalived failed" || exit 1 chkconfig --add keepalived chkconfig --level 345 keepalived on
4.四、在後端服務器上安裝apached
後端node4
[root@node4 ~]# yum -y install httpd [root@node4 html]# echo "this is 192.168.122.4" > /var/www/htmlindex.html [root@node4 ~]# service httpd start [root@node4 html]# curl 192.168.122.4 this is 192.168.122.4
後端node5
[root@node5 ~]# yum -y install httpd [root@node5 html]# echo "this is 192.168.122.5" > /var/www/htmlindex.html [root@node5 ~]# service httpd start [root@node5 html]# curl 192.168.122.5 this is 192.168.122.5
後端node6
[root@node6 ~]# yum -y install httpd [root@node6 html]# echo "this is 192.168.122.6" > /var/www/htmlindex.html [root@node6 ~]# service httpd start [root@node6 html]# curl 192.168.122.6 this is 192.168.122.6
4.五、node二、node3上配置nginx
[root@node2 ~]# vim /usr/local/nginx/conf/nginx.conf upstream web1 ##定義負載均衡組爲web1 { ip_hash; server 192.168.122.4:80; server 192.168.122.5:80; server 192.168.122.6:80; } server { listen 80; server_name dev.test01.com; location / { root /home/kuangl/; index index.html index.htm; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass http://web1; } }
4.六、在node2上配置keepalived
[root@node2 conf]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { notification_email { 404060945@qq.com } notification_email_from root@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_haproxy { script "/etc/keepalived/chk_nginx.sh" interval 2 weight 2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 200 priority 250 advert_int 1 authentication { auth_type PASS auth_pass kuanglnginx } track_script { chk_nginx } virtual_ipaddress { 192.168.122.22 } } vrrp_instance VI_2 { state BACKUP interface eth0 virtual_router_id 251 priority 100 advert_int 1 authentication { auth_type PASS auth_pass kuangl } track_script { chk_nginx } virtual_ipaddress { 192.168.122.23 } }
4.七、在node3上配置keepalived
! Configuration File for keepalived global_defs { notification_email { 404060945@qq.com } notification_email_from root@localhost smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script chk_haproxy { script "/etc/keepalived/chk_nginx.sh" interval 2 weight 2 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 200 priority 100 advert_int 1 authentication { auth_type PASS auth_pass kuanglnginx } track_script { chk_nginx } virtual_ipaddress { 192.168.122.22 } } vrrp_instance VI_2 { state MASTER interface eth0 virtual_router_id 251 priority 250 advert_int 1 authentication { auth_type PASS auth_pass kuangl } track_script { chk_nginx } virtual_ipaddress { 192.168.122.23 } }
4.八、在兩臺雙主服務器上添加自動檢測腳本
#!/bin/bash # description: # 定時查看nginx是否存在,若是不存在則啓動nginx # 若是啓動失敗,則中止keepalived status=$(ps -C nginx --no-heading|wc -l) if [ "${status}" = "0" ]; then /usr/local/nginx/sbin/nginx status2=$(ps -C nginx --no-heading|wc -l) if [ "${status2}" = "0" ]; then /etc/init.d/keepalived stop fi fi
4.九、開啓nginx、keepalived服務
[root@node2 ~]# service keepalived start [root@node2 ~]# /usr/local/nginx/sbin/nginx [root@node3 ~]# service keepalived start [root@node3 ~]# /usr/local/nginx/sbin/nginx
4.十、用 ip a 查看VIP
4.十一、測試訪問
[kuangl@node01 ~]$ curl http://192.168.122.22 this is 192.168.122.6 [kuangl@node01 ~]$ curl http://192.168.122.22 this is 192.168.122.4 [kuangl@node01 ~]$ curl http://192.168.122.22 this is 192.168.122.5 [kuangl@node01 ~]$ curl http://192.168.122.23 this is 192.168.122.6 [kuangl@node01 ~]$ curl http://192.168.122.23 this is 192.168.122.4 [kuangl@node01 ~]$ curl http://192.168.122.23 this is 192.168.122.5
5、後端用rsync作數據同步
node5-node6上配置進程模式,以node5爲例
[root@node5 ~]# yum -y install rsync [root@node5 ~]# vim /etc/rsynsd.conf uid = root gid = root use chroot = no max connections = 5 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log [web01] path=/home/kuangl/ comment = update ignore errors read only = no list = no hosts allow = 192.168.122.0/24 auth users = root uid = root gid = root secrets file = /etc/rsyncd.secrets [root@node5 ~]# vim /etc/rsyncd.secrets root:123456 [root@node5 ~]# chmod 0600 /etc/rsyncd.secrets [root@node5 ~]# ll /etc/rsyncd.secrets -rw-------. 1 root root 12 Jul 20 19:41 /etc/rsyncd.secrets [root@node5 ~]# rsync --daemon [root@node5 ~]# echo "rsync --daemon" >> /etc/rc.local
node4上配置命令模式:
[root@node4 ~]# yum -y install rsync [root@node4 ~]# vim /etc/rsyncd.secrets 123456 [root@node4 ~]# chmod 0600 /etc/rsyncd.secrets root@node4 kuangl]# rsync -vzrtopg --delete --progress --password-file=/etc/rsyncd.secrets rsync+inotify root@192.168.122.5::web01 sending incremental file list rsync+inotify/ rsync+inotify/inotify-tools-3.14.tar.gz 358772 100% 1.85MB/s 0:00:00 (xfer#1, to-check=2/4) rsync+inotify/rsync+inotify_client.sh 617 100% 3.11kB/s 0:00:00 (xfer#2, to-check=1/4) rsync+inotify/rsync+inotify_server.sh 900 100% 4.03kB/s 0:00:00 (xfer#3, to-check=0/4) sent 360679 bytes received 69 bytes 240498.67 bytes/sec total size is 360289 speedup is 1.00
查看結果
[root@node5 ~]# cd /home/kuangl/ [root@node5 kuangl]# ll total 8 -rw-r--r--. 1 root root 22 Jul 20 15:16 index.html drwxr-xr-x. 2 root root 4096 Nov 11 2012 rsync+inotify