基於docker的redis4.0單機集羣搭建

 

一、安裝docker

1、查看linux內核版本

uname -a

docker 要求centos7在版本3.10之上,內核版本過低的百度一下,自己去更新

2、安裝必要的軟件包

yum install -y yum-utils device-mapper-persistent-data lvm2

3、設置yum源

yum-config-manager --add-repo 

4、查看docker版本

yum list docker-ce --showduplicates | sort -r

5、選擇你喜愛的版本下載安裝

 yum install docker-ce-17.12.1.ce

6、 啓動,並加入開機啓動

systemctl start docker
systemctl start docker

7、查看版本

docker version 

到此docker 安裝成功。

二、本文用到的一些docker基礎命令

1、docker images :查看已下載的docker鏡像

2、docker ps [options] :

  • -a :顯示所有的容器,包括未運行的。

  • -f :根據條件過濾顯示的內容。

  • --format :指定返回值的模板文件。

  • -l :顯示最近創建的容器。

  • -n :列出最近創建的n個容器。

  • --no-trunc :不截斷輸出。

  • -q :靜默模式,只顯示容器編號。

  • -s :顯示總的文件大小。

3、docker search [options] term :

  • --automated :只列出 automated build類型的鏡像;

  • --no-trunc :顯示完整的鏡像描述;

  • -s :列出收藏數不小於指定值的鏡像。

4、docker pull [options] name [:tag|@digest] :

  • -a :拉取所有 tagged 鏡像

  • --disable-content-trust :忽略鏡像的校驗,默認開啓

5、docker build [options] path| url| -

  • --build-arg=[] :設置鏡像創建時的變量;

  • --cpu-shares :設置 cpu 使用權重;

  • --cpu-period :限制 CPU CFS週期;

  • --cpu-quota :限制 CPU CFS配額;

  • --cpuset-cpus :指定使用的CPU id;

  • --cpuset-mems :指定使用的內存 id;

  • --disable-content-trust :忽略校驗,默認開啓;

  • -f :指定要使用的Dockerfile路徑;

  • --force-rm :設置鏡像過程中刪除中間容器;

  • --isolation :使用容器隔離技術;

  • --label=[] :設置鏡像使用的元數據;

  • -m :設置內存最大值;

  • --memory-swap :設置Swap的最大值爲內存+swap,"-1"表示不限swap;

  • --no-cache :創建鏡像的過程不使用緩存;

  • --pull :嘗試去更新鏡像的新版本;

  • --quiet, -q :安靜模式,成功後只輸出鏡像 ID;

  • --rm :設置鏡像成功後刪除中間容器;

  • --shm-size :設置/dev/shm的大小,默認值是64M;

  • --ulimit :Ulimit配置。

  • --tag, -t: 鏡像的名字及標籤,通常 name:tag 或者 name 格式;可以在一次構建中爲一個鏡像設置多個標籤。

  • --network: 默認 default。在構建期間設置RUN指令的網絡模式

三、下載redis4.0

docker pull redis:4.0

四、下載ruby

docker pull ruby

五、創建虛擬網卡

docker network create redis-net

六、查看redis-net虛擬網卡網關ip

docker network inspect redis-net | grep "Gateway" | grep --color=auto -P '(\d{1,3}.){3}\d{1,3}' -o

網卡網關ip是:172.18.0.1

七、創建redis配置文件(redis-cluster.tmpl) 

mkdir -p  /home/redis-cluster && cd /home/redis-cluster
vim redis-cluster.tmpl
port ${PORT}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip xxx.xxx.xxx.xx #暫時是你上面查到的網關ip值
cluster-announce-port ${PORT} 
cluster-announce-bus-port 1${PORT}
appendonly yes
protected-mode no

八、生成conf 和 data 文件目錄

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

這樣在你的/home/redis-cluster 下便有 7000~7005 總共六個文件夾

使用tree命令查詢 應該爲:

請忽略data目錄下的文件 

九、啓動redis容器

docker run -p 7000:7000 -p 17000:17000 --restart always --name redis-7000 --net redis-net --privileged=true -v /home/redis-cluster/7000/redis7000.conf:/etc/redis/redis.conf -v /home/redis-cluster/7000/data:/data -d redis:4.0 redis-server /etc/redis/redis.conf

docker run -p 7001:7001 -p 17001:17001 --restart always --name redis-7001 --net redis-net --privileged=true -v /home/redis-cluster/7001/redis7001.conf:/etc/redis/redis.conf -v /home/redis-cluster/7001/data:/data -d redis:4.0 redis-server /etc/redis/redis.conf

