如下僅僅是是我的在一個下午的思考mysql
什麼是負載均衡nginx
負載均衡應用於分佈式系統中,也能夠說是一個核心模塊,主要做用是將大量做業合理地分攤到多個操做單元上進行執行,用於解決互聯網架構中的高併發和高可用的問題,使用帶有負載平衡的多個服務器組件,取代單一的組件,能夠經過冗餘提升可靠性,提升資源的利用率最大化,提升系統的吞吐量,響應延時等等, 我所分享的主要是一些總結層次的,對於一些基礎一些不會過多的描述, 像是負載均衡模式,算法,我不具體細節,這些網上都有不少的資料,我想從一個更高層次上分享一下本身對負載均衡的應用和理解。web
有哪些常見的負載均衡方式算法
我這裏指的是普遍的負載均衡,並不會特定指定web相關負載均衡spring
客戶端方式sql
從上邊的整理能夠看到,利用客戶端實現的負載均衡方式會比較多,自定義程度會更高,有較大的自由度,根據本身的需求變動,這樣作的前提是須要一個集中的存儲,這個存儲存儲能夠是像讓dns機構存儲的dns相關對應ip信息,也能夠是像微服務中用的較多的etcd, zookeeper同樣的分佈式存儲並watch服務相關相關信息,甚至能夠更簡單的像mysql客戶端sharding直接統一客戶端的全部配置文件進行一個配置,甚至能夠是直接存儲在內存的數據。數據庫
服務端方式後端
服務端負載均衡就更多了:緩存
甚至有直接基於硬件的:服務器
硬件F5(--太貴--)
從上能夠看到,基於4,7層的負載均衡技術會相對比較成熟,在各個領域都會有相關的產品,並且這一層極可能是流量入口,確定都會是一些高性能相關軟件產品,甚至是一些昂貴的硬件產品, 不過這一層也是最好玩的,能夠基於負載均衡或者負載均衡的思路作一些更好玩,更有用的功能。
負載均衡應用的更高級應用 --負載均衡能夠玩的就特別多了
7層http
因爲掌握了流量了入口,獲取了全部數據,全部很容易根據數據進行自定義的操做,我舉一些例子,像openresty, 這是一個基於nginx與lua的高性能Web平臺,因爲內核仍是基於nginx,因此性能損失很小,在保持高性能的同時,你能夠在不更改代碼的情形下增長你自定義的功能,同時因爲openresty是7層的負載均衡,你能夠在lua代碼中獲取到每一個http的鏈接,狀態碼,url,request參數等等。
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利用負載均衡相關概念實現了基於數據的分片(數據負載均衡),請求的轉發(計算負載均衡)
從上邊的分片副本策略上確定你能學習到其中的精髓,應用於像分佈式存儲,數據庫設計上邊。
關於elasticsearch想多提一句,它自身實現多種分配負載均衡算法,能夠根據cpu/mem/網絡io, 也能夠基於分片數,索引量,甚至能夠自定義,根據自身情形找到最合適的算法,這個很像很像openstack vm的虛擬機調度算法和kubernetes pods的調度算法。
上邊簡單的描述了幾項基於負載均衡的應用,負載均衡技術在互聯網中真的是很是基礎,使用面也很是廣,像還有數據庫,消息隊列,緩存等技術都利用負載均衡的理念,整體來講呢,就是咱們不管是在設計程序軟件,仍是系統設計,架構優化,均可以多想一想是否能夠用負載均衡的方式解決你的問題。
簡單來講,作好負載均衡就是分別從客戶端和服務端考慮,將計算任務分散,數據節點分散,網絡任務分散,提高的可用性和擴展性,我這裏說得比較虛,我的根據實際狀況選擇合適的調度策略,解決自身的問題就好。