一、Redis主從配置
主機名稱 | 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.confbind 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.confbind 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主從不用事先同步資料,它會自動同步過去
[root@redis-master ~]# systemctl start redis
[root@redis-slave01 ~]# systemctl start redis
[root@redis-slave02 ~]# systemctl start redis
[root@redis-master ~]# netstat -tulnp |grep redistcp 0 0 192.168.56.11:6379 0.0.0.0:* LISTEN 1295/redis-server 1 [root@redis-slave01 ~]# netstat -tulnp |grep redistcp 0 0 192.168.56.12:6379 0.0.0.0:* LISTEN 1625/redis-server 1 [root@redis-slave02 ~]# netstat -tulnp |grep redistcp 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哨兵模式
Redis Sentinel是Redis高可用的實現方案。Sentinel是一個管理多個Redis例項的工具,它可以實現對Redis的監控、通知、自動故障轉移。
Sentinel的主要功能包括主節點存活檢測、主從執行情況檢測、自動故障轉移(failover)、主從切換。Redis的Sentinel最小配置是一主一從。 Redis的Sentinel系統可以用來管理多個Redis伺服器,該系統可以執行以下四個任務:
監控
Sentinel會不斷的檢查主伺服器和從伺服器是否正常執行。
通知
當被監控的某個Redis伺服器出現問題,Sentinel通過API指令碼向管理員或者其他的應用程式傳送通知。
自動故障轉移
當主節點不能正常工作時,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 redisroot 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 redisroot 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 redisroot 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 21747:X 19 Apr 2019 14:59:44.829 # +sdown sentinel 14fca3f851e9e1bd3a4a0dc8a9e34bb237648455 192.168.56.13 26379 @ mymaster 192.168.56.11 63791747:X 19 Apr 2019 14:59:46.950 # -sdown sentinel 14fca3f851e9e1bd3a4a0dc8a9e34bb237648455 192.168.56.13 26379 @ mymaster 192.168.56.11 63791747:X 19 Apr 2019 15:00:44.391 # +sdown master mymaster 192.168.56.11 63791747:X 19 Apr 2019 15:00:44.525 # +new-epoch 11747:X 19 Apr 2019 15:00:44.527 # +vote-for-leader 14fca3f851e9e1bd3a4a0dc8a9e34bb237648455 11747:X 19 Apr 2019 15:00:45.023 # +config-update-from sentinel 14fca3f851e9e1bd3a4a0dc8a9e34bb237648455 192.168.56.13 26379 @ mymaster 192.168.56.11 63791747:X 19 Apr 2019 15:00:45.023 # +switch-master mymaster 192.168.56.11 6379 192.168.56.13 63791747: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,無法連結的狀態 ......
Don't forget the beginner's mind
[admin via ] Redis學習之Redis主從和哨兵模式已經有413次圍觀