`
gao_xianglong
  • 浏览: 460717 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

redis3.x cluster

 
阅读更多

《redis3.x cluster》

 

前言

redis集群后,我们就需要一种数据路由算法将不同key分散存储到不同的redis节点内,通常的做法是获取某个key的hashcode,然后mod,不过这种做法无法很好的支持动态伸缩性需求,一旦节点的增或者删操作,都会导致key无法在redis中命中,所以在redis3.x之前,基本上都是采用编写一致性hash算法实现redis的集群,但是redis3.x正式支持cluster后,却采用的是hash slot(hash槽)。

 

redis集群中一共内置了16384个哈希槽,当set操作时,redis先对key使用crc16验证出一个结果,然后把结果对mod 16384,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。这样做的好处很明显,当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了。

 

目录

一、redis的下载与编译;

二、集群安装所需外围插件;

三、redis集群部署;

四、验证redis集群以及HA;

五、重新指定redis集群的分片规则

六、集群节点的伸缩调整;

七、jediscluster API的使用;

八、注意项;

九、推荐阅读;

 

一、redis的下载与编译

redis的官网下载地址http://redis.io/,笔者本章博文所使用的版本为redis3.0.7正式版,为了避免出现一些无法预估的错误或不一致的情况出现,建议大家使用和笔者一样的版本。或者直接使用下述命令执行redis的下载和编译,如下所示:

$ wget http://download.redis.io/releases/redis-3.0.7.tar.gz
$ tar -zvxf redis-3.0.7.tar.gz
$ cd redis-3.0.7
$ make

 

当成功执行编译命令后,redis的二进制代码包含在/src目录下。

 

二、集群安装所需外围环境

redis集群需要ruby的一系列环境支持,因此我们需要安装一些ruby环境,如下所示 :

$ yum install ruby
$ yum install rubygems
$ gem install redis

 

首先下载并安装ruby环境,然后是rubygems组件,最后是redis接口。在此大家需要注意,如果如法下载安装redis.gem,则可能gem服务器无法连接,手动下载安装即可,推荐地址http://download.csdn.net/download/menggucaoyuan/8487967

手动安装,如下所示:

gem install -l ./redis-3.0.0.gem

 

三、redis集群部署

笔者的redis在安装地址在/usr/local/redis/redis-3.0.7,那么在/usr/local/redis/目录下,笔者新建了如下9个目录,如下所示:

$ mkdir redis7000 redis7001 redis7002 redis7003 redis7004 redis7005 redis7006 redis7007 redis7008

 

然后将/usr/local/redis/redis-3.0.7/redis.conf拷贝至上述9个新建目录中,并逐个修改每一个redis节点的redis配置项,如下所示:

port 每一个redis实例端口
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

  

上述文件中的 cluster-enabled 选项用于开实例的集群模式, 而 cluster-conf-file 选项则设定了保存节点配置文件的路径, 默认值为 nodes.conf.节点配置文件无须人为修改, 它由 Redis 集群在启动时创建, 并在有需要时自动进行更新。

在此大家需要注意,要让集群正常运作至少需要三个主节点,不过在刚开始试用集群功能时, 强烈建议使用六个节点: 其中三个为主节点, 而其余三个则是各个主节点的从节点。笔者本章博文所使用的是9个节点,其中3个主节点,每一个主节点有2个从节点。

 

当配置完成后,使用如下命令启动每一个redis节点,如下所示:

redis-server redis.conf

 

当每一个节点都成功启动之后,最后再使用命令创建redis集群,如下所示:

./redis-trib.rb  create --replicas 2 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 127.0.0.1:7007 127.0.0.1:7008

 

上述命令用于创建一个新的集群, 选项–replicas 2 表示我们希望为集群中的每个主节点创建2个从节点。之后跟着的其他参数则是这个集群实例的地址列表,3个master,6个slave。 redis-trib 会打印出一份预想中的配置给你看, 如果你觉得没问题的话, 就可以输入 yes , redis-trib 就会将这份配置应用到集群当中,让各个节点开始互相通讯,最后可以得到如下信息:

[OK] All 16384 slots covered

 

 这表示集群中的 16384 个槽都有至少一个主节点在处理, 集群运作正常。

 

四、验证redis集群以及HA

当成功启动redis集群后,我们可以尝试使用如下命令登录redis客户端验证redis集群,如下所示:

$ ./redis-cli -c -p 7000
$ cluster nodes

 

当成功执行上述命令后,将会输出:

 

上述集群信息显示为3个master,6个slave,采用1主2从,一共9个节点。在此大家需要注意,redis集群中如果超过半数以上的master节点不可用,意味着整个集群节点不可用。

 

假设我们在某一个master上set一个数据,然后kill掉这个进程,它的slave节点会接管并成为新的master,当集群中挂了3个节点后,redis会将集群进行调整,变化为1主1从,还是3个master节点,并由新的master接替之前down机的数据,这样做的好处是可以避免重新分配hash slot,如下所示: 

 

五、重新指定redis集群的分片规则

重新分片操作基本上就是将某些节点上的哈希槽移动到另外一些节点上面, 和创建集群一样, 重新分片也可以使用 redis-trib 程序来执行一次重新分片操作。在此大家需要注意,重新分片并不会对正在运行的集群程序产生任何影响。执行分片命令,如下所示:

./redis-trib.rb reshard 127.0.0.1:7000

 

我们只需要指定集群中其中一个节点的地址, redis-trib 就会自动找到集群中的其他节点。当执行重新分片命令后,会提示究竟移动多少个hash槽,这里假设我们需要移动1000个hash槽,就输入1000。接下来就要输入希望将这些hash槽移动到哪一个master的id上,最后需要指定将哪些节点上的hash槽移动到之前指定的目标master上,如果输入all就会从其他所有的master上取一些哈希槽移动到目标master上。

最后确认后你将会看到每个redis-trib移动的槽的信息,每个key的移动的信息也会打印出来。在重新分片的过程中,你得例子程序是不会受到影响的,你可以停止或者重新启动多次。在重新分片结束后你可以通过如下命令检查集群状态,如下所示:
./redis-trib.rb check 127.0.0.1:7000 
 
六、集群节点的伸缩调整
redis集群节点的伸缩性调整主要指的是动态向集群中添加master或者slave节点,或者移除master或者slave节点。假设在现有的集群节点中新增加一个master节点,使用如下命令:
./redis-trib.rb add-node 127.0.0.1:7009 127.0.0.1:7000
 
由于新加的master节点还没有分配任何的hash槽,因此还需要对这个master分配hash槽操作。当然出了添加master节点万,我们还可以向集群环境中添加slave节点,使用下述命令往集群节点中新增一个slave节点,如下所示:
./redis-trib.rb add-node --slave 127.0.0.1:7010 127.0.0.1:7000
 
此处的命令和添加一个主节点命令类似,此处并没有指定添加的这个从节点的主节点,这种情况下系统会在其他的复制集中的主节点中随机选取一个作为这个从节点的主节点。当然我们可以通过下面的命令指定主节点:
./redis-trib.rb add-node --slave --master-id be50d14dca84586054196c867f52bc05a5261561 127.0.0.1:7010 127.0.0.1:7000
 
对于移除集群环境中的master或者slave节点,可以使用下述命令:
./redis-trib.rb del-node 127.0.0.1:7000 `<node-id>`
 
第一个参数是任意一个节点的地址,第二个节点是你想要移除的节点地址。使用同样的方法移除主节点,不过在移除主节点前,需要确保这个主节点是空的. 如果不是空的,需要将这个节点的数据重新分片到其他主节点上。
分享到:
评论

相关推荐

    Redis 3.x 分布式集群搭建.pdf

    Redis Cluster是由多个Redis实例组成,官方推荐我们使用6实例,其中3个为主节点,3个为从结点。一旦有主节点发生故障的时候,Redis Cluster可以选举出对应的从结点成为新的主节点,继续对外服务,从而保证服务的高...

    redis_exporter:用于Redis度量标准的Prometheus导出器。 支持Redis 2.x,3.x,4.x,5.x和6.x

    支持Redis 2.x,3.x,4.x,5.x和6.x建立并运行出口商在本地构建和运行git clone https://github.com/oliver006/redis_exporter.gitcd redis_exportergo build ../redis_exporter --version预编译二进制对于预构建的...

    windows一键Redis-Cluster集群工具(支持Redis3.0.504,Redis3.2.100的x86,x64版本)

    windows一键Redis-Cluster集群工具(32位和64位Redis-v3.0.504,以及64位Redis-v3.2.100),资源包括:ruby安装包,rubygem,32位Redis-v3.0.504,64位Redis-v3.0.504,64位Redis-v3.2.100,一键Redis-Cluster集群...

    rediscluster.zip

    RedisCluster + SpringBoot演示案例 本案例所用的Redis是5.0.8所以和旧版的4.0.X不同的地方在于创建集群的方式的变化 所用系统:Centos7.7 64位 本案例设置的统一密码为:shunleite Spring Boot 2.0+ 原文地址:...

    redis-5.0.7-x64.zip

    Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速...内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。

    redis-py-cluster:官方redis集群的Python集群客户端。 Redis 3.0+

    redis-py-cluster 该客户端提供了Redis 3.0中添加的Redis集群客户端... redis-py-cluster 2.1.x将是支持Python 2.7的最后一个主要版本。 2.1.x系列将继续获得支持Python 2的错误修复和安全补丁,直到2020年8月1日。red

    Redis-x64-3.0.504windows集群已经配置好的版本

    这个是windows已经配置好的版本,讲道理你下载过去只需要执行几条命令,redis集群就能搭建起来,懒癌的福音。 注意:基于windows,支持windows离线安装

    tomcat 8.5.x | 9.x.x redis cluster session

    tomcat 集群 session 共享,配置domain域名等

    CentOS7.x 离线安装redis-cluster所需包

    改压缩包中含了centos7.x离线安装redis-cluster的所有相关文件,包括ruby-2.4.1.tar.gz,rubygems-2.7.6.tgz,zlib-1.2.11.tar.gz,redis-4.0.2.gem,tcl8.6.8-src.tar.gz

    Redis-x64-3.0.504.zip -windows版本 redis.exe

    Redis-x64-3.0.504.zip -windows版本 redis.exe This is a critical bug fix release for Redis on Windows 3.0. If you are running a previous version of 3.0 in a cluster configuration you should upgrade to ...

    Redis-x64-cluster.rar

    Redis-x64-cluster

    windows环境下redis集群的搭建

    06、安装ruby环境(rubyinstaller-2.2.4-x64.exe),注意(安装所有模块),后台需要使用此环境。 07、下载ruby环境下Redis的驱动“redis-3.2.2.gem”。 08、把“redis-3.2.2.gem”放到ruby环境下进行驱动,在所在的目录...

    Redis-x64-3.2.100官方原版

    复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用...

    基于springboot , zookeeper , redis 分布式事务强一致性方案+源代码+文档说明

    fat.redis.cluster.nodes=x.x.x.x:x,x.x.x.x:x # zookeeper服务器地址 fat.zookeeper.host=x.x.x.x:x,x.x.x.x:x # zookeeper活跃时间 fat.zookeeper.sessionTimeout=x.x.x.x:x,x.x.x.x:x ``` 应用标识,与spirng....

    redis-5.9.101(6.0-rc1)-x64-windows-bin.rar

    Redis 6 RC1 发布了,项目创建人 antirez 在博客中介绍,这是迄今最“企业”化的版本(SSL 与 ACL 等特性与企业极相关)...Redis Cluster 代理与 Redis 6 一起发布(不同仓库) Redis 6 发布 Disque 模块(不同仓库)

    Redis-x64-3.2.100的安装版java可用

    Redis 是一个开源的(BSD 许可)内存数据结构...Redis 具有高性能,并且提供复制、Lua 脚本、LRU 驱逐、事务和不同级别的磁盘持久性,还通过 Redis Sentinel 提供高可用服务,并提供自动分区功能通过 Redis Cluster。

    redis-desktop-manager-2020.1.0.0.zip

    redis-desktop-manager-2020.1.0.0.x64.exe,64位的已编译好的安装包,已解决cluster模式不能自动跳转的bug

    cluster.zip

    docker编排redis集群, ...3.使用redis-trib.rb初始化集群:redis-trib.rb create --replicas 1 127.0.0.1:7391 127.0.0.1:7392 127.0.0.1:7393 127.0.0.1:7394 127.0.0.1:7395 127.0.0.1:7396(ip改为自己ip即可)

    springboot整合redis

    SpringBoot整合Redis,包括整合单机版Redis、redis-cluster集群、redis哨兵模式

    Redis-x64-3.2.100.zip

    Redis-x64-3.2.100.zip hope help you, Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), ...

Global site tag (gtag.js) - Google Analytics