Redis搭建主從複製、哨兵叢集

JunSIr_deCp發表於2020-10-06

Redis搭建主從複製、哨兵叢集

相關:

Redis導學與一系列常見問題

Redis-資料結構及持久化操作(CentOS)

主從複製搭建

主從複製架構僅僅用來解決資料的冗餘備份,從節點僅僅用來同步資料

無法解決master(主節點)出現故障的自動故障轉移

主從複製架構圖:

準備三臺機器並修改對應的配置檔案

由於我沒有三臺機器,故在單臺機上開啟三個redis服務來模擬主從複製

  1. 準備三份配置檔案,修改對應的配置
- master
	port 6379	#指定埠號
	bind 0.0.0.0  #允許任意遠端連線
	
- slave1
	port 6380
	bind 0.0.0.0
	slaveof masterip masterport # slaveof 192.xxx.xx.xxx 6379

- slave2
	port 6381
	bind 0.0.0.0
	slaveof masterip masterport	# slaveof 192.xxx.xx.xxx 6379

從節點的指定在配置檔案中的位置如下:

2.啟動三臺機器進行測試

- cd /usr/redis/bin
- ./redis-server /root/master/redis.conf
- ./redis-server /root/slave1/redis.conf
- ./redis-server /root/slave2/redis.conf

如果搭建成功,你在master可以進行寫操作,在從節點可以看到資料都會進行同步,但是從節點無法進行寫操作!

啟用哨兵機制

哨兵機制是在主從複製的基礎上進行的

Sentinel(哨兵)是Redis 的高可用性解決方案:由一個或多個Sentinel 例項 組成的Sentinel 系統可以監視任意多個主伺服器,以及這些主伺服器屬下的所有從伺服器,並在被監視的主伺服器進入下線狀態時,自動將下線主伺服器屬下的某個從伺服器升級為新的主伺服器。簡單的說哨兵就是帶有自動故障轉移功能的主從架構

哨兵架構原理圖:

1.在主節點上建立哨兵配置

  • 在Master對應redis.conf同目錄下新建sentinel.conf檔案,名字絕對不能錯;

2.配置哨兵,在sentinel.conf檔案中填入內容:

sentinel monitor [被監控資料庫名字(自定義)]  [ip] [port] [指明哪個資料庫]
# sentinel monitor mymaster 192.xxx.xx.xxx 6379 1

3.啟動哨兵模式進行測試

  • ./redis-sentinel /root/sentinel/sentinel.conf

啟動哨兵後會顯示該哨兵的埠號

如果哨兵機制成功執行,你將master服務當機(CTRL + C)後,可以發現會有新的master被推舉上任,在原master節點恢復後,會成為新master節點的從節點

通過springboot操作哨兵:

spring.redis.sentinel.master=mymaster
#master書寫是使用哨兵監聽的那個名稱
spring.redis.sentinel.nodes=192.168.202.206:26379
#連線的不再是一個具體redis主機,書寫的是多個哨兵節點
  • 注意:如果連線過程中出現如下錯誤:RedisConnectionException: DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command ‘CONFIG SET protected-mode no’ from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2)

  • 解決方案:在哨兵的配置檔案中加入bind 0.0.0.0 開啟遠端連線許可權

叢集搭建

Redis在3.0後開始支援Cluster(模式)模式,目前redis的叢集支援節點的自動發現,支援slave-master選舉和容錯,支援線上分片(sharding shard )等特性

叢集架構圖與細節:

  • 所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬.
  • 各自的節點可以主從複製節點與哨兵機制
  • 節點的fail是通過叢集中超過半數的節點檢測失效時才生效. 當一個節點當機後,如果哨兵沒能即使處理,會被踢出叢集
  • 客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可
  • redis-cluster把所有的物理節點對映到[0-16383]slot(槽)上

關於槽:叢集負載均衡的一種策略

1.準備環境安裝ruby以及redis叢集依賴

yum install -y ruby rubygems #安裝ruby環境與依賴
# ...
# 到網際網路下載redis-xxx.gem到虛擬機器 xxx表示你的redis版本
# ...
gem install redis-xxx.gem  #通過gem安裝

2.在一臺機器建立7個目錄

由於叢集最少需要6個節點(3主3從),我們另外加一個節點用來訪問

7001 ~ 7006代表我們的叢集

3.每個目錄複製一份配置檔案

[root@localhost ~]# cp redis-4.0.10/redis.conf 7000/
[root@localhost ~]# cp redis-4.0.10/redis.conf 7001/
[root@localhost ~]# cp redis-4.0.10/redis.conf 7002/
[root@localhost ~]# cp redis-4.0.10/redis.conf 7003/
[root@localhost ~]# cp redis-4.0.10/redis.conf 7004/
[root@localhost ~]# cp redis-4.0.10/redis.conf 7005/
[root@localhost ~]# cp redis-4.0.10/redis.conf 7006/

4.修改各自目錄配置檔案

- port 	7000 ... 7001 ... 7002 .....   7006       #修改埠
- bind  0.0.0.0                   		 	     #開啟遠端連線
- cluster-enabled  yes 	        			     #開啟叢集模式
- cluster-config-file  nodes-port.conf 		      #叢集節點配置檔案
- cluster-node-timeout  5000      	   			 #叢集節點超時時間
- appendonly  yes   		               		 #開啟AOF持久化

5.指定不同目錄配置檔案啟動七個節點

- [root@localhost bin]# ./redis-server  /root/7000/redis.conf
- [root@localhost bin]# ./redis-server  /root/7001/redis.conf
- [root@localhost bin]# ./redis-server  /root/7002/redis.conf
- [root@localhost bin]# ./redis-server  /root/7003/redis.conf
- [root@localhost bin]# ./redis-server  /root/7004/redis.conf
- [root@localhost bin]# ./redis-server  /root/7005/redis.conf
- [root@localhost bin]# ./redis-server  /root/7006/redis.conf

6.檢視程式

- [root@localhost bin]# ps aux|grep redis

7.複製叢集操作指令碼到bin目錄中

- [root@localhost bin]# cp /root/redis-4.0.10/src/redis-trib.rb .

叢集指令碼在redis原始碼包中,在對應版本的原始碼包src/下找到這個rb原始檔,複製到你redis的bin下即可

8.建立叢集

./redis-trib.rb create --replicas 1 192.168.202.205:7000 192.168.202.205:7001 192.168.202.205:7002 192.168.202.205:7003 192.168.202.205:7004 192.168.202.205:7005

以上所有ip與埠改成你自己的

搭建成功後如下圖所示

叢集下相關操作

叢集節點狀態說明

  • 主節點
    主節點存在hash slots,且主節點的hash slots 沒有交叉
    主節點不能刪除
    一個主節點可以有多個從節點
    主節點當機時多個副本之間自動選舉主節點

  • 從節
    從節點沒有hash slots
    從節點可以刪除
    從節點不負責資料的寫,只負責資料的同步

# 檢視叢集狀態 check [原始叢集中任意節點] [無]
./redis-trib.rb check 192.168.202.205:7000

# 新增主節點 add-node [新加入節點] [原始叢集中任意節點]
./redis-trib.rb  add-node 192.168.1.158:7007  192.168.1.158:7006
- 注意:
	1.該節點必須以叢集模式啟動
	2.預設情況下該節點就是以master節點形式新增
	
	
# 新增從節點 add-node --slave [新加入節點] [叢集中任意節點]
./redis-trib.rb  add-node --slave 192.168.1.158:7006 192.168.1.158:7000
- 注意:
當新增副本節點時沒有指定主節點,redis會隨機給副本節點較少的主節點新增當前副本節點

相關文章