一、序言
本文搭建Redis集群服务。
二、单机模拟
单机模拟是指在单台物理机或者虚拟机上模拟操作,最大化还原本方案中间过程,适用于学习或者开发阶段使用。
为了简化操作,Redis服务做如下约定:数据不持久化到磁盘;服务实例以前台进程方式运行;节点的配置文件以默认配置文件为模版;无密码验证。
(一)集群规划
节点 | 主机 | 主服务端口 | 从服务端口 | 备注 |
---|---|---|---|---|
node01 | 127.0.0.1 | 7010 | 7011 | 物理机 |
node02 | 127.0.0.1 | 7020 | 7021 | 物理机 |
node03 | 127.0.0.1 | 7030 | 7031 | 物理机 |
(二)服务配置
1、随机主从初始化集群
节点的初始配置文件以默认配置文件为模版,为了快速搭建集群环境,这里采用随机分配主从关系方案。
/usr/local/redis/bin/redis-cli --cluster create \
127.0.0.1:6390 127.0.0.1:6391 \
127.0.0.1:6392 127.0.0.1:6393 \
127.0.0.1:6394 127.0.0.1:6395 --cluster-replicas 1
2、自定义主从初始化集群
手动指定主从关系,生产环境下采用手动指定主从服务的位置,确保同一组实例的主从不分布在同一台物理主机上。
(三)服务管理
测试或者学习时,建议采用前台进程管理服务,便于模拟单点故障、查看日志观察主从切换。
生产条件下建议使用Supervisor管理服务,不仅易于管理而且能够实现服务异常终止后自动重启。高可用场景下使用的是三台物理机。
1、Redis实例
/usr/local/redis/bin/redis-server /usr/local/redis/conf/cluster/redis6390.conf --port 6390 --save '' --daemonize no
/usr/local/redis/bin/redis-server /usr/local/redis/conf/cluster/redis6391.conf --port 6391 --save '' --daemonize no
/usr/local/redis/bin/redis-server /usr/local/redis/conf/cluster/redis6392.conf --port 6392 --save '' --daemonize no
/usr/local/redis/bin/redis-server /usr/local/redis/conf/cluster/redis6393.conf --port 6393 --save '' --daemonize no
/usr/local/redis/bin/redis-server /usr/local/redis/conf/cluster/redis6394.conf --port 6394 --save '' --daemonize no
/usr/local/redis/bin/redis-server /usr/local/redis/conf/cluster/redis6395.conf --port 6395 --save '' --daemonize no
三、客户端整合
客户端实现是指基于SpringBoot的整合分为两步实现:一是完成作为基础的整合;二是结合生产需要补充新特性。
(一)基础整合
基础整合的内容是以Java客户端连接高可用哨兵模式Redis服务,实现单节点故障服务正常运行的要求。
1、全局配置文件
全局配置文件添加的配置信息有:
master
参数为哨兵服务名,此处为默认值;
nodes
参数为哨兵服务列表(不是Redis实例服务列表);
database
参数为数据库。
spring:
redis:
cluster:
max-redirects: 3
nodes:
- 192.168.181.171:6390
- 192.168.181.171:6391
- 192.168.181.171:6392
- 192.168.181.171:6393
- 192.168.181.171:6394
- 192.168.181.171:6395
2、配置类
集成进SpringBoot体系,最核心的是创建
LettuceConnectionFactory
连接工厂。
@Configuration
public class RedisClusterConfig {
@Autowired
private RedisProperties redisProperties;
@Bean
public RedisConnectionFactory lettuceConnectionFactory() {
RedisProperties.Cluster cluster = redisProperties.getCluster();
List<String> nodes = cluster.getNodes();
RedisClusterConfiguration configuration = new RedisClusterConfiguration(nodes);
configuration.setMaxRedirects(cluster.getMaxRedirects());
return new LettuceConnectionFactory(configuration);
}
}
四、读写分离
基础整合仅仅是实现了高可用Redis服务的流程,生产环境下仍需要增加其他配置:修改自定义连接数据库序号;授权连接;连接池配置;读写分离。
在高可用前提下,衍生出读写分离的特性,主库完成写请求;从库完成读请求(从库不允许写)。
@Bean
public LettuceClientConfigurationBuilderCustomizer lettuceClientCustomizer() {
// 配置读写分离
return builder -> builder.readFrom(ReadFrom.REPLICA);
}
喜欢本文点个♥️赞♥️支持一下,如有需要,可通过微信
dream4s
与我联系。相关源码在
GitHub
,视频讲解在
B站
,本文收藏在
博客天地
。