Linuxの運用と保守---高可用性Web負荷分散を実現するためのKeepalived + Nginx

Keepalivedは、高性能サーバーの高可用性またはホットスタンバイソリューションです。Keepalivedを使用すると、サーバーの単一障害点を防ぐことができます。Nginxと連携することで、Webフロントエンドサービスの高可用性を実現できます。

CPU名        IPアドレス        仮想IP            キャラクター
lb01 192.168.203.150 192.168.203.88 キープアライブ(マスター)
lb02 192.168.203.148 192.168.203.89 キープアライブ(バックアップ)
web1 192.168.203.136            nginx 
web2 192.168.203.135            nginx 


準備が必要な依存パッケージとインストールパッケージ

[root@web1 ~]# ls | grep tar*
keepalived-2.0.2.tar.gz
libevent-2.1.12-stable.tar.gz
nginx-1.6.0.tar.gz
openssl-1.0.1h.tar.gz
pcre-8.35.tar.gz
zlib-1.2.8.tar.gz

opensslをインストールします

[root@web1 ~]# tar -xf openssl-1.0.1h.tar.gz 
[root@web1 ~]# cd openssl-1.0.1h/
[root@web1 openssl-1.0.1h]# ./config --prefix=/usr/local/openssl
[root@web1 openssl-1.0.1h]# make && make install

PCREをインストールする

[root@web1 ~]# tar -xf pcre-8.35.tar.gz 
[root@web1 ~]# cd pcre-8.35/
[root@web1 pcre-8.35]# ./configure --prefix=/usr/local/pcre
[root@web1 pcre-8.35]# make && make install

zlibをインストールします

[root@web1 ~]# tar -xf zlib-1.2.8.tar.gz 
[root@web1 ~]# cd zlib-1.2.8/
[root@web1 zlib-1.2.8]# ./configure --prefix=/usr/local/zlib
[root@web1 zlib-1.2.8]# make && make install

Nginxをインストールします

[root@web1 src]# wget http://nginx.org/download/nginx-1.6.0.tar.gz
[root@web1 src]# tar -xf nginx-1.6.0.tar.gz
[root@web1 src]# cd nginx-1.6.0/ 
[root@web1 nginx-1.6.0]# ./configure --prefix=/usr/local/nginx --with-openssl=../openssl-1.0.1h --with-pcre=../pcre-8.35 --with-zlib=../zlib-1.2.8 --with-http_ssl_module
[root@web1 nginx-1.6.0]# make && make install
[root@web1 nginx-1.6.0]# useradd www -s /sbin/nologin -M   # 创建用户

Nginx構成ファイルを変更する

[root@web1 conf]# egrep -v "#|^$" nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
 server {
        listen       80;
        server_name  192.168.203.136;
        charset utf-8;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
[root@web1 conf]#

Nginxを起動します

[root@web1 ~]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
[root@web1 ~]# /usr/local/nginx/sbin/nginx -s reload

nginxプロセスの開始を表示する

[root@web1 ~]# ps -ef | grep nginx
root      54235      1  0 17:51 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
www       54244  54235  0 17:51 ?        00:00:00 nginx: worker process
root      54258   8945  0 17:51 pts/0    00:00:00 grep --color=auto nginx
[root@web1 ~]# 

ドメイン名に基づいてnginx仮想ホストを構成します

[root@web1 nginx]# cd html
[root@web1 html]# mkdir www
[root@web1 html]# vim www/index.html
192.168.203.136 www.chd.comm
[root@web1 html]# cd ..
[root@web1 nginx]# sbin/nginx -t   # 检查语句
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@web1 nginx]# sbin/nginx    # 启动nginx
[root@web1 nginx]# sbin/nginx -s reload   # 重启nginx
[root@web1 nginx]# ps -ef |grep nginx   # 查看nginx进程号
nobody      509 130219  0 15:19 ?        00:00:00 nginx: worker process
root        512 111842  0 15:19 pts/2    00:00:00 grep --color=auto nginx
root     130219      1  0 14:34 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
[root@web1 nginx]# echo "192.168.203.136 www.chd.com mail.chd.com mail.cnd.com" >>/etc/hosts   将解析追加到hosts文件中
[root@web1 nginx]# tail -1 /etc/hosts    # 查看hosts文件最后一行内容
192.168.203.136  www.chd.com ftp.chd.com mail.chd.com
[root@web1 nginx]#

ブラウザを開き、IPアドレスを入力してNginxにアクセスします

Nginxは起動後に自動的に起動します

[root@web1 ~]# vim /etc/rc.local
/usr/local/nginx/sbin/nginx

単純な負荷分散を構成する

