天天看點

redis主從模式搭建(一主二從三哨兵)單機redis(可以跳過)redis 主從模式配置哨兵springboot內建

單機redis(可以跳過)

1.安裝環境

yum -y install gcc-c++
           

2.擷取壓縮包

wget http://download.redis.io/releases/redis-5.0.6.tar.gz
           

3.解壓

tar -zxvf redis-5.0.6.tar.gz
           

4.切換到對應的目錄,然後編譯

cd redis-5.0.6
           
make
           

自此,redis已經安裝成功

5.啟動redis,指定配置檔案

./src/redis-server redis.conf
           

界面如下(我6379端口已經被占用,是以我修改為7000了)

redis主從模式搭建(一主二從三哨兵)單機redis(可以跳過)redis 主從模式配置哨兵springboot內建

6.Ctrl+c

退出目前服務,由于不是以守護線程的方式去啟動,是以需要Ctrl+c停止服務

7.修改redis.conf配置檔案

daemonize no 修改為 daemonize yes ,以守護線程啟動

修改密碼為 requirepass root

8.再次啟動redis,和上面指令一樣

9.檢視redis服務

ps -ef |grep redis
           

10.連接配接用戶端

./src/redis-cli
           

進入指定端口redis

./src/redis-cli -p 7000
           

鍵入info,檢視目前redis資訊

鍵入shutdown 停止redis服務

單機redis就安裝和調試完了。

redis 主從模式配置

主從模式: redis的主從模式,使用異步複制,slave節點異步從master節點複制資料,master節點提供讀寫服務,slave節點隻提供讀服務(這個是預設配置,可以通過修改配置檔案 slave-read-only 控制)。master節點可以有多個從節點。配置一個slave節點隻需要在redis.conf檔案中指定 slaveof master-ip master-port 即可。

1.進入到redis目錄

cd /home/tool/redis/redis-5.0.6
           

2.建立一個檔案夾,存放redis的配置檔案

mkdir config
           

3.在config下,建立三個配置檔案,如下:

cd config

vi master-7000.conf

bind 0.0.0.0
port 7000
logfile "7000.log"
dbfilename "dump-7000.rdb"
daemonize yes
rdbcompression yes
           

vi slave-7001.conf

bind 0.0.0.0
port 7001
logfile "7001.log"
dbfilename "dump-7001.rdb"
daemonize yes
rdbcompression yes
slaveof 127.0.0.1 7000
           

vi slave-7002.conf

bind 0.0.0.0
port 7002
logfile "7002.log"
dbfilename "dump-7002.rdb"
daemonize yes
rdbcompression yes
slaveof 127.0.0.1 7000
           

master-7000.conf,為主節點配置檔案,slave-7001.conf,slave-7002.conf為從節點配置檔案,在從節點的配置檔案中使用:slaveof 指定master節點

4.啟動三台reids服務

./src/redis-server config/master-7000.conf
./src/redis-server config/slave-7001.conf
./src/redis-server config/slave-7002.conf
           

檢視一下redis服務

ps -ef |grep redis
info replication
           

5.先分别連上三台Redis服務,擷取key為name的值,通過-p 指定連接配接那個端口的redis服務

./src/redis-cli -p 7000
./src/redis-cli -p 7001
./src/redis-cli -p 7002
           

測試get name 都為nil(沒有)

6.測試主從

給master節點set一個key為name的值,擷取從節點name值,結果如下:

127.0.0.1:7000> set name master

OK

從節點

127.0.0.1:7001> get name

"master"

127.0.0.1:7002> get name

"master"

現在我們對從節點進行寫入操作,結果如下:

redis主從模式搭建(一主二從三哨兵)單機redis(可以跳過)redis 主從模式配置哨兵springboot內建

slave節點隻提供讀服務,不能進行寫入操作

注意

使用主從模式時應注意matser節點的持久化操作,matser節點在未使用持久化的情況詳情下如果當機,并自動重新拉起服務,從伺服器會出現丢失資料的情況。以下測試:

首先,禁止matser服務持久化

127.0.0.1:7000> CONFIG SET save ""
OK
           

在master節點set一個值

127.0.0.1:7000> set age 23
OK
           

slave節點可以get到age的值

127.0.0.1:7001> get age
"23"
           

關掉master節點服務

127.0.0.1:7000> shutdown
not connected> 
           

slave節點此時仍可以get到age的值

127.0.0.1:7001> get age
"23"
           

重新開機master服務,此時擷取不到age的值

./src/redis-server config/master-7000.conf 
./src/redis-cli -p 7000
127.0.0.1:7000> get age
(nil)
           

slave節點此時在擷取age的值為空,資料丢失

./src/redis-cli -p 7001
127.0.0.1:7001> get age
(nil)
           