docker run -p 7002:7002 -p 17002:17002 --restart always --name redis-7002 --net redis-net --privileged=true -v /home/redis-cluster/7002/redis7002.conf:/etc/redis/redis.conf -v /home/redis-cluster/7002/data:/data -d redis:4.0 redis-server /etc/redis/redis.conf

docker run -p 7003:7003 -p 17003:17003 --restart always --name redis-7003 --net redis-net --privileged=true -v /home/redis-cluster/7003/redis7003.conf:/etc/redis/redis.conf -v /home/redis-cluster/7003/data:/data -d redis:4.0 redis-server /etc/redis/redis.conf

docker run -p 7004:7004 -p 17004:17004 --restart always --name redis-7004 --net redis-net --privileged=true -v /home/redis-cluster/7004/redis7004.conf:/etc/redis/redis.conf -v /home/redis-cluster/7004/data:/data -d redis:4.0 redis-server /etc/redis/redis.conf

docker run -p 7005:7005 -p 17005:17005 --restart always --name redis-7005 --net redis-net --privileged=true -v /home/redis-cluster/7005/redis7005.conf:/etc/redis/redis.conf -v /home/redis-cluster/7005/data:/data -d redis:4.0 redis-server /etc/redis/redis.conf

十、查看容器ip分配

docker network inspect redis-net

將 Containers 中的端口對應ip同步替換到你所生成的 conf文件當中。

十一、停止並刪除全部容器

sudo docker stop $(sudo docker ps -a -q) 
sudo docker rm $(sudo docker ps -a -q) 

十二、創建ruby鏡像

寫Dockerfile文件,切記文件名爲Dockerfile

FROM ruby:latest
MAINTAINER sunlin<[email protected]>
RUN gem install redis -v 4.0.0 
RUN mkdir /redis
WORKDIR /redis
ADD ./redis-trib.rb /redis/redis-trib.rb 

這裏分享一個貌似有點坑的小坑

由於當前(2020/01/02)redis最新版本已在5.0之上。redis5.0已經不採用ruby的方式配置集羣。

所以這裏下載redis 要指定版本。否則就會下載最新版的redis-trib.rb,然後會瘋狂提示你:

WARNING: redis-trib.rb is not longer available! 
You should use redis-cli ins.....
...
......等等

十三、運行生成ruby自定義鏡像

docker build -t redis-trib .

十四、運行ruby

docker run -i --rm --net redis-net redis-trib ruby redis-trib.rb create --replicas 1 172.18.0.2:7000 172.18.0.3:7001 172.18.0.4:7002 172.18.0.5:7003 172.18.0.6:7004 172.18.0.7:7005

中間會彈出確認框:

一定要輸入 yes 是yes,不是y!不是y!不是y!!!

輸入y會在接下來的某一步操作中報錯:

(error) CLUSTERDOWN Hash slot not served

十五、檢驗下集羣是否正常運行

docker exec -it redis-7000 /bin/sh
redis-cli -p 7000 -c
set sunl test1 

搭建過程中可能遇到的問題:

一、集羣部署一直卡在Waiting for the cluster to join ......

解決辦法:

1、檢查redis${port}.conf文件

#檢查
cluster-announce-port ${PORT} 
cluster-announce-bus-port 1${PORT}
#port是否與當前端口一致

若不一致則修改conf文件,然後執行:

#1、刪除redis${port} 所在上級目錄的同級目錄data下的全部文件 
rm -rf appendonly.aof dump.rdb nodes.conf
#2、分別進入每個redis容器
docker exec -it redis-port /bin/sh # port 不是命令 是你容器的端口 redis-port 是你容器的名字
#3、登錄redis
redis-cli -p port -c
#4、清除數據
flushdb
#5、退出redis
exit
#6、退出容器
exit
#7、重新啓動當前全部容器
sudo docker restart $(sudo docker ps -a -q) 

二、[ERR] Node 172.168.63.202:7001 is not empty. Either the nodealready knows other nodes (check with CLUSTER NODES) or contains some

#1、刪除redis${port} 所在上級目錄的同級目錄data下的全部文件 
rm -rf appendonly.aof dump.rdb nodes.conf
#2、分別進入每個redis容器
docker exec -it redis-port /bin/sh # port 不是命令 是你容器的端口 redis-port 是你容器的名字
#3、登錄redis
redis-cli -p port -c
#4、清除數據
flushdb
#5、退出redis
exit
#6、退出容器
exit
#7、重新啓動當前全部容器
sudo docker restart $(sudo docker ps -a -q) 

三、Creating Server TCP listening socket ****:6379: bind: Cannot assign requested address

解決辦法:刪除conf文件中的bind

 

 

文章參考:https://www.jianshu.com/p/a147ba796bc5

                  https://blog.csdn.net/qq_35470030/article/details/90042597

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章