zoukankan      html  css  js  c++  java
  • NoSQL之Redis集群理论

    前言

    redis是一个开源的key value存储系统,受到了广大互联网公司的青睐。redis3.0版本之前只支持单例模式,在3.0版本及以后才支持集群,我这里用的是redis3.0.0版本;

    redis集群采用P2P模式,是完全去中心化的,不存在中心节点或者代理节点;

    redis集群是没有统一的入口的,客户端(client)连接集群的时候连接集群中的任意节点(node)即可,集群内部的节点是相互通信的(PING-PONG机制),每个节点都是一个redis实例;

    为了实现集群的高可用,即判断节点是否健康(能否正常使用),redis-cluster有这么一个投票容错机制:如果集群中超过半数的节点投票认为某个节点挂了,那么这个节点就挂了(fail)。这是判断节点是否挂了的方法;

    那么如何判断集群是否挂了呢? 如果集群中任意一个节点挂了,而且该节点没有从节点(备份节点),那么这个集群就挂了。这是判断集群是否挂了的方法;

    那么为什么任意一个节点挂了(没有从节点)这个集群就挂了呢? 因为集群内置了16384个slot(哈希槽),并且把所有的物理节点映射到了这16384[0-16383]个slot上,或者说把这些slot均等的分配给了各个节点。当需要在Redis集群存放一个数据(key-value)时,redis会先对这个key进行crc16算法,然后得到一个结果。再把这个结果对16384进行求余,这个余数会对应[0-16383]其中一个槽,进而决定key-value存储到哪个节点中。所以一旦某个节点挂了,该节点对应的slot就无法使用,那么就会导致集群无法正常工作。

    综上所述,每个Redis集群理论上最多可以有16384个节点。

    一、案例概述

    1.1、单节点Redis服务器带来的问题
    1.1.1、单点故障,服务不可用

    1.1.2、无法处理大量的并发数据请求

    1.1.3、数据丢失——大灾难

    1.2、解决方法
    搭建Redis集群

    二、案例前置知识点

    2.1、Redis集群介绍
    2.1.1、Redis集群是一个提供在多个Redis间节点间共享数据的程序集

    2.1.2、Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误

    2.1.3、Redis集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下可继续处理命令

    2.2、Redis集群的优势
    2.2.1、自动分割数据到不同的节点上

    2.2.2、整个集群的部分节点失败或者不可达的情况下能够继续处理命令

    2.3、Redis集群的实现方法
    2.3.1、有客户端分片

    2.3.2、代理分片

    2.3.3、服务器端分片

    2.4、Redis-Cluster数据分片
    2.4.1、Redis集群没有使用一致性hash,而是引入了哈希槽概念

    2.4.2、Redis集群有16384个哈希槽

    2.4.3、每个key通过CRC16校验后对16384取模来决定放置槽

    2.4.4、集群的每个节点负责一部分哈希槽

    2.4.5、以3个节点组成的集群为例

    ①节点A包含0到5500号哈希槽

    ②节点B包含5501到11000号哈希槽

    ③节点C包含11001到16384号哈希槽

    2.4.6、支持添加或者删除节点

    ①添加删除节点无需停止服务

    ②例如:

    1)如果想新添加个节点D,需要移动节点A、B、C中的部分槽到D上

    2)如果想移除节点A,需要将A中的槽移到B和C上,再将没有任何槽的A节点从集群中移除

    2.4.7、Redis-Cluster的主从复制模型

    ①集群中具有A,B,C三个节点,如果节点B失败了,整个集群就会因缺少5501-11000这个范围的槽而不可用

    ②为每个节点添加一个从节点A1,B1,C1,整个集群便有三个master节点和三个slave节点组成,在节点B失败后,集群便会选举B1为新的主节点继续服务

    ③当B和B1都失败后,集群将不可用

  • 相关阅读:
    mysql自定义函数多表更新:update_order_relation()
    mysql自定义函数初始化数据:init_data()
    关于tomcat启动错误:At least one JAR was scanned for TLDs yet contained no TLDs
    intellij debug模式提示 Method breakpoints may dramatically slow down debugging
    Linux开机启动流程详细步骤是什么?
    chkconfig 添加脚本开机自启动
    优化SSH配置(一键完成增加若干参数)
    linux目录整理
    linux命令整理
    buffer和cache有什么区别?
  • 原文地址:https://www.cnblogs.com/sobk/p/14058935.html
Copyright © 2011-2022 走看看