三台机器搭建redis集群过程及问题记录

2023-11-03

1. 前言

Redis版本 5.0.4
服务器版本 Linux CentOS 6;CentOS 7;CentOS 9;
redis集群需要至少要三个master节点,我们这里搭建三个master节点,并且给每个master再搭建一个slave节点,总共6个redis节点,三主三从。

2. 搭建集群

  • 给三台机器都装上redis
    Linux安装部署Redis
    https://blog.csdn.net/craftsman2020/article/details/122851974

  • 创建redis-cluster目录
    分别在各个服务器下的redis安装目录下(/usr/local/redis/)创建redis-cluster目录

cd  /usr/local/redis/
mkdir  redis-cluster

在redis-cluster下分别创建8001,8002

cd /usr/local/redis/redis-cluster
mkdir 8001 8002

其他两台机器一样的操作,端口分别为8003 8004、 8005 8006

  • 2.3 拷贝配置文件
    将之前的redis.conf拷贝至8001目录
cp /usr/local/redis/redis.conf  /usr/local/redis/redis-cluster/8001/

其他5个目录一样操作

  • 修改redis.conf
1)daemonize yes
2)port 8001(分别对每个机器的端口号进行设置)
3)dir /usr/local/redis/redis-cluster/8001/(指定数据文件存放位置,必须要指定不同的目录位置,不然会丢失数据)
4)cluster-enabled yes(启动集群模式)
5)cluster-config-file nodes-8001.conf(集群节点信息文件,这里800x最好和port对应上)
6)cluster-node-timeout 5000
7) bind 127.0.0.1(去掉bind绑定访问ip信息, 注释掉,或改为0.0.0.0也可)
8) protected-mode no (关闭保护模式)
9)appendonly yes
如果要设置密码需要增加如下配置:
10)requirepass xxx (设置redis访问密码)
11)masterauth xxx (设置集群节点间访问密码,跟上面一致)

将修改好的8001的redis.conf配置文件分别拷贝至8002-8006,修改响应的端口,文件名

cp /usr/local/redis/redis-cluster/8001/redis.conf /usr/local/redis/redis-cluster/8002/
scp /usr/local/redis/redis-cluster/8001/redis.conf root@192.168.2.59:/usr/local/redis/redis-cluster/8003/
scp /usr/local/redis/redis-cluster/8001/redis.conf root@192.168.2.59:/usr/local/redis/redis-cluster/8004/
scp  /usr/local/redis/redis-cluster/8001/redis.conf root@192.168.1.60:/usr/local/redis/redis-cluster/8005/
scp  /usr/local/redis/redis-cluster/8001/redis.conf root@192.168.1.60:/usr/local/redis/redis-cluster/8006/

新拷贝的五个文件仅修改配置项:port、dir、cluster-config-file 即可

  • 分别启动6个redis实例
redis-server /usr/local/redis/redis-cluster/8001/redis.conf
redis-server /usr/local/redis/redis-cluster/8002/redis.conf
redis-server /usr/local/redis/redis-cluster/8003/redis.conf
redis-server /usr/local/redis/redis-cluster/8004/redis.conf
redis-server /usr/local/redis/redis-cluster/8005/redis.conf
redis-server /usr/local/redis/redis-cluster/8006/redis.conf
  • 创建集群
redis-cli -a 123456 --cluster create --cluster-replicas 1 192.168.2.58:8001 192.168.2.58:8002 192.168.2.59:8003 192.168.2.59:8004 192.168.1.60:8005 192.168.1.60:8006

  • 验证集群
    连接A机器任意一个节点
redis-cli -a 123456 -c -h 192.168.2.58 -p 8001  -a 123456

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

  • 查看集群信息
    在这里插入图片描述
  • 查看集群节点
    在这里插入图片描述
  • 关闭集群
redis-cli -a 123456 -c -h 192.168.2.58 -p 8001 shutdown
redis-cli -a 123456 -c -h 192.168.2.58-p 8002 shutdown
redis-cli -a 123456 -c -h 192.168.2.59 -p 8003 shutdown
redis-cli -a 123456 -c -h 192.168.2.59 -p 8004 shutdown
redis-cli -a 123456 -c -h 192.168.1.60 -p 8005 shutdown
redis-cli -a 123456 -c -h 192.168.1.60 -p 8006 shutdown

  • 用脚本关闭和启动集群
  • 用脚本关闭集群
