一、Redis主從模式
1.1簡介
在實際生產環境下,Redis 基本上是不可能部署成單機模式的。一般都需要部署 Redis 集羣實現高可用,以保障業務的穩定運行。
要想學會部署 Redis 集羣,那就先從 Redis 集羣中最簡單的主從模式做起。
在一些簡單小型的應用中,我們可能會看到類似於下圖的 Redis 部署架構。其中 Master 是主機,Slave 是從機,而這種架構方式就是所謂的一主多從:
在這種架構模式下,主機和從機的數據完全一致,主機支持數據的寫入和讀取等各項操作,而從機則只支持與主機數據的同步和讀取。也就是說,客戶端可以將數據寫入到主機,由主機自動將數據的寫入操作同步到從機。
主從模式很好的解決了數據備份問題,並且由於主從服務數據幾乎是一致的,因而可以將寫入數據的命令發送給主機執行,而讀取數據的命令發送給不同的從機執行,從而達到讀寫分離的目的。
1.2部署
下面介紹如何部署一個一主三從的主從模式。
爲了區分單機模式的部署位置,這裏拷貝一下 Redis 的目錄:
cp -r /usr/local/redis-4.0.11 /usr/local/redis-ms
接下來會基於/usr/local/redis-ms目錄部署主從模式。
由於每個 Redis 實例都是一個單獨的進程,所以需要在每個 Redis 實例啓動時爲其分配一個
獨立的配置文件就能使它們區分開來(同時由於本次是部署在同一臺機器,需爲每個實例指定不
同的服務端口)。
爲了在同一臺機器上部署一主三從的 Redis,準備以下四份配置文件:
角色 | 配置文件 | 服務端口 |
---|---|---|
主機 | redis-6379.conf | 6379 |
從機 | redis-6380.conf | 6380 |
從機 | redis-6381.conf | 6381 |
從機 | redis-6382.conf | 6382 |
注:這四份配置文件均拷貝自 /usr/local/redis-ms/redis.conf ,拷貝到 /usr/local/redis-ms/ 目錄再修改即可。
主機 redis-6379.conf 配置文件內容如下:
bind 127.0.0.1 # 正式部署請設爲合適的 IP
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
dir /tmp/redis-ms # Redis 的工作目錄(若不存在需手建否則無法啓動),logfile 與 dbfilename 受其影響
logfile "6379.log" # Redis 日誌名稱(默認不配置,表示輸出到 stdout),正式部署請設置爲合適的名稱
dbfilename dump-6379.rdb # Redis 數據持久化時的存儲位置,正式部署請設置爲合適的名稱
從機 redis-6380.conf 配置文件內容如下:
bind 127.0.0.1 # 正式部署請設爲合適的 IP
port 6380
daemonize yes
pidfile /var/run/redis_6380.pid
dir /tmp/redis-ms # Redis 的工作目錄(若不存在需手建否則無法啓動),logfile 與 dbfilename 受其影響
logfile "6380.log" # Redis 日誌名稱(默認不配置,表示輸出到 stdout),正式部署請設置爲合適的名稱
dbfilename dump-6380.rdb # Redis 數據持久化時的存儲位置,正式部署請設置爲合適的名稱
slaveof 127.0.0.1 6379 # 標註所從屬的主機
從機 redis-6381.conf 配置文件內容如下:
bind 127.0.0.1 # 正式部署請設爲合適的 IP
port 6381
daemonize yes
pidfile /var/run/redis_6381.pid
dir /tmp/redis-ms # Redis 的工作目錄(若不存在需手建否則無法啓動),logfile 與 dbfilename 受其影響
logfile "6381.log" # Redis 日誌名稱(默認不配置,表示輸出到 stdout),正式部署請設置爲合適的名稱
dbfilename dump-6381.rdb # Redis 數據持久化時的存儲位置,正式部署請設置爲合適的名稱
slaveof 127.0.0.1 6379 # 標註所從屬的主機
從機 redis-6382.conf 配置文件內容如下:
bind 127.0.0.1 # 正式部署請設爲合適的 IP
port 6382
daemonize yes
pidfile /var/run/redis_6382.pid
dir /tmp/redis-ms # Redis 的工作目錄(若不存在需手建否則無法啓動),logfile 與 dbfilename 受其影響
logfile "6382.log" # Redis 日誌名稱(默認不配置,表示輸出到 stdout),正式部署請設置爲合適的名稱
dbfilename dump-6382.rdb # Redis 數據持久化時的存儲位置,正式部署請設置爲合適的名稱
slaveof 127.0.0.1 6379 # 標註所從屬的主機
建上面配置的 Redis 工作目錄:
#mkdir /tmp/redis-ms
然後使用 redis-server 命令啓動 Redis 主從實例:
#cd /usr/local/redis-ms/src/ # 切換到啓動腳本目錄
./redis-server ../redis-6379.conf # 啓動 Redis 主機,必須先啓動
./redis-server ../redis-6380.conf # 啓動 Redis 從機
./redis-server ../redis-6381.conf # 啓動 Redis 從機
./redis-server ../redis-6382.conf # 啓動 Redis 從機
1.3測試
現在測試 Redis 主從模式是否能正常工作
可先通過ps -ef|grep redis
命令可查看四個主從進程是否正常啓動:
root 7049 1 0 21:21 ? 00:00:00 ./redis-server 127.0.0.1:6379
root 7057 1 0 21:21 ? 00:00:00 ./redis-server 127.0.0.1:6380
root 7065 1 0 21:21 ? 00:00:00 ./redis-server 127.0.0.1:6381
root 7081 1 0 21:21 ? 00:00:00 ./redis-server 127.0.0.1:6382
然後通過 Redis 測試客戶端命令redis-cli
分別連接到四臺機器:
#cd /usr/local/redis-ms/src/ # 切換到啓動腳本目錄
./redis-cli -h 127.0.0.1 -p 6379 # 連接到 Redis 主機
./redis-cli -h 127.0.0.1 -p 6380 # 連接到 Redis 從機
./redis-cli -h 127.0.0.1 -p 6381 # 連接到 Redis 從機
./redis-cli -h 127.0.0.1 -p 6382 # 連接到 Redis 從機
分別在四個 Redis 測試客戶端執行get
命令,獲取鍵名爲name的數據:
127.0.0.1:6379> get name
(nil) # 由於是新部署的Redis主從模式,該鍵值必定不存在
127.0.0.1:6380> get name
(nil) # 由於是新部署的Redis主從模式,該鍵值必定不存在
127.0.0.1:6381> get name
(nil) # 由於是新部署的Redis主從模式,該鍵值必定不存在
127.0.0.1:6382> get name
(nil) # 由於是新部署的Redis主從模式,該鍵值必定不存在
現在在 Redis 主機 6379 的客戶端寫入數據(執行set
命令,爲鍵 name設置數據):
127.0.0.1:6379> set name jingjing
OK
再在三臺 Redis 從機 6380~6382 的客戶端讀取數據(執行 get 命令,獲取鍵名爲 site 的數據)。
由於經過主從數據同步,此時三臺從機都能取到值:
127.0.0.1:6380> get name
"jingjing"
127.0.0.1:6381> get name
"jingjing"
127.0.0.1:6382> get name
"jingjing"
至此 Redis 主從模式部署完成。
下次將介紹哨兵模式的部署,而哨兵模式是基於主從模式的,所以可以暫且不用停止 Redis 進程,下篇見!