玩转Redis集群的搭建、命令以及Java整合

作者:张丰哲
https://www.jianshu.com/p/dbc62ed27f03
今天推文主要是关于Redis集群的搭建,Redis集群的常用命令、Java操作Redis集群、以及与Spring/Spring MVC的整合等知识。

Redis集群搭建

要想搭建一个最简单的Redis集群,那么至少需要6个节点:3个Master和3个Slave。为什么需要3个Master呢?如果你了解过Hadoop/Storm/Zookeeper这些的话,你就会明白一般分布式要求基数个节点,这样便于选举(少数服从多数的原则)。

Redis集群模型

这里,我将采用一种“偷懒”的方式,在一个Linux虚拟机上搭建6个节点的Redis集群。(因为开启6个Linux虚拟机,我的电脑完全扛不住)

实际上,思路很简单,我将在一台节点上开启6个Redis实例,并且这6个Redis各自有自己的端口。这样的话,相当于模拟出了6台机器了。然后在以这6个实例组建Redis集群就可以了。

第一步:为这6个实例创建好各自存放的目录

想一想,为什么要这样做呢?

第二步:既然是要启动6个Redis实例,自然需要准备各自的配置文件

拷贝redis.conf 6份

6个Redis实例的具体配置

具体来说,需要注意下:由于在一台机器(192.168.99.121)上,因此每个实例应该有不同的端口;同时,每个实例显然会有自己的存放数据的地方;开启AOF模式;开启集群配置;开启后台模式;

第三步:实际上,Redis集群的操作在后文你可以看到是通过Ruby脚本来完成的,因此我们需要安装Ruby相关的RPM包,以及Redis和Ruby的接口包。

yum install ruby

yum install rubygems

gem install redis

第四步:让Redis集群工作起来!

启动6个Redis实例

接下来,我们要通过Ruby脚本来创建集群了。

redis-trib.rb是操作Redis集群的脚本

[root@mydream121 bin]# ./redis-trib.rb create --replicas 1 192.168.99.121:8001 192.168.99.121:8002 192.168.99.121:8003 192.168.99.121:8004 192.168.99.121:8005 192.168.99.121:8006

create redis cluster

redis cluster info

首先,我们来看一下创建集群命令中 --replicas 1,这个代表什么意思呢?1其实代表的是一个比例,就是主节点数/从节点数的比例。那么想一想,在创建集群的时候,哪些节点是主节点呢?哪些节点是从节点呢?答案是将按照命令中IP:PORT的顺序,先是3个主节点,然后是3个从节点。这一点可以通过上面的2张图片印证。

其次,注意到图中slot的概念。slot对于Redis集群而言,就是一个存放数据的地方,就是一个槽。对于每一个Master而言,会存在一个slot的范围,而Slave则没有。在Redis集群中,依然是Master可以读、写,而Slave只读。数据的写入,实际上是分布的存储在slot中,这和以前1.X的主从模式是不一样的(主从模式下Master/Slave数据存储是完全一致的),因为Redis集群中3台Master的数据存储并不一样。这一点将在后续的实验中得到验证。

第五步:验证Redis集群搭建是否成功

cluster info/cluster nodes

搭建起来的Redis集群

到这里,Redis集群的搭建就完毕了!

Redis集群操作实践

数据的分布性

数据分布性

从上面的操作,你可以看到,当存储某一个数据的时候,会分配一个slot,而这个slot从属于某一个Master,也就是说你需要明白,数据是分布的存储在Redis集群当中的。

在线水平扩容

Redis Cluster有一个非常重要的特点就是可以在线的添加节点,实现不影响业务的水平扩容。在这里,我将会在原来6个redis节点上,再添加2个redis节点。做法和以前一致,注意修改redis.conf,然后在启动8007、8008这2个redis实例。

修改redis.conf配置

启动新添加的2个redis实例

集群状态

其实,目前虽然启动了新加的2个redis实例,但是它们是不属于集群的。下面,我们来让它们加入集群中。

add-node命令

./redis-trib.rb add-node 192.168.99.121:8007 192.168.99.121:8006

./redis-trib.rb add-node 新节点 集群中已经存在的节点

在往集群中添加节点A的时候,需要提供一个在集群中已经存在的节点B的信息。因为知道了B的信息,就知道了整个集群的信息。为什么这么说呢,来,我们看一个文件,你就知道了。