lb01サーバーのnginx.confメイン構成ファイルを変更します

[root@web1 nginx]# cat conf/nginx.conf | grep -v "^#"
user  www www;
worker_processes  1;
​
events {
    worker_connections  1024;
}
​
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    gzip  on;
    
    upstream webServer {
    server 192.168.203.135:80  weight=5;
    server 192.168.203.136:80  weight=6;
    }
    
    server {
        listen       80;
        server_name  www.chd.cn;
        charset utf-8;
        #access_log  logs/host.access.log  main;
        location / {
        proxy_pass    http://webServer;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

lb02サーバーのnginx.confメイン構成ファイルを変更します

[root@web2 nginx]# cat conf/nginx.conf | grep -v "^#"
user  www www;
worker_processes  1;
​
events {
    worker_connections  1024;
}
​
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    gzip  on;
​
    upstream webServer {
    server 192.168.203.135:80  weight=5;
    server 192.168.203.136:80  weight=6;
    }
    
    server {
        listen       80;
        server_name  192.168.203.148;
        charset utf-8;
        #access_log  logs/host.access.log  main;
        location / {
            root   html;
            index  index.html index.htm;
        proxy_pass    http://webServer;
        }
​
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

検証: www.chd.cnサーバーを解析すると、web1とweb2が切り替わります。

​[root@lb01 nginx]# curl www.chd.cn
192.168.203.135 www.chd.com
[root@lb01 nginx]# curl www.chd.cn
192.168.203.136 www.chd.com

キープアライブロードバランシングを構成する

キープアライブをインストールする

1.yum安装:
yum install keepalived -y     # 推荐使用yum安装,简单、快捷、高效


2.源码包安装:
[root@lb01 ~]# ls | grep keepalived*
keepalived-2.0.2.tar.gz
[root@lb01 ~]# tar -xf keepalived-2.0.2.tar.gz 
[root@lb01 ~]# cd keepalived-2.0.2/
[root@lb01 keepalived-2.0.2]# ./configure --prefix=/usr/local/keepalived 
[root@lb01 keepalived-2.0.2]# make && make install
[root@lb01 keepalived-2.0.2]# cp keepalived/etc/init.d/keepalived /etc/init.d/
[root@lb01 keepalived-2.0.2]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@lb01 keepalived-2.0.2]# mkdir /etc/keepalived
[root@lb01 keepalived-2.0.2]# chmod +755 /etc/keepalived/
[root@lb01 keepalived-2.0.2]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@lb01 keepalived-2.0.2]# ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
[root@lb01 keepalived-2.0.2]# ./keepalived/etc/init.d/keepalived start
Starting keepalived:                                       [  OK  ]
[root@lb01 keepalived-2.0.2]#

注意:在编译时发出警告解决办法
*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.
​​安装
[root@localhost keepalived-2.0.2]# yum -y install libnl libnl-devel
[root@localhost keepalived-2.0.2]# yum install -y libnfnetlink-devel
メイン設定ファイル    /etc/keepalived/keepalived.conf
環境構成ファイル    / etc / sysconfig / keepalived

lb1の/etc/keepalived/keepalived.conf構成ファイルを変更します

[root@lb01 nginx]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
​
global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb1
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
​
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.203.88/24
    }
 }
 virtual_server 192.168.203.88 80 {
    delay_loop 6
    lb_algo rr 
    lb_kind DR
    persistence_timeout 50
    protocol TCP
    }   
[root@lb01 nginx]# /etc/init.d/keepalived restart      
Restarting keepalived (via systemctl):                     [  OK  ]
[root@lb01 nginx]# ip addr | grep 192.168.203.88
    inet 192.168.203.88/24 scope global secondary ens33
[root@lb01 nginx]#

lb2の/etc/keepalived/keepalived.conf構成ファイルを変更します

[root@lb02 nginx]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
​
global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb02
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
​
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 52
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.203.88/24
    }
 }   
    virtual_server 192.168.203.88 80 {
    delay_loop 6
    lb_algo rr 
    lb_kind DR 
    persistence_timeout 50
    protocol TCP
    }  
[root@lb02 ~]# /etc/init.d/keepalived restart
Restarting keepalived (via systemctl):                     [  OK  ]
[root@lb02 ~]# ip addr | grep 192.168.203.88
[root@lb02 ~]#

これで、マスターノードによって引き継がれる仮想IPアドレスであることがわかります。マスターノードがダウンしている場合は、バックアップノードがキープアライブを自動的に引き継ぐかどうかを確認します。

