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進行設計,是一個高可用,高性能,支持跨數據中副本的分佈式存儲代理層。
上面是官方給的兩個拓撲圖,其結構和elasticsearch集羣的結構比較相似。 這個圖裏面有兩個概念,datacent和rack。這兩個概念舉例來理解,假設我們在阿里雲有集羣,在騰訊雲也有集羣,這就叫兩個datacent,或者換種說法,假設有很多集羣,這些集羣可以根據物理機所在位置或者其他標準,分成了兩大部分,這就叫兩個datacent。 然後在每個datacent內,可能某些物理機在一個機房或者機架甚至就是一個機器上的幾個虛擬機,那麼這些機器之間的通信等速度肯定會更快,這些機器可以組成一個集羣,就叫一個rack。
在dynomite拓撲結構中,每個rack都是一個完整集羣,每個rack的都擁有完整的數據,多個rack間相互備份,這就達到了高可用,具體同步機制後面講。
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
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!