在阿里云上搭建redis高可用集群

redis cluster数据存储和节点通信原理

  • Redis-Cluster简介
    • 什么是Redis-Cluster
    • redis cluster 数据存储
    • redis cluster特点:
    • 分区
      • 分区规则
      • 实现原理
      • slot(槽)
  • 搭建Redis-Cluster
    • 搭建环境
    • 准备工作
      • 课前小知识
    • 配置集群
        • 小Demo
          • 创建springboot项目

1 | RedisCluster是redis的分布式解决方案,在3.0版本后推出的方案。
2 | 有效地解决了Redis分布式的需求,当遇到单机内存、并发等瓶颈时,可使用此方案来解决这些问题。

Redis-Cluster简介

什么是Redis-Cluster

       为何要搭建Redis集群。Redis是在内存中保存数据的,而我们的电脑一般内存都不大,这也就意味着Redis不适合存储大数据,适合存储大数据的是Hadoop生态系统的Hbase或者是MogoDB。Redis更适合处理高并发,一台设备的存储能力是很有限的,但是多台设备协同合作,就可以让内存增大很多倍,这就需要用到集群。

       Redis集群搭建的方式有多种,例如使用客户端分片、Twemproxy、Codis等,但从redis 3.0之后版本支持redis-cluster集群,它是Redis官方提出的解决方案,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。其redis-cluster架构图如下:

在阿里云上搭建redis高可用集群_第1张图片
       客户端与 redis 节点直连,不需要中间 proxy 层.客户端不需要连接集群所有节点连接集群中任何一个可用节点即可。
       所有的 redis 节点彼此互联(PING-PONG 机制),内部使用二进制协议优化传输速度和带宽.

redis cluster 数据存储

1、分布式数据库把整个数据按分区规则映射到多个节点,即把数据划分到多个节点上,每个节点负责整体数据的一个子集。

假设我们库有900条用户数据,有3个redis节点,将900条分成3份,分别存入到3个redis节点
在阿里云上搭建redis高可用集群_第2张图片

redis cluster特点:

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个,当然这是理想的状态,实际可能会有所出入。

slot(槽)

       Redis集群通过分片的方式来保存数据中的键值对:集群中的数据库被分为16384个槽(slot),数据库中的每个健都属于这16384个槽的其中一个,集群中的每个节点可以处理的0个或最多16384个槽。

      当数据库中的16384个槽都有节点在处理时,集群处于上线状态(ok);相反,如果数据库中有任何一个槽没有得到处理,那么集群处于下线状态(fail)。
在阿里云上搭建redis高可用集群_第3张图片
       每当 key 访问过来,Redis Cluster 会计算哈希值是否在这个区间里。它们彼此都知道对应的槽在哪台机器上,这样就能做到平均分配了。

edis用虚拟槽分区原因:
1,解耦数据与节点关系,节点自身维护槽映射关系,分布式存储

搭建Redis-Cluster

搭建环境

       需要 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

输出下图 编译成功。

在阿里云上搭建redis高可用集群_第4张图片
(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

在阿里云上搭建redis高可用集群_第5张图片
出现此提示表示成功,按此方法安装其余5个redis实例

(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行)

在阿里云上搭建redis高可用集群_第6张图片
改成下图
在阿里云上搭建redis高可用集群_第7张图片

(2)启动每个redis实例
以第一个实例为例,命令如下

cd /usr/local/redis-cluster/redis-1/bin/
./redis-server redis.conf

在阿里云上搭建redis高可用集群_第8张图片

把其余的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

在阿里云上搭建redis高可用集群_第9张图片
成功如下

小Demo

创建springboot项目

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!!!
在阿里云上搭建redis高可用集群_第10张图片

你可能感兴趣的:(在阿里云上搭建redis高可用集群)