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.mzph.cn/news/589789.shtml

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

相关文章

【递归、搜索与回溯】综合练习

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;找出所有子集的异或总和再求…

音阶是音乐理论的基本概念之一

音阶是音乐理论的基本概念之一&#xff0c;它是一组按照音高顺序排列的音。不同类型的音阶有不同的音阶结构。在西方音乐中&#xff0c;最常见的是大调音阶和小调音阶。下面是这两种音阶的基本构成&#xff1a; 大调音阶&#xff08;Major Scale&#xff09;&#xff1a; 大调音…

[Python]两个杯子取水问题

利用两个杯子巧取三升水&#xff1a; 今天的这个趣味数学小游戏是利用两个没有刻度的水杯&#xff0c;巧妙地取出三升水来。 题目的条件是&#xff1a;一个总容量为6升的杯子和一个总容量为5升的杯子&#xff0c;同时面前有无限容量的水供你使用。不借助其它任何的容器&#xf…

just recode for myself 统计大模型SFT的结果与version2中text的结果bad case

问题描述&#xff1a; 利用Qwen大模型进行SFT (lora)。将生成的结果与version2版本下的中文test.txt进行bad case分析 代码实现&#xff1a; from tqdm import tqdm, trange import os import re from typing import List import json from pdb import set_trace as stoppip…

测试新字符设备驱动代码

一. 简介 上一篇文章编写了新字符设备驱动框架的代码&#xff0c;并编写了 LED灯IO初始化工作&#xff0c;也编写了Led的开与关函数。文章地址如下&#xff1a; 向新字符设备驱动代码框架中添加Led功能函数-CSDN博客 本文对所完成的新字符设备驱动代码进行测试。通过测试程…

12、高可用性

什么是高可用性 高可用性不是绝对的&#xff0c;只有相对更高的可用性。百分之百的可用性是不可能达到的。可用性的定义不仅仅包括服务正在运行的时间段&#xff0c;还包括应用是否能以足够好的性能处理请求。 导致宕机的原因 在运行环境的问题中&#xff0c;最普通的问题是…

7-1 sdut-Collection-sort--C~K的班级(II)--笔记篇

题目 经过不懈的努力&#xff0c;CXK终于当上了班主任。 现在他要统计班里学生的名单&#xff0c;但是CXK在教务系统中导出班级名单时出了问题&#xff0c;发现会有同学的信息重复&#xff0c;现在他想把重复的同学信息删掉&#xff0c;只保留一个&#xff0c; 但是工作量太大…

LeetCode 热题 100——283. 移动零

283. 移动零 提示 简单 2.3K 相关企业 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,…

使用anaconda创建notebook工程

1.由于每个工程使用的环境都可能不一样&#xff0c;因此一个好的习惯就是不同的工程都创建属于自己的环境&#xff0c;在anaconda中默认的环境是base&#xff1a; //括号中名字&#xff0c;代表当前的环境 (base)dragonmachine: $ conda create --nameexample2.激活环境 // 环…

伺服电机:电子齿轮比

电子齿轮比的概念 位置控制模式下&#xff0c;输入的位置指令是对负载位移进行设定&#xff0c;而电机的位置指令是编码器单位&#xff0c;是对电机的位移进行进行设定&#xff0c;电机位置指令与输入位置指令的比例就是电子尺齿轮比。 输入的位置指令&#xff0c;所对应的位…

JVM内存区域与常见问题

内存结构 这里先以JDK1.8 hotspot垃圾收集器为例&#xff0c;讲讲每块区域存储的数据以及可能会抛的异常。 堆 存放对象实例&#xff0c;会出现内存溢出或内存泄露等情况。 栈 一次方法调用会产生一个栈帧&#xff0c;如果出现递归死循环调用栈空间满了&#xff0c;会出现…

【全网首发】洛谷贪心题解集合

贪心 1.P2240 【深基12.例1】部分背包问题 【深基12.例1】部分背包问题 - 洛谷 思路 万不要被题目给误导了&#xff0c;这道题是贪心。 所有金币都可以分开&#xff0c;也就是说只要按照性价比最高的取一定得到的价值最大。 性价比就是这堆金币的价值除以重量。 只需要把…

85双指针解三数之和

问题描述&#xff1a;给你一个包含n个整数的数组nums&#xff0c;判断nums中是否勋在三个元素a,b,c使得abc0,请你找出所有和为0且不重复的三元组。 求解思路&#xff1a;如果使用for循环的方式&#xff0c;n3的时间复杂度&#xff0c;可以采用双指针的方式&#xff0c;先将整个…

企业级大数据架构设计

企业级大数据架构设计 企业级大数据架构设计 又名&#xff1a; 学习大数据概念&#xff0c; 写框架&#xff08;第1天&#xff09; 数据架构与设计&#xff1a;概述与设计考虑 引言数据架构概述设计考虑因素构建数据架构的步骤 大数据的核心架构内容&#xff1a;构建高效和…

14.用户管理

目录 1、权限表 1、user表 1.用户列 2.权限列 3.安全列 4.资源控制列 2、db表和host 表 1.用户列 2.权限列 3. tables_priv 表和 columns _priv 表 4.procs_priv 表 2、账户管理 1. 登录和退出MySQL服务器 2、创建普通用户&#xff1a; 1.使用CREATE USER语创建…

前端crypto-js 库: MD5

文章目录 什么是crypto-js安装依赖MD5 什么是crypto-js github地址: https://github.com/brix/crypto-js cryptojs文档: https://cryptojs.gitbook.io/docs/#encoders CryptoJS (crypto.js) 为 JavaScript 提供了各种各样的加密算法。 CryptoJS是一个JavaScript加密算法库&a…

免费的CISSP备考学习网站

CISSP&#xff08;Certified Information Systems Security Professional&#xff09;是一项高级的信息安全认证&#xff0c;官方认证机构是(ISC)。虽然(ISC) 提供了官方培训资料&#xff0c;但是很多学习资料都是商业性质的&#xff0c;需要付费购买。尽管如此&#xff0c;仍然…

基于Java SSM框架实现健康管理系统项目【项目源码】

基于java的SSM框架实现健康管理系统演示 JSP技术 JSP是一种跨平台的网页技术&#xff0c;最终实现网页的动态效果&#xff0c;与ASP技术类似&#xff0c;都是在HTML中混合一些程序的相关代码&#xff0c;运用语言引擎来执行代码&#xff0c;JSP能够实现与管理员的交互&#xf…

二分算法

目录 二分 数的三次方根 算法模板 二分 给定一个按照升序排列的长度为 n 的整数数组&#xff0c;以及 q 个查询。 对于每个查询&#xff0c;返回一个元素 k 的起始位置和终止位置&#xff08;位置从 00 开始计数&#xff09;。 如果数组中不存在该元素&#xff0c;则返回 -1…

pycharm配置pyrcc5外部工具

pyrcc5这是 PyQt5 中用来将资源文件&#xff08;.qrc&#xff09;转换为 Python 文件的工具。类似地&#xff0c;如果你想在 PyCharm 中配置 pyrcc5 将 .qrc 文件转换为 .py 文件的外部工具&#xff0c;你可以遵循以下步骤&#xff1a; 打开 PyCharm 的设置: 选择 File > Se…