基于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的方式实。

转载于:https://www.cnblogs.com/xiaohanlin/p/8570275.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5 useMemouseCallback

useMemo 优化渲染 现象 App每次重新执行时&#xff0c;render变化了&#xff0c;引用的render不是同一个函数 import React, { useState, } from "react"; const Foo props > {return <ul>{props.render()}</ul> } function App() {const [range…

6 useRef、useImperativeHandle

useRef在每次执行时返回的是同一个引用&#xff08;返回的ref对象在组件的整个生命周期内保持不变&#xff09;在函数组件中可以使用useRef和createRef但useRef性能比createRef好&#xff0c;快在类组件中&#xff0c;createRef是在初始化constructor时被赋值的&#xff08;执行…

vue --- 列表(v-for渲染)的各种神仙动画效果

通过v-for生成的元素,使用transition包裹将只显示第一条数据,此时需要使用transition-group包裹. <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wid…

linux命令目录

一、文件和目录。&#xff08;文件目录的增删改查&#xff09; lspwdcdmkdirtouchrmdirlnddrmcpmvnlcattacmorelessheadtailstat###########################################grepawksed findlocatewhichwhereiswc ############################################dfdumountumoun…

vue --- 使用component的 :is属性切换标签页

点击对应的标签,下面切换至对应的模板… // 说明 <component :is"name"></component> // 相当于把id为name的组件放到对应的位置总体代码如下: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"…

7 useLayoutEffect、useDebugValue

useEffect&#xff1a;dom完成渲染后执行 不传参数&#xff0c;每次都会执行 传空的依赖[]&#xff0c;只会执行一次 有依赖&#xff0c;依赖项变化会执行 useEffect实现动画效果 import { useEffect, useRef, useState } from "react"const App () > {const [,…

es6 --- map的使用

思路: 1.使用一个map数组来保存nums1中出现的元素及其次数. 2.遍历nums2.使用map的has方法来检测nums2中的元素是否出现在map中,若出现则加入返回数组(retArr),且map数组中的次数减1 /*** param {number[]} nums1* param {number[]} nums2* return {number[]}*/ var intersect…

前端面试之Vue相关总结

Vue2中检测数组变化的限制和解决方法 vue2用下标设置数组没效果 arr [1,2] arr[0] 0,页面上显示的arr并没有修改(如果对应下标是原始值&#xff1b;若是引用值)解决1&#xff1a;Vue.Set解决2&#xff1a;arr.splice (Vue会劫持splice方法) Vue2对对象是循环defineProperty…

vue --- ref属性获取dom元素和子组件的方法

说明: // 假设login的组件定义如下: Vue.component(login, {template:<h1>登录</h1>,data(){return {msg:son msg,}},methods(){show(){console.log(调用子组件的方法);}} }) // 在父元素中使用 <div id"app"><login ref"myLogin"&g…

【工程师综合项目二】React + Koa2打造『JS++官网管理后台』

Redis认知、安装与操作 MongoDB&#xff1a;动态数据库&#xff0c;如游戏中需要频繁地保存人物的坐标 Oracle&#xff1a;收费&#xff0c;企业级 mac要安装homebrew&#xff08;包管理工具&#xff09; window安装Redis程序运行教程 命令行Redis操作 启动&#xff1a; redis-…

webpack --- html-webpack-plugin

安装 cnpm i html-webpack-plugin -D配置 (webpack.config.js) // webpack 是基于node构建的,webpack的配置文件中,任何合法的Node代码都是支持的 var path require(path)// 在内存中生成src下的index.html,同时自动将打包好的bundle.js 导入到页面中 var htmlWebpackPlugin…

git 使用

1. 先进入项目文件夹&#xff0c;通过命令 git init 把这个目录变成git可以管理的仓库 git init 2. 把文件添加到版本库中&#xff0c;使用命令 git add .添加到暂存区里面去&#xff0c;不要忘记后面的小数点“.”&#xff0c;意为添加文件夹下的所有文件 git add . 3. 用命令…

软工作业PSP与单元测试训练

一、实现模块判断传入的身份证号码的正确性&#xff1b; 二、针对所实现的模块编写对应的单元测试代码&#xff1b; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.u…

DNN模型训练词向量原理

转自&#xff1a;https://blog.csdn.net/fendouaini/article/details/79821852 1 词向量 在NLP里&#xff0c;最细的粒度是词语&#xff0c;由词语再组成句子&#xff0c;段落&#xff0c;文章。所以处理NLP问题时&#xff0c;怎么合理的表示词语就成了NLP领域中最先需要解决的…

算法 --- reduce的使用.

描述: 难点: 将[[‘a’,‘b’,‘c’],[‘d’,‘e’,‘f’]]输出为[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]. 关键代码描述: 1.假设我们已经根据输入的数字得到了 rawArr [[‘a’,‘b’,‘c’],[‘d’,‘e’,‘f’]] 2. 下一步将rawArr[0…

算法 --- 递归生成括号

问题描述 思路: 1.首先生成n个括号 2.左括号数量(记为l)不超过n 3.右括号数量(记为r)不超过n,且优先生成左括号(即 l < r) 4.需要设计一个递归式h(str,l,r) // 一开始,str , l 0, r 0 // 第一步进去,添加左括号, str(, l 1, r 0 // 然后因为 l < n . r < l 所以…

使用 TypeScript 改造构建工具及测试用例

最近的一段时间一直在搞TypeScript&#xff0c;一个巨硬出品、赋予JavaScript语言静态类型和编译的语言。 第一个完全使用TypeScript重构的纯Node.js项目已经上线并稳定运行了。 第二个前后端的项目目前也在重构中&#xff0c;关于前端基于webpack的TypeScript套路之前也有提到…

solr7.4 安装与使用

1.solr7环境要求 solr7需要java8环境&#xff0c;且需要在环境变量中添加 JAVA_HOME变量。 2.solr 安装 下载地址 https://lucene.apache.org/solr/mirrors-solr-latest-redir.html 我下载为7.4版本 在solr5以前solr的启动都有tomcat作为容器&#xff0c;但是从solr5以后solr内…

ReactiveCocoa基础

本文转载自最快让你上手ReactiveCocoa之基础篇&#xff0c;在此基础上稍作修改&#xff0c;欢迎交流。 有关对 ReactiveCocoa 的看法可以看一下唐巧的这篇ReactiveCocoa 讨论会 ReactiveCocoa思维导图ReactiveCocoa简介 ReactiveCocoa&#xff08;简称为RAC&#xff09;,是由Gi…

配置OpenCV产生flann\logger.h(66): error C4996: ‘fopen': This function or variable may be unsafe问题

转载自&#xff1a;http://guoming.me/%E9%85%8D%E7%BD%AEopencv%E4%BA%A7%E7%94%9Fflannlogger-h66-error-c4996-fopen-this-function-or-variable-may-be-unsafe%E9%97%AE%E9%A2%98 今天使用vs2012配置OpenCV编译出现问题: 1>—— 已启动生成: 项目: Win32ForOpenCV245, 配…