1.HAProxy简介

2.HAProxy性能详解

3.简单安装和示例配置

4.案例:如何利用HAProxy实现网上购物商城的动静分离

-----------------------------------------------------------------------------------------

1.HAProxy简介

HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

HAProxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。

HAProxy是免费、极速且可靠的用于为TCP和基于HTTP应用程序提供高可用、负载均衡和代理服务的解决方案,尤其适用于高负载且需要持久连接或7层处理机制的web站点。

2.HAProxy性能详解

1.基于单进程、事件驱动模型显著降低了上下文切换的开销及内存占用。

2.事件检查器(event checker)允许其在高并发连接中对任何连接的任何事件实现即时探测。

3.在任何可用的情况下,单缓冲(single buffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽;

4.借助于Linux 2.6 (>= 2.6.27.19)上的splice()系统调用,HAProxy可以实现零复制转发(Zero-copy forwarding),在现在的新版本的Linux OS中还可以实现零复制启动(zero-starting)

5.MRU内存分配器在固定大小的内存池中可实现即时内存分配,这能够减少创建一个会话的时长;

6.树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了接近以O(1)的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列;

7.优化的HTTP首部分析:优化的首部分析功能避免了在HTTP首部分析过程中重读任何内存区域;

8.支持客户端侧的长连接(client-side keep-alive)并且支持TCP加速(TCP speedups)

9.基于源的粘性(source-based stickiness)及更详细的健康状态检测(more verbose health checks)

3.简单安装和示例配置

安装:在RHEL6.4的系统镜像中默认已经集成了HAProxy,版本为1.4.22。在这里我们使用yum装:

[root@HAProxy ~]# yum install haproxy          #安装
[root@HAProxy ~]# rpm -ql haproxy              #查看生成的配置文件
/etc/haproxy
/etc/haproxy/haproxy.cfg
/etc/logrotate.d/haproxy
/etc/rc.d/init.d/haproxy
/usr/bin/halog
/usr/sbin/haproxy
/usr/share/doc/haproxy-1.4.22
......

简单配置:

[root@HAProxy ~]# vim /etc/haproxy/haproxy.cfg
global                #全局设置
    log         127.0.0.1 local2       #定义日志的记录的级别和服务器地址
    chroot      /var/lib/haproxy       #限定相关用户的访问目录
    pidfile     /var/run/haproxy.pid   #pid文件的设置
    maxconn     4000                   #最大连接数的设置
    user        haproxy                #定义运行服务的用户
    group       haproxy                #属组
    daemon                             #设置服务后台运行
    stats socket /var/lib/haproxy/stats #打开状态检测socket
listen stats             #关联前端和后端定义一个定义一个完整的代理                       
    mode http                          #设置代理协议
    bind *:1080                        #绑定相应的端口
    stats enable                       #开启状态检测
    stats hide-version                 #隐藏代理服务器版本
    stats uri       /stats             #设置资源详细记录
    stats realm     haproxy_stats      #设置登录认证提示信息
    stats auth      admin:admin        #设置登录用户和密码
frontend  main *:8080   #定义监听套接字
    acl url_static       path_end   -i .jpg .gif .png .css .js   #acl匹配静态资源
    use_backend static   if url_static  #如果匹配静态资源使用static    
    default_backend      app            #否则使用默认的后端服务器
backend static          #定义后端服务器的设置(匹配静态)
    balance     roundrobin              #使用动态的轮询调度算法
    server      static 192.168.21.4:80 check   #设置代理的后端服务器地址
backend app            #定义匹配默认的后端服务器
    balance     roundrobin
    server  app1 192.168.21.1:80 check
    server  app2 192.168.21.2:80 check

4.案例:如何利用HAProxy实现网上购物商城的动静分离

4.1.实验拓扑:

210313167.png

4.2.实验环境

本次实验所采用的系统环境都为RHEL6.4.

HAProxyhaproxy-1.4.22-3.el6.src.rpm

Apachehttpd-2.2.15-26.el6.src.rpm

MySQLmysql-5.5.33.tar.gz

TomcatA/TomcatB的实验环境搭建和配置和上篇博客相同,这里我就不再详细给出。

4.3.简单配置的实现

HAProxy:

# yum install haproxy
# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
# vim /etc/haproxy/haproxy.cfg
listen stats
    mode http
    bind *:1080
    stats enable
    stats hide-version
    stats uri       /stats
    stats realm     haproxy_stats
    stats auth      admin:admin
                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
frontend  main *:8080
    acl url_static       path_end       -i .jpg .gif .png .css .js         
    use_backend static          if url_static
    default_backend             app
                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
backend static
    balance     roundrobin
     server      static 192.168.21.4:8080 check
                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
backend app
    balance     roundrobin
    server  app1 192.168.21.1:80 check
    server  app2 192.168.21.2:80 check

关于参数的详细解释我在上面已经介绍这里就不在叙述了。

MySQL:

[root@MySQL ~]# yum install cmake
[root@MySQL ~]# useradd -r mysql
[root@MySQL ~]# chown -R mysql:mysql /mydata/data
[root@MySQL ~]# tar xf mysql-5.5.33.tar.gz
[root@MySQL ~]# cd mysql-5.5.33
[root@MySQL ~]# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/mydata/data \
-DSYSCONFDIR=/etc \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
[root@MySQL ~]# make
[root@MySQL ~]# make install
[root@MySQL ~]# cd /usr/local/mysql
[root@MySQL ~]# chown -R root:mysql *
[root@MySQL ~]# cp support-files/my-large.cnf /etc/my.cnf
[root@MySQL ~]# vim /etc/my.cnf
[mysqld]
thread_concurrency = 4                       #物理核心的两倍
datadir = /mydata/data                       #修改数据文件的目录
[root@MySQL ~]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@MySQL ~]# chmod +x /etc/rc.d/init.d/mysqld  
#可以修改该脚本start选项参数添加 --skip-grant  跳过验证
[root@MySQL ~]# cd /usr/local/mysql
[root@MySQL ~]# scripts/mysql_install_db \
--user=mysql  --datadir=/mydata/data         #初始化脚本
[root@MySQL ~]# service mysqld start
[root@MySQL ~]# chkconfig mysqld on
[root@MySQL ~]# ss -tanl                    #查看相关监听端口

