Redis应用学习——Redis Cluster部署

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1. 认识Redis Cluster

1. 集群所解决的问题

  • 提供极高的并发量,即使单个Redis的并发处理量已经很多,但是在大型应用系统中,仍然远远不足,集群提高了并发处理量
  • 能存储更多的数据,单台Redis机器的内存大小有限制,可以通过增加内存条来解决但仍然有限制,集群就可以更好的解决

2. 数据分布:对于一份全量数据,如果其大小超过机器内存,就需要将数据按照分区规则分布式存储在一个个节点上,常用分区规则有

  • 顺序分布:比如有一百个数据,4个Redis节点,那么将这一百个数据顺序分为4份,分布在4个节点上
  • 哈希分布:全量数据中的每一条数据都进行一个哈希运算,依据哈希运算的结果将数据存储在对应的节点中,并且该哈希算法要保证基本能均匀分布数据;典型的例子就是Redis Cluster、Memcache等
    • 节点取余哈希分区:hash(key)%nodes,依据哈希算法计算出对应数据key的哈希值,然后与节点数取余求值,得到应该存储在第几个节点中,但是在节点伸缩时(增加或减少节点)就会发生数据迁移,对原来的每一个数据进行再哈希迁移存储到新的节点中,如果迁移数据量较多就会导致系统性能消耗过大,建议节点扩容的数量翻倍,因为这样数据迁移发生的次数是最少的
    • 一致性哈希分区:节点区域哈希会造成数据迁移,会造成极大的性能消耗,而一致性哈希分区则减轻了这种情况;原理简单来说就是,首先会有一个token环,这个环上代表着0到2的32次方,可以指定一个节点所在的点,多个节点将这个环分为多段,此时将一条数据的key进行哈希运算后,将得到的值找到在token环中的位置,从该位置顺时针旋转碰到的一个节点就是存放的节点。之所以伸缩节点会减少数据迁移,是因为每添加一个节点只会影响相邻的两个节点之间的数据,数据迁移量就会减少很多Redis应用学习——Redis Cluster部署_第1张图片
    • 虚拟槽分区:Redis Cluster采用的分区规则;预设虚拟槽,每个槽隐射一个数据子集,一般会比节点数量多,Redis Cluster的范围是0到16383,会将这些槽位均匀的分配到每个节点中,然后将每一个数据的key进行一个哈希运算后得到的值发送给Redis Cluster中的任意一个节点,假如值在该节点中的所管理槽位值范围包括该值,那么就保存在该节点中,如果不在范围内,则将该数据存储到对应的节点中;该方式也会进行数据迁移,但数据迁移量会更少,Redis Cluster中各个节点之间共享信息Redis应用学习——Redis Cluster部署_第2张图片

3. Redis集群的基本架构

Redis应用学习——Redis Cluster部署_第3张图片

  • 节点:服务端有多个Redis节点,每个节点都能处理来自客户端的读写请求操作,并且各个节点之间都能互相通信,交换信息(比如每个节点都能知道其他节点负责那些槽位),当客户端访问某个节点时,如果访问的key在这个节点上,那就直接访问该节点,否则该节点不会自动的将客户端连接迁移目标节点,而是会返回给客户端key所在的目标节点的信息,客户端再进行一次跳转
  • meet:每一个节点都会对集群中的其他所有节点进行meet操作,如果能够meet到其他节点,那么就表示两个节点之间可以进行通信
  • 指派槽:必须要给集群中的每一个Redis节点指派其负责管理的槽位,槽位共有从0到16383这一共16384个槽位,为了达到负载均衡的效果,尽量均匀分配槽位到每个节点中,比如有3个节点,那么就将0~5460槽位分配到一个节点,5461~10922分配到另一个槽位,10923~16383分配到最后一个。
  • 主从复制,实现高可用

