Redis集群

Posted 宫商角羽徵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis集群相关的知识,希望对你有一定的参考价值。

Redis集群

1. 关于Redis分片哨兵总结

Redis分片: 实现内存数据的扩容, 没有高可用的实现。

Redis哨兵: 主要实现Redis高可用技术,没有实现内存扩容,并且Redis哨兵本身没有实现高可用的效果。

 

 

2. Redis集群概述

Redis集群设计时主机实现分片的功能,每台主机之后都有对应的从机,并且在内部实现高可用(不需要依赖第三方监控)。

通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取。

Redis是一个很好的Cache工具。大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿。

由于内存大小的限制,使用一台 Redis 实例显然无法满足需求,这时就需要使用多台 Redis作为缓存数据库。但是如何保证数据存储的一致性呢,这时就需要搭建Redis集群。采用合理的机制,保证用户的正常的访问需求。

采用Redis集群,可以保证数据分散存储,同时保证数据存储的一致性,并且在内部实现高可用的机制,实现了服务故障的自动迁移。

 

 

3. 集群搭建计划

主从划分:

3台主机 3台从机共6台  端口划分7000-7005

   通用的概念(不适用Redis集群)

   通常情况下,集群的数量都是奇数台(包含主从)

   集群正常工作的条件   存活的服务器数量 > 总数N/2

   1台   不能搭建集群

   2台   不能搭建集群

   3台   (3-1) > 1.5    搭建集群最小单位3台    最多宕机1

   4台   (4-1) > 2      也可以搭建集群          最多宕机1

   所以集群的数量一般都是奇数台

 

 

4. 集群搭建

    1. 准备集群文件夹

    mkdir cluster

    2. 在cluster文件夹中分别创建7000-7005文件夹

     

    3. 将redis根目录中的redis.conf文件复制到cluster/7000/ 并以原名保存。

    cp redis.conf cluster/7000/

     

    4. 编辑配置文件:

    1)  注释IP地址

       

    2)  关闭保护模式

       

    3)  修改端口号

       

    4)  开启后台模式

       

    5)  修改pid文件(绝对路径)

       

    6)  修改持久化文件路径(绝对路径)

       

    7)  设定内存优化策略

       

    8)  关闭AOF模式

       

    9)  开启集群配置

       

    10)  开启集群节点信息配置文件

       

    11)  修改集群节点超时时间

       

 

    5. 复制修改后的配置文件

    将7000文件夹下的redis.conf文件分别复制到7001-7005中:

    

       [tsvv@192 cluster]$ cp 7000/redis.conf  7001/

    [tsvv@192 cluster]$ cp 7000/redis.conf  7002/

    [tsvv@192 cluster]$ cp 7000/redis.conf  7003/

    [tsvv@192 cluster]$ cp 7000/redis.conf  7004/

    [tsvv@192 cluster]$ cp 7000/redis.conf  7005/        

 

 

    6. 批量修改配置文件

    分别将7001-7005文件中的7000改为对应的端口号的名称(%s/7000/7001/g),修改时注意方向键的使用:

     

    7. 通过脚本编辑启动/关闭指令

    1)  创建启动脚本  vim cluster-start.sh

       

 

    2)  编辑关闭的脚本    vim  cluster-shutdown.sh

       

 

    3)  启动redis节点(注意:要以root权限启动,不然Ctrl+C会直接退出程序)

      sh cluster-start.sh

    4)  检查redis节点启动是否正常

       

    8.  创建redis集群

    #5.0版本执行 使用C语言内部管理集群

    

redis-cli --cluster create --cluster-replicas 1 192.168.6.128:7000 192.168.6.128:7001 192.168.6.128:7002 192.168.6.128:7003 192.168.6.128:7004 192.168.6.128:7005

 

  

    9. 查看节点信息

    



    10. Redis集群高可用测试

    关闭Redis主机,检查是否自动实现故障迁移。

    再次启动关闭的主机,检查是否能够实现自动的挂载,一般情况下能够实现主从挂载;个别情况: 宕机后的节点重启,可能挂载到其他主节点中(7001-7002) 正确的

 

 

    11. Redis集群高可用推选原理

     

图- 24

    原理说明:

    Redis的所有节点都会保存当前Redis集群中的全部主从状态信息,并且每个节点都能够相互通信。当一个节点发生宕机现象,则集群中的其他节点通过PING-PONG检测机制检查Redis节点是否宕机,当有半数以上的节点认为宕机,则认为主节点宕机,同时由Redis剩余的主节点进入选举机制,投票选举链接宕机的主节点的从机,实现故障迁移。

    12. Redis集群宕机条件

    特点:集群中如果主机宕机,那么从机可以继续提供服务,当主机中没有从机时,则向其它主机借用多余的从机,继续提供服务,如果主机宕机时没有从机可用,则集群崩溃。

    答案:9个redis节点,节点宕机5-7次时集群才崩溃:

 

     

 

    13. Redis hash槽存储数据原理

    说明: RedisCluster采用此分区,所有的键根据哈希函数(CRC16[key]&16383)映射到0-16384槽内,共16384个槽位,每个节点维护部分槽及槽所映射的键值数据.根据主节点的个数,均衡划分区间.

     算法:哈希函数: Hash()=CRC16[key]&16384按位与

     

    当向Redis集群中插入数据时,首先将key进行计算,之后将计算结果匹配到具体的某一个槽的区间内,之后再将数据set到管理该槽的节点中:

     

    分片效率高:  发生在服务器中      Redis只负责存取

    Redis集群:  发生在Redis内部    效率低

 

 

Java测试:

/**

    * 利用spring整合Redis集群

    * 和分片几乎相同!!!

    */

   @Test

   public void testCluster() {

      Set<HostAndPort> node = new HashSet<HostAndPort>();

      node.add(new HostAndPort("192.168.8.128",7000));

      node.add(new HostAndPort("192.168.8.128",7001));

      node.add(new HostAndPort("192.168.8.128",7002));

      node.add(new HostAndPort("192.168.8.128",7003));

      node.add(new HostAndPort("192.168.8.128",7004));

      node.add(new HostAndPort("192.168.8.128",7005));

      JedisCluster cluster = new JedisCluster(node);

      cluster.set("tsvv", "Redis集群测试成功!!!!");

      System.out.println(cluster.get("tsvv"));

   }

 

 

以上是关于Redis集群的主要内容,如果未能解决你的问题,请参考以下文章

java怎么从多台redis集群取数据库

我在工作中遇到的redis集群使用

redis集群概念

python连接redis,redis集群

Python3 redis集群连接 (带密码验证)

c#程序怎么调用redis集群