NoSQL之Redis(四)--- RedisCluster概念以及搭建

之前已经在博文中介绍了redis以及redis的简单实用,但是在实际的项目中用单机版redis还是很少的基本上都是实用redis集群。

 

         RedisCluster概念


         RedisCluster架构

         架构细节:

         (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

         (2)节点的fail是通过集群中超过半数的节点检测失效时才生效.

         (3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

         (4) Redis Cluster  是Redis的集群实现,内置数据自动分片机制,集群内部将所有的key映射到16384个Slot中,集群中的每个Redis Instance负责其中的一部分的Slot的读写。集群客户端连接集群中任一Redis Instance即可发送命令,当Redis Instance收到自己不负责的Slot的请求时,会将负责请求Key所在Slot的Redis Instance地址返回给客户端,客户端收到后自动将原请求重新发往这个地址,对外部透明。一个Key到底属于哪个Slot由crc16(key) % 16384 决定。

 

         例如下图

         Key:a

         计算a的hash值,例如值为100,100这个slot在server1上,所以a应该放到server1.

         Key:hello

         Hash值:10032,此slot在server3上。Hell可以应该存在server3.

 

         redis-cluster投票:容错

 

         (1)领着投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉.

         (2):什么时候整个集群不可用(cluster_state:fail)? 

             a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完成时进入fail状态. ps : redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.

             b:如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态.

           ps:当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误

 

         RedisCluster安装


         安装redis


         版本说明

         本教程使用redis3.0版本。3.0版本主要增加了redis集群功能。同时由于笔者实用的是一台虚拟机所以只是伪集群模式,但是和真集群的安装方法本质上还是类似的。

         安装的前提条件:

         需要安装gcc:yum install gcc-c++

 

         下载redis的源码包,把源码包上传到linux服务器

         解压源码包

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. tar -zxvf redis-3.0.0.tar.gz  
  2. Make  
  3. Make install  
  4. make installPREFIX=/usr/local/redis-cluster/redis01  

         ps:PREFIX必须大写表示redis的安装路径,执行上面几步之后单机版的redis已经安装成功。

 

         集群环境安装


         搭建集群需要使用到官方提供的ruby脚本,需要安装ruby的环境。       

         安装ruby

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. yum install ruby  
  2. yum install rubygems  

         redis集群管理工具redis-trib.rb输入如下依次命令可以找到

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. cd redis-3.0.0/src  
  2. ll*.rb  

         脚本需要的ruby包:

         下载地址:http://download.csdn.net/detail/senior_lee/9502524

         上传到Linux,并安装ruby包

         geminstall redis-3.0.0.gem

 

         集群搭建


         第一步:创建6另外5个redis实例,在/usr/local/redis-cluster/文件夹下,复制redis01即可,分别命名为redis02~redis06。

         注意:需要分别删除每个redis安装目录里面的dum.rdb文件。

         第二步:修改redis配置文件

         1将port分别改成7001~7006

         2打开cluster-enable前面的注释

         3把创建集群的ruby脚本复制到redis-cluster目录下。

         4启动6个redis实例

    

         5创建集群

 ./redis-trib.rb create --replicas 1 192.168.21.225:7001192.168.21.225:7002 192.168.21.225:7003 192.168.21.225:7004 192.168.21.225:7005192.168.21.225:7006

         ps:创建了三个节点主节点,三个从节点。其中—replicas1 表示每个主节点下面有1个从节点,从节点可以是任意多个。

窗口输出结果入下:

>>> Creating cluster

Connecting to node 192.168.21.225:7001: OK

Connecting to node 192.168.21.225:7002: OK

Connecting to node 192.168.21.225:7003: OK

Connecting to node 192.168.21.225:7004: OK

Connecting to node 192.168.21.225:7005: OK

Connecting to node 192.168.21.225:7006: OK

>>> Performing hash slotsallocation on 6 nodes...

Using 3 masters:

192.168.21.225:7001

192.168.21.225:7002

192.168.21.225:7003

Adding replica 192.168.21.225:7004 to 192.168.21.225:7001

Adding replica 192.168.21.225:7005 to 192.168.21.225:7002

Adding replica 192.168.21.225:7006 to 192.168.21.225:7003

M: 5a8523db7e12ca600dc82901ced06741b3010076192.168.21.225:7001

  slots:0-5460 (5461 slots) master

M: bf6f0929044db485dea9b565bb51e0c917d20a53192.168.21.225:7002

  slots:5461-10922 (5462 slots) master

M: c5e334dc4a53f655cb98fa3c3bdef8a808a693ca192.168.21.225:7003

  slots:10923-16383 (5461 slots) master

S: 2a61b87b49e5b1c84092918fa2467dd70fec115f192.168.21.225:7004

  replicates 5a8523db7e12ca600dc82901ced06741b3010076

S: 14848b8c813766387cfd77229bd2d1ffd6ac8d65192.168.21.225:7005

  replicates bf6f0929044db485dea9b565bb51e0c917d20a53

S: 3192cbe437fe67bbde9062f59d5a77dabcd0d632192.168.21.225:7006

  replicates c5e334dc4a53f655cb98fa3c3bdef8a808a693ca

Can I set the above configuration? (type'yes' to accept): yes

>>> Nodes configuration updated

>>> Assign a different configepoch to each node

>>> Sending CLUSTER MEET messagesto join the cluster

Waiting for the cluster to join.....

>>> Performing Cluster Check(using node 192.168.21.225:7001)

M: 5a8523db7e12ca600dc82901ced06741b3010076192.168.21.225:7001

  slots:0-5460 (5461 slots) master

M: bf6f0929044db485dea9b565bb51e0c917d20a53192.168.21.225:7002

  slots:5461-10922 (5462 slots) master

M: c5e334dc4a53f655cb98fa3c3bdef8a808a693ca192.168.21.225:7003

  slots:10923-16383 (5461 slots) master

M: 2a61b87b49e5b1c84092918fa2467dd70fec115f192.168.21.225:7004

  slots: (0 slots) master

  replicates 5a8523db7e12ca600dc82901ced06741b3010076

M: 14848b8c813766387cfd77229bd2d1ffd6ac8d65192.168.21.225:7005

  slots: (0 slots) master

  replicates bf6f0929044db485dea9b565bb51e0c917d20a53

M: 3192cbe437fe67bbde9062f59d5a77dabcd0d632192.168.21.225:7006

  slots: (0 slots) master

  replicates c5e334dc4a53f655cb98fa3c3bdef8a808a693ca

[OK] All nodes agree about slotsconfiguration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

 

         测试集群


         依次输入如下命令

cd/usr/local/redis-cluster/

redis01/bin/redis-cli-h 192.168.21.225 -p 7002 c

         ps:-c表示连接集群

 

集群就这样愉快的搭建完了,接下的文章里面会依次介绍如何使用jedis操作单机和集群版redis,jedis如何同spring集成以及如何编写jedis的工具类。