Dynomite入門指南

dynomite原理簡介

有問題歡迎討論

項目地址:
https://github.com/Netflix/dynomite

文檔地址:
https://github.com/Netflix/dynomite/wiki

redis命令支持情況:
https://github.com/Netflix/dynomite/blob/dev/notes/redis.md

下載地址:
https://github.com/Netflix/dynomite/releases

dynomite使用netflix開源的一個開源將非分佈式的緩存系統改造成分佈式的緩存系統,根據亞馬遜的Dynamo進行設計,是一個高可用,高性能,支持跨數據中副本的分佈式存儲代理層。


dynomite-architecture.png


topology1.png


上面是官方給的兩個拓撲圖,其結構和elasticsearch集羣的結構比較相似。 這個圖裏面有兩個概念,datacent和rack。這兩個概念舉例來理解,假設我們在阿里雲有集羣,在騰訊雲也有集羣,這就叫兩個datacent,或者換種說法,假設有很多集羣,這些集羣可以根據物理機所在位置或者其他標準,分成了兩大部分,這就叫兩個datacent。 然後在每個datacent內,可能某些物理機在一個機房或者機架甚至就是一個機器上的幾個虛擬機,那麼這些機器之間的通信等速度肯定會更快,這些機器可以組成一個集羣,就叫一個rack。
在dynomite拓撲結構中,每個rack都是一個完整集羣,每個rack的都擁有完整的數據,多個rack間相互備份,這就達到了高可用,具體同步機制後面講。


replication1.png


dynomite結構中,每個rack都是一個一致性hash環,具體規則是rack上每個節點都是個redis master,是可讀寫的。在每個redis節點上都掛載着一個dynomite代理,每個代理持有一個tokens,一致性hash的分配就是根據這個tokens來的,tokens計算規則:從0開始 token = (4294967295 / numberOfNodesInRack) * nodeIndex。每個rack上存在節點都是可以不同的,不需要對應,因爲每個rack上的tokens都是重新計算的。
當客戶端的請求到達任意一個dynomite代理後,dynomite會根據tokens計算出這個key是否屬於自己管理的節點,如果不是的話,會把請求發送到對應的dynomite代理上。
同時,還會把這個請求發送到其他的rack的dynomite代理上,以此來完成rack間的數據同步,這個rack間的數據同步時異步的,但是當我們要求強一致性的時候,可以通過配置參數,當有多少個rack完成數據寫入時,才返回結果,根據對一致性要求程度的不同來設置不同的參數。相關參數:

# DC_ONE 本節點讀寫入完成及請求完成,其他的rack異步寫入
# DC_QUORUM 同步寫入到指定個數的rack中,其他的節點異步寫入
# DC_SAFE_QUORUM 和DC_QUORUM類似,不過這個參數讀寫都要在指定個數的rack中成功並且數據校驗同步,纔算請求成功,不然會報錯。

# yaml配置參數
read_consistency: dc_quorum
write_consistency: dc_quorum

PS:dynomite提供的有自己的客戶端,可以在本地緩存tokens信息,直接客戶端計算對應的dynomite節點地址,不用服務端去計算,提高了響應速度。
參考:https://github.com/richieyan/IntroDynomitedb

簡單的異地多活高可用方案:

1、兩地各鍵一個datacent
2、每個datacent中建立兩個rack
3、每個rack上的redis-server爲一個sentinel集羣,dynomite高可用通過一個redis上掛載多個dynomite實現
4、sentinel集羣通過client-reconf-script腳本,在master節點發生switch操作時,自動去修改dynomite代理地址指向的redis server地址


dynomite安裝使用

安裝:

# 下載release版本後,解壓,然後進入目錄

yum install autoconf automake libtool libffi-dev
autoreconf -fvi

make
# make後src目錄下的dynomite爲可執行文件
src/dynomite -h
# 直接複製到用戶目錄方便使用
mkdir -p ~/dynomite/bin
# rsa的默認存儲位置  在裏面生成dynomite.pem和recon_key.pem
mkdir -p ~/dynomite/conf
# 自定義log路徑
mkdir -p ~/dynomite/logs
cp src/dynomite ~/dynomite/bin


配置使用:

首先,啓動三個redis,port分別爲5000,5001,5002

每個redis-server節點上需要掛在一個dynomite代理

dynomite配置文件(我的yml文件放在conf目錄下):
node1.yml

