Redis-cluster搭建redis高可用集群

首先简单介绍下 Cluster 模式的集群

1.集群对外统一。在使用集群时,只需要关注 Redis 各个节点的 IP 和端口,至于读写节点、主从等无需关注;

2.集群内部协调。主从节点在集群部署时已选举完成,除非节点挂掉,会进行重新选举。其次删除相关配置项时,也会重新选举主节点;

3.去中心化。本模式不再如哨兵、Codise 等,需要第三方监控。Cluster自行加入选举,完成主节点选举,以及读写访问控制。

Redis-cluster原理

Redis 是一个开源的 key-value 存储系统,由于出众的性能,大部分互联网企业都用来做服务器端缓存。Redis 在3.0版本前只支持单实例模式,虽然支持主从模式、哨兵模式部署来解决单点故障,但是现在互联网企业动辄大几百G的数据,可完全是没法满足业务的需求,所以,Redis 在 3.0 版本以后就推出了集群模式。

Redis 集群采用了P2P的模式,完全去中心化。Redis 把所有的 Key 分成了 16384 个 slot,每个 Redis 实例负责其中一部分 slot 。集群中的

所有信息(节点、端口、slot等),都通过节点之间定期的数据交换而更新。

Redis 客户端可以在任意一个 Redis 实例发出请求,如果所需数据不在该实例中,通过重定向命令引导客户端访问所需的实例。

Redis Cluster中,采用slot(槽)的概念,一共分成16384个槽。对于每个进入Redis的键值对,根据key进行散列,分配到这16384个slot中的某一个中。使用的hash算法也比较简单,就是CRC16后16384取模。Redis集群中的每个node(节点)负责分摊这16384个slot中的一部分,也就是说,每个slot都对应一个node负责处理。当动态添加或减少node节点时,需要将16384个槽做个再分配,槽中的键值也要迁移。当然,这一过程,在目前实现中,还处于半自动状态,需要人工介入。Redis集群,要保证16384个槽对应的node都正常工作,如果某个node发生故障,那它负责的slots也就失效,整个集群将不能工作。为了增加集群的可访问性,官方推荐的方案是将node配置成主从结构,即一个master主节点,挂n个slave从节点。这时,如果主节点失效,Redis Cluster会根据选举算法从slave节点中选择一个上升为主节点,整个集群继续对外提供服务。这非常类似服务器节点通过Sentinel监控架构成主从结构,只是Redis Cluster本身提供了故障转移容错的能力。

Redis-cluster环境准备

安装部署任何一个应用其实都很简单,只要安装步骤一步一步来就行了。下面说一下 Redis 集群搭建规划,由于集群至少需要6个节点(3主3从模式),没有那么多机器给我们玩,现在计划是在一台机器上模拟一个集群,端口号分别是9001~9006,当然,这和生产环境的集群搭建没本质区别。

 

搭建集群

   1.安装redis

      这一步省略,可以参考linux安装redis里的第二种方法

   2.创建文件夹

mkdir /usr/local/redis-cluster
cd redis-cluster/
mkdir -p 9001/data 9002/data 9003/data 9004/data 9005/data 9006/data

  3.复制脚本

在 /usr/local/redis-cluster 下创建 bin 文件夹,用来存放集群运行脚本,并把安装好的 Redis 的 src 路径下的运行脚本拷贝过来。

cd /usr/local/redis-cluster

mkdir bin

cd /usr/local/redis-3.2.9/src

cp mkreleasehdr.sh redis-benchmark redis-check-aof  redis-cli redis-server redis-trib.rb /usr/local/redis-cluster/bin

4.复制一个新 Redis 实例

 

我们现在从已安装好的 Redis 中复制一个新的实例到 9001 文件夹,并修改 redis.conf 配置。

cp -r /usr/local/redis    /usr/local/redis-cluster/9001




注意,修改 redis.conf 配置和单点唯一区别是下图部分,其余还是常规的这几项:



port 9001(每个节点的端口号)



bind 192.168.212.150(绑定当前机器 IP)



