单机docker中的Redis集群

0、快速

  1. 如果嫌麻烦,环境是centos7虚拟机,可直接跳到最后,copy脚本保存为shell脚本,添加运行权限后运行。

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日。

5、快速集群脚本

#!/bin/bash
# redis 集群的快速建立脚本,2019年10月28日

path=`pwd`
#ip=`ip -4 addr |grep dynamic|awk -F'[ /]+' '{print $3}'`
#注意,需要测试这个地方是不是能获取到正确的IP值
ip=`ip -4 addr |grep -e inet.*/24|awk -F'[ /]+' '{print $3}'`
if test -z $ip;then
echo '获取IP失败.'
exit 1
else
echo '获取IP 成功,'$ip
fi

docker stop redis01 redis02 redis03 redis04 redis05 redis06 redis07 redis08
docker rm redis01 redis02 redis03 redis04 redis05 redis06 redis07 redis08

rm -rf 8001 8002 8003 8004 8005 8006 8007 8008

startport=8001
times=8

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




docker  run --restart=always -d  --net=host --name redis01   -v  $path/8001/data/:/data/ -v  $path/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  $path/8002/data/:/data/ -v  $path/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  $path/8003/data/:/data/ -v  $path/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  $path/8004/data/:/data/ -v  $path/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  $path/8005/data/:/data/ -v  $path/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  $path/8006/data/:/data/ -v  $path/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  $path/8007/data/:/data/ -v  $path/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  $path/8008/data/:/data/ -v  $path/8008/redis.conf:/usr/local/etc/redis/redis.conf  redis:latest  redis-server /usr/local/etc/redis/redis.conf

docker exec -it redis01 /bin/bash -c " echo yes|redis-cli --cluster  create $ip:8001 $ip:8002 $ip:8003 $ip:8004 $ip:8005 $ip:8006 $ip:8007 $ip:8008 --cluster-replicas 1"
echo  "如果创建集群成功,且未开放端口,则输入yes确定开放端口。"
while true;do
echo -n '是否开放相应端口?请输入正确的指令(yes or no):'
read arg 
case $arg in
Y|y|YES|yes)
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
  break;;
N|n|NO|no)
echo '你取消了添加端口操作'.
  exit;;
*)
esac
done
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值