首页 > 代码库 > 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架构图
- 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
- 节点的fail是通过集群中超过半数的节点检测失效时才生效.
- 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可.
redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value.
redis-cluster选举 容错
领着选举过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉.
什么时候整个集群不可用(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是通的,原来当时只针对这个端口单独开过。
解决方法:联系集成同事放开防火墙的限制即可。
其它使用问题,后续再补充……
Redis3缓存集群(cluster)搭建