聊聊負載均衡

如下僅僅是是我的在一個下午的思考mysql


什麼是負載均衡nginx

負載均衡應用於分佈式系統中,也能夠說是一個核心模塊,主要做用是將大量做業合理地分攤到多個操做單元上進行執行,用於解決互聯網架構中的高併發和高可用的問題,使用帶有負載平衡的多個服務器組件,取代單一的組件,能夠經過冗餘提升可靠性,提升資源的利用率最大化,提升系統的吞吐量,響應延時等等, 我所分享的主要是一些總結層次的,對於一些基礎一些不會過多的描述, 像是負載均衡模式,算法,我不具體細節,這些網上都有不少的資料,我想從一個更高層次上分享一下本身對負載均衡的應用和理解。web

有哪些常見的負載均衡方式算法

我這裏指的是普遍的負載均衡,並不會特定指定web相關負載均衡spring

客戶端方式sql

  1. http利用DNS智能負載均衡根據域名地域運營商解析到不一樣服務器,流量負載均衡
  2. 客戶端內置算法自動鏈接多域名多服務器
  3. 微服務架構客戶端經過服務註冊中心獲取後端服務列表(springcloud stack && kubkernetes service && dubbo 等等)
  4. mysql分庫分表 客戶端sharding
  5. 消息隊列多消費者消費隊列中的任務

從上邊的整理能夠看到,利用客戶端實現的負載均衡方式會比較多,自定義程度會更高,有較大的自由度,根據本身的需求變動,這樣作的前提是須要一個集中的存儲,這個存儲存儲能夠是像讓dns機構存儲的dns相關對應ip信息,也能夠是像微服務中用的較多的etcd, zookeeper同樣的分佈式存儲並watch服務相關相關信息,甚至能夠更簡單的像mysql客戶端sharding直接統一客戶端的全部配置文件進行一個配置,甚至能夠是直接存儲在內存的數據。數據庫


服務端方式後端

服務端負載均衡就更多了:緩存

  1. 基於tcp4層的haproxy/lvs
  2. 基於七層http的nginx,trafik
  3. 基於7層mysql的相關proxy mycat,sharding-sphere, kingsharding
  4. 自身軟件實現 elasticsearch, 分佈式存儲

甚至有直接基於硬件的:服務器

硬件F5(--太貴--)

從上能夠看到,基於4,7層的負載均衡技術會相對比較成熟,在各個領域都會有相關的產品,並且這一層極可能是流量入口,確定都會是一些高性能相關軟件產品,甚至是一些昂貴的硬件產品, 不過這一層也是最好玩的,能夠基於負載均衡或者負載均衡的思路作一些更好玩,更有用的功能。


負載均衡應用的更高級應用 --負載均衡能夠玩的就特別多了

7層http

因爲掌握了流量了入口,獲取了全部數據,全部很容易根據數據進行自定義的操做,我舉一些例子,像openresty, 這是一個基於nginx與lua的高性能Web平臺,因爲內核仍是基於nginx,因此性能損失很小,在保持高性能的同時,你能夠在不更改代碼的情形下增長你自定義的功能,同時因爲openresty是7層的負載均衡,你能夠在lua代碼中獲取到每一個http的鏈接,狀態碼,url,request參數等等。


  1. 服務網關: 基於鏈接,你能夠很快的設計出一個防止cc攻擊的程序, 限制異常訪問的ip, 基於url, ip你能夠用如令牌桶限流算法限制每一個用戶每一個接口的調用頻次。
  2. 自定義調度算法: 基於url, request參數等你能根據請求的參數,將不一樣的流量進行分發到不一樣的服務器組。
  3. 服務化upstreaming : 你能夠利用一個註冊中心去保存你後端服務的server,而後lua程序去watch註冊中心,動態更新註冊列表。


4層tcp


下邊舉例一個4層的例子,如基於lvs, 4層能獲取到的數據會相對少一些,並且會更底層,操做起來難度會更高。 阿里雲利用開源軟件keeplived + lvs 並結合隧道vxlan協議實現了基於多租戶的4層負載均衡。

a 防護ddos攻擊: 基於SYNPROXY模塊實現 syn flood類型攻擊

b lvs集羣實現: lvs和上聯交換機運行OSPF協議,lvs和交換機運行OSPE心跳,當一臺或多臺lvs掛掉還有其餘lvs集羣提供服務。

c 租戶隔離: lvs集羣和後端多租戶利用vxlan進行通行,保證了lvs在雲負載均衡中的隔離性。

描述一個基於軟件程度的:


相信稍微大一點的公司都會用到elasticsearch這個搜索引擎,也會用到他的集羣模式,具體集羣的實現細節我就不作過多的描述了,有興趣的能夠去看看官網。

elasticsearch利用負載均衡相關概念實現了基於數據的分片(數據負載均衡),請求的轉發(計算負載均衡)

  1. 數據分片: elasticsearch自身實現了索引sharding, 首先這就是一種數據負載均衡,數據進行分散,不集中到某個節點,保證高可用的同事,將數據計算存儲都分攤到各自服務器。
  2. 數據同步: 利用數據sharding的多副本,在保證高可用的同時,也保證了讀數據的負載均衡,在進行數據查詢的過程當中,數據讀取會分散到各自的分片數據,若是有多個副本,能夠從多個副本中隨機選取副本查詢,提高查詢性能。

從上邊的分片副本策略上確定你能學習到其中的精髓,應用於像分佈式存儲,數據庫設計上邊。

關於elasticsearch想多提一句,它自身實現多種分配負載均衡算法,能夠根據cpu/mem/網絡io, 也能夠基於分片數,索引量,甚至能夠自定義,根據自身情形找到最合適的算法,這個很像很像openstack vm的虛擬機調度算法和kubernetes pods的調度算法。

上邊簡單的描述了幾項基於負載均衡的應用,負載均衡技術在互聯網中真的是很是基礎,使用面也很是廣,像還有數據庫,消息隊列,緩存等技術都利用負載均衡的理念,整體來講呢,就是咱們不管是在設計程序軟件,仍是系統設計,架構優化,均可以多想一想是否能夠用負載均衡的方式解決你的問題。

我總結一下:

簡單來講,作好負載均衡就是分別從客戶端和服務端考慮,將計算任務分散,數據節點分散,網絡任務分散,提高的可用性和擴展性,我這裏說得比較虛,我的根據實際狀況選擇合適的調度策略,解決自身的問題就好。

相關文章
相關標籤/搜索