09.Redis主從複製原理

1、Redis主從複製架構的介紹node

## 基本介紹redis

01:一個主能夠有多個從(一主多從);從庫下能夠有多個從(級聯式主從);
02:Redis主從複製時是使用異步複製(主無論slave有沒有接收到數據);
03:複製時不會阻塞主服務器響應客戶端的請求,由於在進行數據同步時,
    主上面執行bgsave命令for出一個子進程來進行數據的同步操做;
04:在複製時可能會影響slave端redis的主進程對客戶端的響應;在2.8版本
    之後,slave默認是隻讀的哈?
    例如:主從複製架構,寫是在master端進行,你經過手段作了讀寫分離,
    讓客戶端在slave中進行讀的操做,此時slave在同步(無論全同步,仍是
    增量同步)master端的數據時會不會阻塞客戶端的讀取操做呢?
    解答:這個實際上是由參數slave-serve-stale-data控制的,它有兩個值,
    yes和no;yes表示仍然響應,可能數據不是最新的;默認就是yes;no表示
    不響應,給客戶端報"SYNC with master in progress"錯誤;

## 主從複製時的一個數據安全問題安全

## 基於有數據持久化(無論是RDB仍是AOF)的需求下:
01:Master端若沒有開啓持久化,而Slave中開啓了持久化;
02:若Master端重啓或宕服/機恢復後,會銷燬Slave中的數據(持久化文件和內存中的數據)

2、主從複製的原理bash

## Master端的參數配置服務器

## Basic parameters
bind 172.16.1.31                          # Master端redis綁定的IP地址
protected-mode yes                        # 開啓安全模式,只能經過bind的地址鏈接
port 6379                                 # Master端redis監聽的端口
maxmemory 1GB 
requirepass chenliang                     # Master端redis的鏈接密碼
daemonize yes
databases 16
syslog-enabled no
loglevel notice
logfile /data/redis/6379/logs/redis.log
pidfile /data/redis/6379/run/redis.pid
unixsocket /data/redis/6379/run/redis.sock
 
## Client
maxclients  10000
timeout 300
tcp-backlog 511
tcp-keepalive 60
 
## RDB Persistence
save 900 1                                # 900秒內有1個key被改變就進行rdb持久化
save 300 10                               # 300秒內有10個key被改變就進行rdb持久化
save 60 10000                             # 60秒內有10000個key被改變就進行rdb持久化
dir /data/redis/6379/data/                # 持久化文件的保存路徑
dbfilename dump.rdb                       # rdb持久化的文件名稱
rdbcompression yes                        # 對字符串是否開啓壓縮,默認是yes
rdbchecksum yes                           # 是否對持久化文件進行檢測

## replication
repl-disable-tcp-nodelay no               # 在主從複製的時候關閉tcp的延遲,這樣master一但有數據產生,當即發送給slave;
repl-timeout 60                           # 主從複製的超時時間,默認是60秒,不要超過timeout的時間,數據集較大時要調大;
repl-diskless-sync no                     # 關閉redis的無盤複製,默認也是no,還在實驗中,不要開啓哈;

## Slave端的參數配置架構

## Basic parameters
bind 172.16.1.32
protected-mode yes
port 6379
maxmemory 1GB
requirepass chenliang
daemonize yes
databases 16
syslog-enabled no
loglevel notice
logfile /data/redis/6379/logs/redis.log
pidfile /data/redis/6379/run/redis.pid
unixsocket /data/redis/6379/run/redis.sock
 
## Client
maxclients  10000
timeout 300
tcp-backlog 511
tcp-keepalive 60
 
## RDB Persistence
save 900 1
save 300 10
save 60 10000
dir /data/redis/6379/data/
dbfilename dump.rdb
rdbcompression yes
rdbchecksum yes
 
# replication
slaveof 172.16.1.31 6379         # 告訴slave它要鏈接的Master的IP、端口
masterauth "chenliang"           # 告訴slave鏈接Master時須要的密碼,前面master進行了設置的
repl-ping-slave-period 10        # slave每隔10秒檢測(ping)一下master是否存活
repl-timeout 60                  # 
slave-read-only yes              # 設置slave爲只讀,2.8版本之後默認是隻讀的哈
slave-serve-stale-data yes       # slave與master斷開,或者正在全量同步數據時,slave是否響應客戶端的讀請求;

## 當Slave第一次與Master創建鏈接的過程;Master和Slave都開啓了RDB持久化。less

## Slave與Master創建鏈接後,Master端產生數據了;接上圖異步

## Slave與Master創建鏈接後,Slave重啓或者宕機恢復後[但slave的RDB持久化文件沒有被移除或損壞,Master也仍是好好的運行着哈,重來沒有重啓過]。接上圖socket

## Master重啓或宕服恢復後,Slave再次鏈接Master時的過程tcp

 

相關文章
相關標籤/搜索