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相关知识的讲解,请大家继续关注我博客。
转载于:https://blog.51cto.com/harisxiong/1304969