pidfile /var/run/redis_9001.pid(pid 9001和port要对应)

cluster-enabled yes(启动集群模式)

cluster-config-file nodes9001.conf(9001和port要对应)

cluster-node-timeout 15000

appendonly yes  
dir /usr/local/redis-cluster/9001/data/(数据文件存放位置,在配置文件末尾追加)

5.再复制出五个新 Redis 实例并更改配置

我们已经完成了一个节点了,其实接下来就是机械化的再完成另外五个节点,把 9001 实例 复制到另外五个文件夹中,唯一要修改的就是 redis.conf 中的所有和端口的相关的信息即可


\cp -rf /usr/local/redis-cluster/9001/*   /usr/local/redis-cluster/9002

\cp -rf /usr/local/redis-cluster/9001/*   /usr/local/redis-cluster/9003

\cp -rf /usr/local/redis-cluster/9001/*   /usr/local/redis-cluster/9004

\cp -rf /usr/local/redis-cluster/9001/*   /usr/local/redis-cluster/9005

\cp -rf /usr/local/redis-cluster/9001/*   /usr/local/redis-cluster/9006

修改 9002-9006 的 redis.conf 文件

  把9002-9006配置文件里的9001全替换成各自的端口号就ok了

6.安装集群所需软件

注意:centos7默认的ruby版本太低(2.0),要卸载重装(最低2.2)

yum remove ruby
yum install ruby
yum install rubygems
gem install redis 这个命令失败的话,本地上传安装

本地上传gem并进行安装

 gem install -l redis-3.2.1.gem 

7.文件夹授权

chmod -R 777 /usr/local/redis-cluster/

8.启动集群环境

启动9001-9006六个节点

/usr/local/redis-cluster/9001/redis/bin/redis-server  /usr/local/redis-cluster/9001/redis/etc/redis.conf



/usr/local/redis-cluster/9001/redis/bin/redis-server  /usr/local/redis-cluster/9002/redis/etc/redis.conf

/usr/local/redis-cluster/9001/redis/bin/redis-server  /usr/local/redis-cluster/9003/redis/etc/redis.conf

/usr/local/redis-cluster/9001/redis/bin/redis-server  /usr/local/redis-cluster/9004/redis/etc/redis.conf

/usr/local/redis-cluster/9001/redis/bin/redis-server  /usr/local/redis-cluster/9005/redis/etc/redis.conf

/usr/local/redis-cluster/9001/redis/bin/redis-server  /usr/local/redis-cluster/9006/redis/etc/redis.conf

使用redis-trib.rb创建集群

/usr/local/redis-cluster/bin/redis-trib.rb create --replicas 1 192.168.212.150:9001 192.168.212.150:9002 192.168.212.150:9003 192.168.212.150:9004 192.168.212.150:9005 192.168.212.150:9006

 效果:三台master三台slave

目前来看,9001-9003 为主节点,9004-9006 为从节点,并向你确认是否同意这么配置。输入 yes 后,会开始集群创建。

记住输入yes

9.验证集群环境

集群已经搭建完毕,我们通过客户端命令连接上,通过集群命令看一下状态和节点信息等。

随便找一个节点测试试

集群连接一定要加-c参数,节点之间就可以互相跳转

/usr/local/redis-cluster/9001/redis/bin/redis-cli -c -h 192.168.212.150 -p 9001

查询集群节点信息

127.0.0.1:9001> cluster nodes

执行set get命令


127.0.0.1:9001> set name aa
-> Redirected to slot  located at 127.0.0.1:9002
OK
127.0.0.1:9002> get name
"aa"
127.0.0.1:9002> 

根据redis-cluster的key值分配,name应该分配到节点7002[5461-10922]上,上面显示redis cluster自动从9001跳转到了9002节点。

在每一个redis节点上通过key获取值,都会自动跳到存下key的节点

验证故障转移

当我们把9002shutdown后,9005从从节点slave变为主master。

当9002恢复启动后,连接9002 , 调用info命令,会发现他变成了9005的从节点

springboot集成RedisCluster

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/wota5037/article/details/112021658