什麼是集羣
Redis 集羣實現了對 Redi s的水平擴容,即啓動 N 個 Redis 節點,將整個數據庫分佈存儲在這N個節點中,每個節點存儲總數據的1/N。
Redis 集羣通過分區(partition)來提供一定程度的可用性(availability): 即使集羣中有一部分節點失效或者無法進行通訊, 集羣也可以繼續處理命令請求。
主從複製的目的是爲了減輕 Redis 服務器的 CPU 壓力, 可以保證數據同步, 爲了可以保證 Redis 的高可用, 容災能力, 一般在每個節點使用主從 + 哨兵
Redis 集羣提供了以下好處
- 實現擴容
- 分攤壓力
- 無中心配置相對簡單
Redis 集羣的不足
- 多鍵操作是不被支持的
- 多鍵的Redis事務是不被支持的。lua腳本不被支持。
- 由於集羣方案出現較晚,很多公司已經採用了其他的集羣方案,而代理或者客戶端分片的方案想要遷移至redis cluster,需要整體遷移而不是逐步過渡,複雜度較大。
如果緩存數據量大, 也會有內存的壓力, 這裏使用的Redis4.0版本, 其它版本可能會有差異
安裝ruby環境
- 安裝方式一 : 在線安裝[ 並不推薦,因爲有可能存在下載失敗的情況 ]
yum install ruby
yum install rubygems
- 安裝方式二 : 線下安裝
- 藍奏雲 : https://yonxin.lanzous.com/b00zjd8fg
密碼 : cqq6
- 將下載好的文件解壓完後都拷貝包到虛擬機opt目錄下
- 這裏需要注意的是, 在安裝 Ruby 之前必須裝 C、C++ 語言的編譯環境, Ruby是使用 C語言 編寫的
- 安裝教程 : 鏈接地址
- 開始安裝ruby環境
- 按照依賴安裝各個rpm包14個 , 安裝命令
rpm -Uvh *.rpm --nodeps --force
- 如圖 :
- 到 opt目錄下在安裝
redis-3.2.0.gem
gem install --local redis-3.2.0.gem
- 如圖
以上操作, 搭建集羣的環境基本就準備好了
刪除之前的redis的數據[ 如果不刪集羣一定失敗 rdb 和 aof ] [ 如果沒有則可以不刪]
開始集羣的搭建
- 準備 6 個 redis 實例的配置文件
vim redis-6379.conf
include /myredis/redis.conf
pidfile /var/run/redis_6379.pid
port 6379
dbfilename dump-6379.rdb
appendonly no
logfile ""
#打開集羣
cluster-enabled yes
#設定節點配置文件
cluster-config-file nodes-6379.conf
#設置節點失聯時間,超過該時間[毫秒]集羣自動進行主從更換
cluster-node-timeout 15000
2. 複製生成其他節點的配置文件:6380/6381/6389/6390/6391
[root@centos myredis]#
cp redis-6379.conf redis-6380.conf
[root@centos myredis]#cp redis-6379.conf redis-6381.conf
[root@centos myredis]#cp redis-6379.conf redis-6390.conf
[root@centos myredis]#cp redis-6379.conf redis-6391.conf
[root@centos myredis]#cp redis-6379.conf redis-6389.conf
[root@centos myredis]#
- 修改所有的配置文件中的端口號和文件名端口號一致,
:%s/6379/6380/g
- 啓動6個redis 服務
將六個節點合成一個集羣
- 組合之前,請確保所有redis實例啓動後,nodes-xxxx.conf文件都生成正常。
- 切換到redis解壓的目錄src下,
redis-trib.rb
可以對集羣節點進行合併
cd /opt/redis-4.0.0/src
./redis-trib.rb create --replicas 1 192.168.230.200:6379 192.168.230.200:6380 192.168.230.200:6381 192.168.230.200:6389 192.168.230.200:6390 192.168.230.200:6391
- 如圖
- 顯示分配的槽個數
顯示以上內容基本Redis集羣環境就構建成功了!
連接集羣
- 使用 -c 採用集羣策略連接,設置數據會自動切換到相應的寫主機
redis-cli -c -p 6379
- 一個 Redis 集羣包含 16384 個插槽(hash slot), 數據庫中的每個鍵都屬於這 16384 個插槽的其中一個
- 集羣使用公式 CRC16(key) % 16384 來計算鍵 key 屬於哪個槽, 其中 CRC16(key) 語句用於計算鍵 key 的 CRC16 校驗和 。
- 當設置值後,對自動分配對應的槽 , 如圖
集羣中錄入值
- 不在一個slot下的鍵值,默認是不支持多鍵操作, 是不能使用
mget
,mset
等多鍵操作, 否則會出錯。 - 如下圖
- 可以通過
{}
來定義組的概念,從而使key中{}內相同
內容的鍵值對放到一個slot中去。 - 如下圖
查詢集羣中的值
- 計算鍵 key 應該被放置在哪個槽上。
-
CLUSTER KEYSLOT key
- 如圖
- 返回槽 slot 目前包含的鍵值對數量。
-
CLUSTER COUNTKEYSINSLOT <slot>
- 如圖
- 查看集羣或節點的狀態
-
cluster info/nodes
- 如圖
- 主從的自動切換,必須保證節點中已經保存數據了
故障恢復
- 當主機宕機,從機會自動上位
- 主機回來後會作爲上位的從機的slave
- 如果一個節點上的主從全部宕機,整個集羣環境不可用,當節點主從重啓後集羣環境扔可以使用
- 如果某一段插槽的主從都掛掉,而cluster-require-full-coverage 爲yes ,那麼 ,整個集羣都掛掉
- 如果某一段插槽的主從都掛掉,而cluster-require-full-coverage 爲no ,那麼,該插槽數據全都不能使用,也無法存儲。
感謝閱讀, 以上就是對 Redis 集羣的搭建過程了, 如有什麼更好的建議或方法 ,可以留言或進羣交流. 各種疑難雜症QQ交流羣:1101584918,歡迎大家加入。