Redis是我们在平时开发中经常会用到的一个缓存数据库,特别是在高并发环境下,可以抗住很高的流量,很大的程度上提高了项目的性能
Redis运用之所以这么广泛有一个很大的原因,那就是可以很好的支持集群模式,到现在Redis一共支持三种集群模式----主从模式、哨兵模式、Redis Cluster集群
Redis安装
如果大家已经会怎么安装redis了,那么这一步可以直接跳过
我们首先要去官网下载Redis包
官网下载地址:https://redis.io/download/#redis-downloads
我这里下载的Redis版本是 6.2.7,我用的linux版本的centos 7 ,大家在搭建的时候尽量与我使用的版本保持一致,不然按照我的教程搭建有可能出问题
下载完成之后,需要将包上传到linux上,可以通过 rz 命令上传,如果没有的这个命令的话就需要安装下了
在搭建之前需要看下系统有没有安装gc环境,可以通过命令查看
gc -v
如果查看不了或者没有的话,那么就需要执行命令进行安装
yum install gcc-c++
我这里使用的gcc版本是 4.8.5 的,版本不用跟我的保持一致,反正使用4.8以上的就行了
环境都准备完成之后,我们就可以通过 tar -zxvf 对之前上传的Redis包进行解压了
tar -zxvf redis-6.2.7.tar.gz
解压完成之后我们需要进入到 redis-6.2.7/src 目录下
cd redis-6.2.7/src/
然后执行下 make 命令,等它编译完
make
编译完成之后,我们再来启动下试试
注意此时启动redis服务不是后台启动的,在启动之前,我们需要改成为后台启动,需要通过修改下 redis-6.2.7 目录下的 redis.conf 配置文件,在配置文件里把 daemonize 改为 yes
我们通过 redis-6.2.7/src/ 目录下的 redis-server 启动,注意改为后台启动之后,在启动时需要指定配置文件
src/redis-server redis.conf
启动完成之后,我们再来启动下Redis客户端
src/redis-cli
服务与客户端启动,测试添加数据,我已经全部截取在一张图里了,大家可以自行尝试
主从模式
主从模式是最典型也是最基础的一种集群模式,这种模式除了在Redis上运用,在其他的中间件上也有运用,比如Zookeeper、Mysql等
对于主从模式一般都是一主多从,主Redis节点主要对外提供服务,从Redis节点不对外提供服务,只对主Redis节点进行数据备份,具体的主从示意图如下:
你们肯定就要想了,既然从Redis不对外提供服务,那这种集群模式有啥用呢
我们要想一下,如果只有一台Redis,那么在流量特别高的环境下,这台Redis突然宕机了,那已经无法对外提供服务了,严重一点可能导致整个服务不可用,因此为了能够让服务高可用,我们就需要搭建这种集群架构
我如果有从节点,那么当主节点挂了,我们可以切换到从节点上,最起码保证能够对外提供服务
一般在Redis主从搭建的时候,我们只需要一个主节点两个从节点就可以了,要手动搭建这种主从集群其实也比较简单
我们可以把 redis.conf 文件复制两份,然后把这三个conf文件分别改为 redis-6379.conf、redis-6380.conf、redis-6381.conf,这三个文件分别对应端口 6379 、6380、6381
这里为啥要弄三个 conf 文件呢,这是因为一台Redis实例只要启动的时候指定配置文件是可以启动多次的,我通过这种方式就可以只使用一台Redis实例就可以了
我们把端口为 6379 的 redis 做为主节点,另外的两台做为从节点,我们再把从节点的conf文件做下修改就行了
从节点 conf 配置文件里具体要改的东西我已经列出来了
port 6380 -- 端口号改成各自的端口
dir /redis-6.2.7/data/ -- 这个文件路径主要是存放数据的,我们可以改成自定义路径
replicaof 127.0.0.1 67390 -- 主节点的ip和端口
改完之后我们就可以启动了,我们先要启动主节点,然后再分别启动两个从节点
src/redis-server redis-6379.conf -- 启动主节点
src/redis-server redis-6380.conf -- 启动从节点
src/redis-server redis-6381.conf -- 启动从节点
我们可以连接下主节点的客户端
src/redis-cli -p 6379
连接完成之后我们可以通过 info 命令查看主从信息
我们往主节点里添加一条数据
set liutongxue abc
我们可以分别在从节点里获取到
Redis哨兵集群
上面的主从架构虽然可以保证高可用,但是假设主节点宕机了还需要人工的切换到从节点上
你可能会觉得这没什么,但是如果是半夜三更突然宕机了,此时的开发和运维也在休息,那么就无法恢复了,因为缺乏了人工的干预
为了能过够来抵抗节点故障,当故障发生时可以自动进行主从切换,Redis提供了一种方案—Redis Sentinel ,俗称哨兵,哨兵是对主从结构进行了增强
哨兵集群就是为了能够保证主从架构能够宕机自动恢复,我们可以把这个哨兵集群理解为是一个监控,当主从架构主节点宕机了,哨兵集群如果监控到了,其内部会通过选举机制来选出某一台从节点,并把这台从节点设置为主节点然后就继续对外提供服务
哨兵其实就是Redis提供的一个服务,我们一般搭建哨兵集群也需要用到三个Redis实例
redis-6.2.7 目录下有一个 sentinel.conf 文件,我们按照上面主从架构的搭建步骤同样也复制两份,并命名为 sentinel-26379.conf、sentinel-26380.conf、sentinel-26381.conf
对应如下:
我们以 26379 端口号的Redis为主节点,其他的为从节点
这三个 conf 文件需要配置东西如下
port 26379 --- 端口号需要改各个哨兵节点的端口号
daemonize yes --- 改成后台启动
pidfile "/var/run/redis‐sentinel‐26379.pid" ---pid文件,这里的路径可以自定义
dir "/redis‐6.2.7/data/sentinel" ---存放数据的路径,也可以自定义
sentinel monitor mymaster 127.0.0.1 6379 2 ---这个是监控Redis主节点的ip和端口
这里我要重点说下 sentinel monitor 这个配置
我要说下后面的四个参数:
master-name: 主节点名称,这个在客户端访问集群的时候需要用到
ip: 监控Redis主节点的IP地址,注意这里是Redis集群的主节点,不是哨兵集群里的主节点
redis-port:监控Redis主节点的端口号
quorum:指明当有多少个sentinel认为一个master失效时,master才算失效,这里我配置的是2 ( 一般为:sentinel总数 / 2 + 1)
配置完成之后再来启动哨兵服务,如下
src/redis-sentinel sentinel-26379.conf
src/redis-sentinel sentinel-26380.conf
src/redis-sentinel sentinel-26381.conf
到这里我们的哨兵集群就搭建完了,我们如果要访问的话得需要通过java客户端来访问
public class JedisSentinelTest {
public static void main(String[] args) throws IOException {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(20);
config.setMaxIdle(10);
config.setMinIdle(5);
String masterName = "mymaster";
Set sentinels = new HashSet();
// 这里添加的是哨兵集群节点信息
sentinels.add(new HostAndPort("192.168.18.13",26379).toString());
sentinels.add(new HostAndPort("192.168.18.13",26380).toString());
sentinels.add(new HostAndPort("192.168.18.13",26381).toString());
JedisSentinelPool jedisSentinelPool = new JedisSentinelPool(masterName, sentinels, co nfig, 3000, null);
Jedis jedis = null;
try {
jedis = jedisSentinelPool.getResource();
System.out.println(jedis.set("name", "zhangsan"));
System.out.println(jedis.get("name"));
} catch (Exception e) {
e.printStackTrace();
} finally {
//注意这里不是关闭连接,在JedisPool模式下,Jedis会被归还给资源池。
if (jedis != null) {
jedis.close();
}
}
}
Redis Cluster集群
虽然哨兵集群解决了宕机不能自动恢复问题,但是当主节点挂了之后,当需要切换主节点的时候,哨兵集群内部会通过一个选举机制来选举出某个从节点来进行切换,在这个选举切换的过程中是无法对外提供服务的,因此哨兵集群也不完全能过够做到高可用
因此为了更好的做到高可用就推出Redis Clustere 集群模式,它是由多个主从架构组成的一个集群,如下所示:
其实也是在主从架构上的一个增强,这种集群没有中信节点,可以水平扩展,其性能和高可用均优于哨兵模式
Redis Cluster 最少需要三个主从架构,我这里直接使用一主一从,那么就需要六个redis实例
我们之前已经创建了三个 conf 文件了,这里我再来创建三个 conf 文件,这三个文件就命名为 redis-6382.conf、redis-6383.conf、redis-6384.conf
在这个四个 conf 文件里,我们需要把 replicaof 这个配置给注释掉
然后在这六个文件里还需要改动一些配置,具体如下:
daemonize yes --- 后台启动
port 8001 --- 配置各自的端口号
dir "/redis‐6.2.7/data/" --- 数据存放路径,可以自定义
pidfile /var/run/redis_8001.pid --- 把pid进程号写入pidfile配置的文件,后面跟的是端口号,不同的节点配置不同的端口号
cluster‐enabled yes --- 启动集群模式
cluster‐config‐file nodes‐8001.conf -- 开启配置文件,后面跟的是端口号,不同的节点需要改成各自的端口号
cluster‐node‐timeout 10000 --- 节点连接过期时间
protected‐mode no --- 关闭保护模式
appendonly yes
配置完成之后再启动六个节点
启动完成之后,执行下命令创建Redis Cluster 集群
src/redis‐cli ‐‐cluster create ‐‐cluster‐replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384
--- 创建命令后面跟的就是每一个节点的ip和端口
出现如下消息就代表Redis Cluster集群创建成功
创作不易,希望多多点赞支持下