SpringCloud 之 搭建 Redis 集群(Redis-Cluster)及 主从复制

Redis-Cluster简介

1、 什么是Redis-Cluster

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

Redis集群搭建的方式有多种,例如使用客户端分片、Twemproxy、Codis等,但从redis 3.0之后版本支持redis-cluster集群,它是Redis官方提出的解决方案,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。其redis-cluster架构图如下:
SpringCloud 之 搭建 Redis 集群(Redis-Cluster)及 主从复制_第1张图片
客户端与 redis 节点直连,不需要中间 proxy 层.客户端不需要连接集群所有节点连接集群中任何一个可用节点即可。

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

1.1、分布存储机制-槽

(1)redis-cluster 把所有的物理节点映射到[0-16383]slot 上,cluster 负责维护

node<->slot<->value

(2)Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。

​ 例如三个节点:槽分布的值如下:

SERVER1: 0-5460

SERVER2: 5461-10922

SERVER3: 10923-16383

1.2、容错机制-投票

(1)选举过程是集群中所有master参与,如果半数以上master节点与故障节点通信超过(cluster-node-timeout),认为该节点故障,自动触发故障转移操作. 故障节点对应的从节点自动升级为主节点

(2)什么时候整个集群不可用(cluster_state:fail)?

如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完成时进入fail状态.
SpringCloud 之 搭建 Redis 集群(Redis-Cluster)及 主从复制_第2张图片

2、搭建Redis-Cluster
2.1、搭建要求

需要 6 台 redis 服务器。搭建伪集群。
需要 6 个 redis 实例。
需要运行在不同的端口 7001-7006

2.2、准备工作

(1)安装gcc

Redis 是 c 语言开发的。安装 redis 需要 c 语言的编译环境。如果没有 gcc 需要在线安装。

# 查看是否有 gcc
gcc -v
# centos 安装
yum install gcc-c++
# ubuntu 安装
sudo apt-get update
sudo apt-get  build-depgcc

(2)安装 ruby (我们需要使用ruby脚本来实现集群搭建)

# centos 安装
yum install ruby
yum install rubygems
# ubuntu 安装
sudo apt update
sudo apt install ruby-full
# 查看版本
ruby --version

知识点小贴士
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源码包

wget https://download.redis.io/releases/redis-6.0.9.tar.gz
tar xzf redis-6.0.9.tar.gz
cd redis-6.0.9
make
如果命令行方式下载出错,则把网址复制出来用浏览器下载,然后拷贝到linux中
在这里插入图片描述
看到以下输出结果,表示编译成功
SpringCloud 之 搭建 Redis 集群(Redis-Cluster)及 主从复制_第3张图片

(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

以第一个redis实例为例,命令如下

make install PREFIX=/usr/local/redis-cluster/redis-1
出现此提示表示成功,按此方法安装其余5个redis实例
SpringCloud 之 搭建 Redis 集群(Redis-Cluster)及 主从复制_第4张图片

(6)复制配置文件 将 /redis-3.0.0/redis.conf 复制到redis下的bin目录下

cp redis.conf /usr/local/redis-cluster/redis-1/bin
cp redis.conf /usr/local/redis-cluster/redis-2/bin
cp redis.conf /usr/local/redis-cluster/redis-3/bin
cp redis.conf /usr/local/redis-cluster/redis-4/bin
cp redis.conf /usr/local/redis-cluster/redis-5/bin
cp redis.conf /usr/local/redis-cluster/redis-6/bin
2.3配置集群

(1)修改每个redis节点的配置文件redis.conf

  • (91行) 修改运行端口为7001 (7002 7003 ……)
  • (224行) 将 daemonsize 的 no 改成 yes,开启后台运行 redis
  • (247行) 将pid文件的名字 含端口号那个改成相应的端口
  • (1222行) 将cluster-enabled yes 前的注释去掉,开启集群

集群:

6个节点
3主
3从
1)创建6个节点 7001-7006
2)开启集群
3)串联集群[将集群链接到一起]

(2)启动每个redis实例

​ 以第一个实例为例,命令如下

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

# 为了方便,在/usr/local/redis-cluster目录下创建 redis-start-all.sh 文件,并赋予可运行的权限
vim redis-start-all.sh
# 内容
cd /usr/local/redis-cluster/redis-1/bin/
./redis-server redis.conf
cd /usr/local/redis-cluster/redis-2/bin/
./redis-server redis.conf
cd /usr/local/redis-cluster/redis-3/bin/
./redis-server redis.conf
cd /usr/local/redis-cluster/redis-4/bin/
./redis-server redis.conf
cd /usr/local/redis-cluster/redis-5/bin/
./redis-server redis.conf
cd /usr/local/redis-cluster/redis-6/bin/
./redis-server redis.conf
chmod +x redis-start-all.sh

