Redis主從複製、哨兵、Cluster安裝部署

1、主從複製(Replication)

Redis支持三種集羣方案

  • 主從複製模式
  • Sentinel(哨兵)模式
  • Cluster模式

1.1、部署主從複製

1.1.1、環境說明

軟件 版本
操作系統 Centos 7.6
redis redis-5.0.8

redis版本:redis-5.0.8(下載地址:http://download.redis.io/releases/)

其他軟件:yum install gcc gcc-c++ -y

主機 redis主從信息
1.1.3.51 1.1.3.51:6379(主)
1.1.3.52 1.1.3.52:6379(從)

安裝規範約定:

描述 路徑
軟件安裝路徑 /tools/redis
配置文件存放路徑 /data/redis/etc
log存放路徑 /data/redis/log
pid文件存放路徑 /data/redis/pid
數據存放路徑 /data/redis/redisdata-6379

1.1.2、安裝步驟

編譯安裝redis: 具體參考tar包裏面的README.md文檔

mkdir -p /tools/redis
tar -zxvf redis-5.0.8.tar.gz -C /tools
cd /tools/redis-5.0.8
make PREFIX=/tools/redis install
ln -s /tools/redis /usr/local/redis

修改 /etc/profile : PATH=$PATH:/usr/local/redis/bin
source /etc/profile

創建所需目錄:

mkdir -p /data/redis/{etc,log,pid,redisdata-6379}

編輯配置文件:

官方的配置文件說明詳見:https://redis.io/topics/config ,可能要翻牆才能看到各個版本參數官方詳細解釋。

vi /data/redis/etc/redis-6379.conf (配置文件後面跟端口爲了區分不同實例)

簡單的測試環境,大部分參數默認配置:

daemonize yes
pidfile "/data/redis/pid/redis-6379.pid"
logfile "/data/redis/log/redis-6379.log"
dbfilename "redis-6379.rdb"
dir "/data/redis/redisdata-6379"
protected-mode no
requirepass 1234.C0m

從庫上需要單獨配置的:

replicaof 1.1.3.51 6379 
# master的ip,port,redis從配置文件
masterauth 1234.C0m 
# master的密碼,redis從配置文件
replica-serve-stale-data no 
# 如果slave無法與master同步,設置成slave不可讀,方便監控腳本發現問題,redis從配置文件

生產環境配置文件參考:

daemonize yes
# 默認情況下,redis 不是在後臺運行的,如果需要在後臺運行,把該項的值更改爲 yes
pidfile "/data/redis/pid/redis-6379.pid"
# 當運行多個 redis 服務時,需要指定不同的 pid 文件和端口。
port 6379
# 指定 redis 運行的端口,默認是 6379
timeout 0
# 設置客戶端連接時的超時時間,單位爲秒。當客戶端在這段時間內沒有發出任何指令,那麼關閉該連接。
# 0 是關閉此設置。
tcp-keepalive 60
# TCP keepalive
# 在 Linux 上,指定值(秒)用於發送 ACKs 的時間。注意關閉連接需要雙倍的時間。默認爲 0 。
tcp-backlog 511
# 在高併發的環境中,爲避免慢客戶端的連接問題,需要設置一個高速後臺日誌緩衝區backlog。
# 該參數指定tcp監聽backlog。
loglevel notice
# 日誌記錄級別,默認爲notice
logfile "/data/redis/log/redis-6379.log"
# 日誌文件存放路徑,默認值爲 stdout ,標準輸出,若後臺模式會輸出到 /dev/null
databases 16
# 可用數據庫數
# 默認值爲 16 ,默認數據庫爲 0 ,數據庫範圍在 0- ( database-1 )之間
dbfilename "redis-6379.rdb"
#SNAPSHOTTING
# 本地持久化數據庫文件名,默認值爲 dump.rdb
stop-writes-on-bgsave-error yes
# 後臺存儲錯誤停止寫。默認爲yes。
rdbcompression yes
# 壓縮存儲RDB文件
rdbchecksum yes
# 配置RDB文件中是否記錄校驗位
dir "/data/redis/redisdata-6379"
# 工作目錄
# 數據庫鏡像備份的文件放置的路徑。
# AOF 文件也會存放在這個目錄下面。
# 注意這裏必須制定一個目錄而不是文件。
slave-serve-stale-data yes
#REPLICATION
# 設置當本機爲slave服務時,設置master服務的IP地址及端口,在Redis啓動時,它會自動從master進行數據同步。
# 如:slaveof 192.168.1.10 6379 從庫請放開該參數。
# 當從庫同主機失去連接或者複製正在進行時,
# 如果 slave-serve-stale-data 設置爲 yes( 默認值 ) ,從庫會繼續響應客戶端的請求。
slave-read-only yes
# 配置 slave 實例是否接受寫,配置爲readonly。
repl-diskless-sync no
# 是否使用diskless方式傳輸RDB文件。默認值爲no。2.8.19新增功能。
# DISKLESS功能開啓時,在新加入從庫或從庫斷開重連,將不使用磁盤記錄RDB文件,而使用網絡進行傳輸。
repl-backlog-size 256mb
# 設置backlog緩衝區大小。
repl-backlog-ttl 7200
# 設置backlog緩衝區數據過期時間。
repl-disable-tcp-nodelay no
# 在 slave socket 的 SYNC 後禁用 TCP_NODELAY
# 如果選擇"yes",Redis將使用一個較小的數字TCP數據包和更少的帶寬將數據發送到slave, 但是這可能導致數據發送到slave端會有延遲, 如果是Linux kernel的默認配置,會達到 40 毫秒。
# 如果選擇"no",則發送數據到slave端的延遲會降低,但將使用更多的帶寬用於複製 .
repl-ping-slave-period 30
# 從庫會按照一個時間間隔向主庫發送 PINGs. 可以通過 repl-ping-slave-period 設置這個時間間隔,默認是 10 秒。從庫開啓。
repl-timeout 300
# repl-timeout 設置主庫批量數據傳輸時間或者 ping 回覆時間間隔,默認值是 60 秒
# 一定要確保 repl-timeout 大於 repl-ping-slave-period。主庫開啓。
slave-priority 100
# 如果 master 不能再正常工作,那麼會在多個 slave 中,選擇優先值最小的一個 slave 提升爲 master ,優先值爲 0 表示不能提升爲 master 。
maxclients 50000
#LIMITS
# 最大可連接客戶端數
maxmemory 10G
# 最大可使用內存數
maxmemory-policy allkeys-lru
# 內存達到最大值時鍵刪除的LRU策略。默認值爲volatile-lru-> 利用LRU算法移除設置過過期時間的key。
maxmemory-samples 5
# 設置LRU原則灰度選擇樣本數。默認值爲3.
lua-time-limit 5000
#LUA SCRIPT
# 限制LUA腳本的執行時間
slowlog-log-slower-than 10000
#SLOW LOG
# 設置執行時間超過該值的查詢被記錄到slow log中。單位微秒。
slowlog-max-len 128
# 設置slow log的最大長度。默認128。
activerehashing yes
#ADVANCED CONFIG
# 是否開啓自動rehash
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
# 當 hash 中包含超過指定元素個數並且最大的元素沒有超過臨界時,
# hash 將以一種特殊的編碼方式(大大減少內存使用)來存儲,這裏可以設置這兩個臨界值
# Redis Hash 對應 Value 內部實際就是一個 HashMap ,實際這裏會有 2 種不同實現,
# 這個 Hash 的成員比較少時 Redis 爲了節省內存會採用類似一維數組的方式來緊湊存儲,而不會採用真正的 HashMap 結構,對應的 valueredisObject 的 encoding 爲 zipmap,
# 當成員數量增大時會自動轉成真正的 HashMap, 此時 encoding 爲 ht。
list-max-ziplist-entries 512
list-max-ziplist-value 64
# 和 Hash 一樣,多個小的 list 以特定的方式編碼來節省空間。
# list 數據類型節點值大小小於多少字節會採用緊湊存儲格式。
set-max-intset-entries 512
# set 數據類型內部數據如果全部是數值型,且包含多少節點以下會採用緊湊格式存儲。
# set 數據類型內部數據如果全部是數值型,且包含多少節點以下會採用緊湊格式存儲。
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
# 和 hashe 和 list 一樣 , 排序的 set 在指定的長度內以指定編碼方式存儲以節省空間
# zsort 數據類型節點值大小小於多少字節會採用緊湊存儲格式。
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 250gb 64000mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
# 客戶端的輸出緩衝區的限制,因爲某種原因客戶端從服務器讀取數據的速度不夠快,
# 可用於強制斷開連接(一個常見的原因是一個發佈 / 訂閱客戶端消費消息的速度無法趕上生產它們的速度)。
# 可以三種不同客戶端的方式進行設置:
# normal -> 正常客戶端
# slave -> slave 和 MONITOR 客戶端
# pubsub -> 至少訂閱了一個 pubsub channel 或 pattern 的客戶端
# 一旦達到硬限制客戶端會立即斷開,或者達到軟限制並保持達成的指定秒數(連續)。
# 例如,如果硬限制爲 32 兆字節和軟限制爲 16 兆字節 /10 秒,客戶端將會立即斷開
# 如果輸出緩衝區的大小達到 32 兆字節,客戶端達到 16 兆字節和連續超過了限制 10 秒,也將斷開連接。
# 默認 normal 客戶端不做限制,因爲他們在一個請求後未要求時(以推的方式)不接收數據,
# 只有異步客戶端可能會出現請求數據的速度比它可以讀取的速度快的場景。
# 把硬限制和軟限制都設置爲 0 來禁用該特性
hz 10
# 設置Redis調用內部函數來執行後臺任務的權限。
aof-rewrite-incremental-fsync yes
# 當一個子節點重寫AOF文件時,如果啓用下面的選項,則文件每生成32M 數據進行同步。
rename-command KEYS "MYKEYS"
rename-command FLUSHALL "MYFLUSHALL"
rename-command FLUSHDB "MYFLUSHDB"
rename-command SHUTDOWN "MYSHUTDOWN"
# 命令重命名
protected-mode no
# 關閉保護模式
requirepass 1234.C0m
# 設置複雜一點的密碼
replicaof 1.1.3.51 6379 
# master的ip,port,redis從配置文件
masterauth 1234.C0m 
# master的密碼,redis從配置文件
replica-serve-stale-data no 
# 如果slave無法與master同步,設置成slave不可讀,方便監控腳本發現問題,redis從配置文件

#appendonly 'yes'
##APPEND ONLY MODE
##是否開啓appendonly模式。開啓之後,redis會把所接收到的每一次寫操作請求都追加到appendonly.aof文件中,當redis重新啓動時,會從該文件恢復出之前的狀態。
#appendfilename redis-6379.aof
## aof文件記錄名稱。默認爲appendonly.aof。
#appendfsync everysec
## aof文件同步策略。默認爲everysec:表示對寫操作進行累積,每秒同步一次。
## AOF 策略設置爲 always 或者 everysec 時,後臺處理進程 ( 後臺保存或者 AOF 日誌重寫 ) 會執行大量的 I/O 操作
#no-appendfsync-on-rewrite 'yes'
## 在某些 Linux 配置中會阻止過長的 fsync() 請求。注意現在沒有任何修復,即使 fsync 在另外一個線程進行處理
## 爲了減緩這個問題,可以設置下面這個參數 no-appendfsync-on-rewrite
#auto-aof-rewrite-percentage 100
## 設置自動重寫aof文件的比率
#auto-aof-rewrite-min-size 1000GB
## 設置aof文件執行自動重寫的最小值
#aof-load-truncated 'yes'
## 設置是否在導入aof文件後清空aof文件

1.2、配置主從

啓動主從

/usr/local/redis/bin/redis-server /data/redis/etc/redis-6379.conf
ps aux|grep redis  --查看redis是否已經啓動

如果你的從庫配置瞭如下參數,請跳過後面的配置,直接檢查下主從是否同步即可

requirepass 1234.C0m
# 設置複雜一點的密碼
replicaof 1.1.3.51 6379 
# master的ip,port,redis從配置文件
masterauth 1234.C0m 
# master的密碼,redis從配置文件
replica-serve-stale-data no 
# 如果slave無法與master同步,設置成slave不可讀,方便監控腳本發現問題,redis從配置文件

如果沒有配置,則需要配置下密碼驗證信息:
爲master、slave之間配置密碼驗證,從節點配置

config set requirepass redis-passwd
auth redis-passwd
config set masterauth redis-passwd
auth redis-passwd
config rewrite  #配置信息持久化到配置文件

配置主從參數,從節點配置

redis-cli -h 1.1.3.52 #默認6379端口方式進入從節點
slaveof 1.1.3.51 6379 #設置從的主節點
info                  #查看主從信息

1.3、主從複製優缺點

優點:

  1. master能自動將數據同步到slave,可以進行讀寫分離,分擔master的讀壓力
  2. master、slave之間的同步是以非阻塞的方式進行的,同步期間,客戶端仍然可以提交查詢或更新請求

缺點:

  1. 不具備自動容錯與恢復功能,master或slave的宕機都可能導致客戶端請求失敗,需要等待機器重啓或手動切換客戶端IP才能恢復
  2. master宕機,如果宕機前數據沒有同步完,則切換IP後會存在數據不一致的問題
  3. 難以支持在線擴容,Redis的容量受限於單機配置

2、哨兵(Sentinel)

2.1、部署哨兵

2.1.1、環境說明

在完成了主從複製的前提下來配置哨兵。

主機 redis主從信息 Sentinel信息
1.1.3.51 1.1.3.51:6379(主) 1.1.3.51:26379
1.1.3.52 1.1.3.52:6379(從) 1.1.3.52:26379
1.1.3.53 1.1.3.53:26379

安裝規範約定:

描述 路徑
軟件安裝路徑 /tools/redis
配置文件存放路徑 /data/redis/etc
log存放路徑 /data/redis/log
pid文件存放路徑 /data/redis/pid
數據存放路徑 /data/redis/redisdata-6379
sentinel存放路徑 /data/redis/sentinel-26379

2.1.2、安裝配置

編譯安裝redis步驟同1.1.2章節。

1.1.3.51/52/53節點分別創建目錄:

mkdir -p /data/redis/sentinel-26379

所有節點編輯redis sentinel配置文件:
vi /data/redis/etc/sentinel-26379.conf

daemonize yes
port 26379
protected-mode no
pidfile "/data/redis/pid/sentinel-26379.pid"
dir "/data/redis/sentinel-26379"
logfile "/data/redis/log/sentinel-26379.log"
protected-mode no

啓動sentinel

/usr/local/redis/bin/redis-sentinel /data/redis/etc/sentinel-26379.conf
ps -ef|grep redis    --查看sentinel是否開啓

爲三個sentinel 配置密碼驗證:

/usr/local/redis/bin/redis-cli -p 26379
sentinel set test-sentinel auth-pass 1234.C0m

登錄三個節點上的sentinel將主從添加到sentinel中:

/usr/local/redis/bin/redis-cli -p 26379
sentinel monitor test-sentinel 1.1.3.51 6379 2
sentinel set test-sentinel down-after-milliseconds 10000
sentinel set test-sentinel failover-timeout 30000

最後使用info sentinel命令檢查下狀態是否正常:

127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=test-sentinel,status=ok,address=1.1.3.51:6379,slaves=1,sentinels=3

2.2、測試下哨兵管用不

先查看下當前主從節點的狀態:

主節點:

[root@redis1 etc]# redis-cli -h 1.1.3.51
1.1.3.51:6379> info replication
NOAUTH Authentication required.
1.1.3.51:6379> auth "1234.C0m"
OK
1.1.3.51:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=1.1.3.52,port=6379,state=online,offset=92968,lag=0
master_replid:9c5c08e2ffbfd92776c6f142b0cf2dd48fcb5a5e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:93240
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:268435456
repl_backlog_first_byte_offset:1
repl_backlog_histlen:93240

從節點:

[root@redis2 ~]# redis-cli -h 1.1.3.52
1.1.3.52:6379> auth "1234.C0m"
OK
1.1.3.52:6379> info replication
# Replication
role:slave
master_host:1.1.3.51
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:110554
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:9c5c08e2ffbfd92776c6f142b0cf2dd48fcb5a5e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:110554
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:268435456
repl_backlog_first_byte_offset:1
repl_backlog_histlen:110554
1.1.3.52:6379> 

發現狀態都是OK的,接着把redis master kill 掉:

[root@redis1 etc]# ps -ef|grep redis
avahi      1241      1  0 03:03 ?        00:00:00 avahi-daemon: running [redis1.local]
root     110225      1  0 17:21 ?        00:00:32 redis-server *:6379
root     113307      1  0 21:58 ?        00:00:02 /usr/local/redis/bin/redis-sentinel *:26379 [sentinel]
root     113311 104076  0 21:58 pts/0    00:00:00 /usr/local/redis/bin/redis-cli -p 26379
root     113452 113179  0 22:07 pts/1    00:00:00 grep --color=auto redis
[root@redis1 etc]# kill -9 110225
[root@redis1 etc]# ps -ef|grep redis
avahi      1241      1  0 03:03 ?        00:00:00 avahi-daemon: running [redis1.local]
root     113307      1  0 21:58 ?        00:00:02 /usr/local/redis/bin/redis-sentinel *:26379 [sentinel]
root     113311 104076  0 21:58 pts/0    00:00:00 /usr/local/redis/bin/redis-cli -p 26379
root     113454 113179  0 22:08 pts/1    00:00:00 grep --color=auto redis

1.1.3.52節點上查看複製狀態,發現該節點上的redis已經變成master:

1.1.3.52:6379> info replication
# Replication
role:master
connected_slaves:0
master_replid:14897ea32dd7abeb2dd418e2e200251d410c6002
master_replid2:9c5c08e2ffbfd92776c6f142b0cf2dd48fcb5a5e
master_repl_offset:133875
second_repl_offset:124333
repl_backlog_active:1
repl_backlog_size:268435456
repl_backlog_first_byte_offset:1
repl_backlog_histlen:133875

把1.1.3.51上面的redis啓動看看複製狀態:發現該節點redis已經變成了slave

[root@redis1 etc]# redis-cli -h 1.1.3.51
1.1.3.51:6379> auth "1234.C0m"
OK
1.1.3.51:6379> info replication
# Replication
role:slave
master_host:1.1.3.52
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1
master_link_down_since_seconds:1584886273
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:1622389f3ce9ccdb708d75d7968f82d441b2097d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:268435456
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

2.3、哨兵模式的優缺點

優點:

  1. 哨兵模式基於主從複製模式,所以主從複製模式有的優點,哨兵模式也有
  2. 哨兵模式下,master掛掉可以自動進行切換,系統可用性更高

缺點:

  1. 同樣也繼承了主從模式難以在線擴容的缺點,Redis的容量受限於單機配置
  2. 需要額外的資源來啓動sentinel進程,實現相對複雜一點,同時slave節點作爲備份節點不提供服務

3、集羣(Cluster)

哨兵模式解決了主從複製不能自動故障轉移,達不到高可用的問題,但還是存在難以在線擴容,Redis容量受限於單機配置的問題。Cluster模式實現了Redis的分佈式存儲,即每臺節點存儲不同的內容,來解決在線擴容的問題。

看樣子cluster模式還是挺有用的,值得部署…

官方參考文檔:https://redis.io/topics/cluster-tutorial

3.1、部署集羣

3.1.1、環境說明

前提條件:

  1. 按照第1章節完成3主3從的主從複製搭建
  2. 每個主節點和相應的從節點不要創建在同一臺機器上
  3. 三臺機器任意主節點down掉,相應的從節點會加入集羣中
主機信息 節點信息
1.1.3.51 1.1.3.51:36381 1.1.3.51:36382
1.1.3.52 1.1.3.52:36381 1.1.3.52:36382
1.1.3.53 1.1.3.53:36381 1.1.3.53:36382

安裝規範約定:

描述 路徑
軟件安裝路徑 /tools/rediscluster
配置文件存放路徑 /data/rediscluster/etc
log存放路徑 /data/rediscluster/log
pid文件存放路徑 /data/rediscluster/pid
數據存放路徑 /data/rediscluster/redisdata-36379

3.1.2、安裝步驟

編譯安裝redis: 具體參考tar包裏面的README.md文檔

mkdir -p /tools/rediscluster
tar -zxvf redis-5.0.8.tar.gz -C /tools
cd /tools/redis-5.0.8
make PREFIX=/tools/rediscluster install
ln -s /tools/rediscluster /usr/local/rediscluster

修改 /etc/profile : PATH=$PATH:/usr/local/rediscluster/bin
source /etc/profile

創建所需目錄:三個節點分別執行

mkdir -p /data/rediscluster/{etc,log,pid,redisdata-36381,redisdata-36382,redisdata-36383}

編輯配置文件:
每個節點上兩個redis實例,總共需要編輯6個配置文件。

生成 /data/rediscluster/etc/redis-36381.conf(配置文件後面跟端口爲了區分不同實例)

cat >> /data/rediscluster/etc/redis-36381.conf << EOF
daemonize yes
port 36381
pidfile "/data/rediscluster/pid/redis-36381.pid"
logfile "/data/rediscluster/log/redis-36381.log"
dbfilename "redis-36381.rdb"
dir "/data/rediscluster/redisdata-36381"
protected-mode no
tcp-backlog 511
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
EOF

啓動所有redis實例

/usr/local/rediscluster/bin/redis-server /data/rediscluster/etc/redis-36381.conf
ps aux|grep redis    查看redis是否啓動

redis5.0以下版本需要配置ruby和redis gem

需要注意的是:redis的版本和ruby包的版本最好保持一致,yum install安裝的版本不是想要的版本,需要從分別下載這倆包編譯安裝。

ruby下載地址:http://www.ruby-lang.org/en/downloads/

gem下載地址:https://rubygems.org/gems/redis/versions/

tar -zxvf ruby-2.7.0.tar.gz
cd ruby-2.7.0/
./configure
make && make install
gem install -l redis-4.1.3.gem

redis5.0以下版本搭建集羣

redis-trib.rb create --replicas 1 1.1.3.51:36381 1.1.3.51:36382 1.1.3.52:36381 1.1.3.52:36382 1.1.3.53:36381 1.1.3.53:36382 

redis5.0+版本搭建集羣

redis-cli --cluster create 1.1.3.51:36381 1.1.3.51:36382 \
1.1.3.52:36381 1.1.3.52:36382 \
1.1.3.53:36381 1.1.3.53:36382 \
--cluster-replicas 1

查看集羣狀態

redis-cli -p 36381
cluster nodes
127.0.0.1:36381> cluster nodes
80993783427bd394534380c08f054ea9a98a82df 1.1.3.53:36382@46382 slave 92bf58fcd7f9eccbad3b0441f74edbc2d242da34 0 1585114214000 6 connected
c86a2fd50f429186354c5abc22d28e135b12e9e5 1.1.3.52:36382@46382 slave 39dad3c0e90fa98e27514be0dc3a8950d92b9f4b 0 1585114213000 4 connected
92bf58fcd7f9eccbad3b0441f74edbc2d242da34 1.1.3.52:36381@46381 master - 0 1585114213516 3 connected 5461-10922
a6aaeca7fe569d415fd32698f704bc5c7fc742f2 1.1.3.53:36381@46381 master - 0 1585114214929 5 connected 10923-16383
20b2b472c8f4b135872536c4ff53de609454cd4c 1.1.3.51:36382@46382 slave a6aaeca7fe569d415fd32698f704bc5c7fc742f2 0 1585114213920 5 connected
39dad3c0e90fa98e27514be0dc3a8950d92b9f4b 1.1.3.51:36381@46381 myself,master - 0 1585114212000 1 connected 0-5460

爲了安全,配置密碼認證

config set requirepass redis-passwd
auth redis-passwd
config set masterauth redis-passwd
auth redis-passwd
config rewrite

連接到集羣節點

redis-cli -p 36381 -c 
注意:一定要加上-c,不然節點之間是無法自動跳轉的!

3.2、測試下集羣的健壯性

在kill掉1.1.3.51:36381之前先看下它的從庫,結果:從庫是1.1.3.52:36382

1.1.3.51:36381> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=1.1.3.52,port=36382,state=online,offset=1357,lag=0
master_replid:2a286f0e5806c77267224e20432f5a7fefa60b57
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1357
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1357

kill -9 殺掉1.1.3.51:36381,觀察從庫是否變成主庫,結果:1.1.3.52:36382變成主庫

[root@redis2 ~]# redis-cli -h 1.1.3.52 -p 36382
1.1.3.52:36382> info replication
# Replication
role:master
connected_slaves:0
master_replid:7e6d31f601f1654d7c9ed6192c0d763dbceceddf
master_replid2:2a286f0e5806c77267224e20432f5a7fefa60b57
master_repl_offset:1945
second_repl_offset:1946
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1945

重新啓動1.1.3.51:36381後,該實例切換爲1.1.3.52:36382的從庫。

小結:redis cluster 具有高可用

3.3、集羣模式的優缺點

優點:

  1. 無中心架構,數據按照slot分佈在多個節點。
  2. 集羣中的每個節點都是平等的關係,每個節點都保存各自的數據和整個集羣的狀態。每個節點都和其他所有節點連接,而且這些連接保持活躍,這樣就保證了我們只需要連接集羣中的任意一個節點,就可以獲取到其他節點的數據。
  3. 可線性擴展到1000多個節點,節點可動態添加或刪除
  4. 能夠實現自動故障轉移,節點之間通過gossip協議交換狀態信息,用投票機制完成slave到master的角色轉換

缺點:

  1. 客戶端實現複雜,驅動要求實現Smart Client,緩存slots mapping信息並及時更新,提高了開發難度。目前僅JedisCluster相對成熟,異常處理還不完善,比如常見的“max redirect exception”
  2. 節點會因爲某些原因發生阻塞(阻塞時間大於 cluster-node-timeout)被判斷下線,這種failover是沒有必要的
  3. 數據通過異步複製,不保證數據的強一致性
  4. slave充當“冷備”,不能緩解讀壓力
  5. 批量操作限制,目前只支持具有相同slot值的key執行批量操作,對mset、mget、sunion等操作支持不友好
  6. key事務操作支持有線,只支持多key在同一節點的事務操作,多key分佈不同節點時無法使用事務功能
  7. 不支持多數據庫空間,單機redis可以支持16個db,集羣模式下只能使用一個,即db 0

另外,Redis Cluster模式不建議使用pipeline和multi-keys操作,減少max redirect產生的場景。

最後總結下:Redis集羣方案的三種模式,其中主從複製模式能實現讀寫分離,但是不能自動故障轉移;哨兵模式基於主從複製模式,能實現自動故障轉移,達到高可用,但與主從複製模式一樣,不能在線擴容,容量受限於單機的配置;Cluster模式通過無中心化架構,實現分佈式存儲,可進行線性擴展,也能高可用,但對於像批量操作、事務操作等的支持性不夠好。三種模式各有優缺點,可根據實際場景進行選擇。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章