環境准備
- 3台已安裝 jdk 的 centos 7.5 服務器
- redis-6.2.2.tar.gz
服務器IP
服務器 | IP | 角色 |
---|---|---|
redis-140 | 192.168.86.140 | master |
redis-141 | 192.168.86.141 | slave |
redis-142 | 192.168.86.142 | slave |
單機模式部署
-
linux 安裝 gcc : 用於編譯 redis
yum install gcc
-
上傳安裝包到服務器的 /opt 目錄
-
解壓安裝包,此時 redis 沒有編譯
cd /opt tar -zxvf redis-6.2.2.tar.gz
-
編譯並測試
cd /opt/redis-6.2.2 make #可能出現問題見常見問題,不執行 make test 也可以 make test
-
安裝到指定目錄
make PREFIX=/usr/local/redis install
-
增加一些目錄和拷貝 redis.conf 到安裝目錄
#配置文件存放路徑 mkdir /usr/local/redis/conf #數據存放目錄 mkdir /usr/local/redis/data #日志存放目錄 mkdir /usr/local/redis/logs #拷貝 配置文件到安裝目錄 cp /opt/redis-6.2.2/redis.conf /usr/local/redis/conf/redis.conf
-
修改安裝目錄下的配置文件,修改指定的內容即可,
vi /usr/local/redis/conf/redis.conf
#用於指定本機網卡對應的IP地址,如果是默認 127.0.0.1 的話,則只有本機可以訪問。如果注釋掉則表示客戶端可以通過本機所有網卡進來,如果這樣設置,且沒有設置 requirepass 密碼, redis 默認開始了保護模式 protected-mode,則其它客戶端都可以連接,但是一發送命令就會失敗 bind 192.168.86.140 #數據存放目錄 dir /usr/local/redis/data #是否后台運行 daemonize yes #日志文件 logfile "/usr/local/redis/logs/redis.log" #設置客戶端連接后進行任何其他操作前需要使用的密碼 requirepass pass
-
啟動 redis-server
cd /usr/local/redis/bin ./redis-server ../conf/redis.conf
-
檢查
ps -ef | grep redis ./redis-cli -h 192.168.86.140 -p 6379
集群模式搭建(主從同步+哨兵模式)
-
若無特殊說明,以下操作均需在三台 redis 服務器上操作
-
按照單機模式部署的方式執行操作,一直執行到第七步修改配置文件為止
-
主從同步配置 > 修改 master 配置,修改指定的內容即可,
vi /usr/local/redis/conf/redis.conf
# 用於指定本機網卡對應的IP地址 bind 192.168.86.140 #數據存放目錄 dir /usr/local/redis/data #是否后台運行 daemonize yes #日志文件 logfile "/usr/local/redis/logs/redis.log" #設置客戶端連接后進行任何其他操作前需要使用的密碼 requirepass pass #當master服務設置了密碼保護時(用requirepass制定的密碼),slave服務連接master的密碼 masterauth pass
-
主從同步配置 > 修改兩台 slave 配置,修改指定的內容即可,
vi /usr/local/redis/conf/redis.conf
# 用於指定本機網卡對應的IP地址 每台機器設置為自己的IP bind 192.168.86.141 #數據存放目錄 dir /usr/local/redis/data #日志文件 logfile "/usr/local/redis/logs/redis.log" #是否后台運行 daemonize yes #指定要同步的主機的 ip,端口 replicaof 192.168.86.140 #設置客戶端連接后進行任何其他操作前需要使用的密碼 requirepass pass #當master服務設置了密碼保護時(用requirepass制定的密碼),slave服務連接master的密碼 masterauth pass
-
啟動三台機器的 redis-server
cd /usr/local/redis/bin ./redis-server ../conf/redis.conf
-
檢查 redis 服務是否啟動成功
ps -ef | grep redis ./redis-cli -h <服務器IP> -p 6379
-
檢查主從同步是否配置成功,分別登錄三台 redis ,並輸入 info replication
-
master-140
-
slave-141
-
slave-142
-
-
主從同步完畢之后進行 哨兵模式 配置,可以大概將 redis-sentinel 理解為 zookeeper,是用來監控機器的運行情況的,在 master 宕機之后,先從 哨兵集群中選舉一個哨兵作為故障轉移處理的機器,之后被選舉出來的哨兵用來協調各個 slave 的進行選舉 master
-
在每台機器上設置一個哨兵,配置文件完全一樣,當然可以使用另外的機器來部署 哨兵
-
拷貝並修改哨兵配置
cd /opt/redis-6.2.2 cp sentinel.conf /usr/local/redis/conf vi sentinel.conf
-
修改 sentinel.conf ,只修改下面列出的項目
#設置為后台運行 daemonize yes #日志存放目錄 logfile /usr/local/redis/logs/sentinel.log #數據存放目錄 dir /usr/local/redis/data/ #監控名為 mymaster 的主節點,仲裁參數為 2,一般是哨兵個數的一半+1(類似於zookeeper的過半寫成功機制) sentinel monitor mymaster 192.168.86.140 6379 2 #主機多長時間連接不上,哨兵就判定他掛了,單位毫秒 sentinel down-after-milliseconds mymaster 30000 #主機如果設置了 requirepass sentinel auth-pass mymaster pass
-
啟動哨兵
cd /usr/local/redis/bin ./redis-sentinel ../conf/sentinel.conf
-
查看哨兵是否啟動成功
#查看進程 ps -ef | grep redis #查看日志 tail -f /usr/local/redis/logs/sentinel.log
-
測試集群是否搭建成功
-
關閉或 kill 掉 master 上的 redis 服務,等待30秒,因為我們配置 30秒連接不上就認為他掛了
-
查看 sentinel 日志
-
在另外兩台 slave 上執行 **info replication **
-
-
重新啟動原來的主機,此時重啟之后它將會變為新主機的從機
常見問題
-
執行 make 時,出現 "fatal error: jemalloc/jemalloc.h: No such file or directory"
執行=> make distclean && make
-
執行 make test 時,出現 "You need tcl 8.5 or newer in order to run the Redis test"
執行=> yum install tcl
-
執行 ./redis-cli -p 6379 出現 connection refused
使用 ./redis-cli -h <服務器IP> -p 6379 訪問
-
主從復制的時候,master 正常寫入但是 salve 讀取不到
- 檢查一下 master 的 bind 設置,關於 bind 的正常理解: Redis的bind的誤區
- 檢查一下 slave 的 masterauth 是否正確
- 服務器的端口是否開通,防火牆是否攔截了
-
主機宕機,但是 sentinel 集群沒有重新進行選主
- 如果使用 scp 命令拷貝的話,需要在 sentinel 從沒運行過的時候拷貝,或者進入配置文件,在末尾刪除程序運行自動生成的一些參數