目錄mysql
主機名稱 | IP地址 | redis版本和角色說明 |
---|---|---|
redis-master | 192.168.56.11 | redis 5.0.3(主) |
redis-slave01 | 192.168.56.12 | redis 5.0.3(從) |
redis-slave02 | 192.168.56.13 | redis 5.0.3(從) |
[root@redis-master ~]# grep -Ev "^$|#" /usr/local/redis/redis.conf bind 192.168.56.11 protected-mode yes port 6379 daemonize yes pidfile /var/run/redis_6379.pid logfile "/var/log/redis.log" dir /var/redis/ [root@redis-slave01 ~]# grep -Ev "^$|#" /usr/local/redis/redis.conf bind 192.168.56.12 protected-mode yes port 6379 daemonize yes pidfile /var/run/redis_6379.pid logfile "/var/log/redis.log" dir /var/redis/ replicaof 192.168.56.11 6379 #配置爲master的從,若是master上有密碼配置,還須要增長下面一項密碼配置 masterauth 123456 #配置主的密碼 [root@redis-slave02 ~]# grep -Ev "^$|#" /usr/local/redis/redis.conf bind 192.168.56.13 protected-mode yes port 6379 daemonize yes pidfile /var/run/redis_6379.pid logfile "/var/log/redis.log" dir /var/redis/ replicaof 192.168.56.11 6379 #配置爲master的從 masterauth 123456 #配置主的密碼
這裏須要注意的是:redis主從和mysql主從不同,redis主從不用事先同步數據,它會自動同步過去redis
[root@redis-master ~]# systemctl start redis [root@redis-slave01 ~]# systemctl start redis [root@redis-slave02 ~]# systemctl start redis [root@redis-master ~]# netstat -tulnp |grep redis tcp 0 0 192.168.56.11:6379 0.0.0.0:* LISTEN 1295/redis-server 1 [root@redis-slave01 ~]# netstat -tulnp |grep redis tcp 0 0 192.168.56.12:6379 0.0.0.0:* LISTEN 1625/redis-server 1 [root@redis-slave02 ~]# netstat -tulnp |grep redis tcp 0 0 192.168.56.13:6379 0.0.0.0:* LISTEN 1628/redis-server 1
[root@redis-master ~]# redis-cli -h 192.168.56.11 #主上寫入數據 192.168.56.11:6379> KEYS * (empty list or set) 192.168.56.11:6379> set k1 123 OK 192.168.56.11:6379> set k2 456 OK [root@redis-slave01 ~]# redis-cli -h 192.168.56.12 #slave01上查看是否數據同步 192.168.56.12:6379> KEYS * 1) "k2" 2) "k1" 192.168.56.12:6379> get k1 "123" 192.168.56.12:6379> get k2 "456" [root@redis-slave02 ~]# redis-cli -h 192.168.56.13 #slave02上查看是否數據同步 192.168.56.13:6379> KEYS * 1) "k2" 2) "k1" 192.168.56.13:6379> get k1 "123" 192.168.56.13:6379> get k2 "456"
Redis Sentinel是Redis高可用的實現方案。Sentinel是一個管理多個Redis實例的工具,它能夠實現對Redis的監控、通知、自動故障轉移。sql
Sentinel的主要功能包括主節點存活檢測、主從運行狀況檢測、自動故障轉移(failover)、主從切換。Redis的Sentinel最小配置是一主一從。 Redis的Sentinel系統能夠用來管理多個Redis服務器,該系統能夠執行如下四個任務:緩存
監控bash
Sentinel會不斷的檢查主服務器和從服務器是否正常運行。服務器
通知架構
當被監控的某個Redis服務器出現問題,Sentinel經過API腳本向管理員或者其餘的應用程序發送通知。tcp
自動故障轉移工具
當主節點不能正常工做時,Sentinel會開始一次自動的故障轉移操做,它會將與失效主節點是主從關係的其中一個從節點升級爲新的主節點, 而且將其餘的從節點指向新的主節點。測試
配置提供者
在Redis Sentinel模式下,客戶端應用在初始化時鏈接的是Sentinel節點集合,從中獲取主節點的信息。
Sentinel是Redis的高可用性解決方案:
由一個或多個Sentinel實例組成的Sentinel系統能夠監視任意多個主服務器,以及全部從服務器,並在被監視的主服務器進入下線狀態時,自動將下線主服務器屬下的某個從服務器升級爲新的主服務器,而後由新的主服務器代替已下線的主服務器繼續處理命令請求 。以下圖:
Sentinel負責監控集羣中的全部主、從Redis,當發現主故障時,Sentinel會在全部的從中選一個成爲新的主。而且會把其他的從變爲新主的從。同時那臺有問題的舊主也會變爲新主的從,也就是說當舊的主即便恢復時,並不會恢復原來的主身份,而是做爲新主的一個從。
在Redis高可用架構中,Sentinel每每不是隻有一個,而是有3個或者以上。目的是爲了讓其更加可靠,畢竟主和從切換角色這個過程仍是蠻複雜的。
主觀失效
SDOWN(subjectively down),直接翻譯的爲」主觀」失效,即當前sentinel實例認爲某個redis服務爲」不可用」狀態.
客觀失效
ODOWN(objectively down),直接翻譯爲」客觀」失效,即多個sentinel實例都認爲master處於」SDOWN」狀態,那麼此時master將處於ODOWN,ODOWN能夠簡單理解爲master已經被集羣肯定爲」不可用」,將會開啓failover
主機名稱 | IP地址 | redis版本和角色說明 |
---|---|---|
redis-master | 192.168.56.11:6379 | redis 5.0.3(主) |
redis-slave01 | 192.168.56.12:6379 | redis 5.0.3(從) |
redis-slave02 | 192.168.56.13:6379 | redis 5.0.3(從) |
redis-master | 192.168.56.11:26379 | Sentinel01 |
redis-slave01 | 192.168.56.12:26379 | Sentinel02 |
redis-slave02 | 192.168.56.13:26379 | Sentinel03 |
Sentinel.conf配置文件主要參數解析:
# 端口 port 26379 # 是否後臺啓動 daemonize yes # pid文件路徑 pidfile /var/run/redis-sentinel.pid # 日誌文件路徑 logfile "/var/log/sentinel.log" # 定義工做目錄 dir /tmp # 定義Redis主的別名, IP, 端口,這裏的2指的是須要至少2個Sentinel認爲主Redis掛了才最終會採起下一步行爲 sentinel monitor mymaster 127.0.0.1 6379 2 # 若是mymaster 30秒內沒有響應,則認爲其主觀失效 sentinel down-after-milliseconds mymaster 30000 # 若是master從新選出來後,其它slave節點能同時並行重新master同步數據的臺數有多少個,顯然該值越大,全部slave節點完成同步切換的總體速度越快,但若是此時正好有人在訪問這些slave,可能形成讀取失敗,影響面會更廣。最保守的設置爲1,同一時間,只能有一臺幹這件事,這樣其它slave還能繼續服務,可是全部slave所有完成緩存更新同步的進程將變慢。 sentinel parallel-syncs mymaster 1 # 該參數指定一個時間段,在該時間段內沒有實現故障轉移成功,則會再一次發起故障轉移的操做,單位毫秒 sentinel failover-timeout mymaster 180000 # 不容許使用SENTINEL SET設置notification-script和client-reconfig-script。 sentinel deny-scripts-reconfig yes
修改三臺Sentinel的配置文件,以下
[root@redis-master ~]# grep -Ev "^$|#" /usr/local/redis/sentinel.conf port 26379 daemonize yes pidfile "/var/run/redis-sentinel.pid" logfile "/var/log/sentinel.log" dir "/tmp" sentinel monitor mymaster 192.168.56.11 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 sentinel deny-scripts-reconfig yes [root@redis-slave01 ~]# grep -Ev "^$|#" /usr/local/redis/sentinel.conf port 26379 daemonize yes pidfile "/var/run/redis-sentinel.pid" logfile "/var/log/sentinel.log" dir "/tmp" sentinel monitor mymaster 192.168.56.11 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 sentinel deny-scripts-reconfig yes [root@redis-slave02 ~]# grep -Ev "^$|#" /usr/local/redis/sentinel.conf port 26379 daemonize yes pidfile "/var/run/redis-sentinel.pid" logfile "/var/log/sentinel.log" dir "/tmp" sentinel monitor mymaster 192.168.56.11 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 sentinel deny-scripts-reconfig yes
啓動的順序:主Redis --> 從Redis --> Sentinel1/2/3
[root@redis-master ~]# redis-sentinel /usr/local/redis/sentinel.conf [root@redis-master ~]# ps -ef |grep redis root 1295 1 0 14:03 ? 00:00:06 /usr/local/redis/src/redis-server 192.168.56.11:6379 root 1407 1 1 14:40 ? 00:00:00 redis-sentinel *:26379 [sentinel] root 1412 1200 0 14:40 pts/1 00:00:00 grep --color=auto redis [root@redis-slave01 ~]# redis-sentinel /usr/local/redis/sentinel.conf [root@redis-slave01 ~]# ps -ef |grep redis root 1625 1 0 14:04 ? 00:00:06 /usr/local/redis/src/redis-server 192.168.56.12:6379 root 1715 1 1 14:41 ? 00:00:00 redis-sentinel *:26379 [sentinel] root 1720 1574 0 14:41 pts/0 00:00:00 grep --color=auto redis [root@redis-slave02 ~]# redis-sentinel /usr/local/redis/sentinel.conf [root@redis-slave02 ~]# ps -ef |grep redis root 1628 1 0 14:07 ? 00:00:06 /usr/local/redis/src/redis-server 192.168.56.13:6379 root 1709 1 0 14:42 ? 00:00:00 redis-sentinel *:26379 [sentinel] root 1714 1575 0 14:42 pts/0 00:00:00 grep --color=auto redis
[root@redis-master ~]# redis-cli -p 26379 #哨兵模式查看 127.0.0.1:26379> sentinel master mymaster #輸出被監控的主節點的狀態信息 1) "name" 2) "mymaster" 3) "ip" 4) "192.168.56.11" 5) "port" 6) "6379" 7) "runid" 8) "bae06cc3bc6dcbff7c2de1510df7faf1a6eb6941" 9) "flags" 10) "master" ...... 127.0.0.1:26379> sentinel slaves mymaster #查看mymaster的從信息,能夠看到有2個從節點 1) 1) "name" 2) "192.168.56.12:6379" 3) "ip" 4) "192.168.56.12" 5) "port" 6) "6379" 7) "runid" 8) "c86027e7bdd217cb584b1bd7a6fea4ba79cf6364" 9) "flags" 10) "slave" ...... 2) 1) "name" 2) "192.168.56.13:6379" 3) "ip" 4) "192.168.56.13" 5) "port" 6) "6379" 7) "runid" 8) "61597fdb615ecf8bd7fc18e143112401ed6156ec" 9) "flags" 10) "slave" ...... 127.0.0.1:26379> sentinel sentinels mymaster #查看其它sentinel信息 1) 1) "name" 2) "ba12e2a4023d2e9bcad282395ba6b14030920070" 3) "ip" 4) "192.168.56.12" 5) "port" 6) "26379" 7) "runid" 8) "ba12e2a4023d2e9bcad282395ba6b14030920070" 9) "flags" 10) "sentinel" ...... 2) 1) "name" 2) "14fca3f851e9e1bd3a4a0dc8a9e34bb237648455" 3) "ip" 4) "192.168.56.13" 5) "port" 6) "26379" 7) "runid" 8) "14fca3f851e9e1bd3a4a0dc8a9e34bb237648455" 9) "flags" 10) "sentinel"
模擬中止master上的Redis,查看Redis的主從變化,以下:
[root@redis-master ~]# systemctl stop redis #中止master上的redis [root@redis-slave01 ~]# tail -n 20 /var/log/sentinel.log #查看哨兵日誌 ...... 1747:X 19 Apr 2019 14:59:01.747 # +monitor master mymaster 192.168.56.11 6379 quorum 2 1747:X 19 Apr 2019 14:59:44.829 # +sdown sentinel 14fca3f851e9e1bd3a4a0dc8a9e34bb237648455 192.168.56.13 26379 @ mymaster 192.168.56.11 6379 1747:X 19 Apr 2019 14:59:46.950 # -sdown sentinel 14fca3f851e9e1bd3a4a0dc8a9e34bb237648455 192.168.56.13 26379 @ mymaster 192.168.56.11 6379 1747:X 19 Apr 2019 15:00:44.391 # +sdown master mymaster 192.168.56.11 6379 1747:X 19 Apr 2019 15:00:44.525 # +new-epoch 1 1747:X 19 Apr 2019 15:00:44.527 # +vote-for-leader 14fca3f851e9e1bd3a4a0dc8a9e34bb237648455 1 1747:X 19 Apr 2019 15:00:45.023 # +config-update-from sentinel 14fca3f851e9e1bd3a4a0dc8a9e34bb237648455 192.168.56.13 26379 @ mymaster 192.168.56.11 6379 1747:X 19 Apr 2019 15:00:45.023 # +switch-master mymaster 192.168.56.11 6379 192.168.56.13 6379 1747:X 19 Apr 2019 15:00:45.024 * +slave slave 192.168.56.12:6379 192.168.56.12 6379 @ mymaster 192.168.56.13 6379 1747:X 19 Apr 2019 15:00:45.024 * +slave slave 192.168.56.11:6379 192.168.56.11 6379 @ mymaster 192.168.56.13 6379 1747:X 19 Apr 2019 15:01:15.050 # +sdown slave 192.168.56.11:6379 192.168.56.11 6379 @ mymaster 192.168.56.13 6379 #從上面的日誌能夠看到master已經sdown,並切換爲192.168.56.13爲master節點,下面查看slave01上的配置,會自動的更改replicaof配置項,以下: [root@redis-slave01 ~]# grep "replicaof" /usr/local/redis/redis.conf |grep -vE "#" replicaof 192.168.56.13 6379 [root@redis-master ~]# redis-cli -p 26379 #哨兵模式下查看主從信息,也是能夠看到主從的變化 127.0.0.1:26379> sentinel master mymaster 1) "name" 2) "mymaster" 3) "ip" 4) "192.168.56.13" 5) "port" 6) "6379" 7) "runid" 8) "61597fdb615ecf8bd7fc18e143112401ed6156ec" 9) "flags" 10) "master" ...... 127.0.0.1:26379> sentinel slaves mymaster 1) 1) "name" 2) "192.168.56.12:6379" 3) "ip" 4) "192.168.56.12" 5) "port" 6) "6379" 7) "runid" 8) "c86027e7bdd217cb584b1bd7a6fea4ba79cf6364" 9) "flags" 10) "slave" ...... 2) 1) "name" 2) "192.168.56.11:6379" 3) "ip" 4) "192.168.56.11" 5) "port" 6) "6379" 7) "runid" 8) "" 9) "flags" 10) "s_down,slave,disconnected" #提示該節點爲從,而且狀態爲s_down,沒法連接的狀態 ......