keepalived+Nginx负载均衡高可用

时间:2022-12-19 10:56:10

安装环境:Centos6.5 x86_64系统最小化安装
实验环境:
           Nginx1:172.16.35.206
           Nginx2:172.16.35.81
           http1:172.16.35.249
           http2:172.16.35.75
           VIP:172.16.35.211

拓扑图:

       keepalived+Nginx负载均衡高可用

背景:

   既然有了Lvs+keepalived这样高性能的组合,那为何还要有Nginx+keepalived呢,keepalived的初衷就是为了Lvs而设计的,我们都知道Lvs是一个四层的负载均衡设备,虽然有着高性能的优势,但同时它却没有后端服务器的健康检查机制,keepalived为lvs设计了一系列的健康检查机制TCP_CHECK,UDP_CHECK,HTTP_GET等。同时lvs也可以自己写健康检查脚步。或者结合ldirectory来实现后端检测。但是固LVS始终无法摆脱它是一个四层设备,无法对上层协议进行解析。Nginx不一样,Nginx是一个七层的设备可以对七层协议进行解析,可以对一些请求进行过滤,还可以对请求结果进行缓存。这些都是Nginx独有的优势。但是keepalived并没有为Nginx提供健康检测。需要自己去写一些脚步来进行健康检测。关于Lvs+keepalived的构建可参考我的另一篇博文:

http://forlinux.blog.51cto.com/8001278/1404278


一:安装配置Nginx(结合gperftool来优化内存使用tcmalloc替代glibc来管理内存)

给Nginx1和Nginx2分别安装nginx服务,并配置upstream

#!/bin/bashgroupadd -r nginx
useradd -r -g nginx nginx
yum install gcc gcc-c++ openssl-devel pcre-devel wget vim automake autoconf -y
wget http://nginx.org/download/nginx-1.4.7.tar.gz
#这个地址可能有的时候无法解析到域名下载不到这个包,需要自己去下载包然后安装安装步骤一步一步安装
#wget http://mirror.yongbok.net/nongnu/libunwind/libunwind-1.1.tar.gz
wget http://gperftools.googlecode.com/files/gperftools-2.1.tar.gz
# libunwind install
tar -xvf libunwind-1.1.tar.gz
cd libunwind-1.1
CFLAGS=-fPIC ./configure
make CFLAGS=-fPIC
make CFLAGS=-fPIC install
cd ..
# gperftools install
tar -xvf gperftools-2.1.tar.gz
cd gperftools-2.1
./configure
make && make install
echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
ldconfig
cd ..
# nginx install
tar zxvf nginx-1.4.7.tar.gz
cd nginx-1.4.7
./configure --prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-google_perftools_module \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-pcre
make && make install
# Setup
mkdir /tmp/tcmalloc
chmod 0777 /tmp/tcmalloc
#简单的一个nginx优化
cat >> /etc/sysctl.conf <<EOF
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.core.somaxconn = 262144
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
EOF


Nginx配置:

upstream backserver {        server 172.16.35.249:80 max_fails=3 fail_timeout=3s;        server 172.16.35.75:80  max_fails=3 fail_timeout=3s;}   server {        listen       80;        server_name  localhost;        location / {            root   html;            index  index.html index.htm;            proxy_pass http://backserver;            proxy_set_header X-Real-IP $remote_addr;            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        }


二:安装配置keepalived

#!/bin/bashyum install kernel-devel gcc gcc-c++ openssl-devel -ywget http://www.keepalived.org/software/keepalived-1.2.12.tar.gztar zxvf keepalived-1.2.12.tar.gzcd keepalived-1.2.12./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/*/make && make installmkdir /etc/keepalived\cp  -f keepalived/etc/keepalived/keepalived.conf /etc/keepalived/\cp -f keepalived/etc/init.d/keepalived.init /etc/init.d/keepalived\cp -f keepalived/etc/init.d/keepalived.sysconfig /etc/sysconfig/keepalived\cp -f /usr/local/keepalived/sbin/keepalived /sbin/


配置keepalived

! Configuration File for keepalivedglobal_defs {   notification_email {           yfzhang@Iflytek.com    #定义邮箱报警的邮箱地址   }   notification_email_from root@localhost #定义发送报警信息的地址   smtp_server 127.0.0.1 #定义发送邮件的邮件服务器地址   smtp_connect_timeout 30 #定义发送邮件的超时时间   router_id LVS_DEVEL #全局标识}vrrp_script check_run {    #定义检查nginx服务的脚本        script "killall -0 nginx" #killall -0 nginx会模拟杀死nginx进程,实际上并没有。如果可以模拟杀死则nginx服务正常。        interval 2 #检查的间隔时间        weight -2 #检查失败的话权重减2        fall 2 #检查失败2次才认为是真正的检查失败}vrrp_instance VI_1 {    state MASTER    interface eth0    virtual_router_id 51    priority 100  #备用机器的keepalived的权重要小于这个权重,并且当nginx服务挂掉后100-2要小于备用机器的权重。    advert_int 1    smtp_alert #比较重要 定义使用邮件发送,不然上面的邮件定义都是没有用的,使用了这个当状态发生改变就会发送邮件报警    authentication {        auth_type PASS        auth_pass 1111    }    track_script {    #定义使用哪个脚本来检查。        check_run   }    virtual_ipaddress {        172.16.35.211    }}

备用keepalived上的配置文件和主keepaived一样,但是priority是99.这样的话当nginx挂掉了,主的keepalived就变成了98,那么备机就可以抢占VIP了


三:安装配置两台测试的机器

给两台测试机器安装Nginx提供web服务。并提供测试页面

echo "172.16.35.249" > /usr/local/nginx/html/index.html

echo "172.16.35.75" > /usr/local/nginx/html/index.html


四:测试最终的结果。

基本功能测试:

keepalived+Nginx负载均衡高可用keepalived+Nginx负载均衡高可用


关闭了nginx后开vip是否漂移。

vip没有漂移之前:

keepalived+Nginx负载均衡高可用


关闭了Nginx后VIP进行了漂移

keepalived+Nginx负载均衡高可用

备用机器抢占VIP的过程

keepalived+Nginx负载均衡高可用



关闭Keepalived,看VIP偏移。

keepalived+Nginx负载均衡高可用


注意事项:

  1.keeaplived的配置文件要注意书写格式

   keepalived,默认不检查配置文件的语法问题。这是个很头疼的问题,我就遇见过好几次因为配置文件格式的问题搞了几个小时才解决。要避免从word中粘贴配置文件内容。一下总结下配置文件格式的一些问题:

1.VI_1 { 类似于这样的形式,关键字和{之间需要留空格

2.检测脚本要有权限。


  2.检测脚本也可以使用如下脚本:更具有健壮性。

#!/bin/bashN=`ps -C nginx --no-header|wc -l`if [ $N -eq 0 ];then        /usr/local/nginx/sbin/nginx        sleep 1        if [ `ps -C nginx --no-header|wc -l` -eq 0 ];then                service keepalived stop        fifi


本文出自 “专注linux” 博客,请务必保留此出处http://forlinux.blog.51cto.com/8001278/1404936