上篇文章介绍了windows redis安装及在springboot中的基础整合(传送门)
本篇文章将在上篇文章基础上进行扩展
大致架构如下图所示
Redis Windows
百度云盘:点击下载
提取码:s2cu
下载完成后右键解压到自定义文件夹
RedisDesktopManager
百度云盘:点击下载
提取码:mqj6
下载完成后双击打开一路下一步安装
启动
win + r
输入"cmd"回车
切换至redis安装目录(本例是"D:\Program Files\Redis-x64-3.2.100")
输入"redis-server redis.windows.conf"回车
主从配置
复制
以下是关于 Redis 复制功能的几个重要方面:
Redis 使用异步复制。 从 Redis 2.8 开始, 从服务器会以每秒一次的频率向主服务器报告复制流(replication stream)的处理进度。
一个主服务器可以有多个从服务器。
不仅主服务器可以有从服务器, 从服务器也可以有自己的从服务器, 多个从服务器之间可以构成一个图状结构。
复制功能不会阻塞主服务器: 即使有一个或多个从服务器正在进行初次同步, 主服务器也可以继续处理命令请求。
复制功能也不会阻塞从服务器: 只要在 redis.conf 文件中进行了相应的设置, 即使从服务器正在进行初次同步, 服务器也可以使用旧版本的数据集来处理命令查询。
不过, 在从服务器删除旧版本数据集并载入新版本数据集的那段时间内, 连接请求会被阻塞。
你还可以配置从服务器, 让它在与主服务器之间的连接断开时, 向客户端发送一个错误。
复制功能可以单纯地用于数据冗余(data redundancy), 也可以通过让多个从服务器处理只读命令请求来提升扩展性(scalability): 比如说, 繁重的 SORT 命令可以交给附属节点去运行。
可以通过复制功能来让主服务器免于执行持久化操作: 只要关闭主服务器的持久化功能, 然后由从服务器去执行持久化操作即可。
复制功能的运作原理
无论是初次连接还是重新连接, 当建立一个从服务器时, 从服务器都将向主服务器发送一个 SYNC 命令。
接到 SYNC 命令的主服务器将开始执行 BGSAVE , 并在保存操作执行期间, 将所有新执行的写入命令都保存到一个缓冲区里面。
当 BGSAVE 执行完毕后, 主服务器将执行保存操作所得的 .rdb 文件发送给从服务器, 从服务器接收这个 .rdb 文件, 并将文件中的数据载入到内存中。
之后主服务器会以 Redis 命令协议的格式, 将写命令缓冲区中积累的所有内容都发送给从服务器。
你可以通过 telnet 命令来亲自验证这个同步过程: 首先连上一个正在处理命令请求的 Redis 服务器, 然后向它发送 SYNC 命令, 过一阵子, 你将看到 telnet 会话(session)接收到服务器发来的大段数据(.rdb 文件), 之后还会看到, 所有在服务器执行过的写命令, 都会重新发送到 telnet 会话来。
即使有多个从服务器同时向主服务器发送 SYNC , 主服务器也只需执行一次 BGSAVE 命令, 就可以处理所有这些从服务器的同步请求。
从服务器可以在主从服务器之间的连接断开时进行自动重连, 在 Redis 2.8 版本之前, 断线之后重连的从服务器总要执行一次完整重同步(full resynchronization)操作, 但是从 Redis 2.8 版本开始, 从服务器可以根据主服务器的情况来选择执行完整重同步还是部分重同步(partial resynchronization)。
配置
配置一个从服务器非常简单, 只要在配置文件中增加以下的这一行就可以了:
slaveof 192.168.1.1 6379当然, 你需要将代码中的 192.168.1.1 和 6379 替换成你的主服务器的 IP 和端口号。
另外一种方法是调用 SLAVEOF 命令, 输入主服务器的 IP 和端口, 然后同步就会开始:
127.0.0.1:6379> SLAVEOF 192.168.1.1 10086 OK
只读服务器
从 Redis 2.6 开始, 从服务器支持只读模式, 并且该模式为从服务器的默认模式。
只读模式由 redis.conf 文件中的 slave-read-only 选项控制, 也可以通过 CONFIG SET 命令来开启或关闭这个模式。
只读从服务器会拒绝执行任何写命令, 所以不会出现因为操作失误而将数据不小心写入到了从服务器的情况。
即使从服务器是只读的, DEBUG 和 CONFIG 等管理式命令仍然是可以使用的, 所以我们还是不应该将服务器暴露给互联网或者任何不可信网络。 不过, 使用 redis.conf 中的命令改名选项, 我们可以通过禁止执行某些命令来提升只读从服务器的安全性。
你可能会感到好奇, 既然从服务器上的写数据会被重同步数据覆盖, 也可能在从服务器重启时丢失, 那么为什么要让一个从服务器变得可写呢?
原因是, 一些不重要的临时数据, 仍然是可以保存在从服务器上面的。 比如说, 客户端可以在从服务器上保存主服务器的可达性(reachability)信息, 从而实现故障转移(failover)策略。
以上资料来自http://doc.redisfans.com/topic/replication.html
搭建
redis安装目录下(本例是"D:\Program Files\Redis-x64-3.2.100")新建
slave6380.conf
slave6381.conf
sentinel6379.conf
sentinel6380.conf
slave配置文件以slave6380.conf为例
slave
1.修改port
2.修改slaveof
3.修改logfile(可选,名称自定义)
slave6381.conf中port为6381其他大致相同这里就不一一介绍了
sentinel
以sentinel6379.conf为例
# 当前Sentinel服务运行的端口
port 26379
# 3s内mymaster无响应,则认为mymaster宕机了
# 如果10秒后,mysater仍没启动过来,则启动failover
sentinel monitor master 127.0.0.1 6379 2
# 执行故障转移时,最多有1个从服务器同时对新的主服务器进行同步
sentinel down-after-milliseconds master 3000
# 哨兵监听需要密码认证
# sentinel auth-pass master test@2017
# 线程守护
daemonize no
# 日志路径
logfile "sentinel26379.log"
sentinel6380.conf除了port和logfile不同其他配置相同
运行
启动顺序,先主后从
启动sentinel
命令:
redis-server sentinel6379.conf --sentinel
redis-server sentinel6380.conf --sentinel
验证:
redis-cli -p 26379
info
启动RedisDesktopManager 连接127.0.0.1:6379
此时再去看sentinel6379.conf和sentinel6380.conf
集成哨兵
打开上篇的项目yml中添加哨兵
server:
port: 80
servlet:
contest-path: /
spring:
application:
name: springboot-redis
redis:
host: 127.0.0.1
port: 6379
username:
password:
#哨兵
sentinel:
master: master
password:
#哨兵节点
nodes: 127.0.0.1:26379,127.0.0.1:26380
#lettuce连接池
lettuce:
pool:
# 连接池最大连接数(使用负值表示没有限制)
max-active: 32
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: 300
# 连接池中的最大空闲连接
max-idle: 16
# 连接池中的最小空闲连接
min-idle: 8
database:
connect-timeout: 10000
测试
###
POST http://localhost/set
Content-Type: application/x-www-form-urlencoded
key=admin&v=张三
POST http://localhost/set
HTTP/1.1 200
Content-Type: application/json
Transfer-Encoding: chunked
Date: Thu, 26 Nov 2020 08:41:49 GMT
Keep-Alive: timeout=60
Connection: keep-alive
true
Response code: 200; Time: 443ms; Content length: 4 bytes
将admin值改为李四再次执行
此时关闭端口为6379主库测试
sentinel6379.log
sentinel6380.log
slave6381.log
slave6380.log
可以看出,关闭主库6379后sentinel6379侦测到master无响应后两个哨兵则认为master出现宕机,等待后未恢复开始进行failover
此时执行get
###
GET http://localhost/get/admin
GET http://localhost/get/admin
HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8
Content-Length: 6
Date: Thu, 26 Nov 2020 09:16:55 GMT
Keep-Alive: timeout=60
Connection: keep-alive
李四
Response code: 200; Time: 33ms; Content length: 2 bytes
重新执行set将admin设置为张三
POST http://localhost/set
HTTP/1.1 200
Content-Type: application/json
Transfer-Encoding: chunked
Date: Thu, 26 Nov 2020 09:20:24 GMT
Keep-Alive: timeout=60
Connection: keep-alive
true
Response code: 200; Time: 67ms; Content length: 4 bytes