dyn_o_mite:
  # 數據中心
  datacenter: dc1
  # 集羣分區 
  rack: rack1
  # dynomite之間的內部通訊端口
  dyn_listen: 127.0.0.1:8101
  # 其他的dynomite節點 ip:port:rack:datacenter:tokens
  dyn_seeds:
  - 127.0.0.1:8201:rack1:dc1:1431655765
  - 127.0.0.1:8301:rack1:dc1:2863311530
  # 存儲類型  0 代表redis 1 代表memcached
  data_store: 0
  # 外部訪問的端口
  listen: 127.0.0.1:8102
  dyn_seed_provider: simple_provider
  # 代理的redis server節點 ip:port:weight
  # servers應該是可以配置多個的,但是文檔說目前只能配一個,根據weight猜測,這裏可能是給單節點高可用預留的
  servers:
  - 127.0.0.1:5000:1
  # 集羣標識 計算公式 從0開始 token = (4294967295 / numberOfNodesInRack) * nodeIndex
  tokens: 0
  # 狀態監聽端口
  stats_listen: 127.0.0.1:30000
  # rsa密匙 生成命令 ssh-keygen -t rsa -f ~/dynomite/conf/dynomite.pem
  pem_key_file: conf/dynomite.pem
  # 生成方法如上
  recon_key_file: conf/recon_key.pem
  recon_iv_file: conf/recon_iv.pem


node2.yml

dyn_o_mite:
  # 數據中心
  datacenter: dc1
  # 集羣分區 
  rack: rack1
  # dynomite之間的內部通訊端口
  dyn_listen: 127.0.0.1:8201
  # 其他的dynomite節點 ip:port:rack:datacenter:tokens
  dyn_seeds:
  - 127.0.0.1:8101:rack1:dc1:0
  - 127.0.0.1:8301:rack1:dc1:2863311530
  # 存儲類型  0 代表redis 1 代表memcached
  data_store: 0
  # 外部訪問的端口
  listen: 127.0.0.1:8202
  dyn_seed_provider: simple_provider
  # 代理的redis server節點 ip:port:weight
  # servers應該是可以配置多個的,但是文檔說目前只能配一個,根據weight猜測,這裏可能是給單節點高可用預留的
  servers:
  - 127.0.0.1:5001:1
  # 集羣標識 計算公式 從0開始 token = (4294967295 / numberOfNodesInRack) * nodeIndex
  tokens: 1431655765
  # 狀態監聽端口
  stats_listen: 127.0.0.1:30001
  # rsa密匙 生成命令 ssh-keygen -t rsa -f   # rsa密匙 生成命令 ssh-keygen -t rsa -f ~/dynomite/conf/dynomite.pem
  pem_key_file: conf/dynomite.pem
  # 生成方法如上
  recon_key_file: conf/recon_key.pem
  recon_iv_file: conf/recon_iv.pem


node3.yml

dyn_o_mite:
  # 數據中心
  datacenter: dc1
  # 集羣分區 
  rack: rack1
  # dynomite之間的內部通訊端口
  dyn_listen: 127.0.0.1:8301
  # 其他的dynomite節點 ip:port:rack:datacenter:tokens
  dyn_seeds:
  - 127.0.0.1:8101:rack1:dc1:0
  - 127.0.0.1:8201:rack1:dc1:1431655765
  # 存儲類型  0 代表redis 1 代表memcached
  data_store: 0
  # 外部訪問的端口
  listen: 127.0.0.1:8302
  dyn_seed_provider: simple_provider
  # 代理的redis server節點 ip:port:weight
  # servers應該是可以配置多個的,但是文檔說目前只能配一個,根據weight猜測,這裏可能是給單節點高可用預留的
  servers:
  - 127.0.0.1:5002:1
  # 集羣標識 計算公式 從0開始 token = (4294967295 / numberOfNodesInRack) * nodeIndex
  tokens: 2863311530
  # 狀態監聽端口
  stats_listen: 127.0.0.1:30002
  # rsa密匙 生成命令 ssh-keygen -t rsa -f ~/dynomite/conf/dynomite.pem
  pem_key_file: conf/dynomite.pem
  # 生成方法如上
  recon_key_file: conf/recon_key.pem
  recon_iv_file: conf/recon_iv.pem


遇到的錯誤:

load_private_rsa_key_by_file:48 Error: file conf/dynomite.pem does not exist
entropy_key_iv_load:368 Error: file conf/recon_key.pem does not exist
entropy_key_iv_load:372 Error: file conf/recon_iv.pem does not exist


解決方案:

# yaml文件增加兩個配置項

  # rsa密匙 生成命令 ssh-keygen -t rsa -f ~/dynomite/conf/dynomite.pem
  pem_key_file: conf/dynomite.pem
  # 生成方法如上
  recon_key_file: conf/recon_key.pem
  recon_iv_file: conf/recon_iv.pem

啓動dynomite:

bin/dynomite -c conf/node1.yml -d --output=logs/node1.log
bin/dynomite -c conf/node2.yml -d --output=logs/node2.log
bin/dynomite -c conf/node3.yml -d --output=logs/node3.log


測試:

# 和普通redis客戶端一樣的訪問方式  把端口換成dynomite對外的端口即可
redis-cli -h 127.0.0.1 -p 8102
127.0.0.1:8202> set test1 1
OK
127.0.0.1:8202> set test2 1
OK
127.0.0.1:8202> set test3 1
OK
127.0.0.1:8202> 

然後直接連接redis查看數據,會發現每個redis節點中有一條數據。

本文轉載如下地址:

---------------------
作者:wkCaeser_
來源:CSDN
原文:https://blog.csdn.net/qq_36666651/article/details/82900439
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章