#!/bin/bash
#所有服务器节点的hostname
allnodes=('10.12.2.59' '10.12.2.58' '192.168.1.60')
local_ip=`ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"​`
echo "### " date
echo "### local_ip: ${local_ip}"
PORT=8001
ENDPORT=8007
PASSWROD=123456
while [ $((PORT < ENDPORT)) != "0" ]; do
    for ip in ${allnodes[@]};
    do
        if [ "$ip" = "$local_ip" ];
        then 
            local_count=`ps -ef|grep redis |grep $PORT | wc -l`
            if [ $local_count -gt 0 ];
            then
                echo "### Stoping Local Redis $ip:$PORT"
                redis-cli -p $PORT -a $PASSWROD shutdown
            else 
                echo "no Local redis $ip:$PORT"
            fi
        else
            #判断某个端口是否已被占用,如果是,则执行关闭命令
            count=`ssh root@$ip lsof -i:$PORT | wc -l`
            if [ $count -gt 0 ];
            then
                echo "### Stopping Redis $ip:$PORT"
                ssh root@$ip redis-cli -p $PORT -a $PASSWROD shutdown 2>/dev/null
            else
                echo "no redis $ip:$PORT"
            fi
        fi
    done
    PORT=$((PORT+1))
done
exit 0

  • 用脚本启动集群
#!/bin/bash
#所有服务器节点的hostname
declare -A dic
dic=([8001]="10.12.2.58" [8002]="10.12.2.58" [8003]="10.12.2.59" [8004]="10.12.2.59" [8005]="192.168.1.60" [8006]="192.168.1.60")

local_ip=`ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"​`
echo "### " date
echo "### local_ip: ${local_ip}"

for port in ${!dic[*]}
do 
    ip=${dic[${port}]}
    #echo ip: ${ip} ${port}
    if [ "$ip" = "$local_ip" ];
    then 
        local_count=`ps -ef|grep redis |grep $port | wc -l`
        if [ $local_count -eq 0 ];
        then
            echo "Start Local Redis Server $ip $port"
            redis-server /usr/local/redis/redis-cluster/$port/redis.conf
        else
            echo "Local Redis Server $ip $port already exists!"
        fi
    else
        count=`ssh root@$ip ps -ef|grep redis-server|grep -v grep|grep $port| wc -l`
        if [ $count -eq 0 ];
        then
            echo "Start Redis Server $ip $port"
            ssh root@$ip redis-server /usr/local/redis/redis-cluster/$port/redis.conf
        else
            echo "Redis Server $ip $port already exists!"
        fi
    fi    
done
exit 0

注意:

  • 各集群都设置开开机启动,设置方法请参考https://blog.csdn.net/craftsman2020/article/details/128130348?spm=1001.2014.3001.5502
  • 为了方便启动和终止程序,用shell脚本操作。
  • 集群各机器操作系统版本尽量协调,避免出现Centos6和Centos9无法ssh访问的问题。

3. 遇到的问题

  • 三台机器设置免密互访
    但由于这三台机器centos版本差异大,导致Centos9和Centos6无法设置免密互访。
    设置免密报错,直接用ssh指令连接也会报错:
    在这里插入图片描述
    尝试在生成公钥的文件夹里(一般在当前用户目录下的.ssh文件中)创建一个config文件(没有后缀),用文本文档格式打开,添加下方内容
Host *
HostkeyAlgorithms +ssh-rsa
PubkeyAcceptedKeyTypes +ssh-rsa

参考:
https://blog.csdn.net/weixin_51443484/article/details/125944815
https://weibo.com/ttarticle/p/show?id=2309404806141325738316
但是并没有解决。

之后在centos6上对centos9设置免密:

ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.1.60

报错如下:

no hostkey alg

在centos9上对centos6设置免密报错如下:

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: ERROR: Unable to negotiate with 192.168.1.30 port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss

之后采取了折中的办法,因为Centos7可以对另外两台脚本互设免密,所以就把启动和终止redis集群的脚本放在了Centos7上。

  • 连接redis集群报错:(error) MOVED的解决方法
./redis-cli -h 192.168.2.58 -p 8001-a 123456

192.168.2.58 :8001 > get name

(error) MOVED 5798 192.168.2.58 :8001

这种情况一般是因为启动 redis-cli 时没有设置集群模式所导致。

