Google Code Prettify

2018年9月8日 星期六

Redis: master / slave

Redis 提供有 master / slave 機制,master 的資料會自動同步到 slave,當許多系統共用同一個 Redis 時,可以分配一些系統使用 slave,以減輕 Redis 的負擔,下面說明怎麼建立 master / slave。
  • slave 的設定檔
安裝好的 Redis,在 conf 目錄下有個 redis.conf,是預設的設定檔,複製一份成 redis-slave.conf,然後修改裡面的內容,如下:
port 6380
pidfile /var/run/redis_6380.pid
dir ./slave
slaveof 127.0.0.1 6379
在 redis-slave.conf 找到上述四個設定,將值修改成如上,說明如下:
  1. port 是 slave redis 要傾聽的 port 號,master 已經使用了預設的 6379,所以這裡改成 6380 避免衝突。
  2. 指定 pidfile,UNIX / Linux 的習慣,許多程式執行起來後會產生一個 pid 檔,如果要把這個程式停掉,可以刪除 pid 檔,程式就會停止了。
  3. dir 是運行過程中的 dump 檔要存在那個目錄。
  4. slaveof 指出這個 slave 要跟隨那一個 master ? 這裡指向 port 6379 的那一個 Redis。
  • 運行
建議開兩個 putty,一個執行 master,一個執行 slave,這樣比較好觀察,master 和 slave 的啟動指令如下: (先進入 /redis 目錄下)
bin/redis-server conf/redis.conf
bin/redis-server conf/redis-slave.conf
其實就是帶不同設定檔當參數,就會啟動不同的 instance。
  • 觀察啟動結果
在兩個 putty 分別使用 redis-cli 連線進入 redis,指令如下:
bin/redis-cli -p 6379
127.0.0.1:6379>

bin/redis-cli -p 6380
127.0.0.1:6380>
然後在裡面都下 info replication 這個指令,可以用來觀察 master / slave 運行的狀況,結果顯示如下,master 端清楚的指出自己的角色是 master,有幾個 slave 連向自己,連向自己的 slave 的 IP 和 port 等資訊,slave 端的資訊也清楚的指出自己的角色是 slave,並且連向那一個 master。
    • master
    • slave
  • 測試
在 master 建立一個 (key, value) 值,然後在 slave 用該 key 取出值,可以觀察到 master 的內容會被即時同步到 slave。
    • master
    • slave
就算 master 建立值時,slave 剛好當掉,slave 重啟時,也會再次同步,測試前先在 slave 輸入 「shutdown save」、及「quit」,關閉 slave,如下:
用 ps 觀察看看是否真的 shutdown 了!
6380 port 的都沒有了 ... 確實已經 shutdown,現在於 master 端新建立一個 (key, value) 值。
然後重啟 slave,並觀察有沒有上面的值,如下,重啟後 master 的內容真的有同步過來。
  • slave 是否可以寫入?
上面的測試都是在 master 端寫入,觀察是否有同步到 slave 端,如果我們在 slave 寫入會如何?
如上,會出現"READONLY ... "的錯誤訊息,表示無法由 slave 寫入,但 … 真的都不可以由 slave 寫入嗎?? 那只是預設值!
slave-read-only yes
只要設定檔裡上述的值改成 no,重新啟動後,slave 就可以寫入了! 只不過,這樣 master 和 slave 的內容會不同步,所以大部份的應用都是設為 read only,slave 只是用來分擔 master 的工作,讓只需要讀取內容的 ap 指向 slave。