redis-cluser集群搭建及使用

Posted coding_everyday

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis-cluser集群搭建及使用相关的知识,希望对你有一定的参考价值。

    近段时间一直在研究redis-cluser集群模式,准备将原有的sentinel模式替换掉。但是迟迟没能落实,一来是现有集群模式尚能满足现有应用,怕变更后不稳定固不愿轻易改动;二是对redis-cluster的研究还不是很深入,还需要时间。redis-cluster集群模式自己也有搭建过好几次了,但都只是简单的搭建完,简单的对几种数据类型进行了读写操作就完事了。没有进行过动态增删节点,重新分片等高级特性的研究,固今天就来实际操作下,探探究竟。

redis-cluster集群模式的优点:

  • 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

  • 节点的fail是通过集群中超过半数的节点检测失效时才生效.

  • 客户端与redis节点直连,不需要中间proxy.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即

  • redis-cluster把所有的物理节点映射到[0-16383]slot,cluster负责维护node -> slot -> key

不足:

  • 无中心化架构

  • Gossip消息的开销

  • 不停机升级困难

  • 无法根据统计区分冷热数据

  • 客户端的挑战

  • Cluster协议支持

  • 连接和路由表的维护开销

  • MultiOpPipeline支持有限

  • Redis的实现问题

  • 不能自动发现

  • 不能自动Resharding

  • 无监控管理UI

  • 最终一致性和脑裂问题

  • 数据迁移以Key为单位,速度较慢

  • 数据迁移没有保存进度,故障时不能恢复

  • Slave“冷备,不能缓解读压力

实践开始,本次实践是在centos6环境下完成的。


一、安装redis服务

redis官网下载redis安装包:

http://download.redis.io/releases/redis-stable.tar.gz

解压:

tar-zxvf redis-stable.tar.gz -C /opt/

安装:

makePREFIX=/usr/local/redis install MALLOC=libc

redis的安装可参考我的另一篇文章,http://blog.csdn.net/zh520qx/article/details/5097767,由于安装比较简单,在此不再详述。

安装完之后复制redis解压包下 src/redis-trib.rb 文件到安装目录/usr/local/redis/bin/ ,后续创建集群的时候用的着.这是官方提供的一个用ruby语言编写的用于创建redis集群的工具

命令:cp /opt/redis-stable/src/redis-trib.rb/usr/local/redis-stable/bin/


二、安装集群基础依赖

1、安装zlib类库

命令:yum -y install zlib


2、安装ruby环境

命令:yum -y install ruby rubygems (图片命令少rubygems了一个s)


3、安装ruby环境的redis

命令:gem install redis



三、创建redis实例

创建实例目录:

命令:mkdir -p/usr/local/redis-cluster/redis7001,7002,7003,7004,7005,7006,7007,7008


复制redis.conf配置文件到实例目录:

命令:for dir in /usr/local/redis-cluster/redis700*; do cp -v /opt/redis-stable/redis.conf $dir ; done



修改相关配置参数:

命令:

fordir in /usr/local/redis-cluster/redis700*; do

myport=`basename$dir|sed 's/[a-zA-Z]*//g'`

sed-r -i "

s@^\\s*port.*@port$myport@;

s@^\\s*daemonize.*@daemonizeyes@;

s@^\\s*pidfile.*@pidfile/var/run/redis_$myport.pid@;

s@^\\s*logfile.*@logfile/var/log/redis_$myport.log@;

s@^\\s*#?\\s*cluster-enabled.*@cluster-enabledyes@;

s@^\\s*#?\\s*cluster-config-file.*@cluster-config-file$dir/nodes-$myport.conf@;

s@^\\s*#?\\s*cluster-node-timeout.*@cluster-node-timeout15000@;

s@^\\s*dir.*@dir$dir@;

"$dir/redis.conf

done


启动所有实例:

命令:

fordir in /usr/local/redis-cluster/redis700*; do /usr/local/redis-stable/bin/redis-server$dir/redis.conf ; done



查看实例是否都已启动:

命令:ps -ef|grep redis


通过redis-trib.rb 脚本创建集群:

命令:

./redis-trib.rb create --replicas 1 192.168.253.252:7001 192.168.253.252:7002 192.168.253.252:7003192.168.253.252:7004 192.168.253.252:7005 192.168.253.252:7006


--replicas 1:表示为每个主节点创建一个从节点

至此, redis的集群环境已经搭建完成了,我们可以看一下节点情况:

命令:/usr/local/redis-stable/bin/redis-cli -h 192.168.253.252 -p 7002 clusternodes



四、添加节点

添加节点有两种情况:添加主节点及从节点

1、添加主节点

命令:./ redis-trib.rb add-node192.168.253.252:7007 192.168.253.252:7001


可以看到.使用addnode命令来添加节点,第一个参数是新节点的地址,第二个参数是任意一个已经存在的节点的IP和端口.


2、添加从节点


有两种方法添加从节点,可以像添加主节点一样使用redis-trib命令,也可以像下面的例子一样使用slave选项:

命令:./ redis-trib.rb add-node --slave192.168.253.252:7008 192.168.253.252:7001


此处的命令和添加一个主节点命令类似,此处并没有指定添加的这个从节点的主节点,这种情况下系统会在其他的复制集中的主节点中随机选取一个作为这个从节点的主节点。

你可以通过下面的命令指定主节点:

命令:./redis-trib.rb add-node --slave --master-id 6eb5af25d9ef38c3773f25a9ac4522b6d0a8d5d1192.168.253.252:7008 192.168.253.252:7001



也可以使用CLUSTER REPLICATE命令添加.这个命令也可以改变一个从节点的主节点。


例如,要给主节点192.168.253.252:7007 添加一个从节点,该节点哈希槽的范围1423-16383,节点 ID3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e,我们需要链接新的节点(已经是空的主节点)并执行命令:

redis192.168.253.252:7008>cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e


五、删除节点

只要使用 del-node命令即可:

./redis-trib del-node192.168.253.252:7001 `<node-id>`


第一个参数是任意一个节点的地址,第二个节点是你想要移除的节点地址。

使用同样的方法移除主节点,不过在移除主节点前,需要确保这个主节点是空的.如果不是空的,需要将这个节点的数据重新分片到其他主节点上.

替代移除主节点的方法是手动执行故障恢复,被移除的主节点会作为一个从节点存在,不过这种情况下不会减少集群节点的数量,也需要重新分片数据.


六、重新分片


刚才添加的节点,由于还没有分配到哈希槽,故还是空的。分配哈希槽需重新对集群进行分片。

现在,让我们来试试对集群进行重新分片操作。重新分片并不会对正在运行的集群程序产生任何影响,重新分片也可以使用 redis-trib程序来执行执行以下命令可以开始一次重新分片操作:

./redis-trib.rb reshard192.168.253.252:7001

你只需要指定集群中其中一个节点的地址, redis-trib就会自动找到集群中的其他节点。

目前 redis-trib只能在管理员的协助下完成重新分片的工作,要让 redis-trib自动将哈希槽从一个节点移动到另一个节点,目前来说还做不到

你想移动多少个槽(1 16384)?

我们尝试从将4096个槽重新分片,除了移动的哈希槽数量之外, redis-trib还需要知道重新分片的目标,也即是,负责接收这4096个哈希槽的节点

如果当前环境下只想移动某个节点的哈希槽,也可以采用非交互自动的进行迁移, 如:

./redis-trib.rb  reshard --from 6eb5af25d9ef38c3773f25a9ac4522b6d0a8d5d1 --to 2eacfc66b8293a50fa75b12ef6f94c9ea64a7f35 --slots 100 --yes 192.168.253.252:7001

--from 6eb5af25d9ef38c3773f25a9ac4522b6d0a8d5d1//表示从哪个节点进行迁移,即源节点  注:必须是主节点 

--to 2eacfc66b8293a50fa75b12ef6f94c9ea64a7f35 //迁移到哪个节点,即目标节点

--slots 100 //迁移多少槽位

--yes //无需输入yes确认



在重新分片结束后你可以通过如下命令检查集群状态:

./redis-trib.rb check 192.168.253.252:7001


参考文献:

http://www.redis.cn/topics/cluster-tutorial.html

http://www.redis.cn/topics/cluster-spec.html

以上是关于redis-cluser集群搭建及使用的主要内容,如果未能解决你的问题,请参考以下文章

Docker搭建Redis Cluster集群及扩容和收容

Redis 3.2.8集群部署

KubeSphere - 搭建 elasticsearch集群 及 kibana

Redis主从集群搭建及主从复制原理解析

周一福利MySQL数据库集群-PXC方案

REDIS04_主从复制概述及搭建反客为主薪火相传原理哨兵模式集群搭建