首页 > 代码库 > Redis3缓存集群(cluster)搭建

Redis3缓存集群(cluster)搭建

Redis3以后支持Cluster特性:1.节点自动发现;2.slave->master 选举,集群容错;3.Hot resharding:在线分片;4.进群管理:cluster xxx;5.基于配置(nodes-port.conf)的集群管理;6.ASK 转向/MOVED 转向机制。

集群搭建技术知识点

  • Redis服务端口:用于接收客户端连接或客户端请求命令的端口,如:9579.
  • Redis集群通信端口:用于Redis内部更新交流状态的端口,为当前服务器端口+10000,如19579.
  • Redis的slot:Redis把所有的keys分成16284份,从0到16283.
  • Redis服务器的关系:主从,从是主的备份;主主:主主分别承担不同slot的keys的数据,0-16383个slot都需要分配主服务器上去.
  • Redis的配置文件:redis启动时候使用配置文件初始化服务器的信息,使用命令redis-server redis.conf.
  • Redis集群搭建的最少redis实例是3个,为3个主实例,分配0-16383个slot到三个实例中。从的redis实例可以是任意个,作为备份切换使用.
  • Redis集群中的node_id:redis的集群中除了使用ip加port来标示一个redis实例外,还是用了一个叫做node_id的东西来标示一个redis实例.

Redis Cluster架构

redis-cluster架构图
技术分享

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

    redis-cluster选举 容错
    技术分享

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

  6. 什么时候整个集群不可用(cluster_state:fail),当集群不可用时,所有对集群的操作做都不可用,收到((error)CLUSTERDOWN The cluster is down)错误.
      a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成进群的slot映射[0-16383]不完成时进入fail状态.
      b:如果进群超过半数以上master挂掉,无论是否有slave集群进入fail状态.

Redis3 安装

1.下载与解包

cd /data/crm/crmweb
wget http:////download.redis.io/releases/redis-3.2.0.tar.gz
tar -zxvf /redis-3.2.1.tar.gz

2.编译与安装

cd redis-3.2.0
make && make install

3.创建Redis结点

本次我们选取一台机作验证,一般生产上集群建议不要在一台机主机上,以免出现系统单点故障,无法确保高可用。本次在一台主机上搭建一个集群(3个主结点,6个从结点)

cd /data/crm/crmweb/redis-3.2.0
  mkdir redis_cluster  //创建集群目录
  mkdir 9579 9679 9779  //分别代表三个主节点    其对应服务器端口 9579 9679 9779
 //创建9579节点为例,拷贝到9579目录
 cp /data/crm/crmweb/redis-3.2.0/redis.conf  ./redis_cluster/9579/   
 //拷贝到9679目录
 cp /data/crm/crmweb/redis-3.2.0/redis.conf  ./redis_cluster/9679/   
 //拷贝到9779目录
 cp /data/crm/crmweb/redis-3.2.0/redis.conf  ./redis_cluster/9779/   

分别对9579,9679、9779文件夹中的3个文件修改对应的配置

daemonize    yes                          //redis后台运行
pidfile  /var/run/redis_9579.pid          //pidfile文件对应9579,9679,9779
port  9579                                //端口9579,9679,9779
cluster-enabled  yes                      //开启集群  把注释#去掉
cluster-config-file  nodes_9579.conf      //集群的配置  配置文件首次启动自动生成 9579,9679,9779
cluster-node-timeout  5000                //请求超时  设置5秒够了
appendonly  yes                           //aof日志开启  有需要就开启,它会每次写操作都记录一条日志

4.启动以上节点

cd /data/crm/crmweb/redis-3.2.0/src
redis-server  ../redis_cluster/9579/redis.conf
redis-server  ../redis_cluster/9679/redis.conf
redis-server  ../redis_cluster/9779/redis.conf

重复以上3,4两步依次再创建其它从节点8689,8699,9689,9699,9789,9799

5.查看启动结果 ps -ef|grep redis
技术分享

创建集群

前面已经准备好了搭建集群的redis节点,接下来我们要把这些节点都串连起来搭建集群。官方提供了一个工具:redis-trib.rb(/data/crm/crmweb/redis-3.2.0/src/redis-trib.rb) 看后缀就知道这鸟东西不能直接执行,它是用ruby写的一个程序,所以我们还得安装ruby.

yum -y install ruby ruby-devel rubygems rpm-build 

再用 gem 这个命令来安装 redis接口 gem是ruby的一个工具包.

gem install redis    //等一会儿就好了

上面的步骤完事了,接下来运行一下redis-trib.rb

