1. 程式人生 > 實用技巧 >Docker搭建Redis5.0偽叢集帶密碼

Docker搭建Redis5.0偽叢集帶密碼

Docker搭建Redis5.0偽叢集

前言

我的叢集檔案都在/data/docker/redis-cluster 目錄下,下面的操作都是在/data/docker/redis-cluster目錄下進行的。

環境介紹

操作平臺:騰訊雲
作業系統:CentOS Linux release 7.7.1908 (Core)
核心版本:5.4.13-1.el7.elrepo.x86_64
Docker版本資訊:19.03.6

建立預設配置檔案

建立模版配置檔案

vim /data/docker/redis-cluster/redis-cluster.tmpl

將下面的配置內容複製到redis-cluster.tmpl
注意:1. 要將下面的127.0.0.1

替換成你的外網IP; 2. 請不要手動新增密碼設定相關配置,因為那在後面不在配置檔案中了。

cluster-node-timeout 5000

# 叢集節點IP host模式為宿主機IP
cluster-announce-ip 127.0.0.1

# 叢集節點埠 7001 - 7006
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}

# 開啟 appendonly 備份模式
appendonly yes

# 每秒鐘備份
appendfsync everysec

# 對aof檔案進行壓縮時,是否執行同步操作
no-appendfsync-on-rewrite no

# 當目前aof檔案大小超過上一次重寫時的aof檔案大小的100%時會再次進行重寫
auto-aof-rewrite-percentage 100

# 重寫前AOF檔案的大小最小值 預設 64mb
auto-aof-rewrite-min-size 5120mb

# 關閉快照備份
save ""

生成配置檔案和資料存放目錄(直接執行一下命令):

for port in `seq 7001 7006`; do \
  mkdir -p ./${port}/conf \
  && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis${port}.conf \
  && mkdir -p ./${port}/data; \
done

這一段的意思就是:建立7001-7006目錄以及下面的conf和data目錄,並將redis-cluster.tmpl中的${port}替換為7001-7006分別複製到各自的conf下的redis7001.conf到redis7006.conf中。

建立網路橋接網絡卡

建立橋接網絡卡,網絡卡名叫:redis-cluster-network-bridge,網絡卡使用橋接模式

docker network create --driver bridge redis-cluster-network-bridge

建立docker-redis容器

建立7001-7006一共6個容器(直接執行命令):

for port in `seq 7001 7006`; do \
  docker run -d -it --memory=1G \
  -p ${port}:${port} -p 1${port}:1${port} \
  -v /data/docker/redis-cluster/${port}/conf/redis${port}.conf:/usr/local/etc/redis/redis.conf \
  -v /data/docker/redis-cluster/${port}/data:/data \
  --restart always --name redis-cluster-${port} --net redis-cluster-network-bridge \
  --sysctl net.core.somaxconn=1024 redis:5.0 redis-server /usr/local/etc/redis/redis.conf; \
done

這一段的意思就是:建立名稱為redis-cluster-7001到redis-cluster--7006這6個容器, 每個容器的最大記憶體為1G超過會被程序殺死 (執行時可能會出現...Memory limited without swap...這個警告,可以忽略。如不需要限制記憶體,可以去掉--memeory引數), 埠分別為7001-7006, 叢集埠分別為17001-17006, 將硬碟上的 /data/docker/redis-cluster/7001/conf/redis7001.conf 檔案對映為容器 redis-cluster-7001/usr/local/etc/redis/redis.conf 檔案 (redis-cluster-7002redis-cluster-7006 相同), 將 /data/docker/redis-cluster/7001/data 目錄對映為容器 redis-cluster-7001/data目錄(redis-cluster-7002redis-cluster-7006 相同), 容器伴隨 docker 啟動, 使用 redis-cluster-network-bridge 做為網路連線方式, 最大連線數支援1024, 使用redis:5.0映象做為容器預設啟動, 使用容器中的/usr/local/etc/redis/redis.conf檔案做為預設啟動檔案

此時可以使用docker ps -a檢視剛才建立的容器是否已啟動完成。

搭建叢集

開啟任何一個容器的bash命令列:docker exec -it redis-cluster-7001 bash

注意:1. 要將下面的127.0.0.1替換成你的外網IP;

特別注意:一定要將你的伺服器的外網7001-7006埠和17001-17006埠放開,否則下面一定是"Waiting for the cluster to join.....",當你看到一堆省略號的時候,不用等待了,做下面三件事:

  1. 關閉叢集中的所有例項 for port in `seq 7001 7006`; do docker stop redis-cluster-${port}; done ;
  2. 於此同時刪除掉每個節點檔案下的 demp.rdb和nodes.conf檔案 rm -rf 700*/data/* ;
  3. 然後開放你redis例項埠號+10000的埠,這就需要你去配置安全策略了。

    搭建叢集(直接執行命令):
redis-cli --cluster create  127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1

注意:搭建叢集只需要在其中任意一臺執行上面這條語句就可以了,不要每臺都去執行。
exit退出容器即可。

此時你就可以使用這個叢集了,但是現在是沒有密碼的,下面我們還需要新增密碼。

配置密碼

授權允許訪問每個容器對應的conf配置檔案:

for port in `seq 7001 7006`; do \
  chmod a+w /data/docker/redis-cluster/${port}/conf/redis${port}.conf; \
done

進入每一個容器的bash命令列: docker exec -it redis-cluster-7001 redis-cli -c -p 7001
執行如下命令設定每個容器中Redis密碼(設定密碼為123456):

config set masterauth 123456
config set requirepass 123456
auth 123456
config rewrite

注意:這兒是要進入redis-cluster-7001到redis-cluster-7006全部都要執行一遍的,不是隻在其中一臺執行。

刪除容器

如果你在其中任何一個步驟出錯,可以使用下面的命令刪除容器

for port in `seq 7001 7006`; do \
  docker stop redis-cluster-${port}; \
  docker rm redis-cluster-${port}; \
done