一、關於Redis集羣需知的點
1.1 Redis的集羣方案
Redis目前的集羣方案有以下幾種:
1.RedisCluster:官方推薦,沒有中心節點
2.Codis:中間件產品,存在中心節點
3.Twemproxy:中間件產品,存在中心節點
帶中心節點的解決方案都存在中心節點掛掉後,Redis集羣失效的問題。
因此這裏將採用RedisCluster來實現。
1.2 RedisCluster的特點:
無中心節點,客戶端與redis節點直連,不需要中間代理層。
數據可以被分片存儲
管理方便,後續可自行增加或摘除節點。
1.3 Redis集羣高可用要注意的點
- Reids集羣中應該包含奇數個Master(主),至少應該有3個Master。(因爲Redis集羣和PXC集羣都有選舉機制,當集羣中超過一半以上的節點掛掉,剩餘節點無法進行選舉,組成新的集羣)
- Redis集羣中每個Master都應該有Slave(從)
redis集羣架構圖:
二、搭建Redis集羣
2.1 創建多臺Redis容器
拉取redis鏡像:
docker pull yyyyttttwwww/redis
這個鏡像是已經封裝了ruby環境供搭建集羣使用的,如果下載純淨版的redis鏡像需自行安裝環境。
對鏡像進行重命名:
docker tag yyyyttttwwww/redis redis
docker創建網段net2供Redis集羣使用:
docker network create --subnet=172.19.0.0/16 net2
創建redis容器r1:
docker run -it -d --name r1 -p 5001:6379 --net=net2 --ip 172.19.0.2 redis bash
進入該容器:
docker exec -it r1 bash
有了redis容器還需要去修改reids的配置文件/usr/redis/redis.conf,因爲Redis是默認關閉RedisCluster這樣集羣的功能的,
只有修改了配置文件,redis纔可以加入到集羣裏。
搜索該配置文件,將如下這些配置項改爲如下配置:
在容器內啓動redis服務:
cd /usr/redis/src # 進入redis啓動程序所在目錄
./redis-server ../redis.conf # redis-server是redis的啓動程序。指定配置文件啓動redis。
redis的第一個節點已經正常啓動,之後還需依次創建餘下5個redis容器,如上面的架構圖,一共需要6個redis節點:
之後就是如r1內的配置reids和啓動redis, 啓動所有redis容器內的redis服務。
2.2 搭建RedisCluster集羣
Redis自帶了創建集羣的工具redis-trib,redis-trib是基於Ruby的Redis集羣命令行工具,通過它可以創建出RedisCluster集羣。
但是通過它創建需要很多指令,可以使用寫好的腳本redis-trib.rb來創建。
在非官方的redis鏡像yyyyttttwwww/redis中已經安裝好了Ruby環境以及redis-trib.rb腳本。
按照以下指令,利用redis-trib.rb腳本來創建RedisCluster集羣即可:
2.3 進行測試
在r1容器中啓動redis的客戶端進行測試
/usr/redis/src/redis-cli -c 啓動redis客戶端
可以看到,在經過內部計算後,將a-10的鍵值對存到172.19.0.4這個r3節點中了,也就是架構圖中的第三臺Master。
那麼如果r3停掉了,應該由其slave節點接替master工作,是否是這樣呢?
執行指令:
docker pause r3 停止r3容器
docker exec -it r1 bash 進入r1容器內
/usr/redis/src/redis-cli -c 啓動redis客戶端
cluster nodes 查看redis集羣各個節點狀態
從上圖可以看到172.19.0.4 這個master節點已經掛掉了。而原先的172.19.0.7對應的節點已經升級成爲新的master。
再次嘗試獲取數據,發現果然已經由172.19.0.7對應的節點接替了原本的master做操作:
如果讓r3恢復運行,這個節點是什麼狀態呢?
可以發現r3這個節點已經變成了slave。
到這裏通過RedisCluster搭建高可用的redis集羣就完成了。