(3)执行命令,开启

./redis-start-all.sh
SpringCloud 之 搭建 Redis 集群(Redis-Cluster)及 主从复制_第5张图片
出现这个即表示启动成功

(4)使用 ruby 脚本搭建集群。

进入redis源码目录中的src目录 执行下面的命令,可以实现Redis集群,create创建集群,cluster-replicas创建主从关系 1:是否随机创建(是)。

./redis-cli --cluster create 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 --cluster-replicas 1

出现这样即创建集群成功(因为在 redis.conf 文件中设置 bind 127.0.0.1 所以此时的redis是外面连不上的,需要把每个 bind 改成0.0.0.0 即可)
SpringCloud 之 搭建 Redis 集群(Redis-Cluster)及 主从复制_第6张图片
输入 yes 创建:
SpringCloud 之 搭建 Redis 集群(Redis-Cluster)及 主从复制_第7张图片
(5):测试集群

-c:代表连接的是 redis 集群

在这里插入图片描述

SpringCloud 之 搭建 Redis 集群(Redis-Cluster)及 主从复制_第8张图片

到此 Redis 集群搭建完毕

接下来搭建redis各个节点的主从复制

从下图中可看出
SpringCloud 之 搭建 Redis 集群(Redis-Cluster)及 主从复制_第9张图片
当前的集群架构是:
SpringCloud 之 搭建 Redis 集群(Redis-Cluster)及 主从复制_第10张图片
当一个节点的 master 宕机之后,他的 slave 就不可用了,这不是我们想要的,我们可以利用 redis 的哨兵模式,以达到故障转移,主节点的选举等操作
SpringCloud 之 搭建 Redis 集群(Redis-Cluster)及 主从复制_第11张图片
架构原理如图:

1.多个sentinel 发现并确认master有问题。

2.sentinel内部选举领导

3.选举出slave作为新的master

4.通知其余的slave成为新master的slave

5.通知客户端 主从变化

6.如果老的master重新复活,那么成为新的master的slave

要实现上边的功能的主要细节主要有以下三个定时任务:

每10秒,哨兵会向master和slave发送INFO命令(目的就是监控每一个节点信息)
每2秒,哨兵会向master库和slave的频道(sentinel:hello)发送自己的信息 (sentinel节点通过sentinel:hello频道进行信息交换,比如加入哨兵集群,分享自己节点数据)
每1秒,哨兵会向master和slave以及其他哨兵节点发送PING命令(目的就是 redis节点的状态监控,还有领导选举,主备切换选择等)

策略总结:

​ 1.尽量为 每一个节点部署一个哨兵

​ 2.哨兵也要搭建集群(防止哨兵单点故障)

​ 3.每一个节点都同时设置quorum的值超过半数(N/2)+1

具体操作:
SpringCloud 之 搭建 Redis 集群(Redis-Cluster)及 主从复制_第12张图片

  • 1、将安装包目录下的 sentinel.conf 拷贝到每个 master 的目录下的bin 目录下,也就是 redis-1,redis-2,redis-3
cp sentinel.conf /usr/local/redis-cluster/redis-1/bin/
cp sentinel.conf /usr/local/redis-cluster/redis-2/bin/
cp sentinel.conf /usr/local/redis-cluster/redis-3/bin/
  • 2、然后编辑 sentinel.conf 文件,设置主节点的IP和端口即可

在 sentinel.conf 文件的
SpringCloud 之 搭建 Redis 集群(Redis-Cluster)及 主从复制_第13张图片
在这里插入图片描述

  • 3、启动每个主节点的哨兵
cd /usr/local/redis-cluster/redis-1/bin/
./redis-sentinel ./sentinel.conf
cd /usr/local/redis-cluster/redis-2/bin/
./redis-sentinel ./sentinel.conf
cd /usr/local/redis-cluster/redis-3/bin/
./redis-sentinel ./sentinel.conf

然后就可以发现,之前连接 7004 不能存储节点的现在依然可以使用了,此时要注意,杀死一次7001之后,7004成为主节点,7001再次启动,则7001成为从节点了
SpringCloud 之 搭建 Redis 集群(Redis-Cluster)及 主从复制_第14张图片
最后查看进程信息:

ps -ef|grep redis

SpringCloud 之 搭建 Redis 集群(Redis-Cluster)及 主从复制_第15张图片

你可能感兴趣的:(SpringCloud,SpringBoot,Linux,linux,redis,java)