redis主从集群搭建
redis作为当前炙手可热的NOSQL系统,本身就支持主从集群,下面我们就来动手搭建一个一主两从的redis集群。
一、安装操作
1、环境准备
这里使用三台服务器,按照1主2从3哨兵配置,每台服务器上开启一个redis-server和redis-sentinel哨兵服务,redis-server端口为8000,redis-sentinel的端口为6800,端口也可以使用默认端口,一般线上环境会修改。
redis-server说明
192.168.68.110:8000 主
192.168.68.111:8000 从
192.168.68.112:8000 从
redis-sentinel 哨兵说明
192.168.68.110:6800
192.168.68.111:6800
192.168.68.112:6800
2、搭建redis系统
1 检查是否安装了 gcc环境,如果没有请安装,否则后面会出现编译错误,gcc: Command not found**
yum list installed | grep gcc #查看是否安装
yum install gcc #安装
2 下载redis,并编译
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
tar xzf redis-4.0.9.tar.gz
cd redis-4.0.9
make
如果编译失败,重新编译:
make MALLOC=libc
3 修改配置文件redis.conf
cd /usr/local/redis
vi redis.conf
主节点192.168.68.110上的配置
port 8000
daemonize yes
bind 192.168.68.110 #如果要开放连接的话 则可以修改为0.0.0.0
requirepass 123456 #如果需要密码可以设置 不需要可以不设置
pidfile /var/run/redis-8000.pid
logfile /var/log/redis/redis-8000.log
从节点192.168.68.111,192.168.68.112上的配置
port 8000
daemonize yes
bind 192.168.68.111 #192.168.68.112 #如果要开放连接的话 则可以修改为0.0.0.0
requirepass 123456 #如果需要密码可以设置 不需要可以不设置
masterauth 123456 #这是主节点的密码 如果master 设置了密码 这里必须设置
pidfile /var/run/redis-8000.pid
logfile /var/log/redis/redis-8000.log
slaveof 192.168.68.110 8000 #这是主节点的ip 和端口 注意中间没有冒号
4 启动三台机器上的redis
./src/redis-server ./redis.conf
#启动redis
三个redis服务启动完毕后,进入命令行,执行info replication查看当前主从配置
master 节点显示

slave 节点显示
如果如上图所示没有发现从节点,很有可能是防火墙没有开放8000端口导致主从节点之间没法通信
执行以下命令 将端口加入白名单 或者关闭防火墙
firewall-cmd --zone=public --add-port=8000/tcp --permanent
firewall-cmd --zone=public --add-port=6800/tcp --permanent
firewall-cmd --reload
3、搭建redis-sentinel系统
vi /usr/local/redis/sentinel.conf
修改下面的配置 3台机器的哨兵都需要修改这个配置
protected-mode no
daemonize yes #后台启动
port 6800 #端口号
#master 节点的地址和端口 2 代表法定人数 即需要2个哨兵报告的情况下才会自动故障转移
sentinel monitor mymaster 192.168.68.110 8000 2
sentinel auth-pass mymaster 123456//如果主节点设置了密码这里必须设置 如果没有设置密码 本行可以忽略
#5秒内master6800没有响应,就认为SDOWN
sentinel down-after-milliseconds mymaster 5000
# 故障切换超时时间
sentinel failover-timeout mymaster 15000
logfile /var/log/redis/sentinel.log
pidfile /var/run/sentinel.pid
启动redis-sentinel 哨兵
./src/redis-sentinel ./sentinel.conf
二、测试
1、主从复制测试
主节点添加数据
从节点获取数据
2、故障转移测试
停掉主节点
查看redis集群信息
从节点192.168.68.112升级为主节点
三、springboot配置
1.添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、配置redis连接信息
spring:
redis:
database: 2
# host: 192.168.1.61
# port: 6379
pool:
# 连接池最大连接数(使用负值表示没有限制)
max-active: 20
# 连接池中的最大空闲连接
max-idle: 8
# 连接池中的最小空闲连接
min-idle: 0
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1
# 连接超时时间(毫秒)
timeout: 3000
sentinel:
master: mymaster
nodes: 192.168.1.107:26379,192.168.1.107:26380,192.168.1.108:26379
3、自定义redis配置文件
Configuration
public class RedisConfig {
/**
* @param redisConnectionFactory redis连接工厂
*/
@Bean
public RedisTemplate<String, Object> buildRedisConn(RedisConnectionFactory redisConnectionFactory) {
Objects.requireNonNull(redisConnectionFactory);
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
RedisSerializer<String> stringSerializer = new StringRedisSerializer();
RedisSerializer<Object> jsonSerializer = new GenericJackson2JsonRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(jsonSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(jsonSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
4、添加redis操作服务类即可操作
@Component
public class RedisService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
private static final String PREFIX = "api:";
// =============================common============================
/**
* 指定缓存失效时间
*
* @param key 键
* @param time 时间(秒)
* @return
*/
public boolean expire(String key, long time) {
try {
if (time > 0) {
redisTemplate.expire(PREFIX + key, time, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
.
.
.
}