redis cluster 搭建

来源:互联网 发布:数据库查询手机号是 编辑:程序博客网 时间:2024/04/30 11:28

一、关于redis cluster

1、redis cluster的现状

reids-cluster计划在redis3.0中推出,目前最新版本3.2.0

目前redis支持的cluster特性(已亲测):

1):节点自动发现

2):slave->master 选举,集群容错

3):Hot resharding:在线分片

4):进群管理:cluster xxx

5):基于配置(nodes-port.conf)的集群管理

6):ASK 转向/MOVED 转向机制.

2、redis cluster 架构

1)redis-cluster架构图

 

架构细节:

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

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

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

(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value

2) redis-cluster选举:容错

 

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

(2):什么时候整个集群不可用(cluster_state:fail),当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误

    a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成进群的slot映射[0-16383]不完成时进入fail状态.

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

二、redis cluster的使用

1、安装redis cluster

1):安装redis-cluster依赖:redis-cluster的依赖库在使用时有兼容问题,在reshard时会遇到各种错误,请按指定版本安装.

(1)确保系统安装zlib,否则gem install会报(no such file to load -- zlib)

 

Java代码  收藏代码
  1. #download:zlib-1.2.6.tar  
  2. ./configure  
  3. make  
  4. make install  
  

 

 (1)安装ruby:version(1.9.2)

 Java代码  收藏代码

  1. # ruby1.9.2   
  2. cd /path/ruby  
  3. ./configure -prefix=/usr/local/ruby  
  4. make  
  5. make install  
  6. sudo cp ruby /usr/local/bin  
 (2)安装rubygem:version(1.8.16)

 Java代码  收藏代码

  1. # rubygems-1.8.16.tgz  
  2. cd /path/gem  
  3. sudo ruby setup.rb  
  4. sudo cp bin/gem /usr/local/bin  
 (3)安装gem-redis:version(3.0.0)

 Java代码  收藏代码

  1. gem install redis --version 3.0.0  
  2. #由于源的原因,可能下载失败,就手动下载下来安装  
  3. #download地址:http://rubygems.org/gems/redis/versions/3.0.0  
  4. gem install -l /data/soft/redis-3.0.0.gem  
 

2)安装redis-cluster

 Java代码  收藏代码

  1. cd /path/redis  
  2. make  
  3. sudo cp /opt/redis/src/redis-server /usr/local/bin  
  4. sudo cp /opt/redis/src/redis-cli /usr/local/bin  
  5. sudo cp /opt/redis/src/redis-trib.rb /usr/local/bin  

 

2:配置redis cluster

1)redis配置文件结构:


 使用包含(include)把通用配置和特殊配置分离,方便维护.

3、redis cluster 运维操作

1)初始化并构建集群

(1)启动集群相关节点(必须是空节点),指定配置文件和输出日志

 Java代码  收藏代码

  1. redis-server /opt/redis/conf/redis-6380.conf > /opt/redis/logs/redis-6380.log 2>&1 &  
  2. redis-server /opt/redis/conf/redis-6381.conf > /opt/redis/logs/redis-6381.log 2>&1 &  
  3. redis-server /opt/redis/conf/redis-6382.conf > /opt/redis/logs/redis-6382.log 2>&1 &  
  4. redis-server /opt/redis/conf/redis-7380.conf > /opt/redis/logs/redis-7380.log 2>&1 &  
  5. redis-server /opt/redis/conf/redis-7381.conf > /opt/redis/logs/redis-7381.log 2>&1 &  
  6. redis-server /opt/redis/conf/redis-7382.conf > /opt/redis/logs/redis-7382.log 2>&1 &  

 

