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

redis集群(cluster)笔记

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

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

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

跨主机安装rediscluster集群,本文采用swarm的方式,使用同一个网络,然后分别在对应的机器启动

1.环境准备

  • docker
  • docker-compose
  • swarm集群
  • 安装文件

1.1 swarm环境安装

主机IP
node1192.168.56.100
node2192.168.56.101
node3192.168.56.102

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

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上执行:
docker swarm init --advertise-addr 192.168.56.100
docker swarm join-token manager

返回类似以下内容:

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

1.3 创建swarm网络

在node1上执行以下命令:

docker network create -d overlay --attachable redis-net

1.4 查看node

docker node ls

在这里插入图片描述

2.安装文件准备

2.1 redisnode1文件

filePath="/home/redis/redisnode1"
mkdir -p $filePath
cd $filePath
cat > ${filePath}/docker-compose.yml << EOF
version: '3'networks:redis-net:external: true services:redis1:image: redis:6.0-alpinehostname: redis1container_name: redis1volumes:- "\$PWD/redis1/data:/data"- "\$PWD/redis.conf:/etc/redis.conf"- "\$PWD/redisStart.sh:/redis/redisStart.sh"command: "sh /redis/redisStart.sh"restart: alwaysprivileged: truenetworks:- redis-netredis2:image: redis:6.0-alpinehostname: redis2container_name: redis2volumes:- "\$PWD/redis2/data:/data"- "\$PWD/redis.conf:/etc/redis.conf"- "\$PWD/redisStart.sh:/redis/redisStart.sh"command: "sh /redis/redisStart.sh"restart: alwaysprivileged: truenetworks:- redis-netredis3:image: redis:6.0-alpinehostname: redis3container_name: redis3volumes:- "\$PWD/redis3/data:/data"- "\$PWD/redis.conf:/etc/redis.conf"- "\$PWD/redisStart.sh:/redis/redisStart.sh"command: "sh /redis/redisStart.sh"restart: alwaysprivileged: truenetworks:- redis-net
EOFcat > ${filePath}/redis.conf << EOF
port 6379
masterauth '123456' 
requirepass '123456'
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOFcat > ${filePath}/redisStart.sh << EOF
#!/bin/shCURRENT_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
}# 通过ifconfig命令获取IP地址
IP=\$(ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{print \$1}')
log "Container IP Address is: \${IP}"
CLUSTER_CONFIG="/data/nodes.conf"if [ -f \${CLUSTER_CONFIG} ]; thenif [ -z "\${IP}" ]; thenlog "Unable to determine IP address!"exit 1fi     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}
firedis-server /etc/redis.conf EOFcat > ${filePath}/redisSalveTem.sh << EOF
#!/bin/bash# redis1 容器内执行集群创建# redis1  redis4  redis7
# redis2  redis5  redis8
# redis3  redis6  redis9
# 1 5 9
# 4 2 8
# 7 3 6
# 进入 redis1 容器
docker exec -it redis1 /bin/sh
# 指定主从节点交叉分布
# redis1 容器内执行集群创建
# 创建主节点
redis-cli --cluster create REDIS1:6379 REDIS4:6379 REDIS7:6379 -a '123456'# 确认
yes# 指定主从节点交叉分布redis-cli --cluster add-node REDIS5:6379 REDIS1:6379 --cluster-slave -a '123456'
redis-cli --cluster add-node REDIS9:6379 REDIS1:6379 --cluster-slave -a '123456'
redis-cli --cluster add-node REDIS2:6379 REDIS4:6379 --cluster-slave -a '123456'
redis-cli --cluster add-node REDIS8:6379 REDIS4:6379 --cluster-slave -a '123456'
redis-cli --cluster add-node REDIS3:6379 REDIS7:6379 --cluster-slave -a '123456'
redis-cli --cluster add-node REDIS6:6379 REDIS7:6379 --cluster-slave -a '123456'# 检查集群状态"
redis-cli -c -a '123456'
# 查看集群节点 9个
CLUSTER NODES# 退出 redis
exit# 退出容器
exitEOFcat > ${filePath}/redisSetIp.sh << EOF
#!/bin/bash
\cp redisSalveTem.sh redisSalve.shfunction getIp(){redis1=\$(docker exec -it redis1 sh -c "ping \$1 -c 1 | sed '1{s/[^(]*(//;s/).*//;q}'")echo "\${redis1}"
}echo "redis1=\$(getIp redis1)"
echo "redis2=\$(getIp redis2)"
echo "redis3=\$(getIp redis3)"
echo "redis4=\$(getIp redis4)"
echo "redis5=\$(getIp redis5)"
echo "redis6=\$(getIp redis6)"
echo "redis7=\$(getIp redis7)"
echo "redis8=\$(getIp redis8)"
echo "redis9=\$(getIp redis9)"echo 'sed -i "s#REDIS1#\$redis1#g" redisSalve.sh'
echo 'sed -i "s#REDIS2#\$redis2#g" redisSalve.sh'
echo 'sed -i "s#REDIS3#\$redis3#g" redisSalve.sh'
echo 'sed -i "s#REDIS4#\$redis4#g" redisSalve.sh'
echo 'sed -i "s#REDIS5#\$redis5#g" redisSalve.sh'
echo 'sed -i "s#REDIS6#\$redis6#g" redisSalve.sh'
echo 'sed -i "s#REDIS7#\$redis7#g" redisSalve.sh'
echo 'sed -i "s#REDIS8#\$redis8#g" redisSalve.sh'
echo 'sed -i "s#REDIS9#\$redis9#g" redisSalve.sh'
echo 'cat redisSalve.sh'
EOF

