keepalived+nginx高可用

1 挂载iso镜像文件作为本地yum源

  • 挂载ISO文件到/mnt/CentOS6:mount -o loop /home/CentOS-6.7-x86_64-DVD.iso /mnt/CentOS6
  • 创建repo文件
cd /etc/yum.repos.d
mkdir bak
mv *.repo /etc/yum.repos.d/bak
vi CentOS6.7-localsource.repo

[CentOS7-Localsource]
name=CentOS6
baseurl=file:///mnt/CentOS6
enabled=1
gpgcheck=0

yum  clean all(清除缓存)
yum makecache(建立新缓存)

LVS提供虚拟服务,采用直接路由模式DR;nginx作为反向代理服务器来实现负载均衡;keepalived实现主从热备,检查RealServer的健康状态以及主机与备机之间失效转移。本文选用Tenengine作为反向代理和负载均衡服务,Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性;Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。

直接路由模式DR (Direct Routing)

  • 相关术语
    • 1.DS:Director Server。指的是前端负载均衡器节点
    • 2.RS:Real Server。后端真实的工作服务器
    • 3.VIP:向外部直接面向用户请求,作为用户请求的目标的ip地址
    • 4.DIP:Director Server IP,主要用于和内部主机通讯的IP地址
    • 5.RIP:Real Server IP,后端服务器的IP地址
    • 6.CIP:Client IP,访问客户端的IP地址
  • 原理:负载均衡器和RS都使用同一个IP对外服务。但只有DR对ARP请求进行响应,所有RS对本身这个IP的ARP请求保持静默。也就是说,网关会把对这个服务IP的请求全部定向给DR,而DR收到数据包后根据调度算法,找出对应的RS,把目的MAC地址改为RS的MAC(因为IP一致)并将请求分发给这台RS。这时RS收到这个数据包,处理完成之后,由于IP一致,可以直接将数据返给客户,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端。由于负载均衡器要对二层包头进行改换,所以负载均衡器和RS之间必须在一个广播域,也可以简单的理解为在同一台交换机上。

优点:负载均衡器只是分发请求,应答包通过单独的路由方法返回给客户端。

缺点:要求负载均衡器的网卡必须与物理网卡在一个物理段上。

本次安装环境及软件版本:

- CentOS6.7
- Tengine-2.2.0
- keepalived-2.0.13

2 nginx安装

  • 下载
    http://tengine.taobao.org/download.html

  • 解压
    tar -zxvf Tengine-2.2.0.tar.gz -C /opt/

  • 安装
    进入解压后的目录 ./configure --prefix=/opt/tengine

    异常1:  
       [root@bogon tengine]# ./configure  
    checking for OS  
     + Linux 3.10.0-327.el7.x86_64 x86_64  
    checking for C compiler ... not found  
       
    ./configure: error: C compiler cc is not found  
    也就是c编译器 gcc找不到  
      安装gcc  yum -y install gcc  
    继续检查  
    异常2:  
     checking for PCRE library ... not found  
    checking for PCRE library in /usr/local/ ... not found  
    checking for PCRE library in /usr/include/pcre/ ... not found  
    checking for PCRE library in /usr/pkg/ ... not found  
    checking for PCRE library in /opt/local/ ... not found  
       
    ./configure: error: the HTTP rewrite module requires the PCRE library.  
    You can either disable the module by using --without-http_rewrite_module  
     缺少pcre和pcre-devel 安装 yum -y install pcre pcre-devel  
     这里安装好后 可以通过。
     
     异常3:  
     checking for OpenSSL library ... not found  
     缺少openssl和openssl-devel 安装 yum -y install openssl openssl-devel  
    

    make && make install
    安装完成,安装目录为configure时指定的/opt/tengine,如未指定默认安装目录为/usr/local/nginx

  • 安装完成之后,检查nginx的配置文件是否正确

    cd /opt/tengine/sbin/
    ./nginx -t
    

    检查通过,说明nginx安装成功。

  • nginx启动

    配置环境变量
    vi /etc/profile
    
    加入
    export NGINX_HOME=/opt/tengine
    export PATH=$PATH:$NGINX_HOME/sbin
    保存
    
    输入nginx启动。
    
  • nginx常用命令

    • nginx -m 显示所有加载的模块
    • nginx -l 显示所有可以使用的指令
    • nginx -t 检查nginx的配置文件是否正确
    • nginx -s 启动nginx
    • nginx -s reload 重新加载配置文件
    • nginx -s stop 停止nginx
  • 配置nginx
    vi /home/java/tengine/conf/nginx.conf

