0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Redis集群操作配置

马哥Linux运维 来源:博客园Rainbow-Sea 2025-02-26 18:03 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1. 为什么需要集群-高可用性

为什么需要集群-高可用性:

生产环境的实际需求和问题:

容量不够,redis 如何进行扩容。

并发写操作,redis 如何分摊。

主从模式,薪火相传模式,主机宕机,会导致 ip 地址发生变化,应用程序中配置需要修改对应的主机地址,端口等信息。

传统解决方案 代理主机来解决

e2288c28-f1e9-11ef-9310-92fbcf53809c.png

上图解图:

客户端请求先到代理服务器

由代理服务器进行请求转发到对应的业务处理器

为了高可用,代理服务,A服务,B服务,C服务都需要搭建主从结构(至少是一主一从这样就需求搭建至少 8 台服务器)。

这种方案的缺点是:成本高,维护困难,如果是一主多从,成本就会更高。

redis3.0 提供解决方案 无中心化集群配置:

e260615c-f1e9-11ef-9310-92fbcf53809c.png

各个 Redis 服务仍然采用主从结构。

各个 Redis 服务是连通的,任何一台服务器,都可以作为请求入口

各个 Redis 服务器因为是连通的,可以进行请求转发

这种方式,就无中心化集群配置,可以看到,只需要 6 台服务器即可搞定。

无中心化集群配置,还会根据 key 值,计算 slot ,把数据分散到不同的主机,从而缓解单个主机的存取压力

Redis 推荐使用无中心化集群配置。

在实际生成环境,各个 Redis 服务器,应当部署到不同的机器(防止机器宕机,主从复制失效)。

2. 集群概述(及其搭建)

Redis 集群实现了对 Redis 的水平扩容,即启动 N 个 Redis 节点,将整个数据库分布存储在这个 N 个节点中,每个节点存储总数居的 1 / N

Redis 集群通过分区(partition) 来提供一定程度的可用性(availability) ,即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。

Redis 集群搭建:实操演示:

e2887aa2-f1e9-11ef-9310-92fbcf53809c.png

redis.conf配置修改

cluster-enabled yes        打开集群模式
cluster-config-file nodes-6379.conf    设定节点配置文件名
cluster-node-timeout 15000      设定节点失联时间,超过该时间(毫秒),集群自动进行主 从切换

vi /rainbowsea/redis6379.conf, 删除不必要的内容 增加 cluster 配置, 文件最后内容,如图

include /rainbowsea/redis.conf
pidfile "/var/run/redis_6379.pid"
port 6379
dbfilename "dump6379.rdb"
masterauth rainbowsea
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000

e2aa9722-f1e9-11ef-9310-92fbcf53809c.png

e2c46ae4-f1e9-11ef-9310-92fbcf53809c.png

[root@localhost rainbowsea]# cp redis6379.conf redis6380.conf 
[root@localhost rainbowsea]# cp redis6379.conf redis6381.conf 
[root@localhost rainbowsea]# cp redis6379.conf redis6389.conf 
[root@localhost rainbowsea]# cp redis6379.conf redis6390.conf 
[root@localhost rainbowsea]# cp redis6379.conf redis6391.conf 
[root@localhost rainbowsea]# 

e2ef3198-f1e9-11ef-9310-92fbcf53809c.png

e3196a3a-f1e9-11ef-9310-92fbcf53809c.png

使用查找替换修改另外 5 个文件

e33704aa-f1e9-11ef-9310-92fbcf53809c.png

e3567dda-f1e9-11ef-9310-92fbcf53809c.png

换指令    :%s/6379/6380

其它几个文件以此操作即可, 操作的时候,一定要小心, 最后建议再检查一下

e38213f0-f1e9-11ef-9310-92fbcf53809c.png

e3a19f90-f1e9-11ef-9310-92fbcf53809c.png

e3cd028e-f1e9-11ef-9310-92fbcf53809c.png

e3f24274-f1e9-11ef-9310-92fbcf53809c.png

e40c4da4-f1e9-11ef-9310-92fbcf53809c.png

所有的都要加上这个masterauth rainbowsea加上 Redis 的密码,没有设置密码的则不用配置这个。

所有的都要加上这个masterauth rainbowsea加上 Redis 的密码,没有设置密码的则不用配置这个。

所有的都要加上这个masterauth rainbowsea加上 Redis 的密码,没有设置密码的则不用配置这个。

include /rainbowsea/redis.conf
pidfile "/var/run/redis_6379.pid"
port 6379
dbfilename "dump6379.rdb"
masterauth rainbowsea
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000

启动 6 个 Redis 服务

[root@localhost rainbowsea]# redis-server /rainbowsea/redis6379.conf
[root@localhost rainbowsea]# redis-server /rainbowsea/redis6380.conf
[root@localhost rainbowsea]# redis-server /rainbowsea/redis6381.conf
[root@localhost rainbowsea]# redis-server /rainbowsea/redis6389.conf
[root@localhost rainbowsea]# redis-server /rainbowsea/redis6390.conf
[root@localhost rainbowsea]# redis-server /rainbowsea/redis6391.conf
[root@localhost rainbowsea]# ps -aux | grep redis

e43410d2-f1e9-11ef-9310-92fbcf53809c.png

e45ba30e-f1e9-11ef-9310-92fbcf53809c.png

将六个节点合成一个集群

e47fef5c-f1e9-11ef-9310-92fbcf53809c.png

e4a67a3c-f1e9-11ef-9310-92fbcf53809c.png

进入到该路径下后,将六个节点合成一个集群的指令:

如下这个是 Redis 没有配置密码的,指令

redis-cli --cluster create --cluster-replicas 1 192.168.76.147:6379 192.168.76.147:6380 192.168.76.147:6381 192.168.76.147:6389 192.168.76.147:6390 192.168.76.147:6391

如下这个是 Redis 配置了密码的,指令

redis-cli --cluster create -a rainbowsea --cluster-replicas 1 192.168.76.147:6379 192.168.76.147:6380 192.168.76.147:6381 192.168.76.147:6389 192.168.76.147:6390 192.168.76.147:6391

注意事项和细节:

组合之前,确保所有(你要使用上的端口的) Redis服务器都是启动的,同时在 root 目录下(我这里是 root 配置的)nodes-xxxx.conf文件都生成正常。

此时不可以用 127.0.0.1 ,需要使用真实的 IP地址(就是你连接 Linux 的地址,Linux 当中使用ifconfig指令查询到的地址),在真实生产环境 IP都是独立的。

replicas 1采用最简单的方式配置集群,一台主机,一台从机,正好三组。

搭建加群如果没有成功,把sentinel进程关闭掉,再试一下。

分许主从对应关系。

e4b98c80-f1e9-11ef-9310-92fbcf53809c.png

e4f799d0-f1e9-11ef-9310-92fbcf53809c.png

分析主从对应关系:如下

e5257a9e-f1e9-11ef-9310-92fbcf53809c.png

e54bb682-f1e9-11ef-9310-92fbcf53809c.png

集群方式登录:

指令: redis-cli -c -p 6379

指令: cluster nodes 命令查看集群信息, 主从的对应关系, 主要看这里我标注的颜色

[root@localhost src]# redis-cli -c -p 6379
127.0.0.1:6379> auth rainbowsea
127.0.0.1:6379> cluster nodes

e56471b8-f1e9-11ef-9310-92fbcf53809c.png

e5ad0bbc-f1e9-11ef-9310-92fbcf53809c.png

注意事项和细节:

[root@localhost src]# redis-cli -c -p 6379

e5d851f0-f1e9-11ef-9310-92fbcf53809c.png

一个集群至少要有三个主节点。

选项--cluster-replicas 1表示我们希望为集群中的每个主节点创建一个从节点。

分配原则:尽量保证主服务器和从服务器各自运行在不同的 IP 地址(机器),防止机器故障导致主从机制失效,高可用性得不到保障。

3. Redis 集群的使用

什么是 slots:

Redis 集群启动后, 你会看到如下提示:

e607f6da-f1e9-11ef-9310-92fbcf53809c.png
e66b7606-f1e9-11ef-9310-92fbcf53809c.png

一个 Redis 集群包含了16384个插槽(hash slot) ,编号从0-16383,Redis 中的每个键都属于这 16384 个插槽的其中一个。注意:这里虽然只有 16384个插槽,但是并不是只能插入 16384个键,多个不同的键可以插入到同一个插槽的,并不是一个插槽一个键的

集群使用公式CRC16(key) % 16384来计算键 key 属于哪个槽,其中 CRC16(key) 语句用于计算键 key 的 CRC16的校验和

e6a04cdc-f1e9-11ef-9310-92fbcf53809c.png

集群中的每个节点负责处理一部分插槽。举个例子:如果一个集群可以有主节点,其中

节点 A 负责处理0号 ~ 5460号插槽

节点 B 负责处理5461号 ~ 10922号插槽

节点 C 负责处理10923号 ~ 16383号插槽

在集群中录入值:

在 Redis 每次录入,查询键值,redis 都会计算出该 key 应该送往的插槽,如果不是该客户端对应服务器的插槽,redis 会告知前往的 Redis 实例地址和端口。

Redis-cli 客户端提供了-c参数实现自动重定向。

如redis-cli -c -p 6379登入后,再录入,查询键值对可以自动重定向

e6bd951c-f1e9-11ef-9310-92fbcf53809c.png

e6ecbd38-f1e9-11ef-9310-92fbcf53809c.png

e706be5e-f1e9-11ef-9310-92fbcf53809c.png

e730ac50-f1e9-11ef-9310-92fbcf53809c.png

不在一个 slot 下的键值,是不能使用 mget,mset 等多键操作

192.168.76.147:6381> mset k1 "v1" k2 "v2" k3 "v3"

e759219e-f1e9-11ef-9310-92fbcf53809c.png

e78161d6-f1e9-11ef-9310-92fbcf53809c.png

可以通过{}来定义组的概念,从而使 key 中{}内相同内容的键值对放到一个slot中去,就解决了上面 mget 分布到不同 slot 而导致失败的原因。

192.168.76.147:6381> mest k1{order} "v1" k2{order} "v2" k3{order} "v3"

e7afa29e-f1e9-11ef-9310-92fbcf53809c.png

注意:你如果对键加上了{}组,那么你想要获取到该值的时候,也是要加上对应的{}组的,才能获取到的。

e7dc4dda-f1e9-11ef-9310-92fbcf53809c.png

e8086820-f1e9-11ef-9310-92fbcf53809c.png

e85c2e6a-f1e9-11ef-9310-92fbcf53809c.png

查询集群中的值:

指令:CLUSTER KEYSLOT 返回 key 对应的 slot 值

192.168.76.147:6381> cluster keyslot k1

e87563e4-f1e9-11ef-9310-92fbcf53809c.png

192.168.76.147:6381> cluster keyslot k2{order}

e89835cc-f1e9-11ef-9310-92fbcf53809c.png

可以看到归属于{}同一组的,Redis都是分配到了同一个 slot 插槽数值当中。

e8c82912-f1e9-11ef-9310-92fbcf53809c.png

指令:CLUSTER COUNTKEYSINSLOT 返回 slot 有多少个 key

192.168.76.147:6381> cluster countkeysinslot 12706
(integer) 1
192.168.76.147:6381> cluster countkeysinslot 16025
(integer) 3

e8e5faaa-f1e9-11ef-9310-92fbcf53809c.png

指令:CLUSTER GETKEYSINSLOT 返回 count 个 slot 槽中的键

192.168.76.147:6381> cluster getkeysinslot 16025 1
1) "k1{order}"
192.168.76.147:6381> cluster getkeysinslot 16025 2
1) "k1{order}"
2) "k2{order}"
192.168.76.147:6381> cluster getkeysinslot 16025 3

e910aa8e-f1e9-11ef-9310-92fbcf53809c.png

e930f01e-f1e9-11ef-9310-92fbcf53809c.png

4. Redis 集群故障恢复

如果主节点下线, 从节点会自动升为主节点(注意 15 秒超时, 再观察比较准确)

[root@localhost ~]# redis-cli -c -p 6380

e964e6f8-f1e9-11ef-9310-92fbcf53809c.png

e986b2a6-f1e9-11ef-9310-92fbcf53809c.png

e9b45ac6-f1e9-11ef-9310-92fbcf53809c.png

这里我们将 6380 主机关闭了。

e9d84fb2-f1e9-11ef-9310-92fbcf53809c.png

ea419044-f1e9-11ef-9310-92fbcf53809c.png

主节点恢复后,主节点回来变成从机

ea71acac-f1e9-11ef-9310-92fbcf53809c.png

ea9bb74a-f1e9-11ef-9310-92fbcf53809c.png

如果所有某一段插槽的主从节点都宕掉了,Redis 服务是否还能继续,要根据不同的配置而言。

如果某一段插槽的主从都宕机了,而在 redis.conf 配置文件当中cluster-require-full-coverage为yes,那么,整个集群都会被宕掉,无法使用。

如果某一段插槽的主从都宕机了,而在 redis.conf 配置文件当中cluster-require-full-coverage为no,那么,仅仅只是该段插槽的数据不能使用了,也无法存储了,其他插槽的数据还可以继续使用。

redis.conf 文件当中的参数cluster-require-full-coverage

eacd0f52-f1e9-11ef-9310-92fbcf53809c.png

5. Redis 集群的 Jedis 开发(使用Java程序连接 Redis 同时开启集群)

即使连接的不是主机,集群会自动切换主机进行存储,主机写,从机读

无中心化主从集群,无论从哪台主机写的数据,其他主机上都能读到数据。

注意:需要将 Redis 相关的端口都打开 否则会报错

配置防火墙将所有相关 Redis 的端口都打开。

[root@localhost src]# firewall-cmd --add-port=6379/tcp --permanent
Warning: ALREADY_ENABLED: 6379:tcp
success
[root@localhost src]# firewall-cmd --add-port=6380/tcp --permanent
success
[root@localhost src]# firewall-cmd --add-port=6381/tcp --permanent
success
[root@localhost src]# firewall-cmd --add-port=6389/tcp --permanent
success
[root@localhost src]# firewall-cmd --add-port=6390/tcp --permanent
success
[root@localhost src]# firewall-cmd --add-port=6391/tcp --permanent

eaeeed98-f1e9-11ef-9310-92fbcf53809c.png

[root@localhost src]# firewall-cmd --reload

eb1361d2-f1e9-11ef-9310-92fbcf53809c.png

[root@localhost src]# firewall-cmd --list-all

eb31e2d8-f1e9-11ef-9310-92fbcf53809c.png

在pom.xml当中引入redis.clients依赖。如下:

    
        
            redis.clients
            jedis
            3.2.0
        

eb4f0b56-f1e9-11ef-9310-92fbcf53809c.png

首先测试,是否可以连接到 Redis 服务器。
eb82c996-f1e9-11ef-9310-92fbcf53809c.png

package com.rainbowsea.jedis;

import org.junit.Test;
import redis.clients.jedis.Jedis;

public class JedisCluster_ {

    @Test
    public void con() {
        // 使用 ip地址 + redis的端口的构造器方法
        Jedis jedis = new Jedis("192.168.76.147", 6379);

        // 如果Redis 配置了密码,则需要进行身份校验
        jedis.auth("rainbowsea");
        String ping = jedis.ping();
        System.out.println("连接成功 ping 返回的结果 = " + ping);

        jedis.close();  // 关闭当前连接,注意并没有关闭 Redis

    }

}

ebb308ea-f1e9-11ef-9310-92fbcf53809c.png

ebd1dd88-f1e9-11ef-9310-92fbcf53809c.png

import org.junit.Test;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

import java.util.HashSet;
import java.util.Set;

public class JedisCluster_ {
    public static void main(String[] args) {
        Set set = new HashSet<>();
        set.add(new HostAndPort("192.168.76.147", 6379));

        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        // 对连接池进行配置
        jedisPoolConfig.setMaxTotal(200);
        jedisPoolConfig.setMaxIdle(32);
        jedisPoolConfig.setMaxWaitMillis(60 * 1000); // 单位是毫秒
        jedisPoolConfig.setBlockWhenExhausted(true);
        jedisPoolConfig.setTestOnBorrow(true);

        JedisCluster jedisCluster = new JedisCluster(set,5000,5000,5,"rainbowsea",jedisPoolConfig );
        jedisCluster.set("address", "bj");
        String address = jedisCluster.get("address");
        System.out.println("address=>" + address);
        jedisCluster.close();

    }
}

ebfd3140-f1e9-11ef-9310-92fbcf53809c.png

ec1e0834-f1e9-11ef-9310-92fbcf53809c.png

ec44c2f8-f1e9-11ef-9310-92fbcf53809c.png

6. Redis 集群的优缺点

优点:

实现扩容。

分摊压力。

无中心配置相对简单。

缺点:

多键操作是不被支持的。

多键的 Redis 事务是不被支持的。 lua 脚本不被支持

由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而其它方案想要迁移至 redis cluster ,需要整体迁移而不是逐步过渡,复杂度较大。

7. 补充:

将 root 目录下的,rdb、aof 文件都删除掉

ec634930-f1e9-11ef-9310-92fbcf53809c.png

[root@localhost ~]# rm -f dump*.rdb

ecabb9ea-f1e9-11ef-9310-92fbcf53809c.png
ece5b5dc-f1e9-11ef-9310-92fbcf53809c.png

