Redis高可用哨兵機(jī)制及SpringBoot整合哨兵

前言:在前面講到了Redis分片機(jī)制可實(shí)現(xiàn)內(nèi)存數(shù)據(jù)的擴(kuò)容來提高執(zhí)行速率---Redis的分片機(jī)制及對(duì)一致性HASH算法,可是Redis分片依舊有一些問題,如果redis分片的節(jié)點(diǎn)如果有一個(gè)服務(wù)器宕機(jī),則直接影響用戶的使用.Redis分片機(jī)制沒有實(shí)現(xiàn)高可用功能(HA)。----我所使用的Linux系統(tǒng)是dsCentOS-empty


1.Redis高可用哨兵機(jī)制

1.1主從同步配置

1.1.1 主從同步說明

說明:如果需要實(shí)現(xiàn)redis的高可用(HA),則必須先實(shí)現(xiàn)主從的同步。

當(dāng)用戶操作主節(jié)點(diǎn)時(shí),由程序內(nèi)部自動(dòng)的實(shí)現(xiàn)數(shù)據(jù)的同步,將數(shù)據(jù)同步給從節(jié)點(diǎn).這時(shí)主機(jī)和從機(jī)擁有相同的數(shù)據(jù)。

1.1.2 準(zhǔn)備哨兵的Redis節(jié)點(diǎn)

說明:

1.首先將redis的分片服務(wù)器全部關(guān)閉。
在這里插入圖片描述
2.復(fù)制分片的文件目錄,并且改名為sentinel
cp  -r shards  sentinel
3.刪除多余的持久化文件
rm -f dump.rdb
在這里插入圖片描述
4.分別啟動(dòng)redis
redis-server 6379.conf & redis-server 6380.conf & redis-server 6381.conf &

檢查Redis啟動(dòng)是否正常.

在這里插入圖片描述

1.1.3檢查Redis節(jié)點(diǎn)狀態(tài)

命令: 要求在redis的客戶端中執(zhí)行

info replication

role:master說明是主機(jī),connevted_slaves:0 說明暫無從機(jī)

在這里插入圖片描述

1.1.4實(shí)現(xiàn)主從掛載

設(shè)計(jì)方案: 6379當(dāng)主機(jī) 6380/6381當(dāng)從機(jī)。

在6380/6381中執(zhí)行如下命令:
slaveof   主機(jī)的IP地址   主機(jī)的端口號(hào)
35.png
2.檢查主從的狀態(tài)

role:slave以為著它是從機(jī),master_host/port 是主機(jī)信息

在這里插入圖片描述
3.向Redis的主機(jī)中添加數(shù)據(jù),之后檢查6380/6381中是否有數(shù)據(jù) 是否實(shí)現(xiàn)數(shù)據(jù)的同步.
在這里插入圖片描述

1.2Redis哨兵實(shí)現(xiàn)

1.2.1 哨兵工作原理

在這里插入圖片描述

工作原理說明:

  1. 當(dāng)哨兵啟動(dòng)時(shí),會(huì)根據(jù)配置文件監(jiān)聽當(dāng)前的主機(jī).獲取主機(jī)的全部信息。

  2. 哨兵利用心跳檢測(cè)機(jī)制,判斷當(dāng)前主機(jī)是否存活.如果連續(xù)3次 PING-PONG檢測(cè)時(shí)都沒有響應(yīng).則斷定當(dāng)前主機(jī)宕機(jī)。

  3. 如果發(fā)現(xiàn)主機(jī)宕機(jī),則哨兵會(huì)通過監(jiān)聽獲取當(dāng)前主機(jī)的從節(jié)點(diǎn)信息,之后利用選舉規(guī)則,動(dòng)態(tài)選擇新的主機(jī)。

  4. 如果一旦確定新的主節(jié)點(diǎn),則將其余的節(jié)點(diǎn)設(shè)置為新主機(jī)的從。

1.2.2編輯哨兵配置文件

