Haproxy+Keepalived实现负载均衡高可用
Nginx+keepalived可以参考我的博文
Lvs+keepalived可以参考我的博文
背景:
Haproxy+Keepalived的优势何在,如果你的网站并发量挺大的但是还不至于大到使用lvs的地步,并且又想对七层协议进行过滤。可能需要实现动静分离,又或者是基于内容的过滤等。但是并发量还是挺大的,Nginx可能没法满足要求的话,那么Haproxy是您绝佳的选择Haproxy和Nginx一样都是单进程事件驱动模型,linux2.6内核下都是使用了epoll机制。那么Haproxy相比Nginx有哪些优良之处呢。我认为Haproxy的优化做的比Nginx好可以承载的并发大于Nginx,还有良好的数据接口,基于流量的健康状态检查机制,服务器管理命令行接口,基于URI的负载均衡算法(在缓存服务器场景下工作良好),对session保持和cookie引导有很好的支持。并且适用于多种七层协议(Nginx只支持mail和http),还可以支持四层的负载均衡(用的少,多用于七层)。
HAproxy的一些特性如下:
客户端侧的长连接(client-side keep-alive)
TCP加速(TCP speedups)
响应池(response buffering)
RDP协议
基于源的粘性(source-based stickiness)
更好的统计数据接口(a much better stats interfaces)
更详细的健康状态检测机制(more verbose health checks)
基于流量的健康评估机制(traffic-based health)
支持HTTP认证
服务器管理命令行接口(server management from the CLI)
基于ACL的持久性(ACL-based persistence)
日志分析器
实验环境:
Haproxy主:172.16.35.81
Haproxy备:172.16.35.206
PHP:172.16.35.75
Nginx:172.16.35.249
VIP:172.16.35.211
实验拓扑如下:
Haproxy+keeaplived安装配置:
在Haproxy主和Haproxy备分别安装keepalived
#!/bin/bash yum install kernel-devel gcc gcc-c++ openssl-devel -y wget http://www.keepalived.org/software/keepalived-1.2.12.tar.gz tar zxvf keepalived-1.2.12.tar.gz cd keepalived-1.2.12 ./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/*/ make && make install mkdir /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/
HAproxy主的keepalived配置文件如下:
! Configuration File for keepalived global_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 { script "killall -0 haproxy" interval 2 weight -2 fail 2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { check_run } virtual_ipaddress { 172.16.35.211 } }
Haproxy备的keepalive配置文件和HAproxy是一样的,只是HAproxy备的priority值为99。
安装Haproxy:
#!/bin/bash wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.25.tar.gz tar zxvf haproxy-1.4.25.tar.gz cd haproxy-1.4.25 yum install gcc gcc-c++ autoconf automake -y make TARGET=linux2628 arch=x86_64 make install mkdir /etc/haproxy cp examples/haproxy.cfg /etc/haproxy cp examples/haproxy.init /etc/init.d/haproxy chmod +x /etc/init.d/haproxy
注意:通常我们在网上找到的haproxy的安装方法都是TARGET=linux26,这种边缘方式是可以的,不可以默认是禁用了splice系统调用splice系统调用类似与sendfile机制,在linux内核2.6.28以前有bug存在不建议使用,linux内核2.6.28以后是可以启用的,我使用的是Centos6.4内核版本是2.6.32所以使用TARGET=linux2628的编译方式。
配置HAproxy:
配置文件如下:HAproxy主和背配置文件是相同的
# this config needs haproxy-1.1.28 or haproxy-1.2.1 global log 127.0.0.1 local1 notice #设置日志存放的位置和日志记录的级别,还需要进入/etc/rsyslog.conf中配置local1日志存放的位置 maxconn 40960 #每个haproxy进程最大可接受的并发连接数 uid 99 #指定运行haproxy进程的用户和组 gid 99 daemon #以服务的形式运行 pidfile /var/log/haproxy.pid #指定pid文件的位置 defaults log global #使用全局配置的日志 mode http #使用七层负载均衡 option httplog #记录http访问日志 option dontlognull #不记录空日志 option forwardfor except 127.0.0.1 #允许在发往服务器的请求首部中插入“X-Forwarded-For”首部但除了127.0.0.1 retries 3 #连接失败后重新连接的次数 option redispatch #在连接失败的情况下将sesion重新分发 timeout http-request 10s #等待完成http的请求的最大时间 timeout queue 1m #当请求达到maxconn的时候后续的连接请求就会放置连接队列中,这个时间用于设置队列中的最大等待时间 timeout connect 1m #尝试连接到服务器的最大等待时间 timeout client 1m #设置客户端这边的最大非活动时间(意思就是一个空闲连接的保持时间) timeout server 1m #设置服务器端的最大非活动时间 timeout http-keep-alive 10s #设置等待一个新的http请求的最大等待时间(从一个http请求开始到发送回复报文这段时间) timeout check 10s #额外的检查时间不同于server中的inter 如果设置了haproxy将会使用timeout check和inter中最小的那个 maxconn 20000 #每个haproxy可承受的最大并发连接数目 #定义后端统计数据接口 #一个listen就等于一个frontend结合一个backend listen ststus bind *:1080 #定义监听的接口 stats enable #开启统计数据接口 stats hide-version #隐藏haproxy版本 stats uri /haproxy?stats #定义统计数据网址 stats realm Haproxy\ Statistics #定义认证提示信息 stats auth statsadmin:password #定义认证的用户名和密码 stats auth statsmaster:password stats admin if TRUE #定义在认证通过的情况下开启管理功能 #定义一个fronted frontend www bind *:80 mode http log global #开启http被动关闭 option httpclose #设置一个acl 用来匹配静态文件 acl url_static path_end -i .css .js .html .htm #设置一个acl 用来匹配动态文件 acl url_dynamic path_end -i .php #如果匹配了静态文件就使用nginx提供服务 use_backend static if url_static #默认使用php服务器 default_backend dynamic #定义一个后端 静态服务器 backend static server nginx 172.16.35.75:80 check maxconn 3000 #定义一个后端 动态服务器 backend dynamic server php 172.16.35.249:80 check maxconn 3000 HAproxy主和备的配置文件相同
安装Nginx提供静态web服务:
#!/bin/bash groupadd -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
安装lamp提供动态应用服务这里为了方便使用yum安装:
yum install php-mysql php-gd libjpeg* php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-mcrypt php-bcmath php-mhash libmcrypt php -y yum install mysql mysql-server -y
给nginx和php两台机器分别提供一个动态页面一个静态页面
echo "I am a static page 172.16.35.75" >> /usr/local/nginx/html/index.html
echo "<?php echo "I am s dynamic page 172.16.35.249"; ?>" >> /var/www/html/index.php
验证其结果是否实现动静分离:
验证其结果是否实现了HAproxy的高可用
关闭keepalived实现高可用地址漂移
关闭haproxy实现高可用地址漂移
至此Haproxy+Keepalived实现高可用和动静分离就实现了。