1. 程式人生 > 實用技巧 >Redis多例項主從

Redis多例項主從

目錄

一、redis多例項

1.建立多例項目錄

[root@db01 ~]# mkdir /service/redis/{6380,6381}

2.配置多例項配置檔案

#第一臺多例項配置
[root@db01 ~]# vim /service/redis/6379/redis.conf 
bind 172.16.1.51 127.0.0.1
port 6379
daemonize yes
pidfile /service/redis/6379/redis_6379.pid
loglevel notice
logfile /service/redis/6379/redis_6379.log
dir /service/redis/6379
dbfilename dump.rdb
save 900 1
save 300 10
save 60 10000

#第二臺多例項配置
[root@db01 ~]# vim /service/redis/6380/redis.conf 
bind 172.16.1.51 127.0.0.1
port 6380
daemonize yes
pidfile /service/redis/6380/redis_6380.pid
loglevel notice
logfile /service/redis/6380/redis_6380.log
dir /service/redis/6380
dbfilename dump.rdb
save 900 1
save 300 10
save 60 10000

#第三臺多例項配置
[root@db01 ~]# vim /service/redis/6381/redis.conf 
bind 172.16.1.51 127.0.0.1
port 6381
daemonize yes
pidfile /service/redis/6381/redis_6381.pid
loglevel notice
logfile /service/redis/6381/redis_6381.log
dir /service/redis/6381
dbfilename dump.rdb
save 900 1
save 300 10
save 60 10000

3.啟動多例項

[root@db01 ~]# redis-server /service/redis/6379/redis.conf 
[root@db01 ~]# redis-server /service/redis/6380/redis.conf 
[root@db01 ~]# redis-server /service/redis/6381/redis.conf

4.檢測啟動

[root@db01 ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      14002/redis-server  
tcp        0      0 172.16.1.51:6379        0.0.0.0:*               LISTEN      14002/redis-server  
tcp        0      0 127.0.0.1:6380          0.0.0.0:*               LISTEN      15541/redis-server  
tcp        0      0 172.16.1.51:6380        0.0.0.0:*               LISTEN      15541/redis-server  
tcp        0      0 127.0.0.1:6381          0.0.0.0:*               LISTEN      15545/redis-server  
tcp        0      0 172.16.1.51:6381        0.0.0.0:*               LISTEN      15545/redis-server   

[root@db01 ~]# ps -ef | grep redis
root      14002      1  0 Aug04 ?        00:01:34 redis-server 172.16.1.51:6379
root      15541      1  0 11:50 ?        00:00:00 redis-server 172.16.1.51:6380
root      15545      1  0 11:50 ?        00:00:00 redis-server 172.16.1.51:6381

5.連線多例項

[root@db01 ~]# redis-cli -p 6379
127.0.0.1:6379> quit

[root@db01 ~]# redis-cli -p 6380
127.0.0.1:6380> quit

[root@db01 ~]# redis-cli -p 6381
127.0.0.1:6381> quit

二、redis主從

1.主從複製特點

1.使用非同步複製。
2.一個主伺服器可以有多個從伺服器。
3.從伺服器也可以有自己的從伺服器。
4.複製功能不會阻塞主伺服器。
5.可以通過複製功能來讓主伺服器免於執行持久化操作,由從伺服器去執行持久化操作即可。

#詳細版本
1)Redis 使用非同步複製。從 Redis2.8開始,從伺服器會以每秒一次的頻率向主伺服器報告複製流(replication stream)的處理進度。
2)一個主伺服器可以有多個從伺服器。
3)不僅主伺服器可以有從伺服器,從伺服器也可以有自己的從伺服器,多個從伺服器之間可以構成一個圖狀結構。
4)複製功能不會阻塞主伺服器:即使有一個或多個從伺服器正在進行初次同步, 主伺服器也可以繼續處理命令請求。
5)複製功能也不會阻塞從伺服器:只要在 redis.conf 檔案中進行了相應的設定, 即使從伺服器正在進行初次同步, 伺服器也可以使用舊版本的資料集來處理命令查詢。
6)在從伺服器刪除舊版本資料集並載入新版本資料集的那段時間內,連線請求會被阻塞。
7)還可以配置從伺服器,讓它在與主伺服器之間的連線斷開時,向客戶端傳送一個錯誤。
8)複製功能可以單純地用於資料冗餘(data redundancy),也可以通過讓多個從伺服器處理只讀命令請求來提升擴充套件性(scalability): 比如說,繁重的SORT命令可以交給附屬節點去執行。

2.8版本以前

2.8版本之後

2.主從複製的原理

1.從伺服器向主伺服器傳送 SYNC 命令
2.主庫接到 SYNC 命令會呼叫 BGSAVE 命令建立一個 RDB 檔案
3.主庫將新的資料記錄到緩衝區
4.主庫將 RDB 檔案傳輸到從庫
5.從庫拿到 RDB 檔案以後,會清空自己的資料 *****
6.從庫讀取 RDB 檔案並匯入資料
7.主庫將新的資料從緩衝區傳到從庫進行同步

3.主從複製的機制

#SYNC與PSYNC

1)在 Redis2.8版本之前,斷線之後重連的從伺服器總要執行一次完整重同步(fullresynchronization)操作。
2)從 Redis2.8開始,Redis使用PSYNC命令代替SYNC命令。
3)PSYNC比起SYNC的最大改進在於PSYNC實現了部分重同步(partial resync)特性:
在主從伺服器斷線並且重新連線的時候,只要條件允許,PSYNC可以讓主伺服器只向從伺服器同步斷線期間缺失的資料,而不用重新向從伺服器同步整個資料庫。

PSYNC這個特性需要主伺服器為被髮送的複製流建立一個記憶體緩衝區(in-memory backlog), 並且主伺服器和所有從伺服器之間都記錄一個複製偏移量(replication offset)
和一個主伺服器 ID(master run id),當出現網路連線斷開時,從伺服器會重新連線,並且向主伺服器請求繼續執行原來的複製程序:
1)如果從伺服器記錄的主伺服器ID和當前要連線的主伺服器的ID相同,並且從伺服器記錄的偏移量所指定的資料仍然儲存在主伺服器的複製流緩衝區裡面,
那麼主伺服器會向從伺服器傳送斷線時缺失的那部分資料,然後複製工作可以繼續執行。
2)否則的話,從伺服器就要執行完整重同步操作。

#PSYNC優點:
1)PSYNC只會將從伺服器斷線期間缺失的資料傳送給從伺服器。兩個例子的情況是相同的,但SYNC 需要傳送包含整個資料庫的 RDB 檔案,而PSYNC 只需要傳送三個命令。
2)如果主從伺服器所處的網路環境並不那麼好的話(經常斷線),那麼請儘量使用 Redis 2.8 或以上版本:通過使用 PSYNC 而不是 SYNC 來處理斷線重連線,
可以避免因為重複建立和傳輸 RDB檔案而浪費大量的網路資源、計算資源和記憶體資源。

4.配置主從

# 注意:
- 如主伺服器配置有密碼,則從伺服器需要在配置檔案中新增下方資訊,456為密碼。然後才能進行主從同步
masterauth 456

1)準備環境

角色 主機
主庫 172.16.1.51 6379
從庫 172.16.1.51 6380
從庫 172.16.1.51 6381

2)連線三臺機器

[root@db01 ~]# redis-cli -p 6379
[root@db01 ~]# redis-cli -p 6380
[root@db01 ~]# redis-cli -p 6381

3)檢視主從狀態

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

4)配置主從

127.0.0.1:6380> SLAVEOF 172.16.1.51 6379
OK

127.0.0.1:6381> SLAVEOF 172.16.1.51 6379
OK

5)檢視主從狀態

#檢視主庫
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.16.1.51,port=6380,state=online,offset=263,lag=0
slave1:ip=172.16.1.51,port=6381,state=online,offset=263,lag=1
master_repl_offset:263
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:262

#檢視從庫
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:172.16.1.51
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:319
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0