1.復(fù)制哨兵的配置文件
cp sentinel.conf  sentinel/
2.打開sentinel配置文件

記住是sentinel文件目錄下的配置文件

vim sentinel.conf
2.關(guān)閉保護(hù)模式

protected-mode no    17行
3.開啟后臺(tái)啟動(dòng)
daemonize yes  26行
在這里插入圖片描述
4.配置哨兵的監(jiān)控

mymaster:表示變量的名稱. 代表著當(dāng)前redis的主機(jī).
1: 代表哨兵在選舉的過程中幾票生效.

在這里插入圖片描述
5.修改哨兵的宕機(jī)選舉時(shí)間
在這里插入圖片描述

將主機(jī)宕機(jī)后,從機(jī)選為主機(jī)的時(shí)間定為了10秒。

6.保存配置

1.2.3測(cè)試哨兵高可用

1.啟動(dòng)哨兵
redis-sentinel sentinel.conf
2.檢查哨兵服務(wù)是否啟動(dòng)
在這里插入圖片描述
3.高可用測(cè)試

將redis主機(jī)宕機(jī),等待10秒(這是自定義的),檢查主從結(jié)構(gòu)是否變化。

kill -9 22005
在這里插入圖片描述

主機(jī)6379被宕機(jī)后,轉(zhuǎn)化為了6380,說明哨兵的選舉一切正常。

重新啟動(dòng)6379服務(wù)器,檢查是否為6380的從機(jī)

在這里插入圖片描述

重啟之后,檢查6379的狀態(tài)信息 6379已經(jīng)是6380的從機(jī).哨兵高可用完成。

在這里插入圖片描述

2.SpringBoot整合哨兵

2.1 哨兵入門案例

如果哨兵機(jī)制服務(wù)器全部重啟,問 :是否需要重新配置主從,重新配置哨兵?

不需要
原因:一旦使用哨兵.則會(huì)將主從信息寫入每個(gè)節(jié)點(diǎn)的配置文件中.如果所有的節(jié)點(diǎn)都重啟則根據(jù)自己的配置文件的信息.實(shí)現(xiàn)主從的分配.

redis.conf文件標(biāo)識(shí):

replicaof 192.168.126.166 6380

sentinel.conf文件標(biāo)識(shí):

sentinel leader-epoch mymaster 1
sentinel known-replica mymaster 192.168.126.166 6379
sentinel known-replica mymaster 192.168.126.166 6381
sentinel current-epoch 1

測(cè)試哨兵機(jī)制

說明:用戶應(yīng)該鏈接redis哨兵,而不是redis主機(jī)。

       /**
         * 測(cè)試哨兵機(jī)制
         * masterName:當(dāng)前主機(jī)的變量名稱
         */
        @Test
        public void testSentinel() {
            Set<String> sentinels = new HashSet<String>();
            sentinels.add("192.168.126.166:26379");
            JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels);
            Jedis jedis = pool.getResource();//1主2從 1備份2次
            jedis.set("sentinel", "AAAAA");
            System.out.println(jedis.get("sentinel"));
        }

2.2 SpringBoot整合Redis哨兵

2.2.1添加redis依賴(在測(cè)試哨兵之前添加)

<!--spring整合redis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
</dependency>

2.2.2 編輯redis.properties文件

#標(biāo)識(shí)IP地址和端口號(hào)信息 IP:PORT
redis.node=192.168.126.166:6379
redis.nodes=192.168.126.166:6379,192.168.126.166:6380,192.168.126.166:6381
redis.sentinel=192.168.126.166:26379

2.2.3 編輯redisConfig配置類

    @Value("${redis.sentinel}")
    private String sentinel;    //node,node,node
    
    @Bean
    public Jedis jedis() {
        Set<String> sentinels = new HashSet<String>();
        sentinels.add(sentinel);
        JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels);
        return  pool.getResource();//1主2從 1備份2次
        
    }

2.2.4修改RedisAOP

說明:修改RedisAOP的對(duì)象注入

在這里插入圖片描述
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容