Redis3缓存集群(cluster)搭建
2016-11-21 17:43
525 查看
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实例.
1.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状态.
1.下载与解包
2
3
1
2
3
2.编译与安装
2
1
2
3.创建Redis结点
本次我们选取一台机作验证,一般生产上集群建议不要在一台机主机上,以免出现系统单点故障,无法确保高可用。本次在一台主机上搭建一个集群(3个主结点,6个从结点)
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
分别对9579,9679、9779文件夹中的3个文件修改对应的配置
2
3
4
5
6
7
1
2
3
4
5
6
7
4.启动以上节点
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
再用 gem 这个命令来安装 redis接口 gem是ruby的一个工具包.
1
上面的步骤完事了,接下来运行一下redis-trib.rb
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
replicas 0 表示为以上三个结点创建0个从结点,当然如果为1,则会为以上3个结点默认创建1个从结点。由于我想自己指定前面的6个结点分别挂在不同的主结点下,所以这里就不自动分配了。
接下来为以上3个主结点依次挂从结点:
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集群配置项
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
2.Redis3其它配置
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:
2
3
4
5
1
2
3
4
5
解决办法:GCC没有安装或版本不对,安装一下
1
安装问题2:
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
这个问题竟然困绕了我一整个上午,老以为是集群有什么地方配置不当,但检查再三,网上也查了好多资料,也最终没有解决。后来试着从本地对集群的某个节点进行了网络连接验证:
2
1
2
结果发现不通,运气太差了,因为先前我试过telnet 132.126.2.235 8806是通的,原来当时只针对这个端口单独开过。
解决方法:联系集成同事放开防火墙的限制即可。
其它使用问题,后续再补充……
集群搭建技术知识点
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架构
1.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.下载与解包cd /data/crm/crmweb wget http:////download.redis.io/releases/redis-3.2.0.tar.gz tar -zxvf /redis-3.2.1.tar.gz1
2
3
1
2
3
2.编译与安装
cd redis-3.2.0 make && make install1
2
1
2
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/1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
分别对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日志开启 有需要就开启,它会每次写操作都记录一条日志1
2
3
4
5
6
7
1
2
3
4
5
6
7
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.conf1
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.yum -y install ruby ruby-devel rubygems rpm-build1
1
再用 gem 这个命令来安装 redis接口 gem是ruby的一个工具包.
gem install redis //等一会儿就好了1
1
上面的步骤完事了,接下来运行一下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.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了。
./redis-trib.rb create --replicas 0 132.126.2.235:9579 132.126.2.235:9679 132.126.2.235:97791
1
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:95791
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信息等
登陆命令:
redis-cli -h 132.126.2.235 -p 95791
1
以上验证基本能说明集群已经搭建成功。
Redis3 配置文件
以上相关步骤已经完成,以下对相关配置参数含义进行说明: 1.Redis3集群配置项
#开启集群模式 cluster-enabled yes #运行过程中集群信息保存的文件名,不能冲突,需要个性化 cluster-config-file nodes.conf #集群节点通信内限定的超时时间 cluster-node-timeout 5000 #以追加的方式写数据 appendonly yes #在某个主节点挂死的情况下,其他主节点仍然可以工作 cluster-require-full-coverage no1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
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 64mb1
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: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 21
2
3
4
5
1
2
3
4
5
解决办法:GCC没有安装或版本不对,安装一下
yum install gcc1
1
安装问题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 21
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
这个问题竟然困绕了我一整个上午,老以为是集群有什么地方配置不当,但检查再三,网上也查了好多资料,也最终没有解决。后来试着从本地对集群的某个节点进行了网络连接验证:
cmd telnet 132.126.2.235 95791
2
1
2
结果发现不通,运气太差了,因为先前我试过telnet 132.126.2.235 8806是通的,原来当时只针对这个端口单独开过。
解决方法:联系集成同事放开防火墙的限制即可。
其它使用问题,后续再补充……
相关文章推荐
- Redis3缓存集群(cluster)搭建
- Redis集群搭建之Redis Cluster实践
- redis 一二事 - 搭建集群缓存服务器
- redis 学习笔记(6)-cluster集群搭建
- Redis3.0集群搭建和测试(cluster)
- redis-cluster集群搭建
- 高性能网站架构之缓存篇—Redis集群搭建
- 分布式缓存redis-cluster环境搭建及wishstack调用Jedis
- centos中redis3 cluster集群的搭建
- 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
- 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
- 高性能网站架构之缓存篇—Redis集群搭建
- 分布式缓存技术redis学习(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
- redis之(十六)redis的cluster集群环境的搭建,转载
- Redis-Cluster 集群搭建(Windwos带Server启动)
- Redis 缓存集群 (一)Redis3.0.5 集群搭建
- Redis 3.0 cluster 集群环境搭建
- redis 分片集群(cluster)搭建
- 分布式缓存技术redis学习(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
- 高性能网站架构之缓存篇—Redis集群搭建