基于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.pswp.cn/news/250802.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250802.shtml
英文地址,請注明出處:http://en.pswp.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…

vue --- 動畫執行的周期(動畫的鉤子函數)

如下8個: <transitionv-on:before-enter "beforeEnter"v-on:enter "enter"v-on:after-enter "afterEnter"v-on:enter-cancelled "enterCancelled"v-on:before-leave "beforeLeave"v-on:leave "leave"v-…

二分查找c++

相信對于二分查找的原理大家已經明白&#xff0c;接下來就是代碼實現了 1 #include <iostream>2 #include <cstdio>3 #include <algorithm>4 #include <cstring>5 #include <string>6 #include <cstdlib>7 8 using namespace std;9 10 in…

php獲取網址

1 #測試網址: http://localhost/blog/testurl.php?id52 3 //獲取域名或主機地址 4 echo $_SERVER[HTTP_HOST]."<br>"; #localhost5 6 //獲取網頁地址 7 echo $_SERVER[PHP_SELF]."<br>"; #/blog/testurl.php8 9 //獲取網址參數 10 echo …

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"…

3-15 《元編程》第6章 3-16 hook method

Code That Writes Code 6.1 Coding your way to the weekend 6.2 Kernel#eval, Binding#eval Binding: Objects of class Binding(類Binding的對象) encapsulate &#xff08;密封&#xff09;the execution context at some particular place in the code and retain this c…

7 useLayoutEffect、useDebugValue

useEffect&#xff1a;dom完成渲染后執行 不傳參數&#xff0c;每次都會執行 傳空的依賴[]&#xff0c;只會執行一次 有依賴&#xff0c;依賴項變化會執行 useEffect實現動畫效果 import { useEffect, useRef, useState } from "react"const App () > {const [,…

【Linux】用戶與權限

追加用戶組 groupadd 用戶組名 追加新用戶 useradd -d 指定用戶目錄 -s 指定用戶使用shell -g 指定用戶組 -p 指定用戶密碼 用戶名 更改用戶 添加用戶到其他組 usermod -G 用戶組 用戶名 修改用戶密碼 passwd 用戶名 刪除用戶 userdel [參數] 用戶名參數&#xff1a;-f&#x…

es6 --- map的使用

思路: 1.使用一個map數組來保存nums1中出現的元素及其次數. 2.遍歷nums2.使用map的has方法來檢測nums2中的元素是否出現在map中,若出現則加入返回數組(retArr),且map數組中的次數減1 /*** param {number[]} nums1* param {number[]} nums2* return {number[]}*/ var intersect…

NOIP2005普及組第3題 采藥 (背包問題)

NOIP2005普及組第3題 采藥    時間限制: 1 Sec 內存限制: 128 MB提交: 50 解決: 23[提交][狀態][討論版][命題人:外部導入]題目描述 辰辰是個天資聰穎的孩子&#xff0c;他的夢想是成為世界上最偉大的醫師。為此&#xff0c;他想拜附近最有威望的醫師為師。醫師為了判斷他…

前端面試之Vue相關總結

Vue2中檢測數組變化的限制和解決方法 vue2用下標設置數組沒效果 arr [1,2] arr[0] 0,頁面上顯示的arr并沒有修改(如果對應下標是原始值&#xff1b;若是引用值)解決1&#xff1a;Vue.Set解決2&#xff1a;arr.splice (Vue會劫持splice方法) Vue2對對象是循環defineProperty…

JS和安卓 IOS的交互 例子式記錄

(function () { var u navigator.userAgent; var isAndroid u.indexOf(Android) > -1 || u.indexOf(Adr) > -1; //android終端 var isiOS !!u.match(/\(i[^;];( U;)? CPU.Mac OS X/); if(isAndroid){ (function(){ function android_i…

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…

nyoj164——卡特蘭數(待填坑)

題意&#xff1a;將1~2n個數按照順時針排列好&#xff0c;用一條線將兩個數字連接起來要求&#xff1a;線之間不能有交點&#xff0c;同一個點只允許被連一次。 最后問給出一個n&#xff0c;有多少種方式滿足條件。 卡特蘭數&#xff08;列&#xff09;&#xff1a; 令h(0)1,h(…

git 使用

1. 先進入項目文件夾&#xff0c;通過命令 git init 把這個目錄變成git可以管理的倉庫 git init 2. 把文件添加到版本庫中&#xff0c;使用命令 git add .添加到暫存區里面去&#xff0c;不要忘記后面的小數點“.”&#xff0c;意為添加文件夾下的所有文件 git add . 3. 用命令…