docker-compose快速搭建redis哨兵模式高可用集羣

     本次安裝採用 Ubuntu Server X64 18.04 LTS 版本安裝 redis 集羣環境,集羣節點爲 1 主2從
PS:因爲資源不夠因此利用docker-compose的橋接網絡部署在同一臺機器,平時生產應該避免出現這一種把雞蛋放在一個籃子的狀況後續可能會基於Sentinel搭建redis高可用集羣,docker自行安裝redis

環境配置

主機名 IP 角色 系統 CPU/內存 磁盤
redsis-master 192.168.23.134 Ubuntu Server 18.04 2 核 4G 40G
redsis-slave-1 192.168.23.134 Ubuntu Server 18.04 2 核 4G 40G
redsis-slave-2 192.168.23.134 Ubuntu Server 18.04 2 核 4G 40G
redis-sentinel-1 192.168.23.134 Ubuntu Server 18.04 2 核 4G 40G
redis-sentinel-2 192.168.23.134 Ubuntu Server 18.04 2 核 4G 40G
redis-sentinel-3 192.168.23.134 Ubuntu Server 18.04 2 核 4G 40G

redis

# docker-compose.yml
version: '3'
services:
  master:
    image: redis
    container_name: redis-master
    command: redis-server --requirepass redis_pwd  --masterauth redis_pwd
    ports:
      - 6380:6379
  slave1:
    image: redis
    container_name: redis-slave-1
    ports:
      - 6381:6379
    command:  redis-server --slaveof redis-master 6379 --requirepass redis_pwd --masterauth redis_pwd
  slave2:
    image: redis
    container_name: redis-slave-2
    ports:
      - 6382:6379
    command: redis-server --slaveof redis-master 6379 --requirepass redis_pwd --masterauth redis_pwd
複製代碼

docker-compose up 運行,加參數 -d 能夠實現後臺運行,我這裏特地打印出日誌docker

# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
d48696ad6446        redis               "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:6382->6379/tcp   redis-slave-2
49e9f9057550        redis               "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:6381->6379/tcp   redis-slave-1
18cf4f04ebbc        redis               "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:6380->6379/tcp   redis-master

複製代碼

分別啓了三個redis容器,對外暴露端口號爲6382,6381,6380(與編排文件中的ports設置有關)bash

Redis Sentinel

    Redis 的 Sentinel 系統用於管理多個 Redis 服務器(instance), 該系統執行如下三個任務:服務器

  • 監控(Monitoring): Sentinel 會不斷地檢查你的主服務器和從服務器是否運做正常。
  • 提醒(Notification): 當被監控的某個 Redis 服務器出現問題時, Sentinel 能夠經過 API 向管理員或者其餘應用程序發送通知。
  • 自動故障遷移(Automatic failover): 當一個主服務器不能正常工做時, Sentinel 會開始一次自動故障遷移操做, 它會將失效主服務器的其中一個從服務器升級爲新的主服務器, 並讓失效主服務器的其餘從服務器改成複製新的主服務器; 當客戶端試圖鏈接失效的主服務器時, 集羣也會向客戶端返回新主服務器的地址, 使得集羣可使用新主服務器代替失效服務器。

    Redis Sentinel 是一個分佈式系統, 你能夠在一個架構中運行多個 Sentinel 進程(progress), 這些進程使用流言協議(gossipprotocols) 來接收關於主服務器是否下線的信息, 並使用投票協議(agreementprotocols) 來決定是否執行自動故障遷移, 以及選擇哪一個從服務器做爲新的主服務器。 雖然 Redis Sentinel 釋出爲一個單獨的可執行文件 redis-sentinel , 但實際上它只是一個運行在特殊模式下的 Redis 服務器, 你能夠在啓動一個普通 Redis 服務器時經過給定 –sentinel 選項來啓動 Redis Sentinel 。網絡

# docker-compose.yml 
version: '3'
services:
  sentinel1:
    image: redis
    container_name: redis-sentinel-1
    ports:
      - 26379:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf
  sentinel2:
    image: redis
    container_name: redis-sentinel-2
    ports:
    - 26380:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - ./sentinel2.conf:/usr/local/etc/redis/sentinel.conf
  sentinel3:
    image: redis
    container_name: redis-sentinel-3
    ports:
      - 26381:26379
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
      - ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf
networks:
  default:
    external:
      name: redis_default
複製代碼

掛載數據卷

# sentinel1.conf
port 26379
dir /tmp# 172.18.0.2是redis的主節點ip 
# 指示 Sentinel 去監視一個名爲 mymaster 的主服務器, 這個主服務器的 IP 地址爲 172.18.0.2 (docker inspect [containerIP]能夠獲取) 端口號爲 6379
# 將這個主服務器判斷爲失效至少須要 2 個 Sentinel 贊成 (只要贊成 Sentinel 的數量不達標,自動故障遷移就不會執行)
sentinel monitor mymaster 172.18.0.2 6379 2 
# 
sentinel auth-pass mymaster redis_pwd
# 指定了 Sentinel 認爲服務器已經斷線所需的毫秒數。
sentinel down-after-milliseconds mymaster 30000
# 指定了在執行故障轉移時, 最多能夠有多少個從服務器同時對新的主服務器進行同步, 
# 這個數字越小, 完成故障轉移所需的時間就越長。
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
複製代碼

由於三個機器,複製三份,這裏的名字要和編排文件的volumes對應,docker-compose up -d運行架構

