Redis集群

以前咱们讲了如下Redis的知识技术四部曲,点击回顾:
Redis的sentinel(哨兵)机制》、
解密Redis的持久化和主从复制机制》、
Redis安装和实际应用》、
深刻浅出Redis》;接下来咱们在看看Redis第五部曲:Redis集群。html

Redis集群简介
Redis 集群是一个能够在多个 Redis 节点之间进行数据共享的设施(installation)。
Redis 集群不支持那些须要同时处理多个键的 Redis 命令, 由于执行这些命令须要在多个 Redis 节点之间移动数据, 而且在高负载的状况下, 这些命令将下降 Redis 集群的性能, 并致使不可预测的行为。好比:有name1 和name2 两个节点,命令del name1 name2要同时删除这个key,就不能写在一块儿,得分开写。
Redis 集群经过分区(partition)来提供必定程度的可用性(availability): 即便集群中有一部分节点失效或者没法进行通信, 集群也能够继续处理命令请求。
Redis 集群提供了如下两个好处:
将数据自动切分(split)到多个节点的能力。
当集群中的一部分节点失效或者没法进行通信时, 仍然能够继续处理命令请求的能力。node

Redis集群数据共享
Redis 集群使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现: 一个 Redis 集群包含 16384 个哈希槽(hash slot), 数据库中的每一个键都属于这 16384 个哈希槽的其中一个, 集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪一个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和。redis

集群中的每一个节点负责处理一部分哈希槽。 举个例子, 一个集群能够有三个哈希槽, 其中:
节点 A 负责处理 0 号至 5500 号哈希槽。
节点 B 负责处理 5501 号至 11000 号哈希槽。
节点 C 负责处理 11001 号至 16384 号哈希槽。数据库

这种将哈希槽分布到不一样节点的作法使得用户能够很容易地向集群中添加或者删除节点。 好比说:
若是用户将新节点 D 添加到集群中, 那么集群只须要将节点 A 、B 、 C 中的某些槽移动到节点 D 就能够了。与此相似, 若是用户要从集群中移除节点 A , 那么集群只须要将节点 A 中的全部哈希槽移动到节点 B 和节点 C , 而后再移除空白(不包含任何哈希槽)的节点 A 就能够了。ruby

由于将一个哈希槽从一个节点移动到另外一个节点不会形成节点阻塞, 因此不管是添加新节点仍是移除已存在节点, 又或者改变某个节点包含的哈希槽数量, 都不会形成集群下线。网络

Redis集群的主从复制:
为了使得集群在一部分节点下线或者没法与集群的大多数(majority)节点进行通信的状况下, 仍然能够正常运做, Redis 集群对节点使用了主从复制功能: 集群中的每一个节点都有 1 个至 N 个复制品(replica), 其中一个复制品为主节点(master), 而其他的 N-1 个复制品为从节点(slave)。app

在以前列举的节点 A 、B 、C 的例子中, 若是节点 B 下线了, 那么集群将没法正常运行, 由于集群找不到节点来处理 5501 号至 11000号的哈希槽。less

另外一方面,假如在建立集群的时候(或者至少在节点 B 下线以前), 咱们为主节点 B 添加了从节点 B1 , 那么当主节点 B 下线的时候, 集群就会将 B1 设置为新的主节点, 并让它代替下线的主节点 B , 继续处理 5501 号至 11000 号的哈希槽, 这样集群就不会由于主节点 B 的下线而没法正常运做了。不过若是节点 B 和 B1 都下线的话, Redis 集群仍是会中止运做。异步

Redis集群的一致性保证async

Redis 集群不保证数据的强一致性(strong consistency): 在特定条件下, Redis 集群可能会丢失已经被执行过的写命令。
使用异步复制(asynchronous replication)是 Redis 集群可能会丢失写命令的其中一个缘由。

考虑如下这个写命令的例子:
客户端向主节点 B 发送一条写命令。
主节点 B 执行写命令,并向客户端返回命令回复。
主节点 B 将刚刚执行的写命令复制给它的从节点 B1 、 B2 和 B3 。
如你所见, 主节点对命令的复制工做发生在返回命令回复以后, 由于若是每次处理命令请求都须要等待复制操做完成的话, 那么主节点处理命令请求的速度将极大地下降 —— 咱们必须在性能和一致性之间作出权衡。