2.2 redisnode2文件

filePath="/home/redis/redisnode2"
mkdir -p $filePath
cat > ${filePath}/docker-compose.yml << EOF
version: '3'networks:redis-net:external: true services:redis4:image: redis:6.0-alpinehostname: redis4container_name: redis4volumes:- "\$PWD/redis4/data:/data"- "\$PWD/redis.conf:/etc/redis.conf"- "\$PWD/redisStart.sh:/redis/redisStart.sh"command: "sh /redis/redisStart.sh"restart: alwaysprivileged: truenetworks:- redis-netredis5:image: redis:6.0-alpinehostname: redis5container_name: redis5volumes:- "\$PWD/redis5/data:/data"- "\$PWD/redis.conf:/etc/redis.conf"- "\$PWD/redisStart.sh:/redis/redisStart.sh"command: "sh /redis/redisStart.sh"restart: alwaysprivileged: truenetworks:- redis-netredis6:image: redis:6.0-alpinehostname: redis6container_name: redis6volumes:- "\$PWD/redis6/data:/data"- "\$PWD/redis.conf:/etc/redis.conf"- "\$PWD/redisStart.sh:/redis/redisStart.sh"command: "sh /redis/redisStart.sh"restart: alwaysprivileged: truenetworks:- redis-net
EOFcat > ${filePath}/redis.conf << EOF
port 6379
masterauth '123456' 
requirepass '123456'
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOFcat > ${filePath}/redisStart.sh << EOF
#!/bin/shCURRENT_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
}# 通过ifconfig命令获取IP地址
IP=\$(ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{print \$1}')
log "Container IP Address is: \${IP}"
CLUSTER_CONFIG="/data/nodes.conf"if [ -f \${CLUSTER_CONFIG} ]; thenif [ -z "\${IP}" ]; thenlog "Unable to determine IP address!"exit 1fi     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}
firedis-server /etc/redis.conf EOF

2.3 redisnode3文件

