1 主機環境
我這里使用的操作系統是centos 6.5,安裝在vmware上,共三台。
主機名 | IP | 操作系統 | 用戶名 | 安裝目錄 |
---|---|---|---|---|
node1 | 192.168.1.101 | centos 6.5 | wxyuan | /redis |
node2 | 192.168.1.102 | centos 6.5 | wxyuan | /redis |
node3 | 192.168.1.103 | centos 6.5 | wxyuan | /redis |
2 進程端口規划
node1 | node2 | node3 |
---|---|---|
redis,6379 | redis,6379 | redis,6379 |
sentinel,26379 | sentinel,26379 | sentinel,26379 |
redis下載地址:http://download.redis.io/releases/,選擇需要的版本下載,我使用的版本是redis-3.2.1.tar.gz
3 安裝redis
3.1 檢查是否安裝了gcc
[wxyuan@node1 ~]$ rpm -qa|grep gcc
libgcc-4.4.7-4.el6.x86_64
gcc-4.4.7-4.el6.x86_64
gcc-c++-4.4.7-4.el6.x86_64
如果未安裝,可使用yum install gcc
命令安裝
3.2 編譯安裝redis
(1). 解壓redis安裝包tar -zxvf redis-3.2.1.tar.gz
(2). 編譯安裝redis
[wxyuan@node1 ~]$ cd redis-3.2.1
[wxyuan@node1 ~]$ make
[wxyuan@node1 ~]$ make install PREFIX=/redis # PREFIX指定安裝目錄
安裝完成后,在/redis目錄下會新增bin目錄,這里面是啟動redis服務的相關腳本。
創建/redis/conf、/redis/data、/redis/log目錄。
3.3 修改配置文件redis.conf
拷貝redis-3.2.1/redis.conf文件到/redis/conf目錄下,編輯/redis/conf/redis.conf文件
node1主機上修改內容如下
bind 192.168.1.101 127.0.0.1 #綁定多個IP,既可以遠程訪問,也可以本地客戶端訪問
port 6379 #指定端口
appendonly yes #開啟aof持久化
daemonize yes
pidfile "/redis/redis_6379.pid"
logfile "/redis/log/redis_6379.log"
dir "/redis/data"
node2主機上修改內容如下
bind 192.168.1.102 127.0.0.1 #綁定多個IP,既可以遠程訪問,也可以本地客戶端訪問
port 6379 #指定端口
appendonly yes #開啟aof持久化
daemonize yes
pidfile "/redis/redis_6379.pid"
logfile "/redis/log/redis_6379.log"
dir "/redis/data"
slaveof 192.168.1.101 6379
node3主機上修改內容如下
bind 192.168.1.103 127.0.0.1 #綁定多個IP,既可以遠程訪問,也可以本地客戶端訪問
port 6379 #指定端口
appendonly yes #開啟aof持久化
daemonize yes
pidfile "/redis/redis_6379.pid"
logfile "/redis/log/redis_6379.log"
dir "/redis/data"
slaveof 192.168.1.101 6379
3.4 增加配置文件sentinel.conf
在/redis/conf下增加配置文件sentinel.conf,文件內容為:
node1主機上內容如下
bind 192.168.1.101
port 26379
daemonize yes
logfile "/redis/log/sentinel.log"
dir "/redis/data"
sentinel monitor mymaster 192.168.1.101 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
node2主機上內容如下
bind 192.168.1.102
port 26379
daemonize yes
logfile "/redis/log/sentinel.log"
dir "/redis/data"
sentinel monitor mymaster 192.168.1.101 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
node3主機上內容如下
bind 192.168.1.103
port 26379
daemonize yes
logfile "/redis/log/sentinel.log"
dir "/redis/data"
sentinel monitor mymaster 192.168.1.101 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
部分參數說明:
(1) sentinel monitor <masterName> <ip> <port> <quorum>
-masterName 指定maser的名字
-ip 指定master的IP
-port 指定maseter的端口
-quorum quorum是Sentinel需要協商同意master是否可到達的數量。為了真正的標記slave為失敗,並最終是否需要啟動一個故障轉移進程。無論怎樣,quorum只用於檢測故障。為了實際執行故障轉移,Sentinel需要選舉leader並進行授權。這只發生在大多數Sentinel進程的選舉。
(2) down-after-milliseconds選項指定了 Sentinel 認為服務器已經斷線所需的毫秒數。
如果服務器在給定的毫秒數之內, 沒有返回 Sentinel 發送的 PING 命令的回復, 或者返回一個錯誤, 那么 Sentinel 將這個服務器標記為主觀下(subjectively down,簡稱 SDOWN )。
不過只有一個 Sentinel 將服務器標記為主觀下線並不一定會引起服務器的自動故障遷移: 只有在足夠數量的 Sentinel 都將一個服務器標記為主觀下線之后, 服務器才會被標記為客觀下線(objectively down, 簡稱 ODOWN ), 這時自動故障遷移才會執行。
(3) parallel-syncs選項指定了在執行故障轉移時, 最多可以有多少個從服務器同時對新的主服務器進行同步, 這個數字越小, 完成故障轉移所需的時間就越長。
關於sentinel的詳細配置說明請參考Sentinel配置詳解
4 啟動redis和sentinel
在三台主機上分別執行下述命令,啟動redis服務和sentinel服務
[wxyuan@node1 ~]$ cd /redis
[wxyuan@node1 redis$ ./bin/redis-server conf/redis.conf
[wxyuan@node1 redis$ ./bin/redis-sentinel conf/sentinel.conf
5 故障轉移測試
在node1使用redis-cli命令查看主從信息
[wxyuan@node1 redis]$ ./bin/redis-cli -p 6379 info replication
# Replication
role:master
connected_slaves:2
可以看到node1上的redis進程為master,現在kill掉node1上的redis進程,觀察故障轉移情況。
使用redis-cli命令查看主從信息
[wxyuan@node1 redis]$ ./bin/redis-cli -p 6379 -h 192.168.1.102 info replication
# Replication
role:master
connected_slaves:1
slave1:ip=192.168.1.103,port=6379,state=online,offset=13836,lag=1
[wxyuan@node1 redis]$ ./bin/redis-cli -p 6379 -h 192.168.1.103 info replication
# Replication
role:slave
master_host:192.168.1.102
master_port:6379
可以看到node2上的redis進程已經變成了master。重啟node1上的redis進程后,會發現該redis進程已經變成了slave。
另外,可以通過sentinel.log文件觀察故障轉移過程。
注意:此時打開sentinel文件,會發現內容已經被改變了;sentinel進程啟動后,會根據redis進程的運行情況修改sentinel.conf文件內容。