# user  root;            #运行用户
worker_processes  1;        #启动进程,通常设置成和cpu的数量相等

#全局错误日志及PID文件
error_log  /home/java/nginx/logs/error.log;
error_log  /home/java/nginx/logs/error.log  notice;
error_log  /home/java/nginx/logs/error.log  info;
pid        /home/java/nginx/logs/nginx.pid;

# 工作模式及连接数上线
events {
    use epoll;            #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能

    worker_connections  1024;    #单个后台worker process进程的最大并发链接数
}

#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
    include       mime.types;   #文件扩展名与类型映射表
    default_type  application/octet-stream; #默认文件类型
    
    #设置日志模式
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    #设定请求缓冲
    server_names_hash_bucket_size  128;
    client_header_buffer_size   32K;
    large_client_header_buffers  4 32k;
    # client_max_body_size   8m;
    
    #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
    #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
    sendfile        on;
    tcp_nopush     on;
    tcp_nodelay    on;

    #连接超时时间
    #keepalive_timeout  0;
    keepalive_timeout  65;

    #开启gzip压缩,降低传输流量
    gzip  on;
    #设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,表示不管页面多大都进行压缩。建议设置成大于1K。如果小于1K可能会越压越大。
    gzip_min_length    1k;
    #压缩缓冲区大小。表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
    gzip_buffers    4 16k;
    #压缩版本(默认1.1)用于设置识别HTTP协议版本,目前大部分浏览器已经支持GZIP解压,使用默认即可。
    gzip_http_version  1.1;
    #压缩比率。用来指定GZIP压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理最慢,也比较消耗cpu资源。
    gzip_comp_level  2;
    #用来指定压缩的类型,“text/html”类型总是会被压缩
    gzip_types  text/plain application/x-javascript text/css  application/xml;
    gzip_vary on;

    #反向代理负载均衡设定部分

    #upstream表示负载服务器池,切记,这个名称不能使用下划线,否则无法识别导致负载不过去
    upstream serverpool {
        #server tomcat地址:端口号 weight表示权值,权值越大,被分配的机率越大;
        server 192.168.33.101:80 weight=4 max_fails=2 fail_timeout=30s;
      server 192.168.33.102:80 weight=4 max_fails=2 fail_timeout=30s;
    }

    server {
        listen       8088;        #监听端口    
        server_name  www.test.com; #对外提供服务的网址(域名或者ip)
    
        #默认请求设置
        location / {
            index index.jsp index.html index.htm;   #设定访问的默认首页
            #root /usr/local/apache7/webapps;    #站点根目录,此目录下存放我们的web项目
            proxy_pass http://serverpool;
        }
        
        #charset koi8-r;

        #access_log  logs/host.access.log  main;

    
        #所有的jsp页面均由tomcat处理
        location ~ \.(jsp|jspx|dp)?$
        {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass http://serverpool;    #转向tomcat处理
        }
        
        #所有的静态文件直接读取不经过tomcat,nginx自己处理
        location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ 
        { 
            expires  30d;
        }
        location ~ .*\.(js|css)?$
        {
               expires  1h;
        }
        #log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '$status $body_bytes_sent "$http_referer"' '"$http_user_agent" $http_x_forwarded_for';
        #access_log  /usr/local/nginx/logs/ubitechtest.log access;#设定访问日志的存放路径     

        # redirect server error pages to the static page /50x.html
        #

        #定义错误提示页面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }
}

其他节点上配置文件可完全一样。至此nginx已搭建完成,浏览器输入http://192.168.33.101:8088即可访问。

3 keepalived实现nginx高可用(HA)

  • 安装
    编译安装方式与nginx类似。
先解压
tar -zxvf /home/soft/keepalived-2.0.13.tar.gz

