您的位置:首页 > 运维架构 > Tomcat

HAProxy详解及网上商城动静分离的实现

2013-10-05 21:43 483 查看
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.实验拓扑:



4.2.实验环境
本次实验所采用的系统环境都为RHEL6.4.
HAProxy:haproxy-1.4.22-3.el6.src.rpm
Apache:httpd-2.2.15-26.el6.src.rpm
MySQL:mysql-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.完成JDK和Tomcat的安装
2.实现TomcatA和TomcatB基于内存的共享
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 查看后端服务器状态:



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



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



4.我们能够发现可以访问。
5.在这里我们可以简单的验证一下动静分离的实现。
我们将后端的apache服务器停止再次进行访问如下: [root@Apache ~]# service httpd stop




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



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

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

关于Varnish缓存的使用及keepalived相关知识的讲解,请大家继续关注我博客。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息