redis主從架構(gòu)搭建
主從工作原理(master-slave)
為主節(jié)點master配置一個從節(jié)點slave,不管slave是否為第一次連接上master,slave都會發(fā)送一個sync命令給master請求復制數(shù)據(jù).
master接收到sync命令后,會在后頭進行數(shù)據(jù)持久化,通過bgsave生成最新的rdb快照文件,在生成rdb快照期間master如果收到客戶端新的更新請求,master會把這些修改數(shù)據(jù)集的請求緩存到內(nèi)存中.
當持久化進行完畢后,master會把這份rdb文件數(shù)據(jù)集發(fā)送給slave,slave會把接收到的數(shù)據(jù)進行持久化生成rdb,然后再加載到內(nèi)存中,然后master,再將之前緩存在內(nèi)存中的命令發(fā)送給slave;
???當master與slave之間的連接由于某些原因而斷開,slave能夠自動重連master,如果master收到了多個slave并發(fā)連接請求,master只會進行一次持久化,而不是一個鏈接一次持久化,然后再把這一份持久化數(shù)據(jù)發(fā)送給多個并發(fā)連接的slave;
當master和slave斷開重連后,一般會對整份數(shù)據(jù)進行復制,但是從redis2.8之后master和slave端口后重連支持部分復制.
部分復制的過程:
master會在其內(nèi)存中創(chuàng)建一個復制數(shù)據(jù)用的緩存隊列???
使用docker搭建redis主從架構(gòu)
首先創(chuàng)建redis.conf配置文件,只做基礎配置即可
#修改為守護模式
daemonize yes
#設置進程鎖文件
pidfile /data/redis.pid
#端口
port 6379
#客戶端超時時間
timeout 300
#日志級別
loglevel debug
#日志文件位置
#logfile /data/log-redis.log
#設置數(shù)據(jù)庫的數(shù)量,默認數(shù)據(jù)庫為0稚照,可以使用SELECT <dbid>命令在連接上指定數(shù)據(jù)庫id
databases 8
##指定在多長時間內(nèi)忽妒,有多少次更新操作刻帚,就將數(shù)據(jù)同步到數(shù)據(jù)文件,可以多個條件配合
#save <seconds> <changes>
#Redis默認配置文件中提供了三個條件:
save 900 1
save 300 10
save 60 10000
#指定存儲至本地數(shù)據(jù)庫時是否壓縮數(shù)據(jù)显沈,默認為yes箩祥,Redis采用LZF壓縮,如果為了節(jié)省CPU時間摔寨,
#可以關(guān)閉該#選項,但會導致數(shù)據(jù)庫文件變的巨大
rdbcompression yes
#指定本地數(shù)據(jù)庫文件名
dbfilename dump.rdb
#指定本地數(shù)據(jù)庫路徑
dir /data
#指定是否在每次更新操作后進行日志記錄怖辆,Redis在默認情況下是異步的把數(shù)據(jù)寫入磁盤是复,如果不開啟删顶,可能
#會在斷電時導致一段時間內(nèi)的數(shù)據(jù)丟失。因為 redis本身同步數(shù)據(jù)文件是按上面save條件來同步的淑廊,所以有
#的數(shù)據(jù)會在一段時間內(nèi)只存在于內(nèi)存中
appendonly yes
#指定更新日志條件逗余,共有3個可選值:
#no:表示等操作系統(tǒng)進行數(shù)據(jù)緩存同步到磁盤(快)
#always:表示每次更新操作后手動調(diào)用fsync()將數(shù)據(jù)寫到磁盤(慢,安全)
#everysec:表示每秒同步一次(折衷蒋纬,默認值)
appendfsync everysec
#設置密碼
requirepass wx1212
使用docker的搭建主從節(jié)點的基本流程如下
- 建立redis所需的基本目錄,用于映射建立容器內(nèi)部,根據(jù)映射端口號建立目錄
mkdir -p ?/home/docker/redis/6379?
mkdir -p ?/home/docker/redis/6380
mkdir -p ?/home/docker/redis/6381
mkdir /home/docker/redis/6379?/conf
mkdir /home/docker/redis/6379?/data?
mkdir /home/docker/redis/6380/conf
mkdir /home/docker/redis/6380?/data??
mkdir /home/docker/redis/6381/conf
mkdir /home/docker/redis/6381?/data???
- 進入配置文件目錄建立配置文件
??cd /home/docker/redis/
touch 6379/conf/redis_easy.conf? 6380/conf/redis_easy.conf 6381/conf/redis_easy.conf
- 對主從的配置文件進行調(diào)整
- 1 主節(jié)點配置文件使用基礎配置文件即可
- 2 從節(jié)點配置文件需要添加主節(jié)點相關(guān)的配置,和只讀限定
# 主節(jié)點的ip和主節(jié)點的端口號
?replicaof 192.168.1.150 6379
#設置從節(jié)點為只讀,不可寫入?
replica‐read‐only yes ?
從節(jié)點配置文件為,其中"replicaof 172.17.0.2 6379"是在主節(jié)點搭建完畢后通過docker命令獲取主節(jié)點的iddocker inspect 主節(jié)點容器名稱 |grep IPAddress??
port 6379
timeout 300
databases 8
save 600 1
save 300 10
save 60 10000
loglevel debug
pidfile /data/redis.pid
logfile /data/log-redis.log
dir /data
rdbcompression yes
replicaof 172.17.0.2 6379
replica-read-only yes
protected-mode no
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes
- 啟動??主節(jié)點redis容器
docker run --name redis_6379 -p 6379:6379 -v /home/docker/redis/6379/data:/data -v /home/docker/redis/6379/conf/redis_easy.conf:/etc/redis/redis.conf -d redis:5.0 redis-server /etc/redis/redis.conf
5.啟動從節(jié)點
docker run --name redis_6380 -p 6380:6379 -v /home/docker/redis/6380/data:/data -v /home/docker/redis/6380/conf/redis_easy.conf:/etc/redis/redis.conf -d redis:5.0 redis-server /etc/redis/redis.conf
?
docker run --name redis_6381 -p 6381:6379 -v /home/docker/redis/6381/data:/data -v /home/docker/redis/6381/conf/redis_easy.conf:/etc/redis/redis.conf -d redis:5.0 redis-server /etc/redis/redis.conf
6.進行測試.登錄主節(jié)點添加數(shù)據(jù),然后去從節(jié)點進行數(shù)據(jù)觀察
登錄主節(jié)點
dcoker exec -it redis_6379 redis-cli
set temp 1234
登錄從節(jié)點
dcoker exec -it redis_6380 redis-cli
keys *