單機docker中的Redis集羣

1、準備條件

  1. 使用vmware15安裝centos7
  2. 虛擬機上安裝了docker,yum install docker
  3. 從yum中直接拉取最新官方redis鏡像,yum pull redis
  4. centos7中自帶防火牆工具firewall,檢查是否啓動並啓動
  5. 至少得簡單知道redis的集羣原理和配置流程

2、開始之前的說明

  1. reids集羣至少需要三臺master節點和對應的slave節點,這裏一共創建8臺redis節點,四主四副。
  2. 使用主機的端口從8001-8008,即 8001 8002 8003 8004 8005 8006 8007 8008,這八個,以及用於redis集羣通信的18001-18008端口,一共16個端口。
  3. 假設當前的目錄位置是/home/redis,如果沒有,則創建對應目錄即可

2、開始

  1. 開放端口。命令,firewall-cmd --zone=public --permanent --add-port=xxx/tcp ,將xxx替換爲那16個端口,執行一遍,最後執行 firewall-cmd --reload,可以使用 firewall-cmd --list-all 查看是否開放端口成功。
  2. 爲每個redis節點創建一個文件目錄,用於存放它的配置文件和數據。目錄名就按照端口命名。爲了簡化創建目錄以及它的配置文件。可以將以下代碼保存爲bash腳本,添加運行權限,這裏命名爲 redis.conf.sh:
startport=$1
times=$2

while(( $times>0 ));
do
mkdir $startport
cd $startport
touch redis.conf
echo "port $startport" >> redis.conf
echo "cluster-enabled yes">>redis.conf
echo "cluster-config-file nodes.conf">>redis.conf
echo "cluster-node-timeout 5000">>redis.conf
echo "appendonly yes">>redis.conf
cd ..
let "times--"
let "startport++"
done

  1. 現在所在的目錄是/home/redis,運行腳本,./redis.conf.sh 8001 8,第一個參數是集羣redis的起始端口,第二個參數是累加命名創建多少個目錄,之後會在當前目錄下生成8個文件,文件名從8001到8008,並會在對應目錄下生成redis.conf文件,這是每個redis節點的集羣配置文件,對配置文件的配置不明白可以去官網查詢。這裏是最簡單配置。
  2. 使用配置文件啓動8個redis,直接複製以下所有命令執行即可,確保你現在的目錄是/home/redis,docker運行在–net=host,這是必須的,這可使得JAVA中的JedisCluster正常工作:
docker  run --restart=always -d  --net=host --name redis01   -v  /home/redis/8001/data/:/data/ -v  /home/redis/8001/redis.conf:/usr/local/etc/redis/redis.conf  redis:latest  redis-server /usr/local/etc/redis/redis.conf&&
docker  run --restart=always -d  --net=host --name redis02   -v  /home/redis/8002/data/:/data/ -v  /home/redis/8002/redis.conf:/usr/local/etc/redis/redis.conf  redis:latest  redis-server /usr/local/etc/redis/redis.conf&&
docker  run --restart=always -d  --net=host --name redis03   -v  /home/redis/8003/data/:/data/ -v  /home/redis/8003/redis.conf:/usr/local/etc/redis/redis.conf  redis:latest  redis-server /usr/local/etc/redis/redis.conf&&
docker  run --restart=always -d  --net=host --name redis04   -v  /home/redis/8004/data/:/data/ -v  /home/redis/8004/redis.conf:/usr/local/etc/redis/redis.conf  redis:latest  redis-server /usr/local/etc/redis/redis.conf&&
docker  run --restart=always -d  --net=host --name redis05   -v  /home/redis/8005/data/:/data/ -v  /home/redis/8005/redis.conf:/usr/local/etc/redis/redis.conf  redis:latest  redis-server /usr/local/etc/redis/redis.conf&&
docker  run --restart=always -d  --net=host --name redis06   -v  /home/redis/8006/data/:/data/ -v  /home/redis/8006/redis.conf:/usr/local/etc/redis/redis.conf  redis:latest  redis-server /usr/local/etc/redis/redis.conf&&
docker  run --restart=always -d  --net=host --name redis07   -v  /home/redis/8007/data/:/data/ -v  /home/redis/8007/redis.conf:/usr/local/etc/redis/redis.conf  redis:latest  redis-server /usr/local/etc/redis/redis.conf&&
docker  run --restart=always -d  --net=host --name redis08   -v  /home/redis/8008/data/:/data/ -v  /home/redis/8008/redis.conf:/usr/local/etc/redis/redis.conf  redis:latest  redis-server /usr/local/etc/redis/redis.conf&&\docker ps -n8
  1. 當全部啓動成功,執行下面的命令進入到redis01容器中,這個容器是8個之一即可:
docker exec -it redis01 /bin/bash
  1. 將它們加入到一個集羣中,承接上面的命令,在容器中執行以下命令,注意,將xxx替換成docker所在主機的ip地址,會有提示是否自動分配solt,直接確定即可,當最後join成功,則完成集羣搭建。如果一直卡在join階段,那是集羣通信失敗,和網絡有關:
redis-cli --cluster create xxx:8001 xxx:8002 xxx:8003 xxx:8004 xxx:8005 xxx:8006 xxx:8007 xxx:8008 --cluster-replicas 1

3、其他可能會用到的命令

當前目錄 /home/redis

  1. 停止並刪除所有的redis容器
docker stop redis01 redis02 redis03 redis04 redis05 redis06 redis07 redis08  && docker rm redis01 redis02 redis03 redis04 redis05 redis06 redis07 redis08 && docker ps -n8
  1. 刪除由redis.conf.sh腳本創建的目錄
rm -rf 8001 8002 8003 8004 8005 8006 8007 8008
  1. 批量開放防火牆端口
firewall-cmd --zone=public --permanent --add-port=18001/tcp  --add-port=8001/tcp --add-port=8002/tcp --add-port=18002/tcp --add-port=8003/tcp --add-port=18003/tcp \
 --add-port=18004/tcp  --add-port=8004/tcp --add-port=8005/tcp --add-port=18005/tcp --add-port=8006/tcp --add-port=18006/tcp -add-port=8007/tcp --add-port=18007/tcp -add-port=8008/tcp --add-port=18008/tcp &&
firewall-cmd --reload

4、最後的話

  1. redis集羣的加入階段,即運行 redis-cli --cluster create 命令的時候,後面的參數指定的是每個節點的ip和端口,這裏需要確保每個節點在其本機上能通過這些ip+端口相互訪問,並且指定的端口號加10000的端口也能相互訪問,才能加入集羣成功,否則就會一直卡在加入階段。所以在這個地方需要指定每個節點的具體ip,如果是局域網ip,就需要保證所有ip在同一局域網,這裏可以用docker命令創建虛擬網卡,並在啓動容器時候指定ip和端口,可以保證節點加入集羣成功,但是這可能會使得 JAVA中的JedisCluster工具無法工作,其原因就是JedisCluster會獲取集羣節點加入集羣時候的被指定的ip和端口來作爲集羣的訪問地址,如果這些ip與JedisCluster不在一個局域網,那JedisCluster就會訪問這個集羣失敗,所以在這裏使用 --net=host模式,只要docker所在主機能被外網訪問,JedisCluster就可以正常工作。
  2. 建議使用docker-compose來管理集羣。
  3. 上面的步驟在寫完後未驗證成功性,內容是不久前搭建集羣成功後的簡單記錄,可能會在按照步驟搭建集羣失敗,請多多思考與包涵。日期:2019年10月25日。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章