Redis应用学习——Redis Cluster部署

1. 认识Redis Cluster

1. 集群所解决的问题node

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

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

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

3. Redis集群的基本架构redis

  • 节点:服务端有多个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个节点
  • meet:在一个Redis的客户端经过meet命令,便可与另外一个节点创建通讯交换信息,使用格式为cluster meet ip port,经过该命令将集群中的全部节点链接起来
    • 链接各个节点,经过cluster nodes命令便可查看当前节点所链接的节点有哪些
  • 分配槽位:经过命令cluster addslots slot,slot为数值,范围是0~16383,不可能一条条的写,因此能够经过shell脚本执行,从六个节点中任意挑选三个节点做为主节点用于后面的主从复制,输入对应参数执行该shell脚本为这三个主节点分配槽位,分配完成后,在链接任意一个节点的客户端经过cluster nodes命令便可查看集群中节点的节点信息(好比每一个节点分配的槽位、节点id等),经过cluster info命令便可查看集群的状态信息(好比正常的节点数等),经过这两个命令便可查看集群是否配置成功,成功后便可开始读写命令
  • 设置主从节点,创建主从复制:经过命令cluster replicate node-id,node-id表示某个节点的id,执行这个命令后就会将当前节点做为node-id节点的从节点,实现主从复制以及高可用的自动故障转移,node-id能够经过cluster nodes命令查看得到,好比在上面的执行cluster nodes命令的结果图中,6380端口的Redis节点的node-id为 4dec2bb5e32a6cd6bec9250d4a881f46d6530746 ,创建主从节点关系后,6380、638一、6382为主节点,638三、638四、6385为对应的从节点,再次执行cluster nodes命令查看主从关系
  • 查看最终创建的集群:经过cluster slots命令便可查看集群中每个主节点的分配的槽位范围、自身以及从节点的IP地址和端口信息,而后能够经过集群环境下的Redis数据读写命令,对集群中的数据进行读写操做,集群环境必须在链接客户端的命令后面加 -c
  • 在实际生产环境中,不会使用这些命令进行部署,而是利用另外的一些工具更方便快捷的方式部署,了解这些命令是为了更好的理解集群架构

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

  • 须要准备Ruby环境:下载、编译、安装Ruby;而后安装rubygem redis,这个是Ruby客户端,用来执行Ruby命令;而后再安装redis-trib.rb
    • 安装ruby:经过linux命令 yum install ruby    yum install rubygems,便可安装Ruby环境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环境并发

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

 6. Redis Cluster架构补充细节:负载均衡

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