docker 安裝 redis 並通過 sentinel(哨兵模式) 實現一主兩從集群,實現高可用


1,創建三台 redis,實現主從集群

1,選擇並創建本地數據卷目錄

cd /ussr/local
mkdir docker
cd docker
mkdir redis
cd redis
mkdir data                 # 存放持久化數據和日志文件的數據卷目錄
touch redis1.conf          # 配置文件
touch redis2.conf          # 配置文件
touch redis3.conf          # 配置文件
touch docker-compose.yml   # docker-compose 構建工具的配置文件

2,三個 redis 配置文件基本相同,除了端口分別為 6379 6380 6381 其它完全相同,下面只貼上一個配置文件

# 實例化多少個數據庫
databases 1

# 監聽的端口
port 6379

# 訪問本機需要的密碼 和 作為從機訪問主機的密碼
requirepass 920619
masterauth 920619

# 持久化文件的保存位置
dir /data

# 持久化文件名
dbfilename dump.rdb

# 指定存儲至本地數據庫時是否壓縮數據
rdbcompression yes

# 持久化策略:一定時間內(S) 有多少條數據更新 就觸發保存
# 如 第一條就是 900 秒內有 1 條數據更新 就觸發保存
save 900 1
save 300 10
save 60  10000

# 日志文件的保存地址
logfile redis.log

關於 redis 的更多配置,你點擊這里查看,redis 常見配置與說明
關於以容器啟動的 redis 為什么要修改容器啟動時監聽的端口,這里有一個很坑的問題,正常情況下,容器和容器之間是隔離開的,我們為了節省成本在一台主機
上模擬啟動多台redis,只需要端口映射到主機時做區分即可,一開始筆者也是這么干的,但是后來啟動哨兵模式監聽的時候,發現出現了各種稀奇古怪的問題,比如,
明明有兩台從機,但是程序中值會發現一台,三台,或者四台,就是沒有正常的兩台,明明連接的是主機,居然沒有寫權限等等,后來折騰了半天,發現把容器內部運
行的端口修改了之后,就一切正常了,至於原因,初步認為是 哨兵程序 也是啟動在容器中的,由於是在一台主機,ip 肯定相同,容器中的 端口可能是作為集群的唯
一區分,如果容器內的端口一致,可能出現沖突,這純屬個人猜測,由於部署生產時不會在一台主機裝多個實例,這里不再深究

3,docker-compose.yml 文件中寫入,這里注意除了暴漏 redis 的連接端口外,還要暴漏 集群端口,這個端口比連接端口大 10000

version: '3.1'
services:

  master:
    image: redis
    container_name: redis-master
    ports:
      - 6379:6379
      - 16379:16379
    volumes:
      - ./redis1.conf:/etc/redis.conf
      - ./data-master:/data
    command: redis-server /etc/redis.conf
    
  slave1:
    image: redis
    container_name: redis-slave1
    ports:
      - 6380:6380
      - 16380:16379
    volumes:
      - ./redis2.conf:/etc/redis.conf
      - ./data-slave1:/data
    command: redis-server /etc/redis.conf --slaveof 192.168.200.100 6379
    
  slave2:
    image: redis
    container_name: redis-slave2
    ports:
      - 6381:6381
      - 16381:16379
    volumes:
      - ./redis3.conf:/etc/redis.conf
      - ./data-slave2:/data
    command: redis-server /etc/redis.conf --slaveof 192.168.200.100 6379

4,啟動 redis

cd /usr/local/docker/redis
docker-compose up -d    # docker-compoe 啟動命令
docker ps               # 查看容器是否正常啟動

5,查看主從集群,是否啟動成功,我們先查看 主服務,redis-master

docker exec -it redis-master bash
redis-cli
auth 920619
info

出現如下信息為啟動成功

6,我們插入一個值,測試從機是否能從主機獲取數據

set id 123

7,我們進入一台從機,這里選擇 redis-slave1

docker exec -it redis-slave1 bash
redis-cli -p 6380    # 默認端口是 6379,如果不是需要用 -p 指出具體端口 
auth 920619
get id               # 如果能獲取到 在主機插入的數據,說明主從賦值也配置成功

2,創建三台 sentinel 哨兵

1,選擇並創建本地數據卷目錄

cd /usr/local/docker
mkdir sentinel
cd sentinel 
mkdir logs            # 存放日志的本地數據卷
touch sentinel1.conf  # 配置文件
touch sentinel2.conf  # 配置文件
touch sentinel3.conf  # 配置文件

2,三個配置文件的內容完全一致,但是由於啟動哨兵模式時,會重寫配置文件,所以必須創建三個

# 禁止保護模式
protected-mode no

# 端口
port 26379

# 工作目錄
dir "/data"

# 日志文件名
logfile "sentinel.log"

# 配置需要監聽的 redis 集群,並起一個名稱,這里只需要配置主機的地址即可
sentinel monitor mymaster 192.168.200.100 6379 2

# 訪問 redis 的密碼
sentinel auth-pass mymaster 920619

這里重點說一下 sentinel monitor mymaster 192.168.200.100 6379 2 配置

  1. sentinel monitor:固定關鍵字
  2. mymaster:給集群起的任意名稱,自定義,但是注意 配置訪問密碼的時候,要和這個名稱一致
  3. 192.168.200.100 6379:IP地址和端口
  4. 2:當有兩個哨兵程序認為 redis 失效之后,就下掉 該 redis 主機,重從機中新選舉主機,這里應為要啟動三台哨兵,所以配置為 2

3,docker-compose.yml 文件中寫入

version: '3.1'
services:

  sentinel1:
    image: redis
    container_name: redis-sentinel-1
    ports:
      - 26379:26379
    volumes:
      - ./sentinel1.conf:/etc/sentinel.conf
    command: redis-sentinel /etc/sentinel.conf

  sentinel2:
    image: redis
    container_name: redis-sentinel-2
    ports:
      - 26380:26379
    volumes:
      - ./sentinel2.conf:/etc/sentinel.conf
    command: redis-sentinel /etc/sentinel.conf

  sentinel3:
    image: redis
    container_name: redis-sentinel-3
    ports:
      - 26381:26379
    volumes:
      - ./sentinel3.conf:/etc/sentinel.conf
    command: redis-sentinel /etc/sentinel.conf

4,啟動 sentinel

cd /usr/local/docker/sentinel/
docker-compose up -d   # docker-compoe 啟動命令
docker ps              # 查看容器是否正常啟動

5,驗證是否監聽成功,隨便選擇一台 sentinel 進入,這里選擇 redis-sentinel-3

docker exec -it redis-sentinel-3 bash
sentinel master mymaster  # 查看主服務
sentinel slaves mymaster  # 查看從服務
info                      # 查看完整信息

3,集成到 spring-boot 項目中的配置

spring:
  redis:
    sentinel:
      # 哨兵配置文件中起的名稱
      master: mymaster      
      # 三台哨兵的連接地址            
      nodes: 192.168.200.100:26379,192.168.200.100:26380,192.168.200.100:26381
    password: 920619


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM