Windows下Redis集群搭建:

Windows下Redis集群搭建:


Redis主从复制的常用的几种方式:
1. 一主二从 A(B、C) 一个Master两个Slave
2. 薪火相传(去中心化)A - B - C ,B既是主节点(C的主节点),又是从节点(A的从节点)
3. 反客为主(主节点down掉后,手动操作升级从节点为主节点) & 哨兵模式(主节点down掉后,自动升级从节点为主节点)


参考链接:https://blog.csdn.net/u010648555/article/details/79427606



这里主要介绍配置第三种方式,一主两从 & 哨兵模式

Windows下Redis集群搭建:

1.下载Windows环境的Redis安装包
https://github.com/MicrosoftArchive/redis/releases(windows版github下载地址)
http://download.redis.io/releases/(Linux版下载地址)

redis-sentinel 完整示例下载
提取码: jqq6

2.下载完成进行解压
3.相关配置操作
(1)复制三份解压后Redis
本地修改了名称,复制后文件夹名称显示如下:

redis-master
redis-slave1
redis-slave2

(2)修改redis.windows.conf
redis-master文件夹,修改如下:

# 设置redis连接密码
requirepass “redis”

# 设置master连接密码
masterauth “redis”

redis-slave1文件夹,修改如下:

# 设置redis连接密码
requirepass “redis”

# 设置master连接密码
masterauth “redis”

# 设置redis端口
port 6381

# 设置master复制地址 slaveof
slaveof 127.0.0.1 6379

redis-slave2文件夹,修改如下:

# 设置redis连接密码
requirepass “redis”

# 设置master连接密码
masterauth “redis”

# 设置redis端口
port 6381

# 设置master复制地址 slaveof
slaveof 127.0.0.1 6379

PS:这里测试是单机测试,运行三个Redis,如果是三台不同服务器,则redis端口不需要修改,
slaveof 127.0.0.1 6379 配置为master节点的ip地址即可

4.启动Redis主从复制集群
先启动master
redis-master/redis-server.exe redis.windows.conf
再启动slave
redis-slave1/redis-server.exe redis.windows.conf
redis-slave2/redis-server.exe redis.windows.conf

5.连接Redis测试主从复制
(1) 连接并登入master节点,创建一个测试key
redis-master/redis-cli.exe -h 127.0.0.1 -p 6379
6379>AUTH redis
6379>set key1 value1
6379>get key1
Windows下Redis集群搭建:

查看主从复制信息
6379>info replication
可以看到此时redis-master为主节点,并且有两个slave节点
Windows下Redis集群搭建:

(2) 连接并登入slave1节点,查询在master创建的测试key
redis-slave1/redis-cli.exe -h 127.0.0.1 -p 6380
6380>AUTH redis
6380>get key1
Windows下Redis集群搭建:

查看主从复制信息
6380>info replication
可以看到此时redis-slave1为从节点,主节点master端口为6379

Windows下Redis集群搭建:

同理,连接并登入slave2,出现同slave1结果,说明数据已经同步
PS:master允许读写操作,slave只允许读操作

6.配置哨兵模式
在redis-master、redis-slave1、redis-slave2下分别创建sentinel.conf文件及sentinel目录

redis-master配置内容如下:

################################################################
# 保护模式(是否禁止外部链接,除绑定的ip地址外)
protected-mode
no

# port

# 此sentinel实例运行的端口
port
26379

#
sentinel announce-ip
#
sentinel announce-port
#
# 以上两个配置指令在以下环境中非常有用,因为NAT可以通过非本地地址从外部访问Sentinel。
#
# 当提供announce-ip时,Sentinel将在通信中声明指定的IP地址,而不是像通常那样自动检测本地地址。
#
# 类似地,当提供announce-port 有效且非零时,Sentinel将宣布指定的TCP端口。
#
# 这两个选项不需要一起使用,如果只提供announce-ip,Sentinel将宣告指定的IP和“port”选项指定的服务器端口。
# 如果仅提供announce-port,Sentinel将通告自动检测到的本地IP和指定端口。
#
#
Example:
#
#
sentinel announce-ip 1.2.3.4

# dir

# sentinel工作目录
dir
./data/sentinel

#
sentinel monitor

# 告诉Sentinel监听指定主节点,并且只有在至少个哨兵达成一致的情况下才会判断它 O_DOWN 状态。
# 建议设置为n/2+1,n为sentinel个数。
# 注意:主节点(master)名称不能包含特殊字符或空格。有效字符可以是 A-z 0-9 和这三个字符 “.-_”。
# 注意:如果其他服务器程序想访问连接redis-sentinel,请将127.0.0.1替换为master主机真实ip。
sentinel
monitor redis-master 127.0.0.1 6379 2

#
sentinel auth-pass
#
# 设置用于向主服务器和从服务器进行身份验证的密码。如果要监视的Redis实例中设置了密码,则此选项非常有用。
#
# 请注意,主密码也用于从密码,因此如果你想用Sentinel监视这些实例,不可以在主实例和从实例中设置不同的密码。
#
#
Example:
#
#
sentinel auth-pass mymaster MySUPER–secret-0123passw0rd
sentinel
auth-pass redis-master redis

