您的位置:首页 > 数据库 > Redis

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实例.


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.gz
1
2
3
1
2
3

2.编译与安装
cd redis-3.2.0
make && make install
1
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.conf
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.
yum -y install ruby ruby-devel rubygems rpm-build
1
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:9779
1
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:9579
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信息等 

登陆命令:
redis-cli -h 132.126.2.235 -p 9579
1
1



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


Redis3 配置文件

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

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

解决办法:GCC没有安装或版本不对,安装一下
yum  install  gcc
1
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 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

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

结果发现不通,运气太差了,因为先前我试过telnet 132.126.2.235 8806是通的,原来当时只针对这个端口单独开过。 

解决方法:联系集成同事放开防火墙的限制即可。

其它使用问题,后续再补充……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  redis