Codis 是一個分佈式 Redis 解決方案, 對於上層的應用來講, 鏈接到 Codis Proxy 和鏈接原生的 Redis Server 沒有明顯的區別 (不支持的命令列表), 上層應用能夠像使用單機的 Redis 同樣使用, Codis 底層會處理請求的轉發, 不停機的數據遷移等工做, 全部後邊的一切事情, 對於前面的客戶端來講是透明的, 能夠簡單的認爲後邊鏈接的是一個內存無限大的 Redis 服務.web
須要說明的是codis我只是進行了線下測試,並未經過最終的討論進行線上使用,具體緣由是codis的版本不更新所致使redis
Codis 由四部分組成:數組
· Codis Proxy (codis-proxy)瀏覽器
· Codis Manager (codis-config)服務器
· Codis Redis (codis-server)多線程
· ZooKeeper架構
codis-proxy 是客戶端鏈接的 Redis 代理服務, codis-proxy 自己實現了 Redis 協議, 表現得和一個原生的 Redis 沒什麼區別 (就像 Twemproxy), 對於一個業務來講, 能夠部署多個 codis-proxy, codis-proxy 自己是無狀態的.分佈式
codis-config 是 Codis 的管理工具, 支持包括, 添加/刪除 Redis 節點, 添加/刪除 Proxy 節點, 發起數據遷移等操做. codis-config 自己還自帶了一個 http server, 會啓動一個 dashboard, 用戶能夠直接在瀏覽器上觀察 Codis 集羣的運行狀態.ide
codis-server 是 Codis 項目維護的一個 Redis 分支, 基於 2.8.21 開發, 加入了 slot 的支持和原子的數據遷移指令. Codis 上層的 codis-proxy 和 codis-config 只能和這個版本的 Redis 交互才能正常運行.工具
Codis 依賴 ZooKeeper 來存放數據路由表和 codis-proxy 節點的元信息, codis-config 發起的命令都會經過 ZooKeeper 同步到各個存活的 codis-proxy.
Codis 支持按照 Namespace 區分不一樣的產品, 擁有不一樣的 product name 的產品, 各項配置都不會衝突.
Codis還有一大特色因爲是用go語言寫的,proxy端支持多線程,表明能夠充分利用服務器的cpu資源
192.168.10.169 用途: proxy redis
192.168.10.170 用途: redis
Proxy代理層: 192.168.10.169:19000
Codis實例層:
Group組至關於codis的分片機制
分爲2組group,group_1和group_2
group_1中的機器 ip:192.168.10.169:6379 角色:master
ip:192.168.10.170:6379 角色:slave
group_2中的機器 ip:192.168.10.169:6380 角色:master
ip:192.168.10.170:6380 角色:slvae
Codis-ha 負責group中的從檢測主掛掉後自動提高
1.連接codis的proxy代理,對codis集羣進行讀操做
2.連接codis的proxy代理,對codis集羣進行寫操做
1.斷掉group_1中的master節點
讀是否出現異常: 否
寫是否出現異常: 否
2.同時斷掉group_1和group_2中的master
讀是否出現異常: 否
寫是否出現異常: 否
3.同時斷掉group_1和group_2中的slave
讀是否出現異常: 否
寫是否出現異常: 否
4.新增一組,把slot槽,從100-200的槽位遷移到新增組中
讀是否出現異常: 否
寫是否出現異常: 否
5.同時斷掉group_1中的master和slave節點
讀是否出現異常: 出現一部分訪問報錯
寫是否出現異常: 否
1.當group_1中的master斷掉
操做步驟
(1).須要先從group_1中把掛掉的master節點刪除掉
命令:
codis-config -c ../conf/config.ini server remove 1 192.168.10.170:6379
(2)把之前的master從新加進來換成slave節點
命令:
codis-config -c ../conf/config.ini server add 1 192.168.10.170:6379 slave
(3).若是group_1中有>=2個slave時,master斷掉後,沒有提高爲master的slave仍是會同步斷掉的master節點
(1).依次把slave從group_1中刪除
(2).依次把slave節點加入group_1中
2.當group_1中的slave斷掉,以後恢復後
(1).人爲從新加入到group_1中
命令:
codis-config -c ../conf/config.ini server add 1 192.168.10.170:6379 slave
一、啓動codis web頁面 在zookeeper中註冊codis組的節點
nohup ./bin/codis-config -c config.ini -L ./log/dashboard.log dashboard --addr=:18087 --http-log=./log/requests.log &>/dev/null
2.初始化slot
$CODIS_HOME/bin/codis-config -c $CODIS_HOME/conf/config.ini slot init -f
3.添加codis組
codis-config -c /usr/local/codis/conf/config.ini server add-group 1
4.添加機器到codis組中
codis-config -c /usr/local/codis/conf/config.ini server add 2 192.168.10.170:6380 master
5.分槽
./bin/codis-config -c /etc/codis/config_10.ini slot range-set 0 300 1 online
6.生成一個proxy,把codis_proxy_1這個proxy名稱註冊到zookeeper中,並設置爲offline狀態
/usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini proxy offline codis_proxy_1
7.啓動proxy,代理端口爲19000 http端口爲11000
nohup /usr/local/codis/bin/codis-proxy --log-level info -c /usr/local/codis/conf/config.ini -L /usr/local/codis/logs/proxy.log --cpu=8 --addr=0.0.0.0:19000 --http-addr=0.0.0.0:11000 &
8.把proxy id爲codis_proxy_1的proxy設置爲online狀態,可讓客戶端訪問
/usr/local/codis/bin/codis-config -c /usr/local/codis/conf/config.ini proxy online codis_proxy_1
9.啓動codis-ha,用來作group中從自動提高爲master用,並針對哪一個codis組名
nohup ./codis-ha --codis-config=127.0.0.1:18087 --productName=testgroup1 &
列出codis集羣中的機器當前狀態,並返回數組
Codis-config -c /usr/local/codis/conf/config.ini server list
添加redis實例到codis組中
Codis-config -c /usr/local/codis/conf/config.ini server add 1 192.168.10.169:6379 slave
刪除redis實例從codis組中
Codis-config -c /usr/local/codis/conf/config.ini server remove 1 192.168.10.169:6379
添加codis組
Codis-config -c /usr/local/codis/conf/config.ini server add-group 1
刪除codis組
Codis-config -c /usr/local/codis/conf/config.ini server remove-group 1
初始化slot
Codis-config -c /usr/local/codis/conf/config.ini slot init -f
查看slot槽位1的信息
./codis-config -c /usr/local/codis/conf/config.ini slot info 1
分給組名爲group_2 100-200分爲的hash槽
./codis-config -c /usr/local/codis/conf/config.ini range-set 100 200 2 online