Redis學習(六):Redis的主從複製架構和哨兵機制

Redis的主從複製架構

解決IT行業讀寫瓶頸的終極解決方案
讀寫分離
將讀取的操作和寫入的操作完全物理分隔開。

  • 多個節點讀寫分離:例如1、2、3節點負責數據寫入,4、5、6節點負責數據讀取。
  • 單節點多磁盤的讀寫分離:例如一個節點內1、2、3磁盤負責數據寫入,4、5、6磁盤負責數據讀取。

在Redis中,用戶可以通過執行SLAVEOF命令或者設置slaveof選項,讓一個服務器去複製(replicate)另一個服務器,我們稱呼被複制的服務器爲主服務器(master),而對主服務器進行復制的服務器則被稱爲從服務器(slave),如圖所示。
在這裏插入圖片描述

使用主從複製這種模式,實現node01作爲主節點,node02與node03作爲從節點,並且將node01所有的數據全部都同步到node02與node03服務器。

涉及到讀寫分離就會涉及到讀取和寫入數據的同步
在這裏插入圖片描述
1、主節點正常安裝redis
2、所有從節點正常安裝部署,在配置文件中添加
【slaveof 】【主節點IP】【redis端口號】,從節點不能寫數據到redis。
3、在主節點添加數據,在從節點查看數據是否已經同步。

配置如下(此處只配置了node02圖示,node03與node02一致)

第一步:node02與node03安裝redis

解壓命令:tar -zxvf redis-3.2.8.tar.gz  -C  /export/servers

在這裏插入圖片描述
node02與node03執行以下命令安裝依賴環境

yum -y install gcc-c++

node02與node03服務器安裝 tcl(在線安裝)

yum -y install tcl

node02與node03進行編譯redis

cd /export/servers/redis-3.2.8/
make && make install

node02與node03服務器修改redis配置文件

cd /export/servers/redis-3.2.8/
mkdir -p /export/servers/redis-3.2.8/logs
mkdir -p /export/servers/redis-3.2.8/redisdata

vim redis.conf

bind node02(node03修改此處,其他不變)
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/export/servers/redis-3.2.8/logs/redis.log"
dir /export/servers/redis-3.2.8/redisdata
slaveof node01 6379

第二步:啓動node02與node03節點的redis服務

node02執行以下命令啓動redis服務

cd  /export/servers/redis-3.2.8/src
redis-server  ../redis.conf

node03執行以下命令啓動redis服務

cd  /export/servers/redis-3.2.8/src
redis-server  ../redis.conf

啓動成功便可以實現redis的主從複製,node01可以讀寫操作,node02與node03只支持讀取操作。

實現效果
node01:設置數據 name=zhangsan
node02:查看數據,但無法寫入
node03:查看數據,但無法寫入
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

redis當中的Sentinel架構(哨兵機制)

上面的方案存在什麼問題?

  • 若主節點宕機,將無法寫數據到redis?

如何解決?

  • 引入哨兵機制,當主節點宕機時,哨兵會在從節點中選取一個節點作爲主節點,提供數據寫入服務。

Sentinel(哨兵)是Redis 的高可用性解決方案:由一個或多個Sentinel 實例 組成的Sentinel 系統可以監視任意多個主服務器,以及這些主服務器屬下的所有從服務器,並在被監視的主服務器進入下線狀態時,自動將下線主服務器屬下的某個從服務器升級爲新的主服務器。
例如:
在這裏插入圖片描述
在Server1 掉線後:
在這裏插入圖片描述
升級Server2 爲新的主服務器:
在這裏插入圖片描述
哨兵機制配置

第一步:三臺節點修改哨兵配置文件

cd /export/servers/redis-3.2.8
vim sentinel.conf

# 配置監聽的主服務器,這裏sentinel monitor代表監控,mymaster代表服務器的名稱,可以自定義,192.168.11.128代表監控的主服務器,6379代表端口,2代表只有兩個或兩個以上的哨兵認爲主服務器不可用的時候,纔會進行failover操作。
# 修改bind配置,每臺機器修改爲自己對應的主機名
bind node01
# 配置sentinel服務後臺運行(配置文件中沒有,需自行添加)
daemonize yes
# 修改三臺機器監控的主節點,現在主節點是node01服務器(配置文件有,修改即可)
sentinel monitor mymaster node01 6379 2
# sentinel author-pass定義服務的密碼,mymaster是服務名稱,123456是Redis服務器密碼
# sentinel auth-pass <master-name> <password>

第二步:三臺節點啓動哨兵服務

cd /export/servers/redis-3.2.8
src/redis-sentinel sentinel.conf 

在這裏插入圖片描述
注意:此時redis-server和sentinel兩個都要啓動

第三步:node01服務器殺死redis服務進程
使用kill -9命令殺死redis服務進程,模擬redis故障宕機情況
過一段時間之後,就會在node02與node03服務器選擇一臺服務器來切換爲主節點

第四步:redis的sentinel模式代碼開發連接

/**
 * 測試Redis哨兵模式
 * @author liu
 */
    @Test
    public void testSentinel() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(10);
        jedisPoolConfig.setMaxIdle(5);
        jedisPoolConfig.setMinIdle(5);
        // 哨兵信息
        Set<String> sentinels = new HashSet<>(Arrays.asList("node01:26379",
                "node02:26379","node03:26379"));
        // 創建連接池
        JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels,jedisPoolConfig);
        // 獲取客戶端
        Jedis jedis = pool.getResource();
        // 執行兩個命令
        jedis.set("mykey", "myvalue");
        String value = jedis.get("mykey");
        System.out.println(value);
    }

實現效果圖示

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章