默认已经安装好docker环境
1、拉取redis镜像
docker pull redis
2、创建基础redis容器
在/usr/local/src目录下创建redis-cluster文件夹,并创建配置文件redis-cluster.conf
cd /usr/local/src && mkdir redis-cluster && cd ./redis-cluster && touch redis-cluster.conf
在redis-cluster.conf 添加以下内容
port ${PORT}
cluster-enabled yes
protected-mode no
cluster-config-file nodes.conf
cluster-node-timeout 5000
#对外ip
cluster-announce-ip [ip]
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes
ps:注意修改 [ip],[ip]为你服务器ip。
3、创建自定义network(redis-net),用于集群节点间通信
docker network create redis-net
4、在/usr/local/src/redis-cluster下生成conf和data目录,并生成配置信息
进入/usr/local/src/redis-cluster
cd /usr/local/src/redis-cluster
生成conf和data目录,并生成配置信息
for port in `seq 6000 6005`; do
mkdir -p ./${port}/conf && PORT=${port} envsubst < ./redis-cluster.conf > ./${port}/conf/redis.conf && mkdir -p ./${port}/data;
done
ps:共生成6个文件夹,从6000到6005,每个文件夹下包含data和conf文件夹,同时conf里面有redis.conf配置文件。
5、通过redis镜像创建6个redis容器
创建启动脚本 start.sh
vim start.sh
将下列启动命令写入到脚本中
for port in `seq 6000 6005`; do
docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} -v /usr/local/src/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /usr/local/src/redis-cluster/${port}/data:/data --restart always --name redis-${port} --net redis-net --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf;
done
启动容器
sh start.sh
6、构建redis集群
查看容器id
docker ps
任意进入一个创建的Redis容器(CONTAINER ID为容器id)
docker exec -it CONTAINER ID /bin/bash
执行
cd /usr/local/bin && redis-cli --cluster create ip:6000 ip:6001 ip:6002 ip:6003 ip:6004 ip:6005 --cluster-replicas 1
ps:这里的ip为你服务器的ip,记得修改。
如果出现waiting for the Cluster to join…,那么应该是你端口没有开放完全。
正确操作应该是
ps:中途要输入 yes,确认要初始化。
7、查看redis集群节点信息
首先进入任意一个Redis容器内(CONTAINER ID为容器id)
docker exec -it CONTAINER ID /bin/bash
然后进入 redis-cli(ip为你服务器ip)
redis-cli -h ip -p 6000
查看节点消息
cluster nodes
查看集群信息
cluster info
8、测试reids集群
普通模式连接:由于 test 根据哈希槽计算,是分布在 6001服务上。所以这里会提示转到 6001。
集群模式连接:以下例子显示操作正常(首先要退出当前redis-cli,然后再执行以下代码,ip为你服务器ip)。
redis-cli -c -h ip -p 6000 set test 1
redis-cli -c -h ip -p 6000 get test
到这里,集群模式连接读写正常,集群搭建成功。
问题处理
问题1:创建集群时waiting for the Cluster to join…,
1、删除6000、6001、6002、6003、6004、6005 data下 appendonly.aof、 nodes.conf、
2、关闭系统防火墙
systemctl restart firewalld
3、重启docker
systemctl restart docker
问题2:启动container的时候出现iptables: No chain/target/match by that name
1、重启docker
systemctl restart docker