redis 三主六从高可用dockerswarm高级版(不固定ip)

redis集群(cluster)笔记

redis 三主三从高可用集群docker swarm

redis 三主六从高可用docker(不固定ip)

redis 三主六从高可用dockerswarm高级版(不固定ip)

此博客解决,redis加入集群后,是用于停掉后重启,将nodes.conf中的旧的Ip替换为新的IP,从而达到不会因为IP变化导致集群无法正常使用,以及使用docker stack 启动多个副本 ,自动化脚本加入集群

跨主机安装rediscluster集群,本文采用swarm的方式,使用同一个网络,通过对挂载目录的使配置文件互相同步,从而让redis集群失败自重启达到集群的高可用。

1.环境准备

  • docker
  • docker-compose
  • swarm集群
  • nfs(或者挂载目录自动同步信息)
  • 安装文件

1.1 swarm环境安装

主机 IP
node1 192.168.56.100
node2 192.168.56.101
node3 192.168.56.102

在三台分别执行 开放防火墙:

sh 复制代码
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.100" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.101" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.56.102" accept"
firewall-cmd --reload
firewall-cmd --list-all
systemctl restart docker

1.2 在3台主机上配置swarm

  • 在node1上执行:
sh 复制代码
docker swarm init --advertise-addr 192.168.56.100
docker swarm join-token manager

返回类似以下内容:

sh 复制代码
docker swarm join --token SWMTKN-1-614xi9dvksycykobgifxb4pgopc1wwgczwqct5wqkq8zao6tmx-0ds4jj3ozclrr2wukcaoakxso 192.168.56.100:2377
  • 在node2、node3上执行上面的返回结果:
sh 复制代码
docker swarm join --token SWMTKN-1-2c2xopn2rld8oltcof24sue370681ijhbo3bwcqarjlhq9lkea-2g53o5qn2anre4j9puv4hecrn 192.168.0.101:2377

1.3 创建swarm网络

在node1上执行以下命令:

text 复制代码
docker network create -d overlay --attachable scsdm-net

1.4 查看node

sh 复制代码
docker node ls

2.安装准备

2.1 安装前准备

/home/redis 目录在三台机器互相同步监听可以查看这个文档进行部署,如果使用k3s,k8s及其他编排方式,使用同一个挂载目录就不进行文件同步

2.2 redis相关文件准备

sh 复制代码
filePath="/home/redis"
mkdir -p ${filePath}/data
cd $filePath
cat > ${filePath}/docker-stack-redis.yml << EOF
version: '3'

networks:
  scsdm-net:
    external: true 

services:
  redis-cluster:
    image: redis:6.2.4-alpine
    container_name: "redis-cluster{{.Task.Slot}}"
    hostname: "redis-cluster"
    environment:
      - MY_TASK_SLOT={{.Task.Slot}}
    volumes:
      - "$filePath/data:/data"
      - "$filePath/redisStart.sh:/redis/redisStart.sh"
    command: "sh /redis/redisStart.sh"
    restart: always
    privileged: true
    networks:
     - scsdm-net
    deploy:
      replicas: 9
EOF

cat > ${filePath}/redisStart.sh << EOF
#!/bin/sh

CURRENT_DIR=\$(
   cd "\$(dirname "\$0")"
   pwd
)
nowDate=\$(date "+%Y%m%d%H%M%S")
logFileName="redisStart_"\$nowDate.log
touch \$CURRENT_DIR/\${logFileName}
# 日志函数
log(){
  echo "["\$(date "+%Y-%m-%d %H:%M:%S")"]"\$1 | tee -a \$CURRENT_DIR/\$logFileName
}

# 创建当前的
mkdir -p /data/\${MY_TASK_SLOT}
redisConfPath="/etc/redis.conf"
echo "" >> \$redisConfPath
echo "dir /data/\${MY_TASK_SLOT}" >> \$redisConfPath
echo "port 6379" >> \$redisConfPath
echo "masterauth '123456'" >> \$redisConfPath
echo "requirepass '123456'" >> \$redisConfPath
echo "cluster-enabled yes" >> \$redisConfPath
echo "cluster-config-file nodes.conf" >> \$redisConfPath
echo "cluster-node-timeout 5000" >> \$redisConfPath
echo "# 禁用AOF" >> \$redisConfPath
echo "appendonly no" >> \$redisConfPath