[root@lb01 nginx]# /etc/init.d/keepalived stop
Stopping keepalived (via systemctl):                       [  OK  ]
[root@lb01 nginx]# 
​
[root@lb02 nginx]# ip addr | grep 192.168.203.88
    inet 192.168.203.88/24 scope global secondary ens33
[root@lb02 nginx]#

バックアップノードが仮想IPアドレスを自動的に引き継いだことがわかります。

[root@lb01 nginx]# /etc/init.d/keepalived restart      
Restarting keepalived (via systemctl):                     [  OK  ]
[root@lb01 nginx]# ip addr | grep 192.168.203.88       
    inet 192.168.203.88/24 scope global secondary ens33
[root@lb01 nginx]#

マスターノードが開始されると、マスターノードは自動的にキープアライブサービスを引き継ぎます

キープアライブデュアルメインモードを構成する

lb1の/etc/keepalived/keepalived.conf構成ファイルを変更します

[root@lb01 nginx]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
​
global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb1
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
​
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.203.88/24
    }
 }
​
vrrp_instance VI_2 {
    state BACKUP
    interface ens33
    virtual_router_id 53
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
        192.168.203.89/24
    }   
}   

lb2の/etc/keepalived/keepalived.conf構成ファイルを変更します

[root@lb02 nginx]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
​
global_defs {
   notification_email {
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id lb02
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
​
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 52
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.203.88/24
    }
 }   
    virtual_server 192.168.203.88 80 {
    delay_loop 6
    lb_algo rr 
    lb_kind DR 
    persistence_timeout 50
    protocol TCP
    }  
​
vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 53
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
        192.168.203.89/24
    }   
} 

構成ファイルを変更した後、keepalivedを再起動します

[root@lb01 nginx]# /etc/init.d/keepalived restart              
Restarting keepalived (via systemctl):                     [  OK  ]
[root@lb01 nginx]# ip add|egrep "192.168.203.88|192.168.203.89"
    inet 192.168.203.88/24 scope global secondary ens33

バックアップノードを再起動すると、仮想IPアドレス192.168.203.89がバックアップノードに引き継がれていることがわかります。

[root@lb02 nginx]# /etc/init.d/keepalived restart              
Restarting keepalived (via systemctl):                     [  OK  ]
[root@lb02 nginx]# ip add|egrep "192.168.203.88|192.168.203.89"
    inet 192.168.203.89/24 scope global secondary ens33
[root@lb02 nginx]#

マスターノードを下って、バックアップノードのステータスを確認します

[root@lb01 nginx]# /etc/init.d/keepalived stop
Stopping keepalived (via systemctl):                       [  OK  ]
[root@lb01 nginx]# ip add|egrep "192.168.203.88|192.168.203.89"
[root@lb01 nginx]#

マスターノードがダウンした後、バックアップノードが2つの仮想IPアドレスを引き継いだことがわかります。

[root@lb02 nginx]# ip add|egrep "192.168.203.88|192.168.203.89"
    inet 192.168.203.89/24 scope global secondary ens33
    inet 192.168.203.88/24 scope global secondary ens33

この時点でマスターノードを再起動すると、192.168.203.88が再び引き継がれます。

[root@lb01 nginx]# /etc/init.d/keepalived start
Starting keepalived (via systemctl):                       [  OK  ]
[root@lb01 nginx]# ip add|egrep "192.168.203.88|192.168.203.89"
    inet 192.168.203.88/24 scope global secondary ens33
[root@lb01 nginx]#

スタンバイノードのステータスもまもなくリリースされます192.168.203.88

[root@lb02 nginx]# ip add|egrep "192.168.203.88|192.168.203.89"
    inet 192.168.203.89/24 scope global secondary ens33
[root@lb02 nginx]#

バックアップノードがダウンした後、マスターノードのステータスを確認します

[root@lb02 nginx]# /etc/init.d/keepalived stop
Stopping keepalived (via systemctl):                       [  OK  ]
[root@lb02 nginx]# ip add|egrep "192.168.203.88|192.168.203.89"
[root@lb02 nginx]#

マスターノードがすぐに192.168.203.89を引き継いだことがわかります

[root@lb01 nginx]# ip add|egrep "192.168.203.88|192.168.203.89"
    inet 192.168.203.88/24 scope global secondary ens33
    inet 192.168.203.89/24 scope global secondary ens33
[root@lb01 nginx]#

これまでのところ、nginx + keepalived高可用性クラスターは負荷分散を実現しています。

概要:lb1プライマリノードまたはlb2スタンバイノードのどちらがダウンしているかに関係なく、仮想IPアドレスが切り替えられて引き継がれます。ダウンノードが再開されると、仮想IPが再び引き継がれます。

おすすめ

転載: blog.csdn.net/C_huid/article/details/107909943