redis做爲一個開源的kv數據庫在互聯網公司被普遍應用。
做爲nosql的一員redis有這幾個優勢:redis
事物都不是完美的,redis也有很多缺點:算法
爲了解決上述的缺點,互聯網公司主要提出了三種類型的技術sql
特色:
由客戶端本身計算key在哪一個機器上存儲和查找,和後端服務器沒有什麼關係,下降了redis server集羣的複雜度,增長了開發的難度。
缺點:
可是客戶端要實時知道,集羣節點的信息狀態,新增節點的時候客戶端要支持動態的sharding,可是多數客戶端不支持,所以沒有大規模使用。數據庫
此方式是藉助一個代理服務器實現數據分片,客戶端直接與proxy聯繫,proxy計算集羣節點信息,並把請求發送到對應的集羣節點。後端
表明應用:緩存
twitter 開發。它主要經過事件驅動模型來達到高併發,每收到一個請求,經過解析請求,發送請求到後端服務,再等待迴應,發送回請求方。有這幾個特色:服務器
架構圖(來源於網絡)
因爲twemprox自己是單點的所以 常常和高可用軟件搭配使用網絡
配置示例:數據結構
xxxx:
listen: 127.0.0.1:4097
hash: fnv1a_64
distribution: ketama
auto_eject_hosts: true
redis: true
server_retry_timeout: 2000
server_failure_limit: 1
servers:
- 127.0.0.1:6378:1架構
distribution:爲一致性哈希算法
servers:爲後端緩存服務,twemproxy能夠預先鏈接每一個server或者不,根據接收到的請求具體分析出key,而後根據key來選擇適當的server。
codis 由豌豆莢的團隊編寫,也是採用代理分片的技術。
架構圖(來源於網絡)
Codis組件:
Codis怎麼分片?
Codis 採用 Pre-sharding 的技術來實現數據的分片, 默認分紅 1024 個 哈希槽。其實就是預分片,將這些分佈式狀態保存在ZK中,最大後端支持1024個redis server。另外每一個哈希槽必須有個對應的組id,數據遷移和redis cluster 同樣由哈希槽爲單位。
客戶端隨意與集羣中的任何節點通訊,服務器端負責計算某個key在哪一個機器上,當客戶端訪問某臺機器時,服務器計算對應的key應該存儲在哪一個機器,而後把結果返回給客戶端,客戶端再去對應的節點操做key,是一個重定向的過程,目前官方的Redis Cluster 集羣支持
特色:
Redis Cluster 如何分片?
採用CRC16(key) % 16384 來計算鍵 key 屬於哪一個槽,其中 CRC16(key) 語句用於計算鍵 key 的 CRC16 校驗和。
如何進行故障轉移?
當主節點down掉以後,選舉出一個從成爲新的主
被選中的從執行slave no one 成爲新的主
新主撤銷down掉主的哈希槽指派,把這些哈希槽指派給本身
新主和集羣其餘節點進行通訊,廣播本身是主了
新主開始接收請求和哈希槽指派
如何選舉?
從在集羣中屬於冷備,讀寫請求都不會發往從節點。
從發現本身的主down掉以後,會廣播一條 cluster_type_fallover_auth_reqeust的消息,要求其餘的主節點給本身投票
其餘收到主節點而且還沒投票的狀況下會把票投給他,返回一個cluster_type_fallover_auth_ack的消息,就是欽定他
當集羣中n/2+1的數量的投票從就成爲主。
這個選舉週期沒選成,就下一個週期從新開始
對比
系統參數
vm.overcommit_memory = 1
net.core.somaxconn = 8192 同配置的backlog
echo never > /sys/kernel/mm/transparent_hugepage/enabled
配置參數 Maxmemory 102400mb/10gb timeout 180 tcp-keepalive 300 repl-backlog-size 32M #psync初始大小 client-output-buffer-limit normal 512mb 256mb 60 client-output-buffer-limit slave 1024mb 256mb 120