filePath="/home/redis/redisnode3"
mkdir -p $filePath
cat > ${filePath}/docker-compose.yml << EOF
version: '3'networks:redis-net:external: true services:redis7:image: redis:6.0-alpinehostname: redis7container_name: redis7volumes:- "\$PWD/redis7/data:/data"- "\$PWD/redis.conf:/etc/redis.conf"- "\$PWD/redisStart.sh:/redis/redisStart.sh"command: "sh /redis/redisStart.sh"restart: alwaysprivileged: truenetworks:- redis-netredis8:image: redis:6.0-alpinehostname: redis8container_name: redis8volumes:- "\$PWD/redis8/data:/data"- "\$PWD/redis.conf:/etc/redis.conf"- "\$PWD/redisStart.sh:/redis/redisStart.sh"command: "sh /redis/redisStart.sh"restart: alwaysprivileged: truenetworks:- redis-netredis9:image: redis:6.0-alpinehostname: redis9container_name: redis9volumes:- "\$PWD/redis9/data:/data"- "\$PWD/redis.conf:/etc/redis.conf"- "\$PWD/redisStart.sh:/redis/redisStart.sh"command: "sh /redis/redisStart.sh"restart: alwaysprivileged: truenetworks:- redis-net
EOFcat > ${filePath}/redis.conf << EOF
port 6379
masterauth '123456' 
requirepass '123456'
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOFcat > ${filePath}/redisStart.sh << EOF
#!/bin/shCURRENT_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
}# 通过ifconfig命令获取IP地址
IP=\$(ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{print \$1}')
log "Container IP Address is: \${IP}"
CLUSTER_CONFIG="/data/nodes.conf"if [ -f \${CLUSTER_CONFIG} ]; thenif [ -z "\${IP}" ]; thenlog "Unable to determine IP address!"exit 1fi     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}
firedis-server /etc/redis.conf EOF

3. 启动 redisnode1

进入 node1服务器

cd /home/redis/redisnode1docker-compose up -d 

4. 启动 redisnode2

进入 node2服务器

cd /home/redis/redisnode2docker-compose up -d 

5. 启动 redisnode3

进入 node3服务器

cd /home/redis/redisnode3docker-compose up -d 

6. 创建集群

进入 node1服务器

bash redisSetIp.sh

在这里插入图片描述

复制上面打印的命令进行执行生成加入集群的语句
在这里插入图片描述

按照步骤一步一步的加入

# redis1 容器内执行集群创建# redis1  redis4  redis7
# redis2  redis5  redis8
# redis3  redis6  redis9
# 1 5 9
# 4 2 8
# 7 3 6
# 进入 redis1 容器
docker exec -it redis1 /bin/sh
# 指定主从节点交叉分布
# redis1 容器内执行集群创建
# 创建主节点
redis-cli --cluster create 10.0.1.149:6379 10.0.1.157:6379 10.0.1.29:6379 -a '123456'# 确认
yes# 指定主从节点交叉分布redis-cli --cluster add-node 10.0.1.156:6379 10.0.1.149:6379 --cluster-slave -a '123456'
redis-cli --cluster add-node 10.0.1.176:6379 10.0.1.149:6379 --cluster-slave -a '123456'
redis-cli --cluster add-node 10.0.1.150:6379 10.0.1.157:6379 --cluster-slave -a '123456'
redis-cli --cluster add-node 10.0.1.175:6379 10.0.1.157:6379 --cluster-slave -a '123456'
redis-cli --cluster add-node 10.0.1.146:6379 10.0.1.29:6379 --cluster-slave -a '123456'
redis-cli --cluster add-node 10.0.1.158:6379 10.0.1.29:6379 --cluster-slave -a '123456'# 检查集群状态"
redis-cli -c -a '123456'
# 查看集群节点 9个
CLUSTER NODES# 退出 redis
exit# 退出容器

在这里插入图片描述

7.测试用例

7.1 用例1

设置一个值
将对应值的节点关闭
查看集群,查看设置的参数
启动关闭的节点,查看集群是否加入

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/313983.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《VulnHub》DC:1

title: 《VulnHub》DC&#xff1a;1 date: 2024-01-01 12:46:49 updated: 2024-01-01 12:46:50 categories: WriteUp&#xff1a;Cyber-Range excerpt: 主机发现、目标信息扫描、漏洞扫描、网站指纹信息识别、网站目录扫描、drupal CMS 漏洞利用&#xff08;CVE 2014-3704&…

爱思唯尔的KBS——模板、投稿、返修、接收的总结

