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 配置
- sentinel monitor:固定關鍵字
- mymaster:給集群起的任意名稱,自定義,但是注意 配置訪問密碼的時候,要和這個名稱一致
- 192.168.200.100 6379:IP地址和端口
- 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