八、Redis集群

本文详细介绍了Redis集群的搭建过程,包括删除旧的持久化文件、配置多个Redis实例、启动服务、创建集群以及检查集群状态。还探讨了Redis集群的插槽分配机制,确保数据均匀分布。此外,提到了在集群中进行值操作的注意事项,如多键操作的限制。最后,讨论了故障恢复策略以及Java操作Redis集群的方法,并总结了Redis集群的优缺点,如无中心化、动态扩容,但也存在多键操作不支持等问题。
摘要由CSDN通过智能技术生成

八、Redis集群

1、Redis集群概述
  • Redis使用会出现哪些问题?
    • 1、容量不够,Redis如何进行扩容?
    • 2、并发写操作,Redis如何分摊?
  • Redis中的无中心化集群
    • Redis集群实现了对Redis的水平扩容,即启动N个Redis节点,将整个数据库分步存储在这N个节点中,每个节点存储总数的1/N
    • Redis集群通过分区(partition)来提供一定程度的可用性(availability):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求
2、Redis集群搭建
  • 使用六个端口分别开启redis服务器,模拟六台服务器

  • 1、将原来保存的rdb或aof文件全部删掉 命令: [root@localhost myredis]# rm -rf *.rdb

  • 2、制作6个实例:6379 6380 6381 6389 6390 6391

    • 在每个配置文件中配置(注意更改端口相关配置)

      include /myredis/redis.conf     # 导入配置文件
      pidfile /var/run/redis_6391.pid 
      port 6391 # 指定端口号
      dbfilename dump6391.rdb   # 指定持久化文件名称
      cluster-enabled yes       # 开启支持集群
      cluster-config-file nodes-6391.conf    # 设置节点配置文件名称
      cluster-node-timeout 15000	  # 设定节点失联时间,超过该时间(毫秒),集群自动进入主从切换
      
  • 3、启动六个服务

    • redis-server启动服务

      [root@localhost myredis]# redis-server redis6379.conf
      [root@localhost myredis]# redis-server redis6380.conf
      [root@localhost myredis]# redis-server redis6381.conf
      [root@localhost myredis]# redis-server redis6389.conf
      [root@localhost myredis]# redis-server redis6390.conf
      [root@localhost myredis]# redis-server redis6391.conf
      
    • 查看进程是否启动成功

      [root@localhost myredis]# ps -ef | grep redis
      root       9726      1  0 10:31 ?        00:00:00 redis-server *:6379 [cluster]
      root       9732      1  0 10:31 ?        00:00:00 redis-server *:6380 [cluster]
      root       9738      1  0 10:32 ?        00:00:00 redis-server *:6381 [cluster]
      root       9752      1  0 10:32 ?        00:00:00 redis-server *:6389 [cluster]
      root       9758      1  0 10:32 ?        00:00:00 redis-server *:6390 [cluster]
      root       9764      1  0 10:32 ?        00:00:00 redis-server *:6391 [cluster]
      root       9779   9442  0 10:33 pts/2    00:00:00 grep --color=auto redis
      
  • 4、将六个节点合成一个集群

    • 1、要保证所有的redis实例启动后,node-xxx.conf文件都能正常生成

      redis启动

    • 2、进行合成操作

      • 2.1、进入到redis原始目录的src目录下,执行下列操作

        redis-cli --cluster create --cluster-replicas 1 192.168.17.143:6379 192.168.17.143:6380 192.168.17.143:6381 192.168.17.143:6389 192.168.17.143:6390 192.168.17.143:6391
        
      • 2.2、注意点:

        • 此处不要使用127.0.0.1,使用真实的IP地址
        • replicas 1 采用最简单的方式配置集群,一台主机,一台从机,正好三组
      • 2.3、示例

        [root@localhost myredis]# cd /opt/redis-6.2.1/src
        [root@localhost src]# redis-cli --cluster create --cluster-replicas 1 192.168.17.143:6379 192.168.17.143:6380 192.168.17.143:6381 192.168.17.143:6389 192.168.17.143:6390 192.168.17.143:6391
        

      启动完成

    • 3、完成集群搭建

      • 出现下述示例便完成了搭建

        环境搭建完成

    • 4、客户端登录集群

      [root@localhost src]# redis-cli -c -p 6379
      
      • 通过cluster nodes命令查看集群信息

        查看效果

3、Redis集群插槽(slots)
  • 首先要了解Redis集群如何分配节点

    • 1、一个集群至少需要3个主节点
    • 2、选项 --cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点
    • 3、分配原则是什么:尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上
  • 什么是插槽(slot)?

    • 一个Redis集群中包含16384(0-16383)个插槽,数据库中的每一个键通过计算都是属于这16384中的一个

    • 通过某种算法计算key属于哪个插槽(类似于java中的Set存储过程)

    • 每一个节点享有一部分插槽

    • 以上面搭建集群为例,插槽如下分配

      节点 A 负责处理 0 号至 5460 号插槽
      节点 B 负责处理 5461 号至 10922 号插槽
      节点 C 负责处理 10923 号至 16383 号插槽
      
    • Redis使用插槽分配key的作用

      • 使得key能够平均的落在每一个节点中,减少每个节点服务器的压力
4、在集群中值操作
  • 在redis-cli每次录入、查询键值,redis都会计算出该key的插槽值并送往指定的插槽,如果不是当前客户端连接服务器的插槽,redis会报错,并告知应前往指定的redis实例地址和端口

  • redis-cli客户端提供了 -c 参数 实现了自动重定向的功能,上面登录的命令就是

  • 不在slot下的键值,是不能够使用mget,mset等多键操作的
    效果

  • 可以通过{}来定义组的概念,从而使key中的{}内相同内容的键值放到一个slot中去
    效果

  • 查询集群中的值
    效果

5、故障恢复
  • 1、如果主节点宕机(下线),从节点会自动升为主节点 :要注意上述配置文件中配置的超时时间
  • 2、主节点恢复后,主从关系变化 : 主节点回来变为从机
  • 3、如果某一段插槽的主节点全部宕机,redis服务时候还能继续?
    • 若配置文件中,cluster-require-full-coverage 为yes ,那么 ,整个集群都挂掉
    • 若配置文件中,cluster-require-full-coverage 为no ,那么 ,该插槽数据全都不能使用,也无法存储
6、java操作Redis集群
public class JedisTest{
    public static void main(String[] args){
        //创建对象,当然那也可以创建一个set集合,将端口号放进去
        //new HashSet(new HostAndPort())
        HostAndPort hostAndPort = new HostAndPort("192.168.17.143",6379);
        //只需要连接一个端口即可,因为Redis的无中心化集群,会自动切换节点
        JedisCluster jedisCluster = new JedisCluster(hostAndPort);
        //数据操作
        jedisCluster.set("key","value");
        String value = jedisCluster.get("key");
    }
}
7、Redis集群的优缺点
  • Redis集群的优点
    • 1、实现了扩容
    • 2、分摊压力
    • 3、无中心配置相对简单
  • Redis集群的不足
    • 1、多键操作是不被支持的
    • 2、多键的Redis事务不被支持,lua脚本不支持
    • 3、该无中心化集群出现较晚,很多公司采用了其他集群方案,迁移难度较大
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值