由於服務中根據業務不同使用了redis的多個數據庫db0-db15,redis cluster集群只有db0,其他庫不顯示,無法使用,於是選擇了Redis哨兵模式集群。
我的目錄結構:
Sentinel配置
Sentinel配置文件路徑:
/opt/redis-sentinel/sentinel
redis-sentinel-1.conf
# bind 127.0.0.1 # 哨兵的端口號 # 因為各個哨兵節點會運行在單獨的Docker容器中 # 所以無需擔心端口重復使用 # 如果需要在單機 port 26379 # 設定密碼認證 requirepass "meiyoumima2021" # 配置哨兵的監控參數 # 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum> # master-name是為這個被監控的master起的名字 # ip是被監控的master的IP或主機名。因為Docker容器之間可以使用容器名訪問,所以這里寫master節點的容器名 # redis-port是被監控節點所監聽的端口號 # quorom設定了當幾個哨兵判定這個節點失效后,才認為這個節點真的失效了 sentinel monitor local-master 127.0.0.1 6379 2 # 連接主節點的密碼 # 格式:sentinel auth-pass <master-name> <password> sentinel auth-pass local-master Zdww2021 # master在連續多長時間無法響應PING指令后,就會主觀判定節點下線,默認是30秒 # 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
redis-sentinel-2.conf
# bind 127.0.0.1 # 哨兵的端口號 # 因為各個哨兵節點會運行在單獨的Docker容器中 # 所以無需擔心端口重復使用 # 如果需要在單機 port 26380 # 設定密碼認證 requirepass "meiyoumima2021" # 配置哨兵的監控參數 # 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum> # master-name是為這個被監控的master起的名字 # ip是被監控的master的IP或主機名。因為Docker容器之間可以使用容器名訪問,所以這里寫master節點的容器名 # redis-port是被監控節點所監聽的端口號 # quorom設定了當幾個哨兵判定這個節點失效后,才認為這個節點真的失效了 sentinel monitor local-master 127.0.0.1 6379 2 # 連接主節點的密碼 # 格式:sentinel auth-pass <master-name> <password> sentinel auth-pass local-master Zdww2021 # master在連續多長時間無法響應PING指令后,就會主觀判定節點下線,默認是30秒 # 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
redis-sentinel-3.conf
# bind 127.0.0.1 # 哨兵的端口號 # 因為各個哨兵節點會運行在單獨的Docker容器中 # 所以無需擔心端口重復使用 # 如果需要在單機 port 26381 # 設定密碼認證 requirepass "meiyoumima2021" # 配置哨兵的監控參數 # 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum> # master-name是為這個被監控的master起的名字 # ip是被監控的master的IP或主機名。因為Docker容器之間可以使用容器名訪問,所以這里寫master節點的容器名 # redis-port是被監控節點所監聽的端口號 # quorom設定了當幾個哨兵判定這個節點失效后,才認為這個節點真的失效了 sentinel monitor local-master 127.0.0.1 6379 2 # 連接主節點的密碼 # 格式:sentinel auth-pass <master-name> <password> sentinel auth-pass local-master Zdww2021 # master在連續多長時間無法響應PING指令后,就會主觀判定節點下線,默認是30秒 # 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
Redis配置
/opt/redis-sentinel/server
redis-master.conf
# bind 127.0.0.1
# 啟用保護模式
# 即在沒有使用bind指令綁定具體地址時
# 或在沒有設定密碼時
# Redis將拒絕來自外部的連接
# protected-mode yes
# 監聽端口
port 6379
# 啟動時不打印logo # 這個不重要,想看logo就打開它 always-show-logo yes # 設定密碼認證 requirepass meiyoumima2021 # 禁用KEYS命令 # 一方面 KEYS * 命令可以列出所有的鍵,會影響數據安全 # 另一方面 KEYS 命令會阻塞數據庫,在數據庫中存儲了大量數據時,該命令會消耗很長時間 # 期間對Redis的訪問也會被阻塞,而當鎖釋放的一瞬間,大量請求涌入Redis,會造成Redis直接崩潰 #rename-command KEYS "" # 此外還應禁止 FLUSHALL 和 FLUSHDB 命令 # 這兩個命令會清空數據,並且不會失敗
redis-slave1.conf
# bind 127.0.0.1
# 啟用保護模式
# 即在沒有使用bind指令綁定具體地址時
# 或在沒有設定密碼時
# Redis將拒絕來自外部的連接
# protected-mode yes
# 監聽端口
port 6380
# 啟動時不打印logo # 這個不重要,想看logo就打開它 always-show-logo no # 設定密碼認證 requirepass meiyoumima2021 # 禁用KEYS命令 # 一方面 KEYS * 命令可以列出所有的鍵,會影響數據安全 # 另一方面 KEYS 命令會阻塞數據庫,在數據庫中存儲了大量數據時,該命令會消耗很長時間 # 期間對Redis的訪問也會被阻塞,而當鎖釋放的一瞬間,大量請求涌入Redis,會造成Redis直接崩潰 #rename-command KEYS "" # 此外還應禁止 FLUSHALL 和 FLUSHDB 命令 # 這兩個命令會清空數據,並且不會失敗 # 配置master節點信息 # 格式: #slaveof <masterip> <masterport> # 此處masterip所指定的redis-server-master是運行master節點的容器名 # Docker容器間可以使用容器名代替實際的IP地址來通信 slaveof redis-server-master 6379 # 設定連接主節點所使用的密碼 masterauth meiyoumima2021
redis-slave2.conf
# bind 127.0.0.1
# 啟用保護模式
# 即在沒有使用bind指令綁定具體地址時
# 或在沒有設定密碼時
# Redis將拒絕來自外部的連接
# protected-mode yes
# 監聽端口
port 6381
# 啟動時不打印logo
# 這個不重要,想看logo就打開它
always-show-logo no
# 設定密碼認證
requirepass meiyoumima2021
# 禁用KEYS命令
# 一方面 KEYS * 命令可以列出所有的鍵,會影響數據安全
# 另一方面 KEYS 命令會阻塞數據庫,在數據庫中存儲了大量數據時,該命令會消耗很長時間
# 期間對Redis的訪問也會被阻塞,而當鎖釋放的一瞬間,大量請求涌入Redis,會造成Redis直接崩潰
#rename-command KEYS "" # 此外還應禁止 FLUSHALL 和 FLUSHDB 命令 # 這兩個命令會清空數據,並且不會失敗 # 配置master節點信息 # 格式: #slaveof <masterip> <masterport> # 此處masterip所指定的redis-server-master是運行master節點的容器名 # Docker容器間可以使用容器名代替實際的IP地址來通信 slaveof redis-server-master 6379 # 設定連接主節點所使用的密碼 masterauth meiyoumima2021
docker-compose配置
sentinel和redis-server分別用兩個docker-compose文件來管理
sentinel的docker-compose.yml文件
version: '3' services: redis-sentinel-1: image: redis container_name: redis-sentinel-1 restart: always # 為了規避Docker中端口映射可能帶來的問題 # 這里選擇使用host網絡 #network_mode: host ports: - 26379:26379 volumes: - ./s1/:/usr/local/etc/redis/conf/ # 指定時區,保證容器內時間正確 environment: TZ: "Asia/Shanghai" # sysctls: # net.core.somaxconn: '511' command: ["redis-sentinel", "/usr/local/etc/redis/conf/redis-sentinel-1.conf"] redis-sentinel-2: image: redis container_name: redis-sentinel-2 restart: always #network_mode: host ports: - 26380:26380 volumes: - ./s2/:/usr/local/etc/redis/conf/ environment: TZ: "Asia/Shanghai" # sysctls: # net.core.somaxconn: '511' command: ["redis-sentinel", "/usr/local/etc/redis/conf/redis-sentinel-2.conf"] redis-sentinel-3: image: redis container_name: redis-sentinel-3 restart: always #network_mode: host ports: - 26381:26381 volumes: - ./s3/:/usr/local/etc/redis/conf/ environment: TZ: "Asia/Shanghai" # sysctls: # net.core.somaxconn: '511' command: ["redis-sentinel", "/usr/local/etc/redis/conf/redis-sentinel-3.conf"] networks: default: external:
name:server_default
redis的docker-compose文件
version: '3' services: # 主節點的容器 redis-server-master: image: redis container_name: redis-server-master restart: always # 為了規避Docker中端口映射可能帶來的問題 # 這里選擇使用host網絡,mac下虛擬機不支持 #network_mode: host ports: - 6379:6379 # 指定時區,保證容器內時間正確 environment: TZ: "Asia/Shanghai" volumes: # 映射配置文件和數據目錄 - ./redis-master.conf:/usr/local/etc/redis/redis.conf - ./data/redis-master:/data #sysctls: # net.core.somaxconn: '511' command: ["redis-server", "/usr/local/etc/redis/redis.conf"] # 從節點1的容器 redis-server-slave-1: image: redis container_name: redis-server-slave-1 restart: always #network_mode: host ports: - 6380:6380 depends_on: - redis-server-master environment: TZ: "Asia/Shanghai" volumes: - ./redis-slave1.conf:/usr/local/etc/redis/redis.conf - ./data/redis-slave-1:/data command: ["redis-server", "/usr/local/etc/redis/redis.conf"] # 從節點2的容器 redis-server-slave-2: image: redis container_name: redis-server-slave-2 restart: always #network_mode: host ports: - 6381:6381 depends_on: - redis-server-master environment: TZ: "Asia/Shanghai" volumes: - ./redis-slave2.conf:/usr/local/etc/redis/redis.conf - ./data/redis-slave-2:/data command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
哨兵模式驗證
先啟動Redis 后啟動sentinel
啟動redis
在/opt/redis-sentinel/server路徑下執行
docker-compose up
啟動sentinel
在/opt/redis-sentinel/sentinel路徑下執行
docker-compose up