# 通过ifconfig命令获取IP地址
IP=\$(ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{print \$1}')
log "Container IP Address is: \${IP}"
CLUSTER_CONFIG="/data/\${MY_TASK_SLOT}/nodes.conf"

echo "\$IP" > /data/\${MY_TASK_SLOT}/ip

if [ -f \${CLUSTER_CONFIG} ]; then
    if [ -z "\${IP}" ]; then
       log "Unable to determine Pod IP address!"
       exit 1
    fi     
    log "Updating my IP to \${IP} in \${CLUSTER_CONFIG}"
    sed -i -e "/myself/s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/\${IP}/g" \${CLUSTER_CONFIG}
fi

redis-server /etc/redis.conf 

EOF




cat > ${filePath}/join-redis-cluster.sh << EOF
#!/bin/bash
CURRENT_DIR=\$(
   cd "\$(dirname "\$0")"
   pwd
)
# 指定要遍历的目录
directory="\${CURRENT_DIR}/data"

# 指定要查找的文件名
filename="ip"
temFileName="ipTemp.txt"
rm -rf \$temFileName
find "\$directory" -type f -name "\$filename" | while read -r file
do
	echo -n "\$(cat \$file):6379 " >> \$temFileName

done

REDIS_CLUSTER_CMD="redis-cli --cluster create "\$(cat \$temFileName)" --cluster-replicas 2 -a '123456'"
rm -rf \$temFileName

# 获取容器名称
REDIS_CONTAINER_NAME=\$(docker ps -a | grep "redis-cluster" | awk '{print \$1}'| head -n 1 )

# 生成 redis-cli 命令
echo "生成 redis-cli 命令:\$REDIS_CLUSTER_CMD"

# 进入 Redis 容器并执行命令
DOCKER_EXEC_CMD="echo 'yes' | docker exec -i \$REDIS_CONTAINER_NAME sh -c \"\$REDIS_CLUSTER_CMD\""
echo "Executing Docker Exec Command:"
echo "\$DOCKER_EXEC_CMD"
echo 'yes' | docker exec -i \$REDIS_CONTAINER_NAME sh -c "\$REDIS_CLUSTER_CMD"

echo "查询节点情况"
echo "docker exec -it \$REDIS_CONTAINER_NAME sh -c \"redis-cli -c -a '123456'\""
echo "cluster nodes"
echo "测试其他连接情况"
echo "docker run -it --rm --net=scsdm-net redis:6.2.4-alpine sh -c \"redis-cli -h redis-cluster -c -a '123456'\""


EOF


cat > ${filePath}/startRedis.sh << EOF
#!/bin/bash
docker stack deploy -c docker-stack-redis.yml redis
EOF

cat > ${filePath}/stopReids.sh << EOF
#!/bin/bash
docker stack rm redis
EOF

cat > ${filePath}/restartRedis.sh << EOF
#!/bin/bash
# rm
docker stack rm redis
# start
docker stack deploy -c docker-stack-redis.yml redis
EOF

cat > ${filePath}/showRedisStatus.sh << EOF
#!/bin/bash
# show status
docker stack ps redis --no-trunc
EOF

3. 启动 redis集群

进入 node1服务器

shell 复制代码
cd ${filePath}
bash startRedis.sh
ls data

当出现下面文件后执行命令加入集群

sh 复制代码
bash join-redis-cluster.sh


4. springboot 配置集群

sh 复制代码
springboot 配置集群


spring.redis.port = 6379
spring.redis.password = 123456
spring.redis.cluster.nodes[0] = redis-cluster:6379

5.测试用例

5.1 用例1

sh 复制代码
设置一个值
将对应值的节点关闭
查看集群是否全部启动正常
查看设置的参数

结果:
master改变了,服务自动创建了新的节点自动加入



5.2 用例2

sh 复制代码
重启redis 查看集群是否正常
全部重启暂时不正常,可以重新部署

5.3 用例3

sh 复制代码
使用同一个网络连接集群,查看值
docker run -it --rm --net=scsdm-net redis:6.2.4-alpine sh -c "redis-cli -h redis-cluster -c -a '123456'"
相关推荐
せいしゅん青春之我6 分钟前
【JavaEE初阶】网络经典面试题小小结
java·网络·笔记·网络协议·tcp/ip·java-ee
不见长安在28 分钟前
mysql线上主从集群设置
数据库·mysql
tiging30 分钟前
mysql 如何让事件执行
数据库·mysql
siriuuus39 分钟前
MySQL 数据备份
数据库·mysql·备份
姚远Oracle ACE39 分钟前
Oracle AWR 报告中的SQL来自哪儿?
数据库·sql·oracle
熊文豪42 分钟前
KingbaseES数据库性能调优工具全面解析
数据库·kingbasees·金仓数据库·电科金仓
喜欢踢足球的老罗43 分钟前
零依赖一键多端!用纯 Node.js 打造“IP 可访、角色隔离”的轻量化 Mock 服务器
服务器·tcp/ip·node.js
冠希陈、1 小时前
PHP7.4.33 安装sqlsrv扩展
数据库
光影34151 小时前
专利撰写与申请核心要点简报
前端·数据库·php
心灵宝贝1 小时前
申威ky10架构安装MongoDB 4.0.1(rpm包:mongodb-4.0.1-8.ky10.sw_64.rpm)详细步骤
数据库·mongodb·架构