前置准备
redis.conf 配置文件
port 6379
bind 0.0.0.0
save 60 5
protected-mode no
dbfilename dump.rdb
dir /data/redis/data
pidfile /data/redis/data/redis.pid
appendonly yes
cluster-enabled yes
cluster-config-file /data/redis/data/nodes.conf
cluster-node-timeout 5000
cluster-announce-port 6379
cluster-announce-bus-port 16379
cluster-announce-ip 192.168.10.1 #为该节点IP
脚本start_run.sh
- 初始化目录及配置文件
- 将上面的redis.conf 输入到redis0$num/redis.conf配置文件中
- 开启容器
bashDir 为创建目录
number为创建节点数量
confDir 为redis.conf 目录
startIp 为开始IP #正常IP 192.1.10.1 这里输入192.1.10
startPort 为开始端口 # 26380 则容器端口从26391开始
#!/bin/bash
bashDir=$1
number=$2
confDir=$3
startIp=$4
startPort=$5
if [ -z "$bashDir" ]; then
echo "参数bashDir为空!"
fi
if [ -z "$number" ]; then
echo "参数number为空!"
fi
if [ -z "$confDir" ]; then
echo "参数confDir为空!"
fi
if [ -z "$startIp" ]; then
echo "参数startIp为空!"
fi
if [ -z "$startPort" ]; then
echo "参数startPort为空!"
fi
cd $bashDir
echo "Cd dir --> $bashDir"
for((index=1;index<=$number;index++))
do
mkdir -p redis0$index/data redis0$index/conf
touch redis0$index/conf/redis.conf
cat /dev/null > redis0$index/conf/redis.conf
cat << EOF >redis0$index/conf/redis.conf
port 6379
bind 0.0.0.0
save 60 5
protected-mode no
dbfilename dump.rdb
dir /data/redis/data
pidfile /data/redis/data/redis.pid
appendonly yes
cluster-enabled yes
cluster-config-file /data/redis/data/nodes.conf
cluster-node-timeout 5000
cluster-announce-port 6379
cluster-announce-bus-port 16379
cluster-announce-ip $startIp.$index
EOF
echo "Create dir $bashDir/redis0$index Successfully!"
docker run -itd --net=redis_net --ip=$startIp.$index -v $bashDir/redis0$index/data:/data/redis/data \
-v $bashDir/redis0$index/conf/redis.conf:/data/redis/conf/redis.conf -p $((startPort+index)):6379 -p 1$((startPort+index)):16379 \
--name=redis0$index docker.io/redis:5.0 \
redis-server /data/redis/conf/redis.conf
echo "Start run redis docker container"
done
echo "All finish!"
更新配置文件update_conf.sh
#!/bin/bash
for n in 1 2 3 4 5 6
do
cat /dev/null > redis0$n/conf/redis.conf
cat redis.conf > redis0$n/conf/redis.conf
done
echo "End!!!! "
docker准备
创建自定义网络redis_net
配置网关和子网掩码
docker network create redis_net --gateway 172.168.0.1 --subnet=172.168.0.1/16
启动容器
使用start_run.sh 启动
sh start_run.sh /data/containers/redis 9 /data/containers/redis/redis.conf 172.168.10 26380
可以看到redis容器已经起来了
创建集群
进入到redis容器里执行!
redis-cli --cluster create --cluster-replicas 2 172.168.10.1:6379 172.168.10.2:6379 172.168.10.3:6379 172.168.10.4:6379 172.168.10.5:6379 172.168.10.6:6379 172.168.10.7:6379 172.168.10.8:6379 172.168.10.9:6379
其中172.168.10.1 - 172.168.10.9为容器的IP 不能用宿主机+映射端口!
进入redis容器执行 redis-cli -c
可以看到一共有3个集群 每个集群为1主2从
到此已经搭建完成!
测试
执行 redis-cli -c
set个数据试试
可以看到将该值存到了172.168.10.3主节点上
退出集群模式,直接连另外一个主节点 172.168.10.1 看看是否有数据
可以看到提示到172.168.10.3 上获取数据
试试高可用能力
1.将172.168.10.3主节点停掉
2.可以看到172.168.10.3主节点的从节点172.168.10.9 变成了主节点。说明高可用能力没问题
至此完成了!
备注:
redis启动命令
docker run -itd --net=redis_net --ip=172.168.10.2 -v /data/containers/redis/redis02/data:/data/redis/data -v /data/containers/redis/redis02/conf/redis.conf:/data/redis/conf/redis.conf -p 26380:6379 --name=redis02 docker.io/redis:5.0 redis-server /data/redis/conf/redis.conf
使用awk获取redis容器的所有端口
docker ps|grep redis |awk '{print $10}' |awk -F':' '{print $2}'|awk -F'->' '{print $1}'