Redis 主從配置密碼以及哨兵

目錄:

 

 

 

Redis 主從介紹

主Redis寫入數據時,從Redis會經過Redis Sync機制,同步數據,確保數據一致。而且Redis有哨兵(Sentinel)機制,Redis主掛掉會自動幫咱們提高從爲主,不過哨兵我發現只適用一主多從,不太適合級聯模式。redis


哨兵機制

  1,有了主從,那咱們須要對其進行監控,Sentinel會不斷地檢查你的主服務器和從服務器是否運做正常。某個節點故障後,Sentinel 會開始一次自動故障遷移操做, 它會將失效主服務器的其中一個從服務器升級爲新的主服務器, 並讓失效主服務器的其餘從服務器改成複製新的主服務器; 當客戶端試圖鏈接失效的主服務器時, 集羣也會向客戶端返回新主服務器的地址, 使得集羣可使用新主服務器代替失效服務器。Redis Sentinel 是一個分佈式系統, 你能夠在一個架構中運行多個 Sentinel 進程(Progress), 這些進程使用流言協議(Gossip Protocols)來接收關於主服務器是否下線的信息, 並使用投票協議(Agreement Protocols)來決定是否執行自動故障遷移, 以及選擇哪一個從服務器做爲新的主服務器。雖然 Redis Sentinel 釋出爲一個單獨的可執行文件 redis-sentinel , 但實際上它只是一個運行在特殊模式下的 Redis 服務器。vim

  2,哨兵是個分佈式系統,經過配置文件能夠多個哨兵合做,以實現它的健壯性:安全

  • 某個主服務是否正常,須要經過多個哨兵確認,這樣可保證誤判的低機率。
  • 當哨兵工做的時候,總會有個別哨兵不能正常運行,如個別系統出現故障,因此多個哨兵合做運行,保證了系統的健壯性。
  • 全部的哨兵、redis實例(包括主與從)和客戶端相互之間會有交互,這是一個大的分佈式系統,在此文檔中將由淺入深地介紹哨兵的基礎概念,以便更好的理解其基本屬性,而後是更復雜的特性,讓你理解它是若是精確的工做 

 

Redis 主從配置

  • 環境:一主一從配置,通常來講一個分佈式,至少知足2n+1,最小爲3個,生產看需求。

  主節點IP:192.168.198.131服務器

  從節點IP:192.168.198.132架構

  從節點IP:192.168.198.133app

  端口使用默認6379(若是是虛擬機測試,一臺機器拷貝3個redis目錄進行配置啓動就能夠了)分佈式


  • 安裝: 節點1 節點2 節點3 所有執行如下命令,不一樣的地方有標註。

編譯redispost

cd /usr/local/src/測試

wget http://download.redis.io/releases/redis-3.0.5.tar.gzui

tar zxvf ./redis-3.0.5.tar.gz

cd redis-3.0.5

make

make install

 

主從配置

  1. 將主從redis配置文件redis.conf中的aemonize no 改成 yes
  2. 從redis配置文件添加slaveof 192.168.198.131 6379 的配置
  3. 主從開啓AOF機制 appendoly  yes

cd /usr/local/src/redis-3.0.5

vim redis.conf     #修改如下內容,不是必須的

bind   127.0.0.1 192.168.198.131   #兩臺主機分別改成本身的IP

logfile  "/usr/local/src/redis-3.0.3/redis.log"

daemonize yes   #啓用守護模式

appendonly  yes         #開啓aof持久化

slave-read-only yes   #slave 默認就是隻讀的,這裏不用管。

protected-mode no   #protected-mode 是3.2 以後加入的新特性,爲了禁止公網訪問redis cache,增強redis安全的。根據本身須要配置,它啓用的條件,有兩個,沒有bind IP 以及沒有設置訪問密碼。

#requirepass  "admin.123"    #設置redis登陸密碼  這個看本身需求能夠不要

#masterauth  "admin.123"   #主從認證密碼,不然主從不能同步,這個看本身需求能夠不要

啓用主從模式只有Redis Slave 添加一行,啓動服務主從就配置好了。

slaveof 192.168.198.131 6379


  • 啓動服務

主redis:      

[root@localhost redis-3.0.5]# ./src/redis-server  redis.conf

從redis:

[root@localhost redis-3.0.5]# ./src/redis-server  redis.conf

從redis:

[root@localhost redis-3.0.5]# ./src/redis-server  redis.conf


  •  檢查主從狀態

