keepalived+nginx高可用环境搭建

来源:互联网 发布:何穗为什么那么白 知乎 编辑:程序博客网 时间:2024/05/18 09:04

高可用方案其实很多,而且有很多成本是非常低和简单的。比如你如果有一个网站,高可用最简单的就是nds+nginx+两台机器。

我们由于是客户的一个项目,dns申请是非常麻烦的,所以才考虑用keepalived+nginx做高可用方案。

从网上整理了HA常用组合。
heartbeat v2+crm
heartbeat v3+pacemaker
corosync+pacemaker
cman + rgmanager
keepalived+lvs。

这里我们没有用lvs,而是直接用了nginx,感觉就两台机器,所以也没有必要搞的太复杂。而且也能满足要求。

安装前的规划,这个我认为还是比较重要的,我们就是之前没有好好规划,现在感觉比较乱,而且客户升级也很麻烦。一堆的流程。

我们系统是java开发的,所以用了tomcat进行后台的解析。

首先是目录规划,比如tomcat放在什么地方,静态文件放在什么地方。一般来说有nginx后静态文件由nginx去解析,可以分担tomcat的很多压力。

nginx安装前准备,因为nginx安装还是比较简单的,但是有个问题就是nginx有很多插件,这些插件是否需要安装需要研究一下。由于nginx对回话处理不是太好,所以我们这边需要添加一个会话保持的插件,其他插件建议不要安装太多,毕竟稳定和效率是第一的,非官方的插件就怕有问题,到时候找都不好找。

依赖yum -y install gcc  pcre-devel kernel-devel 

yum install openssl-* -y 剩下的就看提示,没有就安装一下。

下面就是安装:

tar -zxvf nginx-1.7.9.tar.gz
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --add-module=../nginx-stick 
 make 
 make install

这里里面用了一个stick回话保持的插件,下载地址为,这个有时候不太好找,基本上都是google服务器上的,没有办法下载。

https://github.com/ezbake/nginx-sticky-module

安装keepalived:

tar -zxvf keepalived-1.1.20.tar.gz 
ln -s /usr/src/kernels/2.6.9-78.EL-i686/usr/src//linux
./configure make make install
cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
cp /usr/local/etc/sysconfig/keepalived   /etc/sysconfig/
mkdir /etc/keepalived
cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/                           
cp /usr/local/sbin/keepalived /usr/sbin/
设置为服务,开机启动
vi /etc/rc.local 
/etc/init.d/keepalived start

两个软件启动和停止。

service keepalived start/stop

./nginx -s stop
./nginx -c /usr/local/nginx/conf/nginx.conf

keepalived配置:

global_defs { 
router_id LVS_DEVEL    //负载均衡器标识,同一网段内,可以相同 

vrrp_instance VI_1 {    //定义vrrp实例 
state MASTER        //主LVS是MASTER,从的BACKUP 
interface eth0      //LVS监控的网络接口 
virtual_router_id 51  //同一实例下virtual_router_id必须相同 
priority 100            //定义优先级,数字越大,优先级越高 
advert_int 5          //MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒 
authentication {      //验证类型和密码 
auth_type PASS 
auth_pass 1111

virtual_ipaddress {    //虚拟IP 
192.168.1.8


我认为其他的东西主要和负载均衡lvs相关,因为nginx已经代替了lvs的作用所以都去掉了。

nginx主要配置如下:

#user  nobody;
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  secisland  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    sendfile        on;
    keepalive_timeout  65;
    gzip  on;
    gzip_min_length     1000;
    gzip_types      text/plain text/css application/x-javascript;
    upstream tomcat{
          sticky;
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
    }
    server {
        listen       80;
        server_name  localhost;
        access_log  logs/secisland.log  secisland;
        location /nginx_status {
            stub_status on;
            access_log off;
        }
         location ~ \.(htm|html|gif|jpg|jpeg|png|ico|rar|css|js|zip|txt|flv|swf|doc|ppt|xls|pdf)$ {
             root /opt/tomcat1/webapps/ROOT;
              access_log off;
             expires 24h;
         }
        location / {
              proxy_pass http://tomcat;
            #root   /root/html;
            index  index.html index.htm index.jsp;

                proxy_set_header X-Real-IP $remote_addr; 这个两句话tomcat可以取到真实ip,资源等路径才是对的。
                proxy_set_header Host $host;
        }

基本上就完成了keepalived+nginx+tomcat的负载配置,在第一台机器可以配置ngix到第二台tomcat的转发,这个就利用nginx的能力进行了负载均衡的处理,当第一台机器挂了keepalived会把动态ip切换到第二台机器上,实现了双机高可用。

这里有个问题就是当nginx挂了的时候,keepalived并不知道服务不可用,所以还回继续提供服务,但这个时候已经不起作用了。

所以需要添加一个守护进程,当nginx挂的时候把keepalived也观杀掉,当进程启动的时候也启动keepalived。

可以在crontab里面设置30秒检测一次,也就是当nginx挂的时候最长时间会延迟三十秒切换。

*:30 * * * *  /opt/nginx_pid.sh

#!/bin/bash 
# varsion 1.0
A=`ps -C nginx --no-header |wc -l`   
B=`ps -C keepalived --no-header |wc -l`           
if [ $A -eq 0 ];then                      
#       /usr/local/nginx/sbin/nginx
       sleep 1
       if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
             killall keepalived          
       fi   
elif [ $B -eq 0 ];then                      
        /etc/rc.d/init.d/keepalived start
fi 

最后别忘了脚本要加上可执行的权限,不然不会执行。


vrrp_script weight  脚本执行的逻辑:失败的标志位,当返回值为0时候表示成功,其他都是失败。

为正时,脚本检测成功时此weight会加到priority上,检测失败时不加。
主失败
        主 priority < 从 priority + weight 时会切换。
主成功:
        主 priority + weight > 从 priority + weight 时,主依然为主


weight 为负时,脚本检测成功时此weight不影响priority,检测失败时priority – abs(weight)
主失败:
       主 priority – abs(weight) < 从priority 时会切换主从
主成功:
       主 priority > 从priority 主依然为主。

1 0