ed0ca886-f1e9-11ef-9310-92fbcf53809c.png

ed3e8eb4-f1e9-11ef-9310-92fbcf53809c.png

8. 最后:

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”

链接:https://www.cnblogs.com/TheMagicalRainbowSea/p/18703659

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    13

    文章

    10094

    浏览量

    90880
  • 主机
    +关注

    关注

    0

    文章

    1047

    浏览量

    36431
  • 应用程序
    +关注

    关注

    38

    文章

    3342

    浏览量

    59921
  • Redis
    +关注

    关注

    0

    文章

    390

    浏览量

    12051

原文标题:8. 最后:

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    redis集群环境安装及配置

    redis集群主从配置
    发表于 03-08 09:59

    redis集群的两种备份方式

    redis集群 主从同步 备份
    发表于 04-17 13:30

    3分钟搭建Redis Cluster集群

    Redis Cluster集群快速搭建
    发表于 06-12 14:58

    redis集群的如何部署

    redis集群的部署(伪分布式)
    发表于 05-29 17:13

    Redis集群相关问题的解决

    Redis 集群相关问题
    发表于 06-11 10:09

    Docker部署Redis服务器集群的方法

    Docker部署Redis服务器集群
    发表于 06-13 09:12

    如何构建一个稳定、高性能的Redis集群

    地提供服务的? 你也可以尝试回答一下以下这些问题: 我使用 Redis 的场景很简单,只使用单机版 Redis 会有什么问题吗? 我的 Redis 故障宕机了,数据丢失了怎么办?如何能保证我的业务应用不受影响? 为什么需要主从
    的头像 发表于 03-03 15:05 1965次阅读
    如何构建一个稳定、高性能的<b class='flag-5'>Redis</b><b class='flag-5'>集群</b>?

    Redis的主从、哨兵、Redis Cluster集群

      前言 今天跟小伙伴们一起学习Redis的主从、哨兵、Redis Cluster集群Redis主从 Redis哨兵
    的头像 发表于 06-12 14:58 1382次阅读
    <b class='flag-5'>Redis</b>的主从、哨兵、<b class='flag-5'>Redis</b> Cluster<b class='flag-5'>集群</b>

    redis集群状态查看命令

    Redis集群是一种高可用性的分布式架构,可以通过多个节点实现数据的复制和负载均衡。为了维护集群的稳定性和可靠性,管理员需要监控和查看集群的状态。下面是详细介绍
    的头像 发表于 12-04 10:44 2701次阅读

    redis集群中的hash一致性算法的理解

    Redis集群是一种为了增强Redis的可扩展性和高可用性而设计的集群方案。在Redis集群中,
    的头像 发表于 12-04 10:45 1264次阅读

    redis查看集群状态命令

    Redis 是一个开源的、内存中的数据结构存储系统,提供了一系列命令来管理和操作数据。在 Redis 中,集群是一个由多个 Redis 实例
    的头像 发表于 12-04 11:39 2541次阅读

    K8S学习教程(二):在 PetaExpress KubeSphere容器平台部署高可用 Redis 集群

    前言 Redis 是在开发过程中经常用到的缓存中间件,为了考虑在生产环境中稳定性和高可用,Redis通常采用集群模式的部署方式。 在制定Redis
    的头像 发表于 07-03 15:30 1466次阅读
    K8S学习教程(二):在 PetaExpress KubeSphere容器平台部署高可用 <b class='flag-5'>Redis</b> <b class='flag-5'>集群</b>

    redis三种集群方案详解

    Redis中提供的集群方案总共有三种(一般一个redis节点不超过10G内存)。
    的头像 发表于 03-31 10:46 1272次阅读
    <b class='flag-5'>redis</b>三种<b class='flag-5'>集群</b>方案详解

    Redis集群部署与性能优化实战

    Redis作为高性能的内存数据库,在现代互联网架构中扮演着关键角色。作为运维工程师,掌握Redis的部署、配置和优化技能至关重要。本文将从实战角度出发,详细介绍Redis
    的头像 发表于 07-08 17:56 622次阅读

    Redis集群部署配置详解

    Redis集群是一种分布式Redis解决方案,通过数据分片和主从复制实现高可用性和横向扩展。集群将整个数据集分割成16384个哈希槽(hash slots),每个节点负责一部分槽位。
    的头像 发表于 07-17 11:04 588次阅读