启动时使用 -c 参数来启动集群模式,命令如下:

./redis-cli -h 192.168.2.58 -p 8001 -a 123456 -c

192.168.2.58:8001 > get name

-> Redirected to slot [5798] located at 192.168.2.58 :8001
  • (error) READONLY You can‘t write against a read only replica.
    出现以上错误,表示当前redis服务是只读的,没有写权限,估计该服务是被当作从数据库使用了。
    当在redis集群的从节点上做写操作时会遇到以上报错。

  • Redis (error) CROSSSLOT Keys in request don’t hash to the same slot
    参考 https://blog.csdn.net/TreeShu321/article/details/102766814

4. 相关文章

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

三台机器搭建redis集群过程及问题记录 的相关文章

  • 使用brew在MacOSx上安装Redis JSON

    如何使用brew 在 macOSx 上安装 RedisJSON 如何在不编译redis的情况下启用redis上的模块 我不想使用 docker 客户端 Redis Stack 可能是最简单的方法 它不仅仅是 RedisJSON 还包括 Re
  • Spring RedisTemplate:8次调用后方法键挂起

    我使用 Spring RedisTemplate spring data redis 1 7 1 与 Redis 进行通信 我需要通过正则表达式获取然后删除键 例如 context user1 我用的方法 RedisTemplate key
  • 我的 Redis 自动生成的密钥

    我不知道我的 Redis 版本 4 0 9 到底发生了什么 我正在运行一个应用程序并使用 Redis 来存储我的数据库 但是 然后 Redis 自动创建 3 个新键 Backup1 Backup2 Backup3 并删除我的所有数据 这是我
  • PooledRedisClientManager 未释放连接

    我将 json 数据列表存储在 redis 中并使用 ServiceStack c 客户端访问它 我本质上是在管理自己的外键 我在其中存储zrangeid 我使用应用程序内部的接口从zrange然后从 Redis 获取底层 json 对象并
  • redis集群不断打印日志WSA_IO_PENDING

    当我启动redis集群的所有redis服务器时 所有这些服务器不断打印类似WSA IO PENDING clusterWriteDone的日志 9956 03 Feb 18 17 25 044 WSA IO PENDING writing
  • 库存管理系统的 SQL 与 NoSQL

    我正在开发一个基于 JAVA 的网络应用程序 主要目的是拥有在多个称为渠道的网站上销售的产品的库存 我们将担任所有这些渠道的管理者 我们需要的是 用于管理每个渠道的库存更新的队列 库存表 其中包含每个通道上分配的正确快照 将会话 ID 和其
  • 在 sidekiq 上配置 redis 身份验证

    我想我错过了一些东西 因为我在文档中找不到如何编写 redis 实例的用户名和密码以与 sidekiq 一起使用 有没有办法做到这一点 或者是通过 ENV 变量 Sidekiq 将无法识别的 Redis 选项直接传递给 Redis 驱动程序
  • SignalR 无法连接到 SSL 上的 Azure Redis

    我目前在 Azure 上托管我的 redis 缓存服务器 并让 signalR 依赖它作为骨干 使用以下内容 GlobalHost DependencyResolver UseRedis 服务器 端口 密码 eventKey 这可以在端口
  • 无法启动redis.service:单元redis-server.service被屏蔽

    我在 ubuntu 16 04 上安装了 Redis 服务器 但是当我尝试使用启动redis服务时 sudo systemctl start redis 我收到消息 Failed to start redis service Unit re
  • socket.io 广播功能 & Redis pub/sub 架构

    如果有人能帮助我解决一个小疑问 我将不胜感激 使用socket io广播功能和在Redis上使用pub sub设计架构有什么区别 例如 在另一个示例中 node js 服务器正在侦听 socket io 针对 键 模型 todo 和值 数据
  • 有没有办法在 ruby​​ 中重新定义 []=+

    我正在尝试编写一个简单的 DSL 针对 Redis 并且我想自己定义 I have def key val redis zadd name val key end 我想定义 def key val redis zincrby name va
  • 为什么 Redis TimeSeries 不捕获聚合中的最后一个元素?

    我试图了解 Redis 的时间序列规则创建的工作原理 但我很困惑为什么 Redis 会忽略聚合中的最后一项 并想知道这是否是预期的行为 我在中创建了示例代码redis cli为了显示 127 0 0 1 6379 gt FLUSHALL O
  • Redis、会话过期和反向查找

    我目前正在构建一个网络应用程序 并想使用 Redis 来存储会话 登录时 会话会使用相应的用户 ID 插入到 Redis 中 并且过期时间设置为 15 分钟 我现在想实现会话的反向查找 获取具有特定用户 ID 的会话 这里的问题是 由于我无
  • redis - 使用哈希

    我正在使用 redis 为我的 Web 应用程序实现社交流和通知系统 我是 redis 的新手 我对哈希值及其效率有一些疑问 我读过这篇很棒的文章Instagram 帖子 http instagram engineering tumblr
  • 如何使redis中的“HSET”子键“过期”?

    我需要使 Redis 哈希中所有超过 1 个月的密钥过期 这不可能 https github com antirez redis issues 167 issuecomment 2559040 为了保持 Redis 简单 https git
  • 如何使 Redis 缓存中数据层次结构(树)的部分内容无效

    我有一些产品数据 需要在 Redis 缓存中存储多个版本 数据由 JSON 序列化对象组成 获取普通 基本 数据的过程很昂贵 将其定制为不同版本的过程也很昂贵 因此我想缓存所有版本以尽可能进行优化 数据结构看起来像这样 BaseProduc
  • 为什么Redis中没有有序的hashmap?

    Redis 数据类型 http redis io topics data types包括排序集 http redis io topics data types intro sorted sets以及其他用于键值存储的必要数据结构 但我想知道
  • 如何将“.csv”数据文件导入Redis数据库

    如何将 csv 数据文件导入 Redis 数据库 csv 文件中包含 id 时间 纬度 经度 列 您能否向我建议导入 CSV 文件并能够执行空间查询的最佳方法 这是一个非常广泛的问题 因为我们不知道您想要什么数据结构 您期望什么查询等等 为
  • 当 Jedis 与 Spring Data 一起使用时,为什么数据会以奇怪的键存储在 Redis 中?

    我将 Spring Data Redis 与 Jedis 一起使用 我正在尝试存储带有密钥的哈希值vc list id 我能够成功插入到redis 但是 当我使用 redis cli 检查密钥时 我没有看到密钥vc 501381 相反我看到
  • 如何延长 django-redis 中的缓存 ttl(生存时间)?

    我正在使用 django 1 5 4 和 django redis 3 7 1 我想延长缓存的 ttl 生存时间 当我取回它时 这是示例代码 from django core cache import cache foo cache get

