天天看點

08-主從複制與叢集一、定義二、搭建一主多從三、示範四、主從複制的原理五、哨兵模式六、叢集七、搭建叢集八、叢集操作與故障恢複

目錄

一、定義

好處:

二、搭建一主多從

三、示範

四、主從複制的原理

1. 一主二仆

2.薪火相傳

3.反客為主

五、哨兵模式

六、叢集

七、搭建叢集

八、叢集操作與故障恢複

​​​​​​​

一、定義

主機資料更新後根據配置和政策,自動同步到備機的master/slaver機制, Master以寫為主, Slave以讀為主.

08-主從複制與叢集一、定義二、搭建一主多從三、示範四、主從複制的原理五、哨兵模式六、叢集七、搭建叢集八、叢集操作與故障恢複

一主多從:一台主機挂掉,無法進行。需要叢集

好處:

1.讀寫分離:主機做寫操作,從機做讀操作

2.容災快速恢複:當一台機器挂掉,其他從機還能處理

二、搭建一主多從

1.建立/myredis檔案夾

2.複制redis.conf配置檔案到該檔案中

3.配置一主兩從,建立3個配置檔案
    redis6379.conf
    redis6380.conf
    redis6381.conf

4.在三個配置檔案中寫入内容

    修改appendonly no

5.建立redis6379.conf 填寫内容
    include /myredis/redis.conf
    pidfile /var/run/redis_6379.pid
    port 6379
    dbfilename dump6379.rdb

6. 建立redis6380.conf 填寫内容
    include /myredis/redis.conf
    pidfile /var/run/redis_6380.pid
    port 6380
    dbfilename dump6380.rdb

7. 建立redis6381.conf 填寫内容
    include /myredis/redis.conf
    pidfile /var/run/redis_6381.pid
    port 6381
    dbfilename dump6381.rdb
           

啟動三台伺服器

redis-server redis6379.conf
redis-server redis6380.conf
redis-server redis6381.conf
           

檢視程序是否啟動

ps -ef | grep redis
           

檢視三台主機運作情況

info replication
           

分别連上三個redis,不同的端口号

redis-cli -p 6379
redis-cli -p 6380
redis-cli -p 6381
           

配從不配主(在從機的視窗輸入以下指令)

slaveof <主機ip> <主機端口号>

slaveof 127.0.0.1 6379
           

再檢視一遍

info replication
           

顯示該機是一個slave 從伺服器

三、示範

1.在主機中加資料
set k1 v1

2.在從機中能讀到資料
keys *
           

若在從機進行寫操作,會報錯。

四、主從複制的原理

1. 一主二仆

1.其中一台從機挂掉

6379:
6380:
6381:shutdown

2.主機添加操作

6379:set k1 v1
6380:
6381:shutdown

3.6381從機再啟動會什麼效果?
6379:
6380:
6381:redis-server redis6381.conf
        redis-cli -p 6381
        info replication

4.發現從機6381變成主機了,再設定回從機
6379:
6380:
6381:slaveof 127.0.0.1 6379

5.6381能看到k1嗎?
6379:
6380:
6381:key *

6.可以看到,但需要重新設定為從機

           

主機挂掉的情況:從機仍然是從機,主機仍然是主機

1.主機挂掉
6379:shutdown
6380:
6381:

2.從機仍然是從機

3.重新開機主機
6379:redis-server redis6379.conf
        redis-cli -p 6379
6380:
6381:
           

通俗原理:

1、當從連接配接上主伺服器之後,從伺服器向主服務發送進行資料同步消息(從機主動)

2、主伺服器接到從伺服器發送過來同步消息,把主伺服器資料進行持久化rdb檔案,把rdb檔案發送從伺服器,從伺服器拿到rdb進行讀取

3、每次主伺服器進行寫操作之後,和從伺服器進行資料同步(主機主動)

主從複制原理:

  • Slave啟動成功連接配接到master後會發送一個sync指令。
  • Master接到指令啟動背景的存盤程序,同時收集所有接收到的用于修改資料集指令,在背景程序執行完畢之後, master 将傳送整個資料檔案到slave,以完成一次完全同步。
  • 全量複制:而slave服務在接收到資料庫檔案資料後,将其存盤并加載到記憶體中。
  • 增量複制: Master繼續将新的所有收集到的修改指令依次傳給slave,完成同步,但是隻要是重新連接配接master,-次完全同步(全量複制将被自動執行)

2.薪火相傳

薪火相傳:項目經理管幾百人,向下劃分小組長,隻需通知小組長即可。

示範:

1.設定
6379:主機
6380:slave of 127.0.0.1 6379
6381:slave of 127.0.0.1 6380