为相关用户授权:

mysql> create database shopxx;
mysql> create user 'showuser'@'%' identified by 'showpass';
mysql> grant all on shopxx.* to 'showuser'@'%';

TomcatA/B:

1.完成JDKTomcat的安装

2.实现TomcatATomcatB基于内存的共享

3.完成shopxx-a5-Beta.zip商城的部署,下载链接: http://yunpan.cn/QbQadWAreYyGN

Tomcat的相关部署我在上一篇博客已经进行了详细的叙述,整个环境完全一样,大家可以参考一下。

Apache:

[root@Apache ~]# cd /etc/httpd/conf
[root@Apache conf]# vim httpd.conf
    Listen 8080
[root@Apache ~]# cd /var/www/html/
[root@Apache html]# mkdir shop
[root@Apache html]# cd shop/
[root@Apache shop]# scp -rp 192.168.21.1:/usr/local/tomcat/webapps/shop/* /var/www/html/shop/
[root@Apache shop]# ls
admin          favicon.ico  license.html  resources   sitemap
article        index.html   META-INF      robots.txt  upload
changelog.txt  install      product       shopxx.txt  WEB-INF
[root@Apache ~]# service httpd restart
[root@Apache shop]# ss -tanl | grep :8080
LISTEN     0      128         :::8080                    :::* 

4.4.重新启动所有的服务器,并进行相应的测试

1.访问 http://172.16.21.100:1080/stats 查看后端服务器状态:

212440704.png

2.输帐号和密码(已在HAProxy配置文件中定义)

212641237.png

3.访问网上商城主页: http://172.16.21.100:8080/shop

212935683.png

4.我们能够发现可以访问。

5.在这里我们可以简单的验证一下动静分离的实现。

我们将后端的apache服务器停止再次进行访问如下: [root@Apache ~]# service httpd stop

213224874.png

6.再次启动apache服务器进行访问测试 [root@Apache ~]# service httpd start

213648747.png

我们发现又可以完整的显示主页了。登录用户查看购物车的信息依然存在。


至此利用HAProxy反向代理实现网上商城的动静分离已经完整的实现。大家如有疑问可以相互交流。 QQ:572807025 邮箱:xk1129@163.com


关于Varnish缓存的使用及keepalived相关知识的讲解,请大家继续关注我博客。