redis 代理簡要說明

redis介紹

redis做爲一個開源的kv數據庫在互聯網公司被普遍應用。 
做爲nosql的一員redis有這幾個優勢:redis

  • KV存儲
  • 支持多種數據結構
  • 全內存存儲
  • 持久化
  • 主從複製
  • 集羣模式
  • 社區活躍,文檔齊全

事物都不是完美的,redis也有很多缺點:算法

  • 2.x時代原生的故障自動轉移恢復功能比較弱(senteinel出現的還比較晚)
  • 在線擴容,縮容麻煩
  • 主從複製採用全量複製的方式(2.8x以前使用fsync,2.8x以後使用psync)
  • 若是單實例數據量過大,遭遇雪崩,重啓恢復數據很痛苦
 

redis代理介紹

爲了解決上述的缺點,互聯網公司主要提出了三種類型的技術sql

 

1.客戶端分片

特色: 
由客戶端本身計算key在哪一個機器上存儲和查找,和後端服務器沒有什麼關係,下降了redis server集羣的複雜度,增長了開發的難度。 
缺點: 
可是客戶端要實時知道,集羣節點的信息狀態,新增節點的時候客戶端要支持動態的sharding,可是多數客戶端不支持,所以沒有大規模使用。數據庫

 

客戶端分片圖例

image_1bfba1359oqvm2h9hr1dpm1tkc13.png-34.2kB

 

2.代理分片

此方式是藉助一個代理服務器實現數據分片,客戶端直接與proxy聯繫,proxy計算集羣節點信息,並把請求發送到對應的集羣節點。後端

表明應用:緩存

  • twemproxy
  • codis
 

twemproxy

twitter 開發。它主要經過事件驅動模型來達到高併發,每收到一個請求,經過解析請求,發送請求到後端服務,再等待迴應,發送回請求方。有這幾個特色:服務器

  • 事件驅動模型
  • 三種分片算法
  • C語言開發
  • 支持大部分redis命令
  • 配置簡單
  • 支持狀態監控

架構圖(來源於網絡) 
圖片1.jpg-47.1kB
因爲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。

 

twemproxy使用要點:

  • 合理設置twemproxy請求redis的timeout參數
  • 對緩存和存儲服務,分別設置redis eject策略
  • 根據數據大小設置mbuf的大小
  • pipeline請求不宜過大,過大致使twemproxy申請大量的內存空間
  • 跨機房注意client-output-buffer-limit normal &&client-output-buffer-limit slave
 

codis

codis 由豌豆莢的團隊編寫,也是採用代理分片的技術。

  • Go語言編寫
  • 相比twemproxy 限制少,支持動態擴容縮容。
  • 有管理界面,對後期維護友好
  • 依賴ZK
  • Codis-proxy不支持熱重啓

架構圖(來源於網絡) 
圖片2.jpg-31.3kB

Codis組件:

  • Codis Server: 就是後端的redis
  • Codis Proxy: 客戶端連接reids的代理組件,實現redis協議
  • Dashboard 集羣的管理工具
  • Admin: 集羣管理的命令行工具。
  • FE: 集羣管理界面。
  • ZooKeeper : 存放數據路由表和codis-proxy節點的元信息

Codis怎麼分片?

Codis 採用 Pre-sharding 的技術來實現數據的分片, 默認分紅 1024 個 哈希槽。其實就是預分片,將這些分佈式狀態保存在ZK中,最大後端支持1024個redis server。另外每一個哈希槽必須有個對應的組id,數據遷移和redis cluster 同樣由哈希槽爲單位。

 

3.服務端分片

客戶端隨意與集羣中的任何節點通訊,服務器端負責計算某個key在哪一個機器上,當客戶端訪問某臺機器時,服務器計算對應的key應該存儲在哪一個機器,而後把結果返回給客戶端,客戶端再去對應的節點操做key,是一個重定向的過程,目前官方的Redis Cluster 集羣支持

特色:

  • 無中心架構
  • 數據按照s哈希槽存儲分佈在多個redis實例上
  • 實現故障自動轉移
  • 集羣內部增長slave作數據副本,用於集羣快速恢復
  • 可手動踢出節點,爲升級和遷移提供可操做方案

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的數量的投票從就成爲主。 
這個選舉週期沒選成,就下一個週期從新開始

對比

QQ截圖20170505145050.png-40.6kB

 

安裝redis 須要注意的幾個參數

系統參數 
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

相關文章
相關標籤/搜索