2.6381的主機是6380
6379:主機
6380:
6381:info replication
           

中途變更轉向:會清除之前的資料,重建立立拷貝最新的.

風險是一旦某個 slave當機,後面的slave都沒法備份。

主機挂了,從機還是從機,無法寫資料了。

3.反客為主

1.6381從機上位,變成主機
6379:shutdown
6380:
6381:slaveof no one

但需要手動設定,後面的哨兵模式就是反客為主的自動版
           

五、哨兵模式

08-主從複制與叢集一、定義二、搭建一主多從三、示範四、主從複制的原理五、哨兵模式六、叢集七、搭建叢集八、叢集操作與故障恢複

哨兵始終監聽主機是否挂掉,通知從機上位

1.啟動伺服器 并 連接配接
6379:redis-server redis6379.conf
6380:redis-server redis6379.conf
6381: redis-server redis6379.conf

2.設定從伺服器
6379:
6380:slaveof 127.0.0.1 6379
6381: slaveof 127.0.0.1 6379

3.配置哨兵模式
自定義的/myredis目錄下建立sentinel.conf檔案,名字不可錯

sentinel monitor mymaster 127.0.0.1 6379 1
其中mymaster 為監控對象起的伺服器名字
1為至少有多少個哨兵同意遷移的數量,均同意才可

4.啟動哨兵
/usr/local/bin
redis-sentinel /myredis/sentinel.conf

預設端口 26379

5.觀察資訊
主機挂掉,從6380.6381中選擇一個當主機

6.主機挂掉
6379:shutdown
6380:
6381:

7.稍等,哨兵知曉,從機上位
selected-salve ... 6380

8.6380作為主機,但6379作為從伺服器,隻是仍然處以挂掉狀态
6379:挂掉
6380:主機
6381:主機是6380

9.目前的狀況
6379:主機是6380
6380:主機
6381:主機是6380
           

缺點:複制延時

由于所有的寫操作都是先在Master.上操作,然後同步更新到Slave.上,是以從Master同步到Slave機器有一定的延遲 ,當系統很繁忙的時候,延遲問題會更加嚴重, Slave機器數量的增加也會使這個問題更加嚴重

選舉新主機的條件:

1.選擇優先級靠前的

2、選擇偏移量最大的

3、選擇runid最小的從服務

優先級的配置
vi redis.conf

值越小優先級越高
replica-priority 100 

           

偏移量是指獲得,原主機資料最全的。

每個redis執行個體啟動後都會随機生成一個40位的runid

在java中配置主從複制

private static JedisSentinelPool jedisSentinelPool=null;
public static Jedis getJedisFromSentinel {
if(jedisSentinelPool==null) {
Set<String> sentinelSet=new HashSet<>() ;
sentinelSet.add(" 192. 168. 11. 103:26379");
JedisPoolConfig jedi sPpolConfig =new Jedi sPoolConfig(;
jedisPoolConfig. setMaxTotal(10); //最大可用連接配接數
jedisPoolConfig. setMaxIdle(5); //最大閑置連接配接數
jedisPoolConfig. setMinIdle(5); //最小閑置連接配接數
jedisPoolConfig. setBlockWhenExhausted(true); //連接配接耗盡是否等待
jedisPoolConfig. setMaxWaitMillis (2000); //等待時間
jedisPoolConfig. setTestOnBorrow(true); //取連接配接的時候進行一下測試 ping
pong
jedisSentinelPool=new JedisSentinelPool (”mymaster", sentinelSet, jedisPoolConfig) ;
return jedisSentinelPool. getResource() ;
           

六、叢集

引入:

容量不夠, redis如何進行擴容?

并發寫操作,redis如何分攤?

另外,主從模式,薪火相傳模式,主機當機,導緻ip位址發生變化,應用程式中配置需要修改對應的主機位址、端口]等資訊

之前通過代理主機來解決,但是redis3.0中提供了解決方案。就是無中心化叢集配置

代理主機,并不合理

08-主從複制與叢集一、定義二、搭建一主多從三、示範四、主從複制的原理五、哨兵模式六、叢集七、搭建叢集八、叢集操作與故障恢複

 無中心化叢集

任何一台都可以當做服務的入口,他們互相可以傳遞服務 

08-主從複制與叢集一、定義二、搭建一主多從三、示範四、主從複制的原理五、哨兵模式六、叢集七、搭建叢集八、叢集操作與故障恢複

Redis叢集實作了對Redis的水準擴容,即啟動N個redis節點,将整個資料庫分布存儲在這N個節點中,每個節點存儲總資料的1/N

Redis叢集通過分區( partition)來提供一定程度的可用性(availbility) :即使叢集中有一部分節點失效或者無法進行通訊,叢集也可以繼續處理指令請求

七、搭建叢集

1.删除之前的rdb檔案、aof檔案
rm -rf dump63*

2.搭建6台redis伺服器
6379:
6380:
6381:
6389:
6390:
6391:

89是79的從機,90是80的從機,91是81的從機

3.配置基本資訊
daemonize yes
pid 檔案名
指定端口
Log 檔案名字
Appendonly no



4.redis cluster配置修改
include /myredis/redis.conf
pidfile "/var/run/redis_6379.pid"
port 6379
dbfilename "dump6379.rdb"
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000

5.配置其中一台,複制6份
cp redis6379.conf redis6380.conf
....

6.修改6份配置檔案裡面的端口,檔案名都修改

7.啟動6個Redis伺服器
6379:redis-server redis6379.conf
6380: redis-server redis6380.conf
6381:redis-server redis6381.conf
6389:redis-server redis6382.conf
6390:redis-server redis6383.conf
6391:redis-server redis6384.conf

ps -ef | grep redis

8.6個伺服器合成一個叢集
確定redis執行個體都啟動

cd /opt/redis-6.2.1/src
redis-cli --cluster create --cluster-replicas 1 192.168.44.168:6379 192.168.44.168:6380 192.168.44.168:6381 192.168.44.168:6389 192.168.44.168:6390 192.168.44.168:6391

寫真實的IP位址,設定了密碼的要在1後加 -a 密碼,要開放端口才能用

9.接受配置設定方式
yes

10.配置設定完成
16384 ...

11.測試
叢集方式連接配接

redis-cli -c -p 6379

12.查詢結點資訊
cluster nodes

           

cluster-enabled yes        打開叢集模式

cluster-config-file nodes-6379.conf               

cluster-node-timeout 15000        逾時時間

八、叢集操作與故障恢複

rediscluster如何配置設定這六個節點?

一個叢集至少要有三個主節點。

選項--cluster-replicas 1表示我們希望為叢集中的每個主節點建立一個從節點

配置設定原則盡量保證每個主資料庫運作在不同的IP位址,每個從庫和主庫不在一個IP位址上

08-主從複制與叢集一、定義二、搭建一主多從三、示範四、主從複制的原理五、哨兵模式六、叢集七、搭建叢集八、叢集操作與故障恢複
08-主從複制與叢集一、定義二、搭建一主多從三、示範四、主從複制的原理五、哨兵模式六、叢集七、搭建叢集八、叢集操作與故障恢複

什麼是slots?

 [OK] All 16384 slots covered.

一個Redis叢集包含16384 個插槽( hash slot) ,資料庫中的每個鍵都屬于這16384個插槽的其中一個叢集使用公式 CRC16(key) % 16384來計算鍵key屬于哪個槽,中CRC16(key)語句用于計算鍵key的CRC16校驗和。叢集中的每個節點負責處理一部分插槽。

舉個例子 ,如果一個叢集可以有主節點 ,

其中:

節點A負責處理0号至5460号插槽

節點B負責處理5461号至10922号插槽

08-主從複制與叢集一、定義二、搭建一主多從三、示範四、主從複制的原理五、哨兵模式六、叢集七、搭建叢集八、叢集操作與故障恢複

例如:

set k1 value1

k1計算k1所在的插槽,向插槽位置加入到不同的主機當中去。分擔主機壓力。

叢集三個主機可以互相切換,根據計算的插槽位置不同,切換到不同主機。

插槽基本指令

1.如果同時加多個
mset name lucy age 26 address china
報錯,無法計算插槽

2.如果要多個,要分組
mset name{user} lucy age{user} 20
user即組名,根據組名計算插槽

3.根據計算的值,切換

---

1.查詢叢集總的值
cluster keyslot k1

2.計算插槽中有多少key
cluster countkeysinslot 4847
隻能在自己的插槽裡看,否則顯示0

3.顯示插槽4847中的10個key
cluster getkeysinslot 4847 10
           

故障恢複

1.
6379:shutdown
src:redis-cli -c -p 6380

顯示6379 fail,替代者6389升為主機

2.啟動6379會變成89的從機
6379:redis-server redis6379.conf

3.目前狀況
6379 是 89 的從機

           

這個叫做故障恢複

一個部分的主機、從機全挂掉了,根據配置決定redis服務是否繼續

cluster-require-full-coverage yes         則整個叢集都挂掉

cluster-require-full-coverage no        該段插槽資料不能使用,其他仍然可以