随机推荐

  • @Setter与@Getter注解无效,以及idea无法搜索插件的解决方案

    原因 1 lombok插件未安装 2 lombok插件损坏 解决方案 重新安装lombok插件 步骤 进入idea点击File gt Settings gt 搜索点击Plugins 进入插件界面 在搜索框中输入lombok安装 若无法搜索到
  • Gradle 复制文件 无知的菜墩

    Gradle 复制文件 很多大佬都是直接贴出如下代码 简单说就是 task 直接使用 from into include 等方法 然而直接复制下来之后 过了俩小时零一秒钟后依然无法使用 一直不生效 task nestedSpecs type
  • Go Facade外观(门面)设计模式

    动机 Motivation 上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合 随着外部客户程序和各子系统的演化 这种过多的耦合面临很多变化的挑战 如何简化外部客户程序和系统间的交互接口 如何将外部客户程序的演化和内部子系
  • hbuilderx自定义常用代码块

    apipost body let res await this http post 1 if res code 200 2 else this toast res msg prefix apipost project uni app sco
  • hdu 5831 Rikka with Parenthesis II 2016 Multi-University 8

    Problem acm hdu edu cn showproblem php pid 5831 题意 给个括号序列 问能不能通过一次把两个不同位置的符号交换的操作 使得序列里的所有括号左右配对合法 分析 左括号进栈 如果是右括号而且栈顶是左
  • Linux性能监控命令_sar & 自动保存30天历史信息

    简介 sar命令将操作系统中选定的累积活动计数器的内容写入标准输出 计费系统根据 count 和 interval参数中的值 以秒为单位 按照指定的时间间隔写入指定次数的信息 目录 1 语法 1 1 常用参数 2 常见用法 2 1 监控CP
  • HTTP->WebRTC演进路径

    first HTTP Pre AJAX 原始web 一页里发送请求后才返回另一页 如Geocities second AJAX 2004 更新页面不需要刷新 如GMail third Web Sockets 2008 页面能建立双向通信 通
  • Android 10 暗黑模式适配,你需要知道的一切

    在 Android 10 里 Dark theme 暗黑模式得到了系统级的支持 暗黑模式不仅酷炫 而且有降低屏幕耗电 在光线较暗的环境中使用更舒适等好处 今天带大家看一下如何适配暗黑模式 本文会从以下几点进行介绍 动态开启暗黑模式 使用 D
  • 解密IP地址的不同潜力与应用场景

    作为专业爬虫代理供应商 我们经常需要面对不同的IP地址需求 在IP地址选择中 动态IP和静态IP是两个常见的选项 但究竟什么是动态IP和静态IP 它们有什么区别和优势 适用于哪些场景 本文将为你详细解答 让你对IP地址有更全面的了解 第一部
  • html文字图片同一行,CSS控制图片和文字在同一行显示且对齐的3种方法

    CSS控制图片和文字在同一行显示且对齐的3种方法 在 HTML 代码中 有时会需要在文字旁边加上一个图标 默认情况 是图片置顶对齐 文字置底对齐 所以通常图片高 文字低 不能水平居中对齐 常见欢思中属餐显近和想都性厅示近和想都性厅示方法有3
  • Java并发JUC集合类

    文章目录 Java并发JUC集合类 为什么HashTable慢 它的并发度是什么 ConcurrentHashMap在JDK1 7和JDK1 8中实现有什么差别 JDK1 8解決了JDK1 7中什么问题 ConcurrentHashMap
  • Java jinfo 命令详解

    jinfo 命令可以用来查看 Java 进程运行的 JVM 参数 命令如下 root admin jinfo help Usage jinfo option
  • 40 多名直接下属、从不 1 对 1 沟通,老黄如此管理下的英伟达能在 AI 芯片领域称霸多久?...

    省时查报告 专业 及时 全面的行研报告库 省时查方案 专业 及时 全面的营销策划方案库 免费下载 2023年8月份全网热门报告合集 ChatGPT提词示例 让你的ChatGPT聪明100倍 超百页干货资料 AI应用的难点 痛点与未来 202
  • It's Not Just Standing Up: Patterns of Daily Stand-up Meetings

    It s Not Just Standing Up Patterns of Daily Stand up Meetings Jason Yip ThoughtWorks Inc jcyip thoughtworks com http mar
  • VScode launch.json和tasks.json文件的配置

    task json version 2 0 0 command g args g file o file exe 编译命令参数 problemMatcher owner cpp fileLocation relative workspace
  • 高效的学习方法(费曼学习方法)

    学习技巧有四个简单的步骤 1 提取书本信息 阅读并理解 拿出一张白纸简要概括知识点以及对知识点进行深度拓展和横向拓展 深度拓展指增强知识点的理解深度 可以通过提问题的方式加强深度理解 横向拓展指增强其阅读广度 通过与其他学科建立关联 2 在
  • #pragma once和#ifndef / #define / #endif的区别

    转摘自 http www 360doc com content 10 0124 00 722458 14261695 shtml pragma once 指令格式如下 pragma once这是一个比较常用的指令 只要在头文件的最开始加入这
  • 华为OD机试 - 跳房子II(Java)

    题目描述 跳房子 也叫跳飞机 是一种世界性的儿童游戏 游戏参与者需要分多个回合按顺序跳到第1格直到房子的最后一格 然后获得一次选房子的机会 直到所有房子被选完 房子最多的人获胜 跳房子的过程中 如果有踩线等违规行为 会结束当前回合 甚至可能
  • c++什么时候使用new,调用构造函数

    new 补充 构造函数的调用 对象 可以调用成员函数 不可以调用构造函数 我们无法像调用成员函数那样使用对象来调用构造函数 因为在构造函数构造出对象之前 对象是不存在的 因此构造函数被用来创建对象 而不能通过对象来调用 详见 构造函数的4种
  • 三台机器搭建redis集群过程及问题记录

    文章目录 1 前言 2 搭建集群 3 遇到的问题 4 相关文章 1 前言 Redis版本 5 0 4 服务器版本 Linux CentOS 6 CentOS 7 CentOS 9 redis集群需要至少要三个master节点 我们这里搭建三