nodes-xxx.conf

要知道集群中的每一个节点都有这么一个文件,存储着集群中每一个节点的信息:节点的角色、节点的ID、连接状态、slot范围、IP/PORT信息等。仔细观察图中,你可以发现,新加入的8007节点,实际上被默认为master节点,并且没有slot分配!这说明,新加入的节点现在还不可以存储数据,因此我们要为新节点分配slot槽。

[root@mydream121 bin]# ./redis-trib.rb reshard 192.168.99.121:8001

要知道slot都分配在master上,因此其实我们要做的就是从集群的masters上进行重新分配。上面的命令需要指定一个master节点进行reshard分片。

slot重新分配

图中要为新加入的节点8007分配500个slot,而且分配的方式是"all",all是什么意思呢?all代表从已经存在的所有的master上均匀的分配一部分slot给8007。当然你可以通过"done"来指定某一个master进行分配。注意分配给8007是通过节点ID来指定的。

分配后的集群信息

按照上面的操作,我将8008节点也加入集群中,我的想法是让8008成为8007的从节点。既然是从节点,就不需要分配slot槽。注意到add-node方式加入的节点,默认就是master节点,因此这里我们得利用replicate指定主节点。

[root@mydream121 bin]# ./redis-trib.rb add-node 192.168.99.121:8008 192.168.99.121:8001

为从节点指定主节点

那么到现在,我们就在线完成了对Redis集群的水平扩容。那么如何删除节点呢?删除节点时,数据怎么办呢?对于从节点,删除就删除了,并不要紧,关键是主节点,因为主节点上有slot。因此,在删除主节点前,我们要对主节点的slot进行重新分配,完成数据的迁移。这里我就不再演示了,直接给出命令。

删除主节点:先reshard + 后del-node

删除从节点:直接del-node


Redis实现Session共享

Redis可以被用于Session共享,不过现在CAS实现单点登录更容易些。(CAS以后为大家介绍)

redis集群存储session信息

不论是Nginx挂了,还是其中的Tomcat挂掉,都不会丢失Session信息。在实现上,有现成的插件,比如:https://github.com/jcoleman/tomcat-redis-session-manager


Java操作Redis

在单机Redis环境:Jedis

这个没什么好说的,就是给定IP/PORT实例化Jedis操作即可。

Jedis jedis = new Jedis("192.168.99.121", 8001);

在多台Redis环境:ShardedJedis+ShardedJedisPool

ShardedJedis方式

这是一种切片的方式来操作redis,通过hash而均匀的分配到pool里的redis机器中。

在Redis集群环境:JedisCluster

JedisCluster


与Spring整合

我们直接来看配置文件吧!

redis集群与Spring整合

同上文Java操作Redis集群的代码对比下,其实XML就是代码的映射。只不过通过spring的方式,帮助我们配置生成了一个bean:redisCluster。我们可以通过注入的方式得到redisCluster,然后我们想干啥就可以干啥,就这么简单~

--完--

如果需要Redis视频,可以在公众号后台聊天框回复【Redis视频】,可以免费获取编程视频 。

Redis其它推荐阅读:

Redis 零基础入门视频教程

Linux 安装 Redis 图文教程

刚接触学Redis,看这一篇就够了!

再来聊聊Redis到底是什么?

说说 Redis 数据结构和常用命令

Redis最常见面试问题,附答案!

Redis的字符串是怎么实现的?

阿里巴巴官方 Redis 开发规范!

如何借助 Redis 实现秒杀系统?

史上最全 Redis 高可用解决方案总结

10 个正确使用 Redis 的技巧

Redis 分布式锁的正确实现方式

Redis 源码学习之 Redis 事务

详解Redis的内存淘汰策略

Redis 的各项功能,都解决了哪些问题?

为什么单线程的Redis却能支撑高并发?

Redis应用场景,实现功能 “附近的人”

超详细揭秘 Redis 持久化,建议收藏!

后端开发都应该掌握的Redis基础

Redis是如何实现点赞、取消点赞的?

Redis实践:网站搜索的热搜词

如何用 Redis 做实时订阅推送的?

Redis 主从复制以及主从复制原理

如何访问 Redis 中的海量数据?

一文深入了解Redis内存模型!

Redis常见的几种缓存模式

长按加入10W+朋友的IT圈

觉得内容还不错的话,给我点个“在看”呗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值