cd /home/soft/keepalived-2.0.13/
./configure --prefix=/opt/keepalived-2.0.13
make && make install
  • 建立服务启动脚本,以便使用service命令控制,将解压后路径/home/soft/keepalived-2.0.13/keepalived/etc/init.d的文件keepalived拷贝到/etc/init.d下
cp /home/soft/keepalived-2.0.13/keepalived/etc/init.d/keepalived /etc/init.d/
  • 由于安装使用非默认路径(本教程中使用的/opt/keepalived-2.0.13)故需修改相关路径,保证keepalived能正常启动
vi /etc/init.d/keepalived
大约15行
将. /etc/sysconfig/keepalived 修改为
. /opt/keepalived-2.0.13/etc/sysconfig/keepalived
  • 设置正确启动参数命令,并将修改好的keepalived拷贝到/etc/sysconfig 目录下
vi /opt/keepalived-2.0.13/etc/sysconfig/keepalived

修改的路径为安装路径下的配置文件,如果不修改,则默认会去找/etc/keepalived/keepalived.conf文件。
KEEPALIVED_OPTIONS="-D -f /opt/keepalived-2.0.13/etc/keepalived/keepalived.conf"

将修改好的keepalived拷贝到/etc/etc/sysconfig 目录下
cp /opt/keepalived-2.0.13/etc/sysconfig/keepalived /etc/sysconfig/
  • 配置keepalived
    vi /opt/keepalived-2.0.13/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
    router_id LVS_MASTER         # 设置lvs的id,在一个网络应该是唯一的
}
vrrp_instance VI_1 {
    state MASTER            # 指定keepalived的角色,备用服务器上为 BACKUP
    interface ens33            # 当前进行vrrp通讯的网络接口卡(当前centos的网卡),根据自己的服务器来设置
    virtual_router_id 66        # 虚拟路由编号,主从要一直
    priority 100            # 优先级,数值越大,获取处理请求的优先级越高,备用服务器上数值要小点
    advert_int 1            # 检查间隔,默认为1s(vrrp组播周期秒数)
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.33.200        # 定义虚拟ip(VIP),可多设,每行一个
    }
}

# 定义对外提供的LVS的VIP以及port
virtual_server 192.168.33.200 80 {
    delay_loop 6             # 设置健康检查时间,每隔6秒查询realserver状态
    lb_algo rr            # lvs 算法
    lb_kind DR            # 设置lvs实现负载的机制,有NAT、TUN、DR三个模式
    persistence_timeout 0        # 同一IP的连接60秒内被分配到同一台realserver
    protocol TCP
    
    #真实服务器(nginx) 
    real_server 192.168.33.101 8088 {
        weight 3        # 配置节点权值,数值越大权重越高
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 8088
        }
        
    }
    real_server 192.168.33.102 8088 {
        weight 3
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 8088
        }
    }
}
  • 这里在keepalived的配置文件中定义的LVS模式为DR模式,还需要在两台rs上执行lvs_dr_rs.sh脚本
vi /opt/keepalived-2.0.13/lvs_dr_rs.sh

#/bin/bash
vip=192.168.33.200
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

  • 执行:sh /opt/keepalived-2.0.13/lvs_dr_rs.sh
  • 在两台真实服务器上面执行完毕之后,执行ip addr就能看到两台服务器的lo都绑定好了虚拟ip.
  • 服务器重启之后绑定的这个虚拟ip就没有了,需要再执行一下脚本,所以可以把对这个脚本的执行放到开机自启中。
执行命令:vi /etc/rc.d/rc.local
将以下内容添加至该文件中:sh /opt/keepalived-2.0.13/lvs_dr_rs.sh
保存退出,然后添加执行权限:chmod +x rc.local

  • 启动keepalived服务: service keepalived start
  • 在keepalived端执行命令ipvsadm -ln查看连接数,如果报错,先安装ipvsadm,yum install -y ipvsadm
[root@chenhao keepalived-2.0.13]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.33.200:80 rr
  -> 192.168.33.101:80            Route   3      0          1         
  -> 192.168.33.102:80            Route   3      0          2
  • 出现的问题
1、启动过程中提示keepalived command not found
启动方式为:/etc/init.d/keepalived start
原因:keepalived命令没有在/usr/sbin目录下
解决方法:cp /opt/keepalived-2.0.13/sbin/keepalived /usr/sbin
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章