(2)使用自带的ruby工具(redis-trib.rb)构建集群

 Java代码  收藏代码

  1. #redis-trib.rb的create子命令构建  
  2. #--replicas 则指定了为Redis Cluster中的每个Master节点配备几个Slave节点  
  3. #节点角色由顺序决定,先master之后是slave(为方便辨认,slave的端口比master大1000)  
  4. redis-trib.rb create --replicas 1 10.10.34.14:6380 10.10.34.14:6381 10.10.34.14:6382 10.10.34.14:7380 10.10.34.14:7381 10.10.34.14:7382  
 (3)检查集群状态,

 Java代码  收藏代码

  1. #redis-trib.rb的check子命令构建  
  2. #ip:port可以是集群的任意节点  
  3. redis-trib.rb check 1 10.10.34.14:6380  
 最后输出如下信息,没有任何警告或错误,表示集群启动成功并处于ok状态

 Java代码  收藏代码

  1. [OK] All nodes agree about slots configuration.  
  2. >>> Check for open slots...  
  3. >>> Check slots coverage...  
  4. [OK] All 16384 slots covered.  

 三、重启redis cluster

1、重启部分redis node

命令:
/usr/local/bin/redis-cli shutdown
该命令会停止当前服务器上6379端口的redis node

此时redis cluster的节点状态变为
67d89b4f617b9cb83899bb5631167ec577c00827 10.86.45.137:6379 myself,slave 337241090f64e602e5f917ef840809ed52025565 0 0 10 connected9899dae2ea13c350c5ad0dd562a76c32fdf1522d 10.86.45.136:6379 slave,fail 9e2ebd2d76d708045f7117dd8a4d922d988dfa9d 1435577082442 1435577078233 17 disconnected7b86c086200b5078b6a97fa6152bbabd97569d5f 10.86.45.138:6379 master - 0 1435577092279 18 connected 10000-163839e2ebd2d76d708045f7117dd8a4d922d988dfa9d 10.86.41.39:6379 master - 0 1435577095290 0 connected 0-4999337241090f64e602e5f917ef840809ed52025565 10.86.41.40:6379 master - 0 1435577093285 15 connected 5000-99991ba8070f2057e312517dc002660957e66431d676 10.86.41.41:6379 slave 7b86c086200b5078b6a97fa6152bbabd97569d5f 0 1435577094286 18 connected

看9899dae2ea13c350c5ad0dd562a76c32fdf1522d这个节点,已经是disconnected状态,说明该节点已经从redis cluster断开

执行以下命令
sudo /usr/local/bin/redis-server  /etc/redis.conf 

此时redis cluster的节点状态变为
67d89b4f617b9cb83899bb5631167ec577c00827 10.86.45.137:6379 myself,slave 337241090f64e602e5f917ef840809ed52025565 0 0 10 connected9899dae2ea13c350c5ad0dd562a76c32fdf1522d 10.86.45.136:6379 slave 9e2ebd2d76d708045f7117dd8a4d922d988dfa9d 0 1435577341917 17 connected7b86c086200b5078b6a97fa6152bbabd97569d5f 10.86.45.138:6379 master - 0 1435577342418 18 connected 10000-163839e2ebd2d76d708045f7117dd8a4d922d988dfa9d 10.86.41.39:6379 master - 0 1435577338910 0 connected 0-4999337241090f64e602e5f917ef840809ed52025565 10.86.41.40:6379 master - 0 1435577339913 15 connected 5000-99991ba8070f2057e312517dc002660957e66431d676 10.86.41.41:6379 slave 7b86c086200b5078b6a97fa6152bbabd97569d5f 0 1435577342919 18 connected

看9899dae2ea13c350c5ad0dd562a76c32fdf1522d这个节点,已经是connected状态,说明该节点已经重新连回redis cluster

注意:当集群正常动行时,某有部分节点重启后,node id是不发生变化的

2、重启整个redis cluster


特别注意:重启整个集群的时候,redis id有可能会发生变化,导致集群启动失败

启动失败的修复方法

1、cluster nodes,查看当前集群结点状态,找出各节点新ID2、cluster meet,将没有在集群中的结点连入集群,如果所有结点都已连入集群,可以忽略这步3、cluster forget,将已经没有IP的结点清除掉4、cluster replicate,将结点手工分配为另一个节点的salve5、cluster slots,给master分别slot

执行完以上五步,查看集群状态,此时集群状态应该已经恢复正常

0 0