天天看點

Redis進階/叢集管理Cluster/哨兵模式

Redis叢集

讀/寫分離

什麼是讀/寫分離

在使用者量非常龐大的時候,單台redis肯定是完全不夠用的。是以更多的時候我們更希望可以讀/寫分離,讀/寫分離的前提就是讀操作比寫操作頻繁的多,将資料放在多台伺服器上那麼久可以消除單台伺服器的壓力。

Redis主從同步

主從同步的過程

1.保證主伺服器(Master)的啟動

2.當從伺服器啟動時,發送SYNC指令給主伺服器。主伺服器接受到同步指令時,就是執行bgsave指令備份資料,但是主伺服器并不會拒絕用戶端的寫操作,而是将來自用戶端的寫指令寫入緩沖區。從伺服器在未收到主伺服器的備份快照檔案之前,會根據配置決定使用現有資料響應用戶端還是傳回錯誤

3.當bgsave指令被主伺服器執行完後,開始向從伺服器發送備份檔案,這個時候從伺服器就會丢棄現有的所有資料,開始載入發送過來的快照檔案

4.當主伺服器發送完備份檔案後,會将bgsave執行之後的緩存區内的寫指令也發送給從伺服器,從伺服器完成備份檔案解析後,就開始等待主伺服器的後續指令

5.同步完成以後,每次主伺服器完成一次寫入指令,都會同時往從伺服器發送同步寫入指令,主從同步就完成了

配置主從同步

從機配置:

slaveof server port 設定Master的ip和端口

masterauth root 設定Master的密碼

Redis哨兵模式(sentinel)

什麼是哨兵模式?

主從同步有一個問題就是:當Master當機以後需要手動的把一台Slave切換為Master,這種方式需要人工幹預,費時費力。是以哨兵模式可以幫助我們解決這個問題

哨兵模式概述

哨兵是一個獨立的程序。

哨兵會檢測多個redis伺服器,包括Master和Slave。通過發送指令,讓redis伺服器響應,檢測其運作狀态。

當哨兵檢測到master當機,就會自動将slave切換成master,然後通過釋出訂閱模式通知其他slave修改配置檔案,切換主機

為了實作哨兵的高可用,可以配置成多哨兵模式,即多個哨兵程序運作在不同的伺服器上檢測各個redis伺服器,哨兵兩兩之間也會互相監控。

多哨兵模式時,Master一旦當機,哨兵1檢測到這個結果,并不會馬上進行故障切換,而僅僅是哨兵1主管的認為Master不可用。當其他哨兵也檢測到Master不可用時,并且有一定的數量後,那麼哨兵之間就會形成一次投票,投票的結果由一個哨兵發起,進行切換操作,切換完成後,就會通過釋出訂閱方式讓各個哨兵把自己監控的伺服器實作切換主機。

哨兵模式配置

配置哨兵配置檔案:

redis/src/sentinel.conf

預設端口:

port 26379

内容如下:

禁止保護模式

protected-mode no

配置監聽的主服務, 最後的2表示當2個或2個以上的哨兵認為主服務不可用才會進行故障切換

sentinel monitor 伺服器名稱(自定義) 主服務ip 端口 2

定義服務密碼

sentinel auth-pass 伺服器名稱(和上面相同) 密碼

打開服務端口:哨兵之間兩兩監控

vim /etc/sysconfig/iptables

service iptables restart

啟動哨兵

./redis-sentinel sentinel.conf

哨兵的其他配置

sentinel down-after-milliseconds

- 指定哨兵在檢測redis服務時,當redis服務在一個毫秒數内都無法回答時,單個哨兵認為的主觀下線時間,預設為30秒

sentinel failover-timeout

- 指定故障切換運作的毫秒數,當超過這個毫秒數時,就認為切換故障失敗,預設3分鐘

sentinel notification-script

- 指定哨兵檢測到redis執行個體異常時,調用的報警腳本

Spring中啟動哨兵

<!-- 哨兵配置 -->
<bean id="sentinelConfig" 
	class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