# -> 輸出以下
NTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                NAMES
bbd6093a6bdf        redis               "docker-entrypoint.s…"   About a minute ago   Up About a minute   6379/tcp, 0.0.0.0:26380->26379/tcp   redis-sentinel-2
69eb1530998d        redis               "docker-entrypoint.s…"   About a minute ago   Up About a minute   6379/tcp, 0.0.0.0:26379->26379/tcp   redis-sentinel-1
019a72cdbc95        redis               "docker-entrypoint.s…"   About a minute ago   Up About a minute   6379/tcp, 0.0.0.0:26381->26379/tcp   redis-sentinel-3
d48696ad6446        redis               "docker-entrypoint.s…"   18 minutes ago       Up 18 minutes       0.0.0.0:6382->6379/tcp               redis-slave-2
49e9f9057550        redis               "docker-entrypoint.s…"   18 minutes ago       Up 18 minutes       0.0.0.0:6381->6379/tcp               redis-slave-1
18cf4f04ebbc        redis               "docker-entrypoint.s…"   18 minutes ago       Up 18 minutes       0.0.0.0:6380->6379/tcp               redis-master
複製代碼

驗證

redis

docker exec -it 18cf4f04ebbc redis-cli進入主機器運維

# -> info以前先進行受權 auth redis_pwd(requirepass的值)
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
# 從節點信息
slave0:ip=172.18.0.4,port=6379,state=online,offset=2492,lag=0
slave1:ip=172.18.0.3,port=6379,state=online,offset=2492,lag=1
master_replid:2760a09897b3d82d0e304265fcc2b030e1740300
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2492
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2492

複製代碼

exit退出去tcp

Redis Sentinel

docker exec -it 69eb1530998d bash分佈式

1) "name"
 2) "mymaster"
 3) "ip"
 4) "172.18.0.2"
 5) "port"
 6) "6379"
 7) "runid"
 8) "3fc8105ab0b5722b5deb266b9fdaddfa15a7e683"
 9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "747"
19) "last-ping-reply"
20) "747"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "8849"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "69121"
29) "config-epoch"
30) "0"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "180000"
39) "parallel-syncs"
40) "1"
127.0.0.1:26379> 


複製代碼

記錄

Redis啓用密碼認證

     Redis主從和clsuter支持密碼認證的。redis啓用密碼認證必定要requirepass和masterauth同時設置。若是主節點設置了requirepass登陸驗證,在主從切換,slave在和master作數據同步的時候首先須要發送一個ping的消息給主節點判斷主節點是否存活,再監聽主節點的端口是否聯通,發送數據同步等都會用到master的登陸密碼,不然沒法登陸,log會出現響應的報錯。也就是說slave的masterauth和master的requirepass是對應的,因此建議redis啓用密碼時將各個節點的masterauth和requirepass設置爲相同的密碼,下降運維成本。固然設置爲不一樣也是能夠的,注意slave節點masterauth和master節點requirepass的對應關係就行。ui

  • masterauth做用:主要是針對master對應的slave節點設置的,在slave節點數據同步的時候用到。

  • requirepass做用:對登陸權限作限制,redis每一個節點的requirepass能夠是獨立、不一樣的。

主觀下線和客觀下線

     由上述配置知down-after-milliseconds 選項指定了 Sentinel 認爲服務器已經斷線所需的毫秒數。 若是服務器在給定的毫秒數以內, 沒有返回 Sentinel 發送的 PING 命令的回覆, 或者返回一個錯誤, 那麼 Sentinel 將這個服務器標記爲主觀下線(subjectively down,簡稱 SDOWN)

  • 主觀下線(Subjectively Down, 簡稱 SDOWN)指的是單個 Sentinel 實例對服務器作出的下線判斷。
  • 客觀下線(Objectively Down, 簡稱 ODOWN)指的是多個 Sentinel 實例在對同一個服務器作出 SDOWN 判斷, 而且經過 SENTINEL is-master-down-by-addr 命令互相交流以後, 得出的服務器下線判斷。 (一個 Sentinel 能夠經過向另外一個 Sentinel 發送 SENTINEL is-master-down-by-addr 命令來詢問對方是否定爲給定的服務器已下線。)客觀下線條件只適用於主服務器

若是一個服務器沒有在 master-down-after-milliseconds 選項所指定的時間內, 對向它發送 PING 命令的 Sentinel 返回一個有效回覆[+PONG 、 -LOADING 或者 -MASTERDOWN 。], 那麼 Sentinel 就會將這個服務器標記爲主觀下線。

Sentinel 命令

  • PING :返回 PONG 。
  • SENTINEL masters :列出全部被監視的主服務器,以及這些主服務器的當前狀態。
  • SENTINEL slaves :列出給定主服務器的全部從服務器,以及這些從服務器的當前狀態。 SENTINEL get-master-addr-by-name : 返回給定名字的主服務器的 IP 地址和端口號。 若是這個主服務器正在執行故障轉移操做, 或者針對這個主服務器的故障轉移操做已經完成, 那麼這個命令返回新的主服務器的 IP 地址和端口號。
  • SENTINEL reset : 重置全部名字和給定模式 pattern 相匹配的主服務器。 pattern 參數是一個 Glob 風格的模式。 重置操做清楚主服務器目前的全部狀態, 包括正在執行中的故障轉移, 並移除目前已經發現和關聯的, 主服務器的全部從服務器和 Sentinel 。
  • SENTINEL failover : 當主服務器失效時, 在不詢問其餘 Sentinel 意見的狀況下, 強制開始一次自動故障遷移 (不過發起故障轉移的 Sentinel 會向其餘 Sentinel 發送一個新的配置,其餘 Sentinel 會根據這個配置進行相應的更新)。

結束

親測成功!!!🍾🍾🍾

PS:外部訪問須要配置redis.conf
相關文章
相關標籤/搜索