前面的兩篇文章給大家介紹了Redis的兩種持久化方式RDB和AOF,兩種方式各有各的優缺點,本文給大家介紹Redis的主從複制,算是Redis的第三種持久化方式。
主從複制
主從複制可以擴充Redis的性能,比單機版的Redis性能更加的穩定,Redis的主從複制和關系型資料庫的主從複制差不多。從機能精确的從主機複制資訊。
主從複制的優點:
- 實作讀寫分離
- 降低master的壓力
- 實作資料的備份
實作一個主從配置
主從關系圖
一主兩從
執行個體配置
三個redis執行個體,ip位址配置設定如下:
192.168.88.121:6379
192.168.88.121:6380
192.168.88.121:6381
在同一台伺服器上配置3個執行個體,具體配置如下:
1.建立配置檔案
将redis.conf配置檔案複制3份,為了便于區分分别命名為:
[root@hadoop-node01 redis-5.0.3]# cp redis.conf redis6379.conf
[root@hadoop-node01 redis-5.0.3]# cp redis.conf redis6380.conf
[root@hadoop-node01 redis-5.0.3]# cp redis.conf redis6381.conf
2.分别修改三個配置檔案
先修改6379配置檔案,将如下内容修改為6379,預設是6379的不用改變
port 6379
pidfile /var/run/redis_6379.pid
logfile "6379.log"
dbfilename dump6379.rdb
appendfilename "appendonly6379.aof"
同理将另外兩個檔案相關的資訊分别修改為6380和6381
3.啟動執行個體
通過如下三個指令分别啟動三個redis執行個體
[root@hadoop-node01 redis-5.0.3]# src/redis-server redis6379.conf
[root@hadoop-node01 redis-5.0.3]# src/redis-server redis6380.conf
[root@hadoop-node01 redis-5.0.3]# src/redis-server redis6381.conf
4.分别進入執行個體
通過如下指令分别進入三個執行個體
[root@hadoop-node01 redis-5.0.3]# src/redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
[root@hadoop-node01 redis-5.0.3]# src/redis-cli -p 6380
127.0.0.1:6380> ping
PONG
127.0.0.1:6380>
[root@hadoop-node01 redis-5.0.3]# src/redis-cli -p 6381
127.0.0.1:6381> ping
PONG
127.0.0.1:6381>
到此我們成功的配置了三個執行個體,但是這三個執行個體到此還是互相獨立的。
5.配置主從關系
設定6371的執行個體為master,6380和6381的為slave,如此隻需要在6380和6381上分别指向如下指令即可
127.0.0.1:6380> slaveof 127.0.0.1 6379
127.0.0.1:6381> slaveof 127.0.0.1 6379
或者在6380和6381的配置檔案中添加如下配置也可:
slaveof 127.0.0.1 6379
到此主從關系搭建好了。
6.檢視主從關系
在master上檢視,執行如下指令
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=280,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=280,lag=1
master_replid:8f432756134c9d855c3957341173a2dfc6d603db
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:280
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:280
可以看到角色是master,有兩個slave節點位址端口資訊都有,
在slave上檢視(6381上執行 info replication)
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:336
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:8f432756134c9d855c3957341173a2dfc6d603db
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:336
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:29
repl_backlog_histlen:308
可以看到角色為slave,對應的master資訊也都有。
7.測試
我們在master上添加一個資訊,在slave上檢視。
主從複制需要注意的地方
如果master已經運作了一段時間,slave才連上來,此時slave會對master的所有資料進行同步,而不是從連接配接上的時間點同步!
master節點可讀可寫,但是slave節點隻讀不可寫(如果非要寫可以修改redis.conf檔案中的slave-read-only的值來實作)
在目前的這個主從結構中,如果master挂點,重新開機後依然還是master,主從操作依然可用。
複制原理
1.全量複制
Redis全量複制一般發生在Slave初始化階段,這時Slave需要将Master上的所有資料都複制一份。具體步驟如下:
從伺服器連接配接主伺服器,發送SYNC指令;
主伺服器接收到SYNC命名後,開始執行BGSAVE指令生成RDB檔案并使用緩沖區記錄此後執行的所有寫指令;
主伺服器BGSAVE執行完後,向所有從伺服器發送快照檔案,并在發送期間繼續記錄被執行的寫指令;
從伺服器收到快照檔案後丢棄所有舊資料,載入收到的快照;
主伺服器快照發送完畢後開始向從伺服器發送緩沖區中的寫指令;
從伺服器完成對快照的載入,開始接收指令請求,并執行來自主伺服器緩沖區的寫指令;
完成上面幾個步驟後就完成了從伺服器資料初始化的所有操作,從伺服器此時可以接收來自使用者的讀請求。
2.增量複制
Redis增量複制是指Slave初始化後開始正常工作時主伺服器發生的寫操作同步到從伺服器的過程。 增量複制的過程主要是主伺服器每執行一個寫指令就會向從伺服器發送相同的寫指令,從伺服器接收并執行收到的寫指令。
複制偏移量
執行複制的雙方——主伺服器和從伺服器會分别維護一個複制偏移量:
主伺服器每次向從伺服器傳播N個位元組的資料時,就将自己的複制偏移量的值加上N;
從伺服器每次收到主伺服器傳播來的N個位元組的資料時,就将自己的複制偏移量的值加上N;
注意隻要是slave重新連接配接master都會自動執行一個全量複制