1 | RedisCluster是redis的分布式解决方案,在3.0版本后推出的方案。
2 | 有效地解决了Redis分布式的需求,当遇到单机内存、并发等瓶颈时,可使用此方案来解决这些问题。
为何要搭建Redis集群。Redis是在内存中保存数据的,而我们的电脑一般内存都不大,这也就意味着Redis不适合存储大数据,适合存储大数据的是Hadoop生态系统的Hbase或者是MogoDB。Redis更适合处理高并发,一台设备的存储能力是很有限的,但是多台设备协同合作,就可以让内存增大很多倍,这就需要用到集群。
Redis集群搭建的方式有多种,例如使用客户端分片、Twemproxy、Codis等,但从redis 3.0之后版本支持redis-cluster集群,它是Redis官方提出的解决方案,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。其redis-cluster架构图如下:
客户端与 redis 节点直连,不需要中间 proxy 层.客户端不需要连接集群所有节点连接集群中任何一个可用节点即可。
所有的 redis 节点彼此互联(PING-PONG 机制),内部使用二进制协议优化传输速度和带宽.
1、分布式数据库把整个数据按分区规则映射到多个节点,即把数据划分到多个节点上,每个节点负责整体数据的一个子集。
假设我们库有900条用户数据,有3个redis节点,将900条分成3份,分别存入到3个redis节点
1、所有的节点之间都是联通的
2、集群消息通信通过集群总线通信,集群总线端口大小为客户端服务端口+10000,这个10000是固定值;
3、节点之间的通信协议采用二进制的方式;
4、客户端和集群节点之间通信和通常一样,通过文本协议进行;
5、集群节点不会代理查询,也就是某个key不存在当前查询的节点时,会返回该key对应的slot值。
常见的分区规则哈希分区和顺序分区,redis集群使用了哈希分区,顺序分区暂用不到,不做具体说明;
rediscluster采用了哈希分区的“虚拟槽分区”方式(哈希分区分节点取余、一致性哈希分区和虚拟槽分区)
redis-cluster的分区实现,是将数据分散到不同的节点上,到这里会有一个solt(槽)的概念,每一个集群中的master会“持有”一段solt,slot跟key之间有映射,这里的slot是一个虚拟的概念。举个栗子,如果有个6各节点,三主三从的redis cluster,这个集群中有1000个key,那么这1000个的分布每个master上保存333个,会有一个master上保存334个,当然这是理想的状态,实际可能会有所出入。
Redis集群通过分片的方式来保存数据中的键值对:集群中的数据库被分为16384个槽(slot),数据库中的每个健都属于这16384个槽的其中一个,集群中的每个节点可以处理的0个或最多16384个槽。
当数据库中的16384个槽都有节点在处理时,集群处于上线状态(ok);相反,如果数据库中有任何一个槽没有得到处理,那么集群处于下线状态(fail)。
每当 key 访问过来,Redis Cluster 会计算哈希值是否在这个区间里。它们彼此都知道对应的槽在哪台机器上,这样就能做到平均分配了。
edis用虚拟槽分区原因:
1,解耦数据与节点关系,节点自身维护槽映射关系,分布式存储
需要 6 台 redis 服务器。搭建伪集群。
需要 6 个 redis 实例。
需要运行在不同的端口 7001-7006
(1)安装gcc 【此步省略】
是 c 语言开发的。安装 redis 需要 c 语言的编译环境。如果没有 gcc 需要在线安装
yum install gcc-c++
(2)使用yum命令安装 ruby
yum install ruby
yum install rubygems
Ruby,一种简单快捷的面向对象(面向对象程序设计)脚本语言,在20世纪90年代由日本人松本行弘(Yukihiro Matsumoto)开发,遵守GPL协议和Ruby License。它的灵感与特性来自于 Perl、Smalltalk、Eiffel、Ada以及 Lisp 语言。由 Ruby 语言本身还发展出了JRuby(Java平台)、IronRuby(.NET平台)等其他平台的 Ruby 语言替代品。Ruby的作者于1993年2月24日开始编写Ruby,直至1995年12月才正式公开发布于fj(新闻组)。因为Perl发音与6月诞生石pearl(珍珠)相同,因此Ruby以7月诞生石ruby(红宝石)命名
RubyGems简称gems,是一个用于对 Ruby组件进行打包的 Ruby 打包系统
这是一条华丽的分割线
(3)将redis源码包上传到 linux 系统 ,解压redis源码包
(4)编译redis源码 ,进入redis源码文件夹
make
输出下图 编译成功。
(5)创建目录/usr/local/redis-cluster目录, 安装6个redis实例,分别安装在以下目录
/usr/local/redis-cluster/redis-1
/usr/local/redis-cluster/redis-2
/usr/local/redis-cluster/redis-3
/usr/local/redis-cluster/redis-4
/usr/local/redis-cluster/redis-5
/usr/local/redis-cluster/redis-6
为了节省各位的时间,我就写出来了(简单的改下最后数字就好!)
make install PREFIX=/usr/local/redis-cluster/redis-1
make install PREFIX=/usr/local/redis-cluster/redis-2
make install PREFIX=/usr/local/redis-cluster/redis-3
make install PREFIX=/usr/local/redis-cluster/redis-4
make install PREFIX=/usr/local/redis-cluster/redis-5
make install PREFIX=/usr/local/redis-cluster/redis-6
(6)进入 /redis-4.0.8 目录中找到 redis.conf 输入以下命令
vim redis.conf
将配置文件中 daemonize no 改成 daemonize yes
保存退出!
(7)复制配置文件 将 /redis-4.0.8/redis.conf 复制到redis各个目录下的bin目录下
[root@localhost redis-3.0.0]# cp redis.conf /usr/local/redis-cluster/redis-1/bin
[root@localhost redis-3.0.0]# cp redis.conf /usr/local/redis-cluster/redis-2/bin
[root@localhost redis-3.0.0]# cp redis.conf /usr/local/redis-cluster/redis-3/bin
[root@localhost redis-3.0.0]# cp redis.conf /usr/local/redis-cluster/redis-4/bin
[root@localhost redis-3.0.0]# cp redis.conf /usr/local/redis-cluster/redis-5/bin
[root@localhost redis-3.0.0]# cp redis.conf /usr/local/redis-cluster/redis-6/bin
(1)修改每个redis节点的配置文件redis.conf
修改运行端口为7001 (7002 7003 …)
将cluster-enabled yes 前的注释去掉(632行)
(2)启动每个redis实例
以第一个实例为例,命令如下
cd /usr/local/redis-cluster/redis-1/bin/
./redis-server redis.conf
把其余的5个也启动起来,然后查看一下是不是都启动起来了
[root@localhost ~]# ps -ef | grep redis
root 15776 15775 0 08:19 pts/1 00:00:00 ./redis-server *:7001 [cluster]
root 15810 15784 0 08:22 pts/2 00:00:00 ./redis-server *:7002 [cluster]
root 15831 15813 0 08:23 pts/3 00:00:00 ./redis-server *:7003 [cluster]
root 15852 15834 0 08:23 pts/4 00:00:00 ./redis-server *:7004 [cluster]
root 15872 15856 0 08:24 pts/5 00:00:00 ./redis-server *:7005 [cluster]
root 15891 15875 0 08:24 pts/6 00:00:00 ./redis-server *:7006 [cluster]
root 15926 15895 0 08:24 pts/7 00:00:00 grep redis
(3)上传redis-4.0.8.gem ,安装 ruby用于搭建redis集群的脚本。
root@localhost ~]# gem install redis-4.0.8.gem
Successfully installed redis-4.0.8
1 gem installed
Installing ri documentation for redis-4.0.8…
Installing RDoc documentation for redis-4.0.8…
(4)使用 ruby 脚本搭建集群。
进入redis源码目录中的src目录 执行下面的命令
47.9*.1**.4*是我自己的公网IP 此处把外网ip换成自己的公网ip
./redis-trib.rb create --replicas 1 47.9*.1**.45:7001 47.9*.1**.45:7002 47.9*.1**.45:7003
47.9*.1**.45:7004 47.9*.1**.45:7005 47.9*.1**.45:7006
applicationyml中填入下方配置
spring:
redis:
cluster:
nodes: 47.9*.1**.45:7007,47.9*.1**.45:7002,47.9*.1**.45:7003,47.9*.1**.45:7004,47.9*.1**.45:7005,47.9*.1**.45:7006
max-redirects: 6
创建一个测试类
测试类上写上 @SpringBootTest 注解
注入redis的API
@Autowired
RedisTemplate redisTemplate;
写一个测试方法
@Test
public void test1(){
System.out.println(redisTemplate.hasKey(“name”));
}
运行测试类 如果输出 true 或 false 表示搭建成功。(true和false是代表redis集群中是否有name数据)!
OK!!!