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节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
- 节点的fail是通过集群中超过半数的节点检测失效时才生效.
- 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可.
- redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value.
2.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.下载与解包
- 1
- 2
- 3
- 1
- 2
- 3
2.编译与安装
- 1
- 2
- 1
- 2
3.创建Redis结点
本次我们选取一台机作验证,一般生产上集群建议不要在一台机主机上,以免出现系统单点故障,无法确保高可用。本次在一台主机上搭建一个集群(3个主结点,6个从结点)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
分别对9579,9679、9779文件夹中的3个文件修改对应的配置
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
4.启动以上节点
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
重复以上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.
- 1
- 1
再用 gem 这个命令来安装 redis接口 gem是ruby的一个工具包.
- 1
- 1
上面的步骤完事了,接下来运行一下redis-trib.rb
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
确认以上9个结点均启动,接下就可以用上面的命令来create了。
- 1
- 1
replicas 0 表示为以上三个结点创建0个从结点,当然如果为1,则会为以上3个结点默认创建1个从结点。由于我想自己指定前面的6个结点分别挂在不同的主结点下,所以这里就不自动分配了。
接下来为以上3个主结点依次挂从结点:
- 1
- 1
以上命令就是将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信息等
登陆命令:
- 1
- 1
以上验证基本能说明集群已经搭建成功。
Redis3 配置文件
以上相关步骤已经完成,以下对相关配置参数含义进行说明:
1.Redis3集群配置项
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
2.Redis3其它配置
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
问题总结
安装问题1:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
解决办法:GCC没有安装或版本不对,安装一下
- 1
- 1
安装问题2:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
解决办法:原因是没有安装jemalloc内存分配器,可以安装jemalloc 或 直接输入make MALLOC=libc && make install
集群连通性问题1:
集群搭建成功后,在本地tomcat启了一个应用来访问缓存集群,发现老是提示如下错误:no reachable node in cluster
这个问题竟然困绕了我一整个上午,老以为是集群有什么地方配置不当,但检查再三,网上也查了好多资料,也最终没有解决。后来试着从本地对集群的某个节点进行了网络连接验证:
- 1
- 2
- 1
- 2
结果发现不通,运气太差了,因为先前我试过telnet 132.126.2.235 8806是通的,原来当时只针对这个端口单独开过。
解决方法:联系集成同事放开防火墙的限制即可。
其它使用问题,后续再补充……