若是真的有必要的话, Redis 集群可能会在未来提供同步地(synchronou)执行写命令的方法。
Redis 集群另一种可能会丢失命令的状况是, 集群出现网络分裂(network partition), 而且一个客户端与至少包括一个主节点在内的少数(minority)实例被孤立。

举个例子, 假设集群包含 A 、 B 、 C 、 A1 、 B1 、 C1 六个节点, 其中 A 、B 、C 为主节点, 而 A1 、B1 、C1 分别为三个主节点的从节点, 另外还有一个客户端 Z1 。

假设集群中发生网络分裂, 那么集群可能会分裂为两方, 大多数(majority)的一方包含节点 A 、C 、A1 、B1 和 C1 , 而少数(minority)的一方则包含节点 B 和客户端 Z1 。

在网络分裂期间, 主节点 B 仍然会接受 Z1 发送的写命令:
若是网络分裂出现的时间很短, 那么集群会继续正常运行;可是,若是网络分裂出现的时间足够长, 使得大多数一方将从节点 B1 设置为新的主节点, 并使用 B1 来代替原来的主节点 B , 那么 Z1 发送给主节点 B 的写命令将丢失。

注意,在网络分裂出现期间, 客户端 Z1 能够向主节点 B 发送写命令的最大时间是有限制的, 这一时间限制称为节点超时时间(node timeout),是 Redis 集群的一个重要的配置选项:
对于大多数一方来讲,若是一个主节点未能在节点超时时间所设定的时限内从新联系上集群, 那么集群会将这个主节点视为下线, 并使用从节点来代替这个主节点继续工做。
对于少数一方, 若是一个主节点未能在节点超时时间所设定的时限内从新联系上集群, 那么它将中止处理写命令, 并向客户端报告错误。

Redis集群搭建
要让集群正常运做至少须要3个主节点, 不过在刚开始试用集群功能时, 强烈建议使用六个节点: 其中三个为主节点, 而其他三个则是各个主节点的从节点。
集群规划:3个主节点,3个从节点。

配置文件:

port 7000 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes daemonize yes protected-mode no

文件中的 cluster-enabled 选项用于开实例的集群模式, 而 cluster-conf-file 选项则设定了保存节点配置文件的路径, 默认值为 nodes.conf.

首先准备三台机器,计划每台机器运行两个redis实例,集群一共运行6个实例。在每台机器上建立个redis-cluster的目录,建立两个以端口号为名字的子目录, 稍后咱们在将每一个目录中运行一个 Redis 实例。

mkdir cluster-test cd cluster-test mkdir 7000 7001

在文件夹 7000 和7001 中, 各建立一个 redis.conf 文件, 文件的内容可使用上面的示例配置文件, 但记得将配置中的端口号从 7000 改成与文件夹名字相同的号码。

在每台机器的7000和7001文件夹下,使用redis-server redis.conf启动实例。

如今咱们已经有了六个正在运行中的 Redis 实例, 接下来咱们须要使用这些实例来建立集群, 并为每一个节点编写配置文件。

经过使用 Redis 集群命令行工具 redis-trib , 编写节点配置文件的工做能够很是容易地完成: redis-trib 位于 Redis 源码的 src 文件夹中, 它是一个 Ruby 程序, 这个程序经过向实例发送特殊命令来完成建立新集群, 检查集群, 或者对集群进行从新分片(reshared)等工做。

安装ruby相关的程序:

1.yum install ruby 2.yum install rubygems 3.gem install redis --version 3.0.0

注意: 
gem install redis --version 3.0.0 失败的话,须要修改一下gem的源
gem sources --remove https://rubygems.org/
gem sources -a https://ruby.taobao.org/

安装完以后用执行如下命令来建立集群:

./redis-trib.rb create --replicas 1 ip1:7000 ip1:7001 Ip2:7000 ip2:7001 ip3:7000 ip3:7001

命令的意义以下:
给定 redis-trib.rb 程序的命令是 create , 这表示咱们但愿建立一个新的集群。
选项 --replicas 1 表示咱们但愿为集群中的每一个主节点建立一个从节点。
以后跟着的其余参数则是实例的地址列表, 咱们但愿程序使用这些地址所指示的实例来建立新集群。
简单来讲, 以上命令的意思就是让 redis-trib 程序建立一个包含三个主节点和三个从节点的集群。
建立完以后用 redis-clie –c –p 7000来连接集群

好了,Redis暂时为你们讲解到这里,感兴趣的同窗能够继续关注上海尚学堂,后续有关大数据技术知识文章陆续放送。。。

相关文章
相关标签/搜索