~]# redis-cli -c -h 192.168.198.131 -p 6379
192.168.198.131:6379> info
.......
# Replication   #中間省略了內容,本身能夠看看,主要是找到這一段,看主從狀態。
role:master
connected_slaves:1
slave0:ip=192.168.198.132,port=6379,state=online,offset=5700675,lag=0
slave0:ip=192.168.198.133,port=6379,state=online,offset=5700676,lag=1
master_repl_offset:5700675
repl_backlog_active:1
repl_backlog_size:10000000
repl_backlog_first_byte_offset:1
repl_backlog_histlen:5707674
.......


 

測試數據同步

主redis:
[root@localhost redis-3.0.5]# src/redis-cli -p 6379
127.0.0.1:6379> set name abc
OK
127.0.0.1:6379> get name
"abc"
127.0.0.1:6379>
從redis:
[root@localhost redis-3.0.5]# src/redis-cli -p 6379
127.0.0.1:6379> get name
"abc"
127.0.0.1:6379>

127.0.0.1:6379>
從redis:
[root@localhost redis-3.0.5]# src/redis-cli -p 6379
127.0.0.1:6379> get name
"abc"
127.0.0.1:6379>


默認是讀寫分離的

在從redis:

[root@localhost redis-3.0.5]# src/redis-cli -p 6379
127.0.0.1:6379> set name 123
(error) READONLY You can't write against a read only slave.


Redis Sentinel  配置

首先咱們cp一份redis目錄這樣好區分開來,一臺服務器開啓多個redis服務也是這樣拷貝目錄配置端口啓動
cp /usr/local/src/redis-3.0.5 /usr/local/src/redis-3.0.5-sentinel1
cd /usr/local/src/redis-3.0.5-sentinel1
vim sentinel.conf   #在redis的跟目錄下
port 26379
daemonize yes
protected-mode no   #保護模式若是開啓只接受迴環地址的ipv4和ipv6地址連接,拒絕外部連接,並且正常應該配置多個哨兵,避免一個哨兵出現獨裁狀況,若是配置多個哨兵那若是開啓也會拒絕其餘sentinel的鏈接。致使哨兵配置沒法生效。
logfile "/usr/local/src/redis-3.0.5-sentinel1/sentinel.log"    #指明日誌文件
dir "/usr/local/src/redis-3.0.5-sentinel1" ## 哨兵sentinel的工做目錄
sentinel monitor mymaster 192.168.198.131 6379 1   #哨兵監控的master,選擇新主須要幾個哨兵投票
sentinel down-after-milliseconds mymaster 5000   #master或者slave多少時間(默認30秒)不能使用標記爲down狀態。
sentinel failover-timeout mymaster 18000   #若哨兵在配置值內未能完成故障轉移操做,則任務本次故障轉移失敗。
sentinel auth-pass mymaster redispass   #若是redis配置了密碼,那這裏必須配置認證,不然不能自動切換
sentinel parallel-syncs mymaster 1 # 這個配置項指定了在發生failover主備切換時最多能夠有多少個slave同時對新的master進行 同步,這個數字越小,完成failover所需的時間就越長, 可是若是這個數字越大,就意味着越 多的slave由於replication而不可用。能夠經過將這個值設爲 1 來保證每次只有一個slave 處於不能處理命令請求的狀態

[root@master redis-3.0.5-sentinel1]# /usr/local/src/redis-3.0.5-sentinel1/src/redis-sentinel /usr/local/src/redis-3.0.5-sentinel1/sentinel.conf   #啓動服務
若是有下面報錯 啓動命令後面要加上 --sentinel
*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 6
>>> 'sentinel monitor mymaster 192.168.198.131 6379 1'
sentinel directive while not in sentinel mode

哨兵無需配置slave,只須要指定master,哨兵會自動發現slave

檢查哨兵狀態:

[root@localhost redis-3.0.5-sentinel1]# ./src/redis-cli -p 26379
127.0.0.1:26379> info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=1
127.0.0.1:26379>

 

就這樣,分佈式完成了,啓動,而後殺死主redis, 而後就從哨兵中看到了redis的選舉新主redis切換了,將如今的主redis的數據進行save保存,而後將如今的主redis根目錄下dump.rdb文件拷貝覆蓋到原來主redis的根目錄下dump.rdb (若是是aof持久化則直接拷貝aof文件覆蓋原來主熱地上的根目錄下並重啓),而後咱們啓動殺死的主redis,發現以前的主redis變成了新主的從redis了,就這樣整個過程就完成了。

rdb持久化數據同步步驟以下:

 1)將如今的主redis的數據進行保存

     [root@localhost redis-3.0.5]# src/redis-cli -p 6379
     127.0.0.1:6379> save
     OK
     127.0.0.1:6379>  

2)將如今的主redis根目錄下dump.rdb文件拷貝覆蓋到原來主redis的根目錄下dump.rdb

3)啓動原來的主redis

      [root@localhost redis-3.0.5]# ./src/redis-server  redis.conf