#
sentinel down-after-milliseconds
#
# 主节点或副本在指定时间内没有回复PING,便认为该节点为主观下线 S_DOWN 状态。
#
# 默认30秒
sentinel
down-after-milliseconds redis-master 10000

#
sentinel parallel-syncs
# 在故障转移期间,多少个副本节点进行数据同步
# 如果使用从服务器提供查询,请使用较低的数字
# 为了避免所有的从节点在同一时间都无法接近执行与主服务器同步的时间
sentinel
parallel-syncs redis-master 1

#
sentinel failover-timeout
#
# 指定故障转移超时时间(毫秒)。它有多种用途:
#
# - 在先前的故障转移之后重新启动故障转移所需的时间已由给定的Sentinel针对同一主服务器尝试,是故障转移超时的两倍。
#
# - 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
#
# - 取消已在进行但未生成任何配置更改的故障转移所需的时间。
#
# - 当进行failover时,配置所有slaves指向新的master所需的最大时间。
# 即使过了这个超时,slaves依然会被正确配置为指向master。
#
# 默认3分钟.
sentinel
failover-timeout redis-master 180000
################################################################

redis-slave1、redis-slave2的sentinel.conf只需修改端口
如:port 26380、port 26381
PS:这里测试是单机测试,运行三个Redis,如果是三台不同服务器,则redis端口不需要修改,
sentinel monitor redis-master 127.0.0.1 6379 2 配置为master节点的ip地址即可

7.启动哨兵模式节点
PS:启动哨兵模式必须先启动redis主从集群,启动redis主从集群要先启动master节点,再启动slave节点,
启动哨兵节点则没有启动先后顺序
redis-master/redis-server.exe sentinel.conf --sentinel
redis-slave1/redis-server.exe sentinel.conf --sentinel
redis-slave2/redis-server.exe sentinel.conf --sentinel

8.测试哨兵模式
(1) 连接并登入master节点,并关闭该节点
redis-master/redis-cli.exe -h 127.0.0.1 -p 6379 -a redis
6379> shutdown save
Windows下Redis集群搭建:

(2) 等待10s(sentinel down-after-milliseconds redis-master 10000)
连接并登入slave1节点
redis-slave1/redis-cli.exe -h 127.0.0.1 -p 6380 -a redis
6380>info replication
可以看到此时redis-slave1依旧为从节点,主节点master端口为6381(redis-slave2),说明redis-master宕机后
redis-slave2顶替redis-master作为主节点
Windows下Redis集群搭建:

(3) 连接并登入slave2节点

redis-slave2/redis-cli.exe -h 127.0.0.1 -p 6381 -a redis
6381>info replication

可以看到redis-slave2已经从slave变为master,此时因为redis-master宕机,只有一个从节点6380(redis-slave1)

Windows下Redis集群搭建:

更新测试key
6381>set key1 new-value

(4) 回到redis-slave1查询测试key
6380>get key1
Windows下Redis集群搭建:
此时新的master节点的数据已经同步过来了

(5) 重新启动redis-master并登入查看信息
可以看到此时redis-master已成为slave节点,主节点端口为6381(redis-slave2)
Windows下Redis集群搭建:


PS:如果一主二从下,第一个master宕机,第二个选举出来的master也宕机了,至少要保证两个哨兵实例存活,
最后一个slave才会选举为master,当其余的sentinel启动后会自动从其他sentinel同步数据

9.SpringBoot整合redis-sentinel

pom.xml文件引入:


org.springframework.boot
spring-boot-starter-data-redis


项目配置文件中添加如下配置(根据实际修改):
#redis配置
spring.redis.database=0
#redis地址(单机使用,sentinel模式不需要配置)
#spring.redis.host=192.168.10.206
#redis端口号(单机使用,sentinel模式不需要配置)
#spring.redis.port=6379
spring.redis.password=redis
spring.redis.lettuce.pool.max-active=500
spring.redis.lettuce.pool.max-idle=50
spring.redis.lettuce.pool.max-wait=1000
spring.redis.timeout=1000
#sentinel主节点名称
spring.redis.sentinel.master=redis-master
#sentinel节点列表
spring.redis.sentinel.nodes=192.168.10.206:26379,192.168.10.206:26380,192.168.10.206:26381

此处只给出简单的RedisUtil示例

@Slf4j
@Component
public class RedisUtil{

@Autowired
private String RedisTemplate redisTemplateAuto;

private static String RedisTemplate redisTemplate;

public static String set(String key,String value){
try{
value=StringUtils.isBlank(value)?"":value;
redisTemplate.opsForValue().set(key,value);
}catch(Exception e){
log.error(“Setrediskeyerror:”+e);
}
return value;
}

public static Setget Keys(String pattern){
try{
if(null != redisTemplate){
Return redisTemplate.keys(pattern);
}
}catch(Exception e){
log.error(“Get redis keys by pattern error:”+e);
}
return Sets.newHashSet();
}

}

测试master宕机下,能否正常顺利进行读写,如果可以正常读写,说明已经配置成功
下面日志可看出,当master宕机后,自动切换到新选举出来的master上

Windows下Redis集群搭建: