Linux Redis 主從復制,Redis slaveof replicaof主從復制,redis-sentinel哨兵


Linux Redis 主從復制,Redis slaveof replicaof主從復制,redis-sentinel哨兵

 

================================

©Copyright 蕃薯耀 2020-12-18

https://www.cnblogs.com/fanshuyao/

 

基於redis-5.0.10.tar.gz

一、Redis主從復制配置,從機配置

進行redis配置文件的目錄,在redis.conf加入下面的配置(replicaof <masterip> <masterport>)

vim redis.conf
replicaof 192.168.170.11 6379

從機只讀模式默認是開啟的:

replica-read-only yes


或者(不打開配置文件,直接加到文件中):

echo "replicaof 192.168.170.11 6379" >> redis.conf

 

說明一下,replicaof是新版本的命令,舊版本是slaveof命令

(舊版本)使用slaveof命令:

slaveof 192.168.170.11 6379
slave-read-only yes

或者直接追加到配置文件

echo "slaveof 192.168.170.11 6379" >> redis.conf
echo "slave-read-only yes" >> redis.conf

 

二、查看redis主從配置

主機查看主從信息(先運行redis-cli)

127.0.0.1:6379> info replication

或者直接(不需要運行redis-cli):

/java/redis5/bin/redis-cli info replication

顯示的內容是:

# Replication
role:master
connected_slaves:2
slave0:ip=192.168.170.129,port=6379,state=online,offset=1207,lag=0
slave1:ip=192.168.170.130,port=6379,state=online,offset=1207,lag=0
master_replid:498a75a7d0eeacef2b29664a4f1c848be4882460
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1207
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1207

role:master,表示是主機

 

從機查看主從信息(開啟了redis-cli):

info replication

或者(不需要運行redis-cli)

/java/redis5/bin/redis-cli info replication

顯示的內容:

127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.170.11
master_port:6379
master_link_status:up

role:slave,表示從機

 

測試從機有沒有復制主機的值,建立主從關系后,從機自動會從主機復制所有數據:

/java/redis5/bin/redis-cli get b

顯示內容

[root@host_132 ~]# /java/redis5/bin/redis-cli get b
"456"

 

測試在從機增加數據:

從機是只讀模式,是不能設置值的:

127.0.0.1:6379> set c 12345
(error) READONLY You can't write against a read only replica.

 

三、Redis sentinel哨兵模式

Sentinel(哨兵)是用於監控redis集群中Master狀態的工具,是Redis 的高可用性解決方案。

sentinel哨兵模式已經被集成在redis2.4之后的版本中。

sentinel是redis高可用的解決方案,sentinel系統可以監視一個或者多個redis master服務,以及這些master服務的所有從服務;

當某個master服務下線時,自動將該master下的某個從服務升級為master服務替代已下線的master服務繼續處理請求。

sentinel可以讓redis實現主從復制,當一個集群中的master失效之后,sentinel可以選舉出一個新的master用於自動接替master的工作,集群中的其他redis服務器自動指向新的master同步數據。

一般建議sentinel采取奇數台,防止某一台sentinel無法連接到master導致誤切換。其結構如下:

 

1、復制sentinel的配置文件sentinel.conf 到指定的目錄

cp /java/redis5/sentinel.conf /java/redis5/bin/

2、去掉配置文件的注釋和空行,生成新的配置文件

cd /java/redis5/bin/
cat sentinel.conf | grep -v "#" | grep -v "^$" > sentinel-26379.conf

3、修改配置文件sentinel-26379.conf

vim sentinel-26379.conf

修改內容:(這個文件夾要先建:/java/redis5/data/)

port 26379
daemonize yes
pidfile /java/redis5/data/redis-sentinel-26379.pid
logfile "redis-sentinel-26379.log"
dir /java/redis5/data/

4、修改ip地址,將127.0.0.1修改成192.168.170.11,端口如果是默認的,不需要修改,后面那個2表示2個redis-sentinel檢查到master出問題后進入換master的方案。

sentinel monitor mymaster 192.168.170.11 6379 2

5、啟動sentinel

/java/redis5/bin/redis-sentinel /java/redis5/bin/sentinel-26379.conf

6、查看進程:

ps -ef | grep redis-sentinel
[root@host_132 bin]# ps -ef | grep redis-sentinel
root       4303      1  0 09:32 ?        00:00:00 /java/redis5/bin/redis-sentinel *:26379 [sentinel]
root       4311   1396  0 09:32 pts/0    00:00:00 grep --color=auto redis-sentinel

 

四、設置redis-sentinel開機啟動
1、創建服務文件(此方式為centos7的方式),文件原來是沒有的。

vi /etc/systemd/system/redis-sentinel.service

開機啟動文件內容:

[Unit]
#Description:描述服務
Description=RedisSentinel
#After:描述服務類別 
After=network.target

#服務運行參數的設置 
[Service]
#Type=forking是后台運行的形式 
Type=forking
#ExecStart為服務的具體運行命令,路徑必須是絕對路徑 
ExecStart=/java/redis5/bin/redis-sentinel /java/redis5/bin/sentinel-26379.conf
#ExecReload為重啟命令 ,路徑必須是絕對路徑 
ExecReload=/java/redis5/bin/redis-sentinel -s reload
#ExecStop為停止命令 ,路徑必須是絕對路徑 
ExecStop=/java/redis5/bin/redis-sentinel -s stop
#PrivateTmp=True表示給服務分配獨立的臨時空間 
PrivateTmp=true

#運行級別下服務安裝的相關設置,可設置為多用戶,即系統運行級別為3
[Install]
WantedBy=multi-user.target

 

2、重載系統服務:

systemctl daemon-reload

3、將服務加入開機自啟 (注意redis-sentinel.service后面不能跟空格 )

systemctl enable redis-sentinel.service

成功后提示:

[root@host_132 bin]# systemctl enable redis-sentinel.service
Created symlink from /etc/systemd/system/multi-user.target.wants/redis-sentinel.service to /etc/systemd/system/redis-sentinel.service.

4、測試開機啟動是否成功,重啟服務器

重啟服務器

reboot -f

5、系統重啟后,查看服務運行狀態:

systemctl status redis-sentinel.service

或者查看進程

ps -ef | grep redis-sentinel

 

五、開放redis-sentinel的連接端口,默認是26379

過程略。

 

六、Jedis測試Redis哨兵模式切換master

1、准備3台虛擬機,分別安裝了redis和redis-sentinel

過程略。

 

2、引入jedis依賴

<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
</dependency>

 

3、編寫Java代碼測試:

import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import org.apache.log4j.Logger;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisSentinelPool;

public class RedisSentinel {

    private static Logger log = Logger.getLogger(RedisSentinel.class);
    
    public static void redisSentinel() {
        Set<String> sentinels = new HashSet<String>();
        sentinels.add("192.168.170.128:26379");//192.168.170.11
        sentinels.add("192.168.170.129:26379");//192.168.170.12
        sentinels.add("192.168.170.130:26379");//192.168.170.13
        JedisSentinelPool jedisSentinelPool = new JedisSentinelPool("mymaster", sentinels);
        Jedis jedis = jedisSentinelPool.getResource();
        String a = jedis.get("a");
        String b = jedis.get("b");
        System.out.println("a=" + a);
        System.out.println("b=" + b);
        jedis.close();
        jedisSentinelPool.close();
    }
    
    
    /**
     * 測試哨兵轉移
     */
    public static void redisSentinelTransfer() {
        Set<String> sentinels = new HashSet<String>();
        sentinels.add("192.168.170.11:26379");
        sentinels.add("192.168.170.12:26379");
        sentinels.add("192.168.170.13:26379");
        @SuppressWarnings("resource")
        JedisSentinelPool jedisSentinelPool = new JedisSentinelPool("mymaster", sentinels);
        Jedis jedis = null;
        
        while(true) {
            try {
                //不能放在while里面,這樣連接池在8次后會被用完,不執行redis方法,也不報錯。
                //如果放在while,必須回收。
                jedis = jedisSentinelPool.getResource();
                int randInt = new Random().nextInt(10000);
                String key  = "k_" + randInt;
                String value  = "v_" + randInt;
                jedis.set(key, value);
                
                log.info(key + " = " + value);
                TimeUnit.SECONDS.sleep(2);
                
            } catch (Exception e) {
                log.info(e);
                
            } finally {
                if(jedis != null) {
                    jedis.close();
                }
            }
            
        }
        
    }
    
    
    public static void main(String[] args) {
        //redisSentinel();
        redisSentinelTransfer();
    }
    
    
}

 

4、直接通過kill -9 xxx 關閉Redis(主)的redis服務,測試master是否切換。

 注意:默認是要 30秒 后才會切換。

 

 

Centos7 Redis5安裝及配置,Linux Centos7安裝Redis5,Centos7 Redis自啟動,見:

https://www.cnblogs.com/fanshuyao/p/14144607.html

 

 

(如果文章對您有幫助,歡迎捐贈,^_^)

 

================================

©Copyright 蕃薯耀 2020-12-18

https://www.cnblogs.com/fanshuyao/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM