1. 程式人生 > 實用技巧 >Redis使用--主從複製

Redis使用--主從複製

主從複製

像MySQL一樣,redis是支援主從同步的,而且也支援一主多從以及多級從結構。

主從好處

主從結構,一是為了純粹的冗餘備份,二是為了提升讀效能,比如很消耗效能的SORT就可以由從伺服器來承擔。

redis的主從同步是非同步進行的,這意味著主從同步不會影響主邏輯,也不會降低redis的處理效能。主從架構中,可以考慮關閉主伺服器的資料持久化功能,只讓從伺服器進行持久化,這樣可以提高主伺服器的處理效能。

在主從架構中,從伺服器通常被設定為只讀模式,這樣可以避免從伺服器的資料被誤修改。但是從伺服器仍然可以接受CONFIG等指令,所以還是不應該將從伺服器直接暴露到不安全的網路環境中。如果必須如此,那可以考慮給重要指令進行重新命名,來避免命令被外人誤執行。

主從– 同步原理

從伺服器會向主伺服器發出SYNC指令,當主伺服器接到此命令後,就會呼叫BGSAVE指令來建立一個子程序專門進行資料持久化工作,也就是將主伺服器的資料寫入RDB檔案中。在資料持久化期間,主伺服器將執行的寫指令都快取在記憶體中。在BGSAVE指令執行完成後,主伺服器會將持久化好的RDB檔案傳送給從伺服器,從伺服器接到此檔案後會將其儲存到磁碟上,然後再將其讀取到記憶體中。這個動作完成後,主伺服器會將這段時間快取的寫指令再以redis協議的格式傳送給從伺服器。

另外,要說的一點是,即使有多個從伺服器同時發來SYNC指令,主伺服器也只會執行一次BGSAVE,然後把持久化好的RDB檔案發給多個下游。在redis2.8版本之前,如果從伺服器與主伺服器因某些原因斷開連線的話,都會進行一次主從之間的全量的資料同步;而在2.8版本之後,redis支援了效率更高的增量同步策略,這大大降低了連線斷開的恢復成本。

主伺服器會在記憶體中維護一個緩衝區,緩衝區中儲存著將要發給從伺服器的內容。從伺服器在與主伺服器出現網路瞬斷之後,從伺服器會嘗試再次與主伺服器連線,一旦連線成功,從伺服器就會把“希望同步的主伺服器ID”和“希望請求的資料的偏移位置(replication offset)”傳送出去。主伺服器接收到這樣的同步請求後,首先會驗證主伺服器ID是否和自己的ID匹配,其次會檢查“請求的偏移位置”是否存在於自己的緩衝區中,如果兩者都滿足的話,主伺服器就會向從伺服器傳送增量內容。

增量同步功能,需要伺服器端支援全新的PSYNC指令。這個指令,只有在redis-2.8之後才具有。

Windows下配置主從

1. 解壓多分Redis

一個是主服務,兩個從服務。

2. 修改從服務的配置檔案

將這兩個檔案中的埠 port 更改為與主redis(6379)不相同既可,例: 6380、6381。然後再更改主從配置的引數:# slaveof <masterip> <masterport> ,改為:slaveof 127.0.0.1 6379 表示是該主服務的從服務

3. 安裝啟動服務

主伺服器:

F:\Redis-6379>  redis-server --service-install redis.windows.conf --loglevel verbose  --service-name  redis6379  (這裡是windows服務裡顯示的名稱)

F:\Redis-6379>  redis-server.exe redis.windows.conf

從伺服器1:

F:\Redis-6380> redis-server --service-install redis.windows.conf --loglevel verbose  --service-name  redis6380

F:\Redis-6380>  redis-server.exe redis.windows.conf

從伺服器2:

F:\Redis-6381>  redis-server --service-install redis.windows.conf --loglevel verbose  --service-name  redis6381

F:\Redis-6381>  redis-server.exe redis.windows.conf

4. 驗證從伺服器

然後在主服務裡面建立key,在從服務裡可以取到主服務裡設定的key

5. 從伺服器只讀

預設情況下redis資料庫充當slave角色時是隻讀的不能進行寫操作 可以在配置檔案中開啟非只讀:slave-read-only no

CentOS 7下配置主從

1. 在安裝好單機版的前提下,複製三份配置檔案

進入redis所在目錄
[root@zhaoyl redis-6.0.6]# cd RedisSoft/redis-6.0.6

建立6379、6380、6382目錄,分別將安裝目錄下的redis.conf拷貝到這三個目錄下。
[root@zhaoyl redis-6.0.6]# 6379 && cp redis.conf 6379/6379.conf
[root@zhaoyl redis-6.0.6]# 6381 && cp redis.conf 6380/6380.conf
[root@zhaoyl redis-6.0.6]# 6382 && cp redis.conf 6382/6382.conf

2. 分別修改配置檔案

[root@zhaoyl redis-6.0.6]# vim 6379/6379.conf
修改內容:
# Redis使用後臺模式
daemonize yes

# 關閉保護模式
protected-mode no

# 註釋以下內容開啟遠端訪問
# bind 127.0.0.1

# 修改啟動埠為6379
port 6379

# 修改pidfile指向路徑
pidfile 6379/redis_6379.pid

以此類推,修改埠6380及6382配置。修改配置檔案時,按空格+/+要找的詞可以快速定位,找到後按i鍵進入insert狀態進行修改,修改完成後按Esc鍵,然後接著按:w進行儲存

3. 主從結構設定

在Redis中設定主從有2種方式:
1. 在redis.conf中設定slaveof
    a)  slaveof <masterip> <masterport>

2. 使用redis-cli客戶端連線到redis服務,執行slaveof命令
    a)  slaveof <masterip> <masterport>

第二種方式在重啟後將失去主從複製關係。 我們這裡使用第二種方式設定主從: 使用Redis客戶端連線上6380埠,設定6380埠Redis為6379的從

使用Redis客戶端連線上6382埠,設定6382埠Redis為6379的從

4. 檢視Redis主從關係

使用Redis客戶端連線上6379埠,檢視Redis主從關係 如下圖所示

role:角色資訊
slaveX:從庫資訊
connected_slaves:從庫數量

5. 測試主從資料

6. 主從從結構設定

Redis的主從架構的缺點是所有的slave節點資料的複製和同步都由master節點來處理,會照成master節點壓力太大,所以我們使用主從從結構來處理

1. 前面步驟同主從架構一致,只是在設定主從結構時,設定6380為6379的從,6382為6380的從

使用Redis客戶端連線上6380埠,設定6380埠Redis為6379的從

使用Redis客戶端連線上6382埠,設定6382埠Redis為6380的從

2. 檢視主從從架構資訊:

3. 測試