主從+哨兵架構,解決了單點問題和請求壓力問題,可是數據容量仍然是 1:1 的克隆數據,數據容量問題依舊存在,數據並無分攤到各個節點。mysql
從業務的角度不一樣的模塊按約定好的邏輯落入不一樣的Redis 節點。面試
好比:評論業務用一個redis階段,商品信息業務用另一個節點,購物車用另一個節點。redis
弊端:redis節點數改變的話,數據就分配規則就被打破了。算法
使用場景:消息隊列。sql
數據隨機的落入到不一樣的節點,對於客戶端而言無所謂數據落在那一臺節點,只須要知道key就能拿到數據。數據庫
規劃一個虛擬的環形節點,將節點和數據參與位置分配算法。設計模式
優勢:增長節點能夠分擔其餘節點的壓力,不會形成全局洗牌,本來的數據還在最初規劃出的物理節點中。緩存
一致性Hash缺點:
多線程
方案:當在計算出的離最近節點沒有獲取到的數據,嘗試從離計算值最近的2個物理節點去去獲取數據。架構
假設:咱們剛上線的時候Redis節點只有兩臺,而個人的數據的key是多是基於某一個基準在往上作增加,那麼就會致使數據大概傾斜的落在某一個節點,最極端的可能致使全部的請求都打在了這一個節點,從而拖垮此節點,從而引起緩存雪崩
。
方案:上述問題的關鍵點在於物理節點少,數據落點
非黑即白
,那麼可否增長邏輯上的節點?只有兩臺物理節點,可是還有不一樣的端口啊,ok,那就在每一個IP以後再添加隨機的數字去生成邏輯節點。
上述的解決方案中,咱們把數據路由的邏輯架在了客戶端,可是對於客戶端而言,鏈接能夠當作是幾類數據直接懟在了服務端。這對於服務端而言鏈接的開銷也是不小的。革命還沒有成功,還需努力
。
基於客戶端路由
租客誰都找房東去房東帶看房子怎麼能受得了對吧,那就找中介
唄
基於代理路由
那麼此時只要關注的就是這個中介proxy
代理的性能。 那麼是否有已經造好的Proxy輪子?
咱們前面說的經過hash取模計算數據所屬節點的方案中,缺陷在於增減節點須要對全部的數據rehash
,再根據rehash的結果遷移數據。那麼是否可以將數據預先規劃
? 假設最初節點只有兩個,要預先規劃數據所屬節點,先將數據預先規劃爲10槽位(slots),在Redis Cluster裏實際上是分配了16384個slots,後續增長節點則直接從2個節點各自分一段範圍的數據過來,雨露均沾
嘛。而後分到的數據進行rehash,再數據遷移到新的節點。
這樣子的話,只要增長了節點。數據仍是存在高頻的rehash呀?並且假如要對兩個相同類型的數據進行求交併補運算的話,redis也沒辦法作。比如兩個物理庫的mysql數據沒辦法inner join。
對數據加標籤(hash tag)而不是單純的直接經過hash(key),Redis不想被吐槽它不行
呀。這個鍋得用戶本身背,你想要對這部分的數據作運算,作事務處理那麼你就應該儘量的將數據劃分到一個物理機上。你本身給數據加tag,從而對同一個tag作hash運算的時候能保證在一個物理機上。
每一個節點存一份數據-節點
映射關係表,好比redis1節點存放的是0,1,2的hash值對應的數據,redis1爲5,6,7,此時用戶請求獲取key1,其hash值爲3。
一直想整理出一份完美的面試寶典,可是時間上一直騰不開,這套一千多道面試題寶典,結合今年金三銀四各類大廠面試題,以及 GitHub 上 star 數超 30K+ 的文檔整理出來的,我上傳之後,毫無心外的短短半個小時點贊量就達到了 13k,說實話仍是有點難以想象的。
內容涵蓋:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、SpringBoot、SpringCloud、RabbitMQ、Kafka、Linux等技術棧(485頁)
內容涵蓋:Java基礎、JVM、高併發、多線程、分佈式、設計模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、數據庫、雲計算等
因爲篇幅限制,詳解資料太全面,細節內容太多,因此只把部分知識點截圖出來粗略的介紹,每一個小節點裏面都有更細化的內容!
須要的小夥伴,能夠一鍵三連,下方獲取免費領取方式!