Redis學習之:Redis的集羣

1.爲何須要Redis集羣

隨着咱們系統業務量的增加,單機Redis已經不能知足需求了。假設咱們的系統要緩存的數據已經遠遠超出服務器的內存,就須要將這些數據以分片的形式存儲到不一樣的服務器上。node

2.解決的問題

數據冗餘備份、故障自動轉移、核心解決了單節點併發壓力問題redis

3.Redis集羣的原理

  • redis-cluster會均分16384個slot(從0-16383),每一個節點負責一部分槽
  • 客戶端能夠鏈接任意一個redis-cluster服務器
  • 每次set或get都會經過crc16算法計算出對應的slot
  • 對同一個key,屢次進行crc16計算時結果一致樣的
  • 同一個key在通過crc16計算時,結果必定會出現相同的狀況
  • 各個節點之間相互通信

4.Redis集羣搭建

  • Redis集羣至少須要3個節點,由於投票容錯機制要求超過半數節點認爲某個節點掛了該節點纔是掛了,因此2個節點沒法構成集羣
  • 要保證集羣的高可用,須要每一個節點都有從節點,也就是備份節點,因此Redis集羣至少須要6臺服務器。由於我沒有那麼多服務器,也啓動不了那麼多虛擬機,所在這裏搭建的是僞分佈式集羣,即一臺服務器虛擬運行6個redis實例,修改端口號爲(7001-7006),固然實際生產環境的Redis集羣搭建和這裏是同樣的

每一個配置文件作以下配置

port ${port}                                   #端口 
cluster-enabled yes                            #開啓集羣模式
cluster-config-file nodes-${port}.conf         #修改集羣配置文件
cluster-node-timeout 15000                     #設置節點超時時間
appendonly yes                                 #設置持久化爲aof模式
appendfilename appendonly-${port}.aof          #設置每一個持久化文件名
dbfilename dump-${port}.rdb                    #快照文件名
pidfile /var/run/redis_${port}.pid             #進程文件名
cluster-require-full-coverage yes              #
bind 0.0.0.0

啓動每一個redis服務

.redis-server ./redis-${port}.conf

  • 6個節點啓動完成後,咱們開始建立集羣
redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1  #參數1表示1主1從
# 7001爲7004的主節點
# 7002爲7005的主節點
# 7003爲7006的主節點

輸入yes後,成功完成集羣配置算法

查看集羣狀態

redis-cli --cluster info 192.168.3.200:7001   # 這裏鏈接任意一個節點均可以

操做集羣

鏈接任意一個節點均可以操做緩存

此時咱們發現,Redis會根據key去進行計算,無論是查詢仍是添加都會分配到對應的槽中bash

注意

  • 當某一個主節點宕機後,其對應的從節點會成爲主節點
  • 以前的主節點若是從新啓動後,則只能成爲從節點,不能成爲主節點了

向已存在的集羣中添加節點

啓動一個新的Redis實例 7007

redis-server ./redis-7007.conf

將7007節點加入集羣中

redis-cli --cluster add-node 127.0.0.7:7007 127.0.0.1:7001     # 前面的參數表示新增的節點ip:port 後面的參數表示已經存在的集羣節點的ip:port

此時咱們查看節點信息服務器

雖然7007節點已經加入了集羣,可是沒有分配任何的數據槽併發

給集羣節點從新分片

redis-cli --cluster reshard 192.168.3.200:7001

這裏它會首先提示咱們須要轉移多少個槽,咱們輸入3000app

而後會提示咱們須要哪一個id接收,咱們輸入使用 info 命令看到的7007節點的id 7e37f7ecde1a7bdc434ddc564662e47f3d3875e6分佈式

而後提示咱們從哪些節點分配出這些槽,咱們輸入allui

而後輸入 yes 就能夠完成節點槽的從新分配

相關文章
相關標籤/搜索