/usr/local/redis-3.2.1/src/redis-trib.rb
   Usage: redis-trib <command> <options> <arguments ...>

   reshard        host:port
                  --to <arg>
                  --yes
                  --slots <arg>
                  --from <arg>
  check          host:port
  call            host:port command arg arg .. arg
  set-timeout    host:port milliseconds
  add-node        new_host:new_port existing_host:existing_port
                  --master-id <arg>
                  --slave
  del-node        host:port node_id
  fix            host:port
  import          host:port
                  --from <arg>
  help            (show this help)
  create          host1:port1 ... hostN:portN
                  --replicas <arg>

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

确认以上9个结点均启动,接下就可以用上面的命令来create了。

./redis-trib.rb create --replicas 0 132.126.2.235:9579 132.126.2.235:9679 132.126.2.235:9779

replicas 0 表示为以上三个结点创建0个从结点,当然如果为1,则会为以上3个结点默认创建1个从结点。由于我想自己指定前面的6个结点分别挂在不同的主结点下,所以这里就不自动分配了。

接下来为以上3个主结点依次挂从结点:

./redis-trib.rb **add-node** --slave --master-id ef131da7722c9451b7f111a83c19ddba8faa3df4 132.126.2.235:8689 132.126.2.235:9579

以上命令就是将132.126.2.235:8689 结点当作132.126.2.235:9579的从结点。master-id ef131da7722c9451b7f111a83c19ddba8faa3df4 这个可以有好多方式可以获取 比如用 ./redis-trib.rb check 132.126.2.235:9579 也会显示出来。其它结点也依次挂载到相应的主节点上。这里就不一一写出来了。

查看一下 /data/crm/crmweb/redis-3.2.0/src/redis-trib.rb check 132.126.2.235:9579
到这里集群已经初步搭建好了。

接下来可以登陆下节点验证一把值的存取,cluster信息等
登陆命令:

redis-cli -h 132.126.2.235 -p 9579

技术分享

以上验证基本能说明集群已经搭建成功。

Redis3 配置文件

以上相关步骤已经完成,以下对相关配置参数含义进行说明:
1.Redis3集群配置项

#开启集群模式
cluster-enabled yes
#运行过程中集群信息保存的文件名,不能冲突,需要个性化
cluster-config-file nodes.conf
#集群节点通信内限定的超时时间
cluster-node-timeout 5000
#以追加的方式写数据
appendonly yes
#在某个主节点挂死的情况下,其他主节点仍然可以工作
cluster-require-full-coverage no

2.Redis3其它配置

#绑定ip,需要个性化
bind 127.0.0.1
#启用保护模式
protected-mode yes
#绑定的服务端口,需要个性化
port 6379
tcp-backlog 511
#日志级别debug # verbose# notice# warning
loglevel warning
#redis连接多久不连接就关闭,单位秒,0表示不断开
timeout 0
#用于检测连接是否挂死,每多少秒发送一个ack
tcp-keepalive 60
daemonize no
stop-writes-on-bgsave-error no
rdbcompression no
#本地文件存储的数据,需要个性化
dbfilename dump.rdb
#本地数据存储文件dbfilename的目录
dir ./
#开启日志文件
logfile redis.log
#pidfile
pidfile /var/run/redis.pid
#配置连接数
maxclients 10000
#配置使用内存
maxmemory 4gb
#内存过期策略
maxmemory-policy volatile-lru
#需要个性化
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

问题总结

安装问题1:

CC adlist.o
  /bin/sh: cc: command not found
  make[1]: *** [adlist.o] Error 127
  make[1]: Leaving directory `/data/crm/crmweb/redis-3.2.0/src
  make: *** [all] Error 2

解决办法:GCC没有安装或版本不对,安装一下

yum  install  gcc

安装问题2:

zmalloc.h:50:31: 
  error: jemalloc/jemalloc.h: No such file or directory
  zmalloc.h:55:2: error: 

  #error "Newer version of jemalloc required"
  make[1]: *** [adlist.o] Error 
  1
  make[1]: Leaving directory `/data/crm/crmweb/redis-3.2.0/src
  make: *** [all] 
  Error 2

解决办法:原因是没有安装jemalloc内存分配器,可以安装jemalloc 或 直接输入make MALLOC=libc && make install

集群连通性问题1:
集群搭建成功后,在本地tomcat启了一个应用来访问缓存集群,发现老是提示如下错误:no reachable node in cluster

这个问题竟然困绕了我一整个上午,老以为是集群有什么地方配置不当,但检查再三,网上也查了好多资料,也最终没有解决。后来试着从本地对集群的某个节点进行了网络连接验证:

cmd
telnet 132.126.2.235 9579

结果发现不通,运气太差了,因为先前我试过telnet 132.126.2.235 8806是通的,原来当时只针对这个端口单独开过。
解决方法:联系集成同事放开防火墙的限制即可。

其它使用问题,后续再补充……

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

    Redis3缓存集群(cluster)搭建