第二篇论文终于是接受了QAQ&#xff0c;被审稿人疯狂拖时间&#xff0c;KBS是真难绷啊 由于之前发布过关于爱思唯尔旗下的ESWA博客&#xff0c;KBS和ESWA是类似的&#xff0c;因此本篇博客主要说下区别以及期间碰到的各种情况&#xff0c;有疑问依然可以在评论区说&#xff0c;…

5个用于构建Web应用程序的Go Web框架

探索高效Web开发的顶级Go框架 Go&#xff08;或称为Golang&#xff09;以其简洁性、高效性和出色的标准库而闻名。然而&#xff0c;有几个流行的Go Web框架和库为构建Web应用程序提供了额外的功能。以下是五个最值得注意的Go框架&#xff1a; 1. Gin&#xff1a; Gin是一个高…

Impala4.x源码阅读笔记(三)——Impala如何管理Iceberg表元数据

前言 本文为笔者个人阅读Apache Impala源码时的笔记&#xff0c;仅代表我个人对代码的理解&#xff0c;个人水平有限&#xff0c;文章可能存在理解错误、遗漏或者过时之处。如果有任何错误或者有更好的见解&#xff0c;欢迎指正。 上一篇文章Impala4.x源码阅读笔记&#xff0…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的图像剪切(ROI)功能(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的图像剪切&#xff08;ROI&#xff09;功能&#xff08;C&#xff09; Baumer工业相机Baumer工业相机的图像剪切&#xff08;ROI&#xff09;功能的技术背景CameraExplorer如何使用图像剪切&#xff08;ROI&#xff09;功…

mysql基础-字段类型及几点讨论事项

目录 1.主要字段类型 1.1整数 1.2.浮点数类型 1.3.文本类型 1.4.日期与时间类型 2.讨论几点有关字段类型的事 2.1 时间类型字段用字符还是datetime&#xff1f; 2.2 时间类型字段如何设置随时间更新&#xff1f; 2.3 字段长度够用即可 2.4 小数的字段类型选择&#xf…

错题总结五

一. 操作访问字节个数问题 这道题考察的是指针有关的知识&#xff0c;而这种指针的知识我们提到过 指针相关知识(入门)-CSDN博客 指针相关知识(进阶)-CSDN博客 在这里&#xff0c;我们复习一下。在指针里&#xff0c;int有4个字节&#xff0c;short有2个字节&#xff0c;换句…

水果软件2024FL Studio21.3mac苹果中文版

FL STUDIO21发布&#xff0c;提供您一直在等待的出色工作流程功能。通过新效果、多个播放列表曲目选择和无所畏惧的撤消一切编辑&#xff0c;将您的音乐带入2024年。FL Studio21中文完整版是一个功能齐全、开放式架构的PC音乐创作和制作环境。它具有基于音乐音序器的图形用户界…

二、RK3588-安装Opencv-4.8.1(C++版本)

1.前言 OpenCV是一个跨平台的计算机视觉和机器学习软件库&#xff0c;基于Apache2.0许可&#xff08;开源&#xff09;发行。它可以在Linux、Windows、Android和Mac OS操作系统上运行。OpenCV由一系列C函数和少量C类构成&#xff0c;同时提供了Python、Ruby、MATLAB等语言的接口…

神秘的Cookie和Session

Cookie 1.Cookie是什么&#xff1f; Cookie是浏览器提供的持久化储存数据的方式。 2.从哪里来&#xff1f; Cookie从服务器中来&#xff0c;存储到客户端中。一个客户端就对应着一个浏览器。 服务器代码中决定了什么样的数据会储存到客户端中&#xff0c;通过HTTP相应的Se…

常见位运算模板方法总结(包含五道例题)

哈喽大家好&#xff0c;今天博主给大家带来算法基础常见位运算的模板&#xff0c;可以说大家遇到的百分之九十与位运算有关的题都可以用得上。话不多上我们上干货&#xff1a; 一.基础位运算符 << 左移运算符 >> 右移运算符 ~ 取反 & 与运算 | …

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈

深入浅出图解C#堆与栈 C# HeapingVS Stacking第一节 理解堆与栈 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理](https://mp.csdn.n…