4. Redis集群简单搭建过程:有两种安装配置方式,分别是官方工具安装和原生命令安装,主要介绍原生命令安装过程,用来理解架构

  • 配置Redis节点:除了需要配置端口号port(因为是在一台机器进行部署集群)、以及以守护线程运行Redis的参数daemonize yes等,主要配置参数有
    • cluster-enabled yes:该参数配置就表示当前Redis是一个Redis集群节点
    • cluster-node-timeout 15000:该配置可以被其他节点用来判断当前节点是否主观下线
    • cluster-config-file nodes-port.conf:集群节点的配置文件,通过port来区别每个节点生成的集群配置文件
    • cluster-require-full-coverage no:用于配置是否需要当前集群中所有节点全部正常才能对外提供服务,如果有一个节点发生故障将不会对外提供服务
    • 最简配置示例:如下图中的配置,将其中的端口数字修改为每个节点所占用的端口,复制修改该文件为6份,用作启动6个节点Redis应用学习——Redis Cluster部署_第4张图片Redis应用学习——Redis Cluster部署_第5张图片
  • meet:在一个Redis的客户端通过meet命令,即可与另一个节点建立通信交换信息,使用格式为cluster meet ip port,通过该命令将集群中的所有节点连接起来
    • 连接各个节点,通过cluster nodes命令即可查看当前节点所连接的节点有哪些Redis应用学习——Redis Cluster部署_第6张图片
  • 分配槽位:通过命令cluster addslots slot,slot为数值,范围是0~16383,不可能一条条的写,所以可以通过shell脚本执行,从六个节点中任意挑选三个节点作为主节点用于后面的主从复制,输入对应参数执行该shell脚本为这三个主节点分配槽位,分配完成后,在连接任意一个节点的客户端通过cluster nodes命令即可查看集群中节点的节点信息(比如每个节点分配的槽位、节点id等),通过cluster info命令即可查看集群的状态信息(比如正常的节点数等),通过这两个命令即可查看集群是否配置成功,成功后即可开始读写命令Redis应用学习——Redis Cluster部署_第7张图片b0a1db2802a88ec427e749885df87428dc7.jpgRedis应用学习——Redis Cluster部署_第8张图片ef3b3623f800c9a23d778e951416e371035.jpg
  • 设置主从节点,建立主从复制:通过命令cluster replicate node-id,node-id表示某个节点的id,执行这个命令后就会将当前节点作为node-id节点的从节点,实现主从复制以及高可用的自动故障转移,node-id可以通过cluster nodes命令查看获得,比如在上面的执行cluster nodes命令的结果图中,6380端口的Redis节点的node-id为 4dec2bb5e32a6cd6bec9250d4a881f46d6530746 ,建立主从节点关系后,6380、6381、6382为主节点,6383、6384、6385为对应的从节点,再次执行cluster nodes命令查看主从关系Redis应用学习——Redis Cluster部署_第9张图片Redis应用学习——Redis Cluster部署_第10张图片
  • 查看最终建立的集群:通过cluster slots命令即可查看集群中每一个主节点的分配的槽位范围、自身以及从节点的IP地址和端口信息,然后可以通过集群环境下的Redis数据读写命令,对集群中的数据进行读写操作,集群环境必须在连接客户端的命令后面加 -cRedis应用学习——Redis Cluster部署_第11张图片b63f084adfab99cd1109e888f08812608bb.jpg
  • 在实际生产环境中,不会使用这些命令进行部署,而是利用另外的一些工具更方便快捷的方式部署,了解这些命令是为了更好的理解集群架构

5. 使用Ruby脚本快速搭建Redis集群

  • 需要准备Ruby环境:下载、编译、安装Ruby;然后安装rubygem redis,这个是Ruby客户端,用来执行Ruby命令;然后再安装redis-trib.rb
    • 安装ruby:通过linux命令 yum install ruby    yum install rubygems,即可安装Ruby环境

    • 下载redis-3.0.0.gem至/usr/local下,执行:gem install /usr/local/redis-3.0.0.gem

    • 安装redis-trib.rb只需要将Redis安装包解压后的目录下,找到src目录,将其中的redis-trib.rb文件复制到/usr/local/bin目录下,复制到/usr/local/bin目录下主要是为了能够在任意目录下都能执行该文件,而运行该文件的前提就是要有Ruby环境Redis应用学习——Redis Cluster部署_第12张图片

  • 正常启动6台Redis节点,每个Redis节点的启动配置文件仍然和上面所写的原生命令搭建中所使用的相同(注意,之前使用原生命令创建的集群会产生一系列的日志文件和生成集群配置文件,将这些文件全部删除后才可以重新配置集群,默认这些文件存储的路径就在每个Redis启动配置文件中dir参数所指定的路径下),然后使用redis-trib.rb中的命令,将这些Redis节点建立为一个集群
    • redis-trib.rb create --replicas host1:port1 [host2:port2 ... hostn:portn] :该命令用于建立集群和节点间主从节点关系,count参数表示一个主节点对应多少个从节点,后面写上所有节点的IP地址和端口,redis-trib.rb会自动将这些节点分为主节点和从节点,比如count为1,节点数有6个,那么前3个节点就是主节点,后面3个就是从节点,按顺序主从节点对应,如果节点数量有问题无法匹配,则会报错,否则就会返回一个配置方案,选择是否接受该方案,输入yes表示接受该方案,集群就会生成1a440fa942541dba8fd9aebaec8abb51996.jpgRedis应用学习——Redis Cluster部署_第13张图片

 6. Redis Cluster架构补充细节:

  • 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
  • 节点的下线是通过集群中超过半数的主节点检测失效时才生效.
  • 客户端与redis节点直连,不需要中间proxy层(例如redis sentinel中需要sentinel做中间层),客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
  • redis-cluster把所有的物理节点映射到[0-16383]slot,cluster负责维护node<->slot<->value

 

转载于:https://my.oschina.net/ProgramerLife/blog/2714579

你可能感兴趣的:(Redis应用学习——Redis Cluster部署)