<!-- 配置master主服務的名稱 -->
	<property name="master">
	   <bean class="org.springframework.data.redis.connection.RedisNode">
	    	<property name="name" value="mymaster"/>
	    </bean>
		</property>
		    <!-- 配置哨兵服務 -->
		    <property name="sentinels">
		    	<set>
		    		<bean 
		    		class="org.springframework.data.redis.connection.RedisNode">
		    			<constructor-arg name="host" value="192.168.101.153"/>
		    			<constructor-arg name="port" value="26379"/>
		    		</bean>
			    	<bean 
			    	class="org.springframework.data.redis.connection.RedisNode">
			    		<constructor-arg name="host" value="192.168.101.153"/>
			    		<constructor-arg name="port" value="26380"/>
			    	</bean>
			    	<bean 
			    	class="org.springframework.data.redis.connection.RedisNode">
			    		<constructor-arg name="host" value="192.168.101.153"/>
			    		<constructor-arg name="port" value="26381"/>
			    	</bean>
		     </set>
	</property>
</bean>
           

SpringBoot中啟動哨兵

spring:
  redis:
    sentinel:
      master: myMaster
      nodes: 
        - 192.168.184.130:26379
        - 192.168.184.131:26379
        - 192.168.184.132:26379
           

Cluster模式

Cluster叢集的特點

1、Client與redis節點直接連接配接,不需要中間proxy層.

2、redis-cluster把所有的實體節點映射到[0-16383]slot(插槽)上,cluster 負責維護

3、所有的redis節點彼此互聯(PING-PONG機制),内部使用gossip二進制協定優化傳輸資料

4、節點的失效檢測是通過叢集中超過半數的節點檢測失效時才生效.

問題:Redis 叢集中内置了 16384 個哈希槽,那他是如何決定将key放入哪個插槽的?

- 當Redis 叢集中放置一個 key-value 時,redis 先對 key 使用 crc16 算法算出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編号在 0-16383 之間的哈希槽,redis 會根據節點數量大緻均等的将哈希槽映射到不同的節點

Cluster叢集搭建步驟

前置條件:删除redis/src下的appendonly.aof,dump.rdb,nodes-6379.conf 3個檔案

1.

修改redis.conf,配置叢集資訊

開啟叢集,cluster-enabled yes

指定叢集的配置檔案,cluster-config-file nodes-端口.conf

2、用redis-trib.rb搭建叢集

因為redis-trib.rb是用Ruby實作的Redis叢集管理工具,是以我們需要先安裝ruby的環境

2.1、安裝ruby

yum -y install zlib ruby rubygems

2.2、安裝rubygems的redis依賴

gem install -l redis-3.3.0.gem

3、安裝好依賴的環境之後,我們就可以來使用腳本指令了

注意:此腳本檔案在我們的解壓縮目錄src下

執行指令:

./redis-trib.rb create --replicas 0 192.168.10.167:6379 192.168.10.167:6380 192.168.10.167:6381 開放16379 redis端口+1W

–replicas 0:指定了從資料的數量為0

4、檢視叢集狀态

通過用戶端輸入以下指令:

cluster nodes:這個指令可以檢視插槽的配置設定情況

整個Redis提供了16384個插槽,./redis-trib.rb 腳本實作了是将16384個插槽平均配置設定給了N個節點。

Cluster高可用叢集的搭建步驟

問題:叢集中的故障檢查機制

1、當叢集中的節點超過半數認為該目标節點疑似下線,那麼該節點就會被标記為下線;

2、當叢集中的任何一個節點下線,就會導緻插槽區有空檔,不完整,那麼該叢集将不可用;

解決方案

- 在Redis叢集中可以使用主從模式實作某一個節點的高可用

建立新叢集,且設定為一主一備

./redis-trib.rb create --replicas 1 192.168.10.167:6379 192.168.10.167:6380 192.168.10.167:6381 192.168.10.167:6382 192.168.10.167:6383 192.168.10.167:6384

spring:
    redis:
    cluster:
      max-redirects: 0
      nodes:
        - 192.168.184.130:26379
        - 192.168.184.131:26379
        - 192.168.184.132:26379
           

繼續閱讀