1. 程式人生 > >基於docker的sentinel的高可用Redis叢集

基於docker的sentinel的高可用Redis叢集

前言:docker和redis都是很好玩的技術,作為一個技術狂,一定會特別喜歡,那麼我們可能會使用Docker來啟動單個Redis用於開發,接下來將講講基於Sentinel的高可用Redis 3叢集,程式碼以及放在git(git程式碼連結)上面了,放在專案裡面的resources資料夾下面。覺得不錯請給個星。不僅包含了如何啟動docker叢集,同時融入到java的ssm框架中,結合例項使用。使用的是Redis官方映象3.2.1

一,介紹
這裡寫圖片描述
Sentinel是Redis的高可用性(HA)解決方案,由一個或多個Sentinel例項組成的Sentinel系統可以監視任意多個主伺服器,以及這些主伺服器屬下的所有從伺服器,並在被監視的主伺服器進行下線狀態時,自動將下線主伺服器屬下的某個從伺服器升級為新的主伺服器,然後由新的主伺服器代替已下線的主伺服器繼續處理命令請求。Redis提供的sentinel(哨兵)機制,通過sentinel模式啟動redis後,自動監控master/slave的執行狀態,基本原理是:心跳機制+投票裁決

監控(Monitoring): Sentinel 會不斷地檢查你的主伺服器和從伺服器是否運作正常。
提醒(Notification): 當被監控的某個 Redis 伺服器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程式傳送通知。
自動故障遷移(Automatic failover): 當一個主伺服器不能正常工作時, Sentinel 會開始一次自動故障遷移操作, 它會將失效主伺服器的其中一個從伺服器升級為新的主伺服器, 並讓失效主伺服器的其他從伺服器改為複製新的主伺服器; 當客戶端試圖連線失效的主伺服器時, 叢集也會向客戶端返回新主伺服器的地址, 使得叢集可以使用新主伺服器代替失效伺服器。

接下來先看一個sentinel.conf配置檔案

sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1

sentinel monitor resque 192.168.1.3 6380 4
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5

第一行表示Redis監控一個叫做mymaster的執行在127.0.0.1:6379的master,投票達到2則表示master以及掛掉了。
第二行表示在一段時間範圍呢sentinel向master傳送的心跳PING沒有回覆則認為master不可用了。
第三行表示主從切換時候,最多有多少個slave同時對新的master進行同步
其他詳細的配置可去官方文件檢視

接下來部署Redis叢集

git clone https://github.com/wacxt/pretty_ssm
cd pretty_ssm/src/main/resources/docker

可以看到目錄下面的docker-compose.yml,裡面定義了Redis叢集的服務組成,sentinel目錄下面的Dockerfile則包含了sentinel服務

接下來就是開啟服務了

(拉取映象)
docker-compose build
(部署並且啟動叢集)
docker-compose up -d
(檢查叢集狀態)
docker-compose ps
(伸縮sentinel的例項數量到3個)
docker-compose scale sentinel=3
(伸縮slave的例項數量到2個,這樣我們就有3個redis例項了(包含一個master))
docker-compose scale slave=2

如果要看到master節點失效,可以執行./test.sh,就可以看到具體資訊了。

到這裡就佈置完成了,那麼如何整合到java的ssm框架中呢?
redis.properties

#redis config
redis.pass=
redis.pool.maxTotal=105
redis.pool.maxIdle=10
redis.pool.maxWaitMillis=5000
redis.pool.testOnBorrow=true
redis.ip=127.0.0.1
redis.port=6379

#sentinel1.ip=192.168.11.100
#sentinel1.port=63791
#sentinel2.ip=192.168.11.101
#sentinel2.port=63792
#sentinel3.ip=192.168.11.102
#sentinel3.port=63792

#redis.ip1=192.168.11.100
#redis.port1=7111
#redis.ip2=192.168.11.101
#redis.port2=7112
#redis.ip3=192.168.11.102

spring-redis.xml配置

<!-- Redis 配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <property name="maxTotal" value="${redis.pool.maxTotal}" />
    <property name="maxIdle" value="${redis.pool.maxIdle}" />
    <property name="maxWaitMillis" value="${redis.pool.maxWaitMillis}" />
    <property name="testOnBorrow" value="${redis.pool.testOnBorrow}" />
</bean>

<bean id="sentinelConfiguration"
    class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
    <property name="master">
        <bean class="org.springframework.data.redis.connection.RedisNode">
            <property name="name" value="master-1"></property>
        </bean>
    </property>
    <property name="sentinels">
        <set>
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <constructor-arg name="host" value="${sentinel1.ip}"></constructor-arg>
                <constructor-arg name="port" value="${sentinel1.port}"></constructor-arg>
            </bean>
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <constructor-arg name="host" value="${sentinel2.ip}"></constructor-arg>
                <constructor-arg name="port" value="${sentinel2.port}"></constructor-arg>
            </bean>
        </set>
    </property>
</bean>

<!-- Jedis ConnectionFactory連線配置 -->
<bean id="jedisConnectionFactory"
    class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    <property name="password" value="${redis.pass}"></property>
    <property name="poolConfig" >
        <ref bean="jedisPoolConfig"/>
    </property>
    <constructor-arg name="sentinelConfig" ref="sentinelConfiguration"></constructor-arg>
</bean>

<!-- redisTemplate配置,redisTemplate是對Jedis的對redis操作的擴充套件,有更多的操作,封裝使操作更便捷 -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
    <property name="connectionFactory" ref="jedisConnectionFactory" />
</bean>

注意
我在yml檔案中只把master暴露到宿主機中,如何需要暴露其他端口出來的,需要自己修改。
git程式碼傳送門:傳送門