資料丢失的原因:因為master服務挂了之後,重新開機服務後,slave節點會與master節點進行一次完整的重同步操作,是以由于master節點沒有持久化,就導緻slave節點上的資料也會丢失掉。是以在配置了Redis的主從模式的時候,應該打開主伺服器的持久化功能。

到這,redis的主從模式就已經完成了

哨兵

sentinel是哨兵,用于監視主從伺服器的運作狀況,如果主伺服器挂掉,會在從伺服器中選舉一個作為主伺服器。

建立三個哨兵配置檔案(分别監視上面一主二從)

sentinel-7000.conf

port 27000
daemonize yes
logfile "27000.log"
sentinel monitor mymaster 127.0.0.1 7000 2
           

sentinel-7001.conf

port 27001
daemonize yes
logfile "27001.log"
sentinel monitor mymaster 127.0.0.1 7000 2
           

sentinel-7002.conf

port 27002
daemonize yes
logfile "27002.log"
sentinel monitor mymaster 127.0.0.1 7000 2
           

然後分别啟動

./src/redis-server config/sentinel-7000.conf --sentinel
./src/redis-server config/sentinel-7001.conf --sentinel
./src/redis-server config/sentinel-7002.conf --sentinel
           

啟動之後配置會變成

port 27000
sentinel myid 7f4d877479793a2e16e34b541c1f01055d85276c
daemonize yes
logfile "27000.log"
# Generated by CONFIG REWRITE
dir "/home/tool/redis/redis-5.0.6"
protected-mode no
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-replica mymaster 127.0.0.1 7002
sentinel known-replica mymaster 127.0.0.1 7001
sentinel known-sentinel mymaster 127.0.0.1 27002 de9744aa912c76c3c0db08c6dd371b545cdca83a
sentinel known-sentinel mymaster 127.0.0.1 27001 4b63d1decceb108fd968998c84db7dfa96e083d3
sentinel current-epoch 0
           

測試:

分别進入三台redis

./src/redis-cli -p 7000
./src/redis-cli -p 7001
./src/redis-cli -p 7002
           

檢視對應的角色

info replication
           

7000:

redis主從模式搭建(一主二從三哨兵)單機redis(可以跳過)redis 主從模式配置哨兵springboot內建

7001:

redis主從模式搭建(一主二從三哨兵)單機redis(可以跳過)redis 主從模式配置哨兵springboot內建

7002:

redis主從模式搭建(一主二從三哨兵)單機redis(可以跳過)redis 主從模式配置哨兵springboot內建

将master服務殺死

redis主從模式搭建(一主二從三哨兵)單機redis(可以跳過)redis 主從模式配置哨兵springboot內建

接着檢視redis7000:

redis主從模式搭建(一主二從三哨兵)單機redis(可以跳過)redis 主從模式配置哨兵springboot內建

7001:

redis主從模式搭建(一主二從三哨兵)單機redis(可以跳過)redis 主從模式配置哨兵springboot內建

7002:

redis主從模式搭建(一主二從三哨兵)單機redis(可以跳過)redis 主從模式配置哨兵springboot內建

發現7002已經變成主節點master了 

springboot內建

application.properties檔案

// 主從配置
// name of Redis server  哨兵監聽的Redis server的名稱
spring.redis.sentinel.master=mymaster
// comma-separated list of host:port pairs  哨兵的配置清單
spring.redis.sentinel.nodes=127.0.0.1:27000,127.0.0.1:27001,127.0.0.1:27002
           

新增RedisSentinelConfiguration代碼

/**
     * redis哨兵配置
     * @return
     */
    @Bean
    public RedisSentinelConfiguration redisSentinelConfiguration(){
        RedisSentinelConfiguration configuration = new RedisSentinelConfiguration();
        String[] host = redisNodes.split(",");
        for(String redisHost : host){
            String[] item = redisHost.split(":");
            String ip = item[0];
            String port = item[1];
            configuration.addSentinel(new RedisNode(ip, Integer.parseInt(port)));
        }
        configuration.setMaster(master);
        return configuration;
    }
 
    /**
     * 連接配接redis的工廠類
     *
     * @return
     */
    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
    //構造方法中注入RedisSentinelConfiguration對象
        JedisConnectionFactory factory = new JedisConnectionFactory(redisSentinelConfiguration());
        factory.setHostName(host);
        factory.setPort(port);
        factory.setTimeout(timeout);
        factory.setPassword(password);
        factory.setDatabase(database);
        return factory;
    }
           

驗證思路

* 寫一個controller方法,用來往redis中新增資料

* 此時關閉redis主伺服器,再次調用contoller方法、

* 如果接口依舊可以寫入資訊,說明配置成功。此時檢視redis的其他從伺服器,會發現有一個從伺服器變成了主伺服器。

繼續閱讀