原创 Redis集羣模式高可用原理

什麼是 Cluster 集羣 Redis 集羣是一種分佈式數據庫方案,集羣通過分片(sharding)來進行數據管理(「分治思想」的一種實踐),並提供複製和故障轉移功能。 將數據劃分爲 16384 的 slots,每個節點負責一部分槽位。槽

原创 Redis哨兵模式高可用原理

我們知道主從複製是高可用的基石,從庫宕機依然可以將請求發送給主庫或者其他從庫,但是 Master 宕機,只能響應讀操作,寫請求無法再執行。 所以主從複製架構面臨一個嚴峻問題,主庫掛了,無法執行「寫操作」,無法自動選擇一個 Slave 切換爲

原创 Redis 客戶端 Jedis 的特性和原理

Redis 作爲目前通用的緩存選型,因其高性能而倍受歡迎。Redis 的 2.x 版本僅支持單機模式,從 3.0 版本開始引入集羣模式。 Redis 的 Java 生態的客戶端當中包含 Jedis、Redisson、Lettuce,不同的客

原创 ActiveMQ中拉模式與推模式

拉模式(點對點消息) 如果沒有消費者在監聽隊列,消息將保留在隊列中,直至消息消費者連接到隊列爲止。在這種模型中,消息不是自動推動給消息消費者的,而是要由消息消費者從隊列中請求獲得。 推模式(發佈訂閱消息) 在該模型中,消息會自動廣播,消息消

原创 彈力設計之降級設計

所謂的降級設計(Degradation),本質是爲了解決資源不足和訪問量過大的問題。當資源和訪問量出現矛盾的時候,在有限的資源下,爲了能夠扛住大量的請求,我們就需要對系統進行降級操作。也就是說,暫時犧牲掉一些東西,以保障整個系統的平穩運行。

原创 彈力設計之熔斷設計

熔斷機制這個詞肯定不陌生,它的靈感來源於我們電閘上的“保險絲”,當電壓有問題時(比如短路),自動跳閘,此時電路就會斷開,我們的電器就會受到保護。不然,會導致電器被燒壞,如果人沒在家或是人在熟睡中,還會導致火災。所以,在電路世界通常都會有這樣

原创 彈力設計之限流設計

保護系統不會在過載的情況下出現問題,我們就需要限流。 我們在一些系統中都可以看到這樣的設計,比如,我們的數據庫訪問的連接池,還有我們的線程池,還有 Nginx 下的用於限制瞬時併發連接數的 limit_conn 模塊,限制每秒平均速率的 l

原创 彈力設計之隔離設計

隔離設計對應的單詞是 Bulkheads,中文翻譯爲隔板。但其實,這個術語是用在造船上的,也就是船艙裏防漏水的隔板。一般的船無論大小都會有這個東西,大一點的船都會把船艙隔成若干個空間。這樣,如果船艙漏水,只會進到一個小空間裏,不會讓整個船艙

原创 彈力設計之冪等性設計

所謂冪等性設計,就是說,一次和多次請求某一個資源應該具有同樣的副作用。用數學的語言來表達就是:f(x) = f(f(x))。 比如,求絕對值的函數,abs(x) = abs(abs(x))。 爲什麼我們需要這樣的操作?說白了,就是在我們把系

原创 彈力設計之重試設計

關於重試,這個模式應該是一個很普遍的設計模式了。當我們把單體應用服務化,尤其是微服務化,本來在一個進程內的函數調用就成了遠程調用,這樣就會涉及到網絡上的問題。 網絡上有很多的各式各樣的組件,如 DNS 服務、網卡、交換機、路由器、負載均衡等

原创 彈力設計之異步通訊設計

前面所說的隔離設計通常都需要對系統做解耦設計,而把一個單體系統解耦,不單單是把業務功能拆分出來,正如上面所說,拆分完後還會面對很多的問題。其中一個重要的問題就是這些系統間的通訊。 通訊一般來說分同步和異步兩種。同步通訊就像打電話,需要實時響

原创 分佈式系統之全棧監控

首先,我們需要全棧系統監控,它就像是我們的眼睛,沒有它,我們就不知道系統到底發生了什麼,我們將無法管理或是運維整個分佈式系統。所以,這個系統是非常非常關鍵的。 而在分佈式或 Cloud Native 的情況下,系統分成多層,服務各種關聯,需

原创 彈力設計簡介

彈力設計又叫容錯設計,其中着眼於分佈式系統的各種“容忍”能力,包括容錯能力(服務隔離、異步調用、請求冪等性)、可伸縮性(有 / 無狀態的服務)、一致性(補償事務、重試)、應對大流量的能力(熔斷、降級)。可以看到,在確保系統正確性的前提下,系

原创 分佈式系統架構簡介

最近幾年,我們一直在談論各式各樣的架構,如高併發架構、異地多活架構、容器化架構、微服務架構、高可用架構、彈性化架構等。還有和這些架構相關的管理型的技術方法,如 DevOps、應用監控、自動化運維、SOA 服務治理、去 IOE 等。面對這麼多

原创 分佈式系統的技術棧

構建分佈式系統的目的是增加系統容量,提高系統的可用性,轉換成技術方面,也就是完成下面兩件事。 大流量處理。通過集羣技術把大規模併發請求的負載分散到不同的機器上。 關鍵業務保護。提高後臺服務的可用性,把故障隔離起來阻止多米諾骨牌效應(雪崩效應