4)info replication命令查看主從複製信息,以前的主redis變成了新主的從redis了


主Redis宕機測試(大概流程以下,本身測試,從redis宕機重啓slave從新加入到了主從複製中)

把主redis的進程kill掉,觀察sentinel控制檯輸出信息:
2461:X 18 Jul 08:29:19.276 #   +sdown master mymaster 127.0.0.1 6380【 master服務已經宕機 】
2461:X 18 Jul 08:29:19.276 # +odown master mymaster 127.0.0.1 6380 #quorum 1/1
2461:X 18 Jul 08:29:19.276 # +new-epoch 1
2461:X 18 Jul 08:29:19.276 #   +try-failover master mymaster 127.0.0.1 6380【嘗試恢復master】
2461:X 18 Jul 08:29:19.282 # +vote-for-leader 236f14b361fc5a0dc0621cf88823ed6e6252b2f3 1 【 投票選舉哨兵leader,如今就一個哨兵因此leader就本身 】
2461:X 18 Jul 08:29:19.282 # +elected-leader master mymaster 127.0.0.1 6380 【選出leader】
2461:X 18 Jul 08:29:19.282 # +failover-state-select-slave master mymaster 127.0.0.1 6380 【選中其中的一個slave當作master】
2461:X 18 Jul 08:29:19.345 #   +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380【選中6381當master】
2461:X 18 Jul 08:29:19.345 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380 【發送slaveof no one命令】
2461:X 18 Jul 08:29:19.401 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380 【等待升級master】
2461:X 18 Jul 08:29:20.291 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380 【升級6381爲master】
2461:X 18 Jul 08:29:20.291 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6380
2461:X 18 Jul 08:29:20.361 * +slave-reconf-sent slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
2461:X 18 Jul 08:29:20.666 * +slave-reconf-inprog slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
2461:X 18 Jul 08:29:21.694 * +slave-reconf-done slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
2461:X 18 Jul 08:29:21.770 #   +failover-end master mymaster 127.0.0.1 6380【 故障恢復完成 】
2461:X 18 Jul 08:29:21.770 #   +switch-master mymaster 127.0.0.1 6380 127.0.0.1 6381【master 從6380切換到6381】
2461:X 18 Jul 08:29:21.771 * +slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6381 【添加6382爲6381的從庫】
2461:X 18 Jul 08:29:21.771 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381 【添加6380爲6381的從庫】
2461:X 18 Jul 08:29:51.828 # +sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381 【 發現6380已經宕機,等待6380的恢復 】

 

查看主從複製信息能夠看出,如今6381爲master,有一個從庫

127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6382,state=online,offset=35213,lag=1
master_repl_offset:35346
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:35345
 

把6380恢復

[root@master redis-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-master-slave/6380/redis.conf
觀察sentinel控制檯輸出信息:
2461:X 18 Jul 08:42:35.202 # -sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
2461:X 18 Jul 08:42:45.207 * +convert-to-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381

 

查看主從複製信息:

127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6382,state=online,offset=56432,lag=0
slave1:ip=127.0.0.1,port=6380,state=online,offset=56432,lag=0
master_repl_offset:56432
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:56431
 

配置多個哨兵

啓動三個哨兵(redis-3.0.3-sentinel1, redis-3.0.3-sentinel2, redis-3.0.3-sentinel3)
cp /usr/local/src/redis-3.0.3-sentinel1 /usr/local/src/redis-3.0.3-sentinel2
cp /usr/local/src/redis-3.0.3-sentinel1 /usr/local/src/redis-3.0.3-sentinel3
配置(三個配置基本類似, 就端口號的地方改一下)
vim sentinel.conf   #在redis的跟目錄下
port 26379   # 對應第sentinel1
port 26380  # 對應第sentinel2
port 26381  # 對應第sentinel3
 
啓動sentinel服務
[root@master redis-3.0.3-sentinel1]# /usr/local/src/redis-3.0.3-sentinel1/src/redis-sentinel /usr/local/src/redis-3.0.3-sentinel1/sentinel.conf   #啓動服務
[root@master redis-3.0.3-sentinel2]# /usr/local/src/redis-3.0.3-sentinel2/src/redis-sentinel /usr/local/src/redis-3.0.3-sentinel2/sentinel.conf   #啓動服務
[root@master redis-3.0.3-sentinel3]# /usr/local/src/redis-3.0.3-sentinel3/src/redis-sentinel /usr/local/src/redis-3.0.3-sentinel3/sentinel.conf   #啓動服務

 

多個哨兵配置文件同樣,正常狀況下要配置奇數哨兵,避免切換時候票數相同,出現競爭,影響線上業務。
相關文章
相關標籤/搜索