基于openstack搭建百万级并发负载均衡器的解决方案
最近,喜欢研究一些国外技术大咖们的文章,而这篇文章是基于openstack负载均衡器的解决方案,做的一些总结~希望能够给小伙伴带来一些灵感或者帮助。
openstack现有的负载均衡解决方案,无论是lbaas plugin还是octavia,后端都是基于haproxy的,由于haproxy本身的限制,其单任务最高并发不会超过5万,经本人亲测,利用octavia,在openstack云主机上运行haproxy最高达到过3万并发,所有如果要想达到更高基本的并发,就需要重新设计负载均衡的架构了。
废话不多,先上实现架构图:
如上图,利用lvs的dr转发模式把外部请求分发到多个haproxy,然后由haproxy提供四、七层负载均衡服务。借助这种方式我们就能横向扩展haproxy集群了,整个集群的能力最终由LVS决定,由于lvs特殊的流量转发的处理方式,所以其性能我们完全没必要担心(后面会有解释)。
【01 LVS】
Linux Virtual Server是一个由章文嵩博士发起的一个开源项目,它的官方网站是 http://www.linuxvirtualserver.org现在 LVS 已经是 Linux 内核标准的一部分。LVS能提供高性能的四层负载均衡功能。
LVS有三种转发方式:DR、NAT、TUN,其中DR模式下LVS仅处理二层包头,LVS仅作为访问入口,不作为网关,且后端返回流量不需要进过LVS,因此,LVS对于大流量的转发有很高的处理性能。这次我们借助LVS的DR转发模式提供高速转发功能,在结合haproxy丰富的4、7层功能,来达到我们的需求。
【02 Keepalived】
Keepalived顾名思义keepalilved是实现多机热备的软件,LVS作为负载均衡集群的访问入口,自然要考虑到单点故障的问题,keepaived+lvs的模式是目前业内的首选解决方案,当前端接收请求的lvs虚机出现健康问题时,keepalived会迅速转移VIP到健康的LVS虚机上,保证整个业务不间断。
另外Keepalived不仅能监控前端lvs的健康状况,还能监控后端haproxy集群每台haproxy虚机的健康状况,实时剔除不健康的虚机,并发出报警。
【03 VIP】
整个集群对外的IP,VIP分布在haproxy集群的每台机器及LVS虚机上(只能有一台LVS虚机拥有VIP),LVS上的VIP作为请求的目的IP,haproxy上的VIP作为应答的原IP。配置VIP有很多注意事项,我后面会给出一些配置链接作为参考。
【04 RIP】
haproxy虚机的真实IP,用于haproxy集群内部通讯,接收lvs分发过来的流量,及管理虚机的IP。
【05 Haproxy】
这个就不做介绍了,凡是在openstack上捣鼓负载均衡的小伙伴们对它应该有了深入的了解了。
参考链接:
LVS相关:
http://www.cnblogs.com/liwei0526vip/p/6370103.html
http://www.cnblogs.com/czh-liyu/archive/2011/11/29/2267963.html
http://www.cnblogs.com/danbo/p/4609202.html
keepalived相关:
http://freeloda.blog.51cto.com/2033581/1280962
http://www.cnblogs.com/edisonchou/p/4281978.html
http://blog.csdn.net/xyang81/article/details/52554398
更详细的资料,小伙伴们就需要自己在网上找了,自己动手试着搭建一套,能对上面架构有更深刻的理解。
注意!!!(在小伙伴们迫不及待想验证这个架构时一定要先阅读这儿)
参考链接的配置是在正常物理机上的配置,但在openstack环境中,有以下几点需要注意:
1、 openstack默认开启了防arp欺骗(这个会过滤掉源IP和目的IP为VIP的数据包),且在ovs流表和iptables规则中均有防arp欺骗的规则,在配置文件中关闭防arp欺骗,也只是去掉了ovs流表的规则,iptables中的规则依然存在。正确的解决方案是在配置集群之前要为每个haproxy虚拟机的port添加allowed_address_pairs。添加方法:neutron port-update--allowed-address-pair ip_address=VIP
2、 openstack会利用iptables规则检查非法的tcp连接(即:请求和应答不在同一端口上的连接(有没有一种它就是故意针对lvs dr转发模式的感觉)),这里解决方案给出两种:
2.1如果仅是在验证阶段,改变下面三个内核参数:
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
2.2如果小伙伴觉得方案可行,想要实现代码时:
修改neutron代码:neutron/agent/linux/iptables_firewall.py,
需要注释掉625行(仅此一行,小伙伴们大可放心,不会对neutron功能有任何影响)
3、由于VIP是我们手动设置上的,在neutron数据库中没有记录,neutron为后续虚拟机分配IP时可能会重复,因此我们要先创建一个port占用VIP,创建方法:
neutron port-create--fixed-ip ip_address=VIP
最后给出实现该方案的编码建议:
依然利用octavia的架构,octavia-api不变。添加octavia.amphora.drivers、octavia.compute.drivers和octavia.network.drivers,可根据用户创建负载均衡时选择的最大连接数决定启动多少haproxy虚机。
另,还可实现octavia的多provider,如果用户要求并发数不多,后端可用namespace,如果用户要求稍大并发可用octavia的默认方法用单个虚拟机haproxy实现,如果要求大并发就用lvs+haproxy的方式实。
基于openstack搭建百万级并发负载均衡器的解决方案的更多相关文章
- 总结:如何使用redis缓存加索引处理数据库百万级并发
前言:事先说明:在实际应用中这种做法设计需要各位读者自己设计,本文只提供一种思想.准备工作:安装后本地数redis服务器,使用mysql数据库,事先插入1000万条数据,可以参考我之前的文章插入数据, ...
- 使用redis缓存加索引处理数据库百万级并发
使用redis缓存加索引处理数据库百万级并发 前言:事先说明:在实际应用中这种做法设计需要各位读者自己设计,本文只提供一种思想.准备工作:安装后本地数redis服务器,使用mysql数据库,事先插入1 ...
- 【分布式事务】基于RocketMQ搭建生产级消息集群?
导读 目前很多互联网公司的系统都在朝着微服务化.分布式化系统的方向在演进,这带来了很多好处,也带来了一些棘手的问题,其中最棘手的莫过于数据一致性问题了.早期我们的软件功能都在一个进程中,数据的一致性可 ...
- 支撑百万级并发,Netty如何实现高性能内存管理
Netty作为一款高性能网络应用程序框架,实现了一套高性能内存管理机制 通过学习其中的实现原理.算法.并发设计,有利于我们写出更优雅.更高性能的代码:当使用Netty时碰到内存方面的问题时,也可以更高 ...
- dns 服务架构优化 - 百万级并发不是梦 - bind+namedmanager+dnsmasq
bind: DNS服务端. namedmanager: DNS web管理页面. dnsmasq: 并发查询上游dns域名解析. 问题:作为消息推送业务,单台业务机器域名解析并发达到上万次.业务机器集 ...
- 基于openstack平台的几种Cloud DB解决方案
方案一.openstack 官方 trove解决方案 此方案进行过镜像的打包,由于网络问题,还未能成功实现 方案二.salt 或者ansible+ docker 由于 docker部署数据库,在数据库 ...
- 阿里云云盾抗下全球最大DDoS攻击(5亿次请求,95万QPS HTTPS CC攻击) ,阿里百万级QPS资源调度系统,一般的服务器qps多少? QPS/TPS/并发量/系统吞吐量
阿里云云盾抗下全球最大DDoS攻击(5亿次请求,95万QPS HTTPS CC攻击) 作者:用户 来源:互联网 时间:2016-03-30 13:32:40 安全流量事件https互联网资源 摘要: ...
- 每秒处理3百万请求的Web集群搭建-如何生成每秒百万级别的 HTTP 请求?
本文是构建能够每秒处理 3 百万请求的高性能 Web 集群系列文章的第一篇.它记录了我使用负载生成器工具的一些经历,希望它能帮助每一个像我一样不得不使用这些工具的人节省时间. 负载生成器是一些生成用于 ...
- sqlserver 处理百万级以上的数据处理与优化
一处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应 ...
随机推荐
- cpu,io密集型计算概念
I/O密集型 (CPU-bound) I/O bound 指的是系统的CPU效能相对硬盘/内存的效能要好很多,此时,系统运作,大部分的状况是 CPU 在等 I/O (硬盘/内存) 的读/写,此时 CP ...
- 页面布局整理(基于scss)
页面开发步骤: 1.全局reset.设置基础背景色.设置基础字体样式 2.全局布局页面结构,meta 标签引入 3.按钮等相同的样式,用scss提前写好一份公用,渐变等 border-radius b ...
- 无法安装 Microsoft Visual Studio 2010 Service Pack 1
解决办法: 32 位系统删除:HKEY_LOCAL_MACHINE\Software\Microsoft\VSTO Designtime Setup\ 64 位系统删除:HKEY_LOCAL_MACH ...
- SQL提取数据库表名,字段名等信息
-------提取数据库所有表的表名.字段名 -------在SQLserver 2000中测试 --查询所有用户表所有字段的特征 SELECT D.Name as TableName, A.colo ...
- 游戏引擎架构Note1
[游戏引擎架构] 1.第14章介绍的对游戏性相关系统的设计非常有价值.各个开发人员几乎都是凭经验设计,很少见有书籍对这些做总结. 5.通过此书以知悉一些知名游戏作品实际上所采用的方案. 6.书名中的架 ...
- 面试题:Java程序员最常用的20%技术 已看1
首先常用api(String,StringBuffer/StringBuilder等) 1.集合类,线程类 2.Servlet(很少用纯粹的servlet写,但你要懂,因为很多框架都是基于servle ...
- requests基础
爬虫的基本原理:爬虫本质上是模拟人浏览信息的过程,只不过他通过计算机来达到快速抓取筛选信息的目的.所以我们想要写一个爬虫,最基本的就是要将我们需要抓取信息的网页原原本本的抓取下来.这个时候就要用到re ...
- backquote
character (`) A backquote or backtick. echo 'date' date echo `date` 2015年 07月 03日 星期五 16:11:13 CST j ...
- 如何恢复VS2013代码实时校验功能
VS2013在某一天突然无法进行实时代码校验了,只有在编译的时候,错误列表才显示语法错误 怎么来解决这个问题呢?试试环境重置吧. 首先:打开工具菜单,选择“导入和导出设置”. 其次:可以先导出选定 ...
- 【JAVA】虚拟机指令集
[JAVA]虚拟机指令集 – – – 0x00 nop 什么都不做 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1 将int型-1推送至栈顶 0x03 icons ...