├── README.md ├── imgs ├── install.gif ├── run.png ├── shell.png ├── show.gif ├── su.png └── success.png ├── initup.sh ├── redis-cluster.tmpl ├── shutdown.sh └── startup.sh /README.md: -------------------------------------------------------------------------------- 1 | # docker 环境下的redis cluster 集群搭建 2 | 3 | ### 注意事项 4 | 5 | - 当某个master节点宕机以后,slave变为主节点需要几秒钟的时候,在这段时间,会报一个错误 `(error) CLUSTERDOWN The cluster is down` 6 | 只要等一会再去连接就行了。 7 | 8 | 9 | 10 | ### 1.redis镜像下载,这里使用的是redis 5.0.0的版本 11 | 12 | ``` 13 | docker pull redis:5.0.0 14 | ``` 15 | 16 | ### 2.创建搭建集群所需的conf文件,这里暂时命名为`redis-cluster.tmpl` 17 | 18 | ```shell 19 | port ${PORT} #redis端口 20 | protected-mode no #关闭保护模式,允许外网访问 21 | cluster-enabled yes # 开启集群模式 22 | cluster-config-file nodes.conf #集群配置名 23 | cluster-node-timeout 5000 #超时时间 24 | cluster-announce-ip ${IP} #搭建集群主机的外网ip 25 | cluster-announce-port ${PORT} #节点映射端口 26 | cluster-announce-bus-port 1${PORT} #节点总线端 27 | appendonly yes #持久化模式 28 | ``` 29 | 30 | ### 3.创建集群和节点运行所需文件夹和文件 31 | 32 | ```shell 33 | #这里是搭建集群的主机的外网ip 34 | ip=xxx.xxx.xx.xx 35 | #集群文件目录 36 | redisdir="/home/redis-cluster" 37 | 38 | #为6个节点分别创建文件夹7000-7005,data文件夹和conf文件,这里会将`redis-cluster.tmpl`中的${IP}和${PORT}替换成相应的值 39 | for port in `seq 7000 7005`; do \ 40 | mkdir -p ${redisdir}/${port}/conf \ 41 | && PORT=${port} IP=${ip} envsubst < ./redis-cluster.tmpl > ${redisdir}/${port}/conf/redis.conf \ 42 | && mkdir -p ${redisdir}/${port}/data; \ 43 | done 44 | 45 | ``` 46 | 47 | ### 4.创建docker自定义网桥 48 | 49 | ```shell 50 | 51 | docker network create redis-net 52 | 53 | #查看docker所有的网桥 54 | 55 | docker network ls 56 | 57 | ``` 58 | 59 | ### 5.运行redis各节点容器 60 | 61 | ```shell 62 | 63 | #定义一个初始值变量,用于叠加ip 64 | execsh='/usr/local/bin/redis-cli --cluster create ' 65 | #创建redis运行容器 66 | for port in `seq 7000 7005`; do \ 67 | docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} \ 68 | -v ${redisdir}/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \ 69 | -v ${redisdir}/${port}/data:/data \ 70 | --restart always --name redis-${port} --net redis-net \ 71 | --sysctl net.core.somaxconn=1024 redis:${version} redis-server /usr/local/etc/redis/redis.conf; \ 72 | #获取docker分配的ip 73 | execsh=${execsh}`docker inspect redis-${port} | grep "IPAddress" | grep --color=auto -P '(\d{1,3}.){3}\d{1,3}' -o`:${port}' ' 74 | done 75 | 76 | execsh=${execsh}'--cluster-replicas 1' 77 | 78 | #将拼接好的命令打印到控制台,后面进入到redis容器中需要用到 79 | echo ${execsh} 80 | 81 | ``` 82 | 83 | ![运行img](https://github.com/niezhiliang/docker-redis-colony/blob/master/imgs/shell.png) 84 | 85 | ![运行img](https://github.com/niezhiliang/docker-redis-colony/blob/master/imgs/run.png) 86 | 87 | ### 6.通过命令进入redis-7000的容器内部,并输入创建容器时打印出的shell命令 88 | 89 | ```shell 90 | 91 | docker exec -it redis-7000 bash 92 | 93 | /usr/local/bin/redis-cli --cluster create 172.22.0.2:7000 172.22.0.3:7001 172.22.0.4:7002 172.22.0.5:7003 172.22.0.6:7004 172.22.0.7:7005 --cluster-replicas 1 94 | 95 | 96 | ``` 97 | 98 | ![搭建成功图片](https://github.com/niezhiliang/docker-redis-colony/blob/master/imgs/success.png) 99 | 100 | ### 7.进入容器中的redis,校验搭建是否成功 101 | 102 | ```shell 103 | 104 | redis-cli -p 7000 -c 105 | 106 | ``` 107 | 108 | ### 8.确保搭建成功,我们先退出容器,并把刚才跳转到的节点容器关掉,再进入redis-7000容器,看redis是否还能正常保存获取数据 109 | 110 | ```shell 111 | #关闭7002节点 112 | docker rm redis-7002 -f 113 | 114 | ``` 115 | 116 | ![搭建成功图片](https://github.com/niezhiliang/docker-redis-colony/blob/master/imgs/su.png) 117 | 118 | 119 | ## 至此我们redis集群环境成功搭建完成,作为一个患有懒人综合征的来说,这么多步骤太烦太烦,就不能输入一两条命令就给我安装完嘛。 哈哈哈,为了偷懒,我把这些命令写成了一个脚本,只需要输入几条命令,就能搭建完成 120 | 121 | > 特别注意:`修改initup.sh中ip=xxxxx 将其改为你服务器的外网ip,内网ip外网会连不上` 122 | 123 | - 拉取脚本项目 124 | 125 | ``` 126 | 127 | git clone https://github.com/niezhiliang/docker-redis-colony 128 | 129 | cd docker-redis-colony 130 | 131 | //执行初始换脚本(这个就是在第一次搭建时候运行,如果搭建成功后,千万别执行该脚本,会发生什么我也不知道) 132 | 133 | ./initup.sh 134 | 135 | //脚本执行过程中会自动进入redis-7000容器中,在dat目录下会有个exe.sh脚本,这个是我将docker容器运行时的命令输入到了这个脚本中,我们只要执行就好 136 | 137 | ./exe.sh 138 | 139 | //执行完后,会让我们输入yes or no 我们输入yes嘛输入完耐心等待吧,不出意外,最后几行命令是绿的就成功啦。绿绿更健康 哈哈😝 140 | 141 | ``` 142 | - redis集群关闭脚本 143 | ```shell 144 | 145 | ./shutup.sh 146 | 147 | ``` 148 | 149 | - 集群搭建成功后,`以后启动集群都只需启动startup脚本,签完不要手贱去执行initup.sh` 150 | 151 | ```shell 152 | 153 | ./startup.sh 154 | 155 | ``` 156 | 157 | 项目源码:https://github.com/niezhiliang/docker-redis-colony 158 | 159 | 160 | #### 集群安装gif 161 | 162 | ![脚本演示gif](https://github.com/niezhiliang/docker-redis-colony/blob/master/imgs/install.gif) 163 | 164 | 165 | #### 集群功能实现gif 166 | 167 | ![脚本演示gif](https://github.com/niezhiliang/docker-redis-colony/blob/master/imgs/show.gif) 168 | 169 | 170 | -------------------------------------------------------------------------------- /imgs/install.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niezhiliang/docker-redis-colony/5706cfcff5b1278113d1b7dc3e57e5dabbd950ed/imgs/install.gif -------------------------------------------------------------------------------- /imgs/run.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niezhiliang/docker-redis-colony/5706cfcff5b1278113d1b7dc3e57e5dabbd950ed/imgs/run.png -------------------------------------------------------------------------------- /imgs/shell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niezhiliang/docker-redis-colony/5706cfcff5b1278113d1b7dc3e57e5dabbd950ed/imgs/shell.png -------------------------------------------------------------------------------- /imgs/show.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niezhiliang/docker-redis-colony/5706cfcff5b1278113d1b7dc3e57e5dabbd950ed/imgs/show.gif -------------------------------------------------------------------------------- /imgs/su.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niezhiliang/docker-redis-colony/5706cfcff5b1278113d1b7dc3e57e5dabbd950ed/imgs/su.png -------------------------------------------------------------------------------- /imgs/success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niezhiliang/docker-redis-colony/5706cfcff5b1278113d1b7dc3e57e5dabbd950ed/imgs/success.png -------------------------------------------------------------------------------- /initup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | #服务器内网ip 4 | ip="172.16.252.126" 5 | #redis镜像版本 6 | version="5.0.0" 7 | 8 | #集群文件防止目录 9 | redisdir="/home/redis-cluster" 10 | 11 | #判断问加减是否存在 如果存在删除后创建,不存在创建 12 | rm -f -r ${redisdir} 13 | # if [ -f "${redisdir}"} ];then 14 | # rm -f -r ${redisdir} 15 | # fi 16 | mkdir -p ${redisdir} 17 | 18 | echo "构建redis集群目录..." 19 | 20 | for port in `seq 7000 7005`; do \ 21 | mkdir -p ${redisdir}/${port}/conf \ 22 | && PORT=${port} IP=${ip} envsubst < ./redis-cluster.tmpl > ${redisdir}/${port}/conf/redis.conf \ 23 | && mkdir -p ${redisdir}/${port}/data; \ 24 | done 25 | 26 | echo "拉取redis:${version}镜像..." 27 | 28 | #拉取redis镜像 29 | docker pull redis:${version} 30 | 31 | #为redis集群创建docker网桥 32 | docker network create redis-net 33 | 34 | echo "创建网桥..." 35 | #查看docker所有的网桥 36 | docker network ls 37 | 38 | echo "创建并运行redis集群容器..." 39 | 40 | #定义一个初始值变量,用于叠加ip 41 | execsh='/usr/local/bin/redis-cli --cluster create ' 42 | #创建redis运行容器 43 | for port in `seq 7000 7005`; do \ 44 | docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} \ 45 | -v ${redisdir}/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \ 46 | -v ${redisdir}/${port}/data:/data \ 47 | --restart always --name redis-${port} --net redis-net \ 48 | --sysctl net.core.somaxconn=1024 redis:${version} redis-server /usr/local/etc/redis/redis.conf; \ 49 | #获取docker分配的ip 50 | execsh=${execsh}`docker inspect redis-${port} | grep "IPAddress" | grep --color=auto -P '(\d{1,3}.){3}\d{1,3}' -o`:${port}' ' 51 | done 52 | 53 | execsh=${execsh}'--cluster-replicas 1' 54 | 55 | #将拼接好的命令打印到控制台 56 | echo ${execsh} 57 | 58 | #将控制台的打印命令写入exe.sh脚本,docker容器直接执行就好 59 | echo "${execsh}" > ${redisdir}/7000/data/exe.sh 60 | 61 | #给exe.sh权限 62 | chmod 777 ${redisdir}/7000/data/exe.sh 63 | 64 | #进入第一个redis容器内 65 | docker exec -it redis-7000 bash 66 | 67 | -------------------------------------------------------------------------------- /redis-cluster.tmpl: -------------------------------------------------------------------------------- 1 | port ${PORT} 2 | protected-mode no 3 | cluster-enabled yes 4 | cluster-config-file nodes.conf 5 | cluster-node-timeout 5000 6 | cluster-announce-ip ${IP} 7 | cluster-announce-port ${PORT} 8 | cluster-announce-bus-port 1${PORT} 9 | appendonly yes 10 | 11 | -------------------------------------------------------------------------------- /shutdown.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo '强制停止redis集群容器...' 4 | for port in `seq 7000 7005`; do \ 5 | docker rm redis-${port} -f 6 | done 7 | -------------------------------------------------------------------------------- /startup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | #集群文件防止目录 4 | redisdir="/home/redis-cluster" 5 | #redis镜像版本 6 | version="5.0.0" 7 | 8 | for port in `seq 7000 7005`; do \ 9 | docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} \ 10 | -v ${redisdir}/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \ 11 | -v ${redisdir}/${port}/data:/data \ 12 | --restart always --name redis-${port} --net redis-net \ 13 | --sysctl net.core.somaxconn=1024 redis:${version} redis-server /usr/local/etc/redis/redis.conf; \ 14 | done 15 | --------------------------------------------------------------------------------