目錄
一、定義
好處:
二、搭建一主多從
三、示範
四、主從複制的原理
1. 一主二仆
2.薪火相傳
3.反客為主
五、哨兵模式
六、叢集
七、搭建叢集
八、叢集操作與故障恢複
一、定義
主機資料更新後根據配置和政策,自動同步到備機的master/slaver機制, Master以寫為主, Slave以讀為主.

一主多從:一台主機挂掉,無法進行。需要叢集
好處:
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
但需要手動設定,後面的哨兵模式就是反客為主的自動版
五、哨兵模式
哨兵始終監聽主機是否挂掉,通知從機上位
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中提供了解決方案。就是無中心化叢集配置
代理主機,并不合理
無中心化叢集
任何一台都可以當做服務的入口,他們互相可以傳遞服務
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位址上
什麼是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号插槽
例如:
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 該段插槽資料不能使用,其他仍然可以