当前位置:首页 > 数码 > Redis轻松添加从节点-系统性能再飙升-零烦恼-零阻塞 (redis轻量级锁和redisson分布式锁的使用场景)

Redis轻松添加从节点-系统性能再飙升-零烦恼-零阻塞 (redis轻量级锁和redisson分布式锁的使用场景)

admin1个月前 (04-17)数码17

措施

  1. 配置复制积压缓冲区。
  2. 配置复制延迟。
  3. 增加主节点资源。
  4. 控制并发复制连接数。
  5. 从节点的磁盘写入延迟。
  6. 从节点的最大内存限制。
  7. 从节连接超时时间设置。
  8. 从节点检活时间修改。
  9. 复制积压缓冲区存活时间。
  10. repl-disable-tcp-nodelay。
  11. 复制刷盘同步参数设置。
  12. 从节点写入延迟。

具体操作

1. 配置复制积压缓冲区

repl-backlog-size 10mb
  

2. 配置复制延迟

CONFIG SET replica-replica-lag 5
  

3. 增加主节点资源

此操作因实际情况而异。

4. 控制并发复制连接数

CONFIG SET replica-max-replication-jobs 5
  

5. 从节点的磁盘写入延迟

CONFIG SET repl-diskless-sync-delay 5
  

6. 从节点的最大内存限制

CONFIG SET maxmemory 8gb
  

7. 从节连接超时时间设置

CONFIG SET repl-timeout 60
  

8. 从节点检活时间修改

CONFIG SET repl-ping-slave-period 60
  

9. 复制积压缓冲区存活时间

CONFIG SET repl-backlog-ttl 3600
  

10. repl-disable-tcp-nodelay

CONFIG SET repl-disable-tcp-nodelay yes
  

11. 复制刷盘同步参数设置

CONFIG SET repl-diskless-sync yes
  

12. 从节点写入延迟

CONFIG SET min-replicas-to-write 3
CONFIG SET min-replicas-max-lag 10
  

建议

Redis 单个实例内存使用过大可能会导致系统性能下降,甚至影响整个服务器的运行速度。因此,建议及时进行优化。


Loki 日志系统分布式部署实践三 redis

Redis

这里支持 redis 主从、哨兵、集群三种模式,我这里选择主从即可,集群模式测试异常,没能解决 安装 redis 主从模式: 编写配置文件: 安装: 查看密码: 连接 master: 连接 slave: 读写分离: 读写: 只读: 错误 1: 解决: 参考:参考:参考:注意:Kubernetes 1.12+ 可以使用 来设置 pod 的 sysctl,而不需要 initContainer 了: 错误 2: 解决: 使用 initContainer 去修改 sysctl 的方案在生产环境正常,这里却报错了,应该是 securityContext 或 PSP 的问题,这里没有启用 PSP,那就剩下 securityContext 了: 我这里尝试写入如下权限,最终都被修改掉了: 这里暂时没有找到解决方案,但是发现虽然报错了,下面 sysctl 修改是生效了的,因为日志不再报错了 错误 3: 解决: 因为 bitnami/minideb:buster 镜像里没有 sysctl 方法一:替换镜像 方法二:直接安装包,但是这个比较慢 错误 4: 解决: 参考:参考:注意:它将修改调度了容器的节点的内核设置,从而影响该节点上运行的其他容器。 这就是为什么您需要运行特权的 initContainer 或设置 的原因。 错误 5: 解决: 因为将宿主机的 /sys 挂载到容器内的路径变成了 /host-sys 所以要修改路径: 错误 6: 解决: 这里暂时看不受影响 错误 7: 解决: 因为 master 挂掉了 错误 8: 解决: Redis 提供两种相对有效的备份方法: 利用 RDB 快照的持久化方式不是非常可靠,当运行 Redis 的计算机停止工作、意外掉电、意外杀掉了 Redis 进程那么最近写入 Redis 的数据将会丢。 对于某些应用这或许不成问题,但对于持久化要求非常高的应用场景快照方式不是理想的选择。 利用 AOF 文件是一个替代方案,用以最大限度的持久化数据。 同样,可以通过配置文件来开闭 AOF。 打开 AOF 持久化功能后,Redis 处理完每个事件后会调用 write(2) 将变化写入 kernel 的 buffer,如果此时 write(2) 被阻塞,Redis 就不能处理下一个事件。 Linux 规定执行 write(2) 时,如果对同一个文件正在执行 fdatasync(2) 将 kernel buffer 写入物理磁盘,或者有 system wide sync 在执行,write(2) 会被 Block 住,整个 Redis 被 Block 住。 如果系统 IO 繁忙,比如有别的应用在写盘,或者 Redis 自己在 AOF rewrite 或 RDB snapshot(虽然此时写入的是另一个临时文件,虽然各自都在连续写,但两个文件间的切换使得磁盘磁头的寻道时间加长),就可能导致 fdatasync(2) 迟迟未能完成从而 Block 住 write(2),Block 住整个 Redis。 为了更清晰的看到 fdatasync(2) 的执行时长,可以使用下面命令跟踪,但会影响系统性能: Redis 提供了一个自救的方式,当发现文件有在执行 fdatasync(2) 时,就先不调用 write(2),只存在 cache 里,免得被 Block。 但如果已经超过两秒都还是这个样子,则会硬着头皮执行 write(2),即使 redis 会被 Block 住。 此时那句要命的 log 会打印:Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis. 之后用 redis-cli INFO 可以看到 aof_delayed_fsync 的值被加 1。 因此,对于 fsync 设为 everysec 时丢失数据的可能性的最严谨说法是: 如果有 fdatasync 在长时间的执行,此时 redis 意外关闭会造成文件里不多于两秒的数据丢失。 如果 fdatasync 运行正常,redis 意外关闭没有影响,只有当操作系统 crash 时才会造成少于 1 秒的数据丢失。 方法一:关闭 AOF 如果采用 redis 主从 + sentinel 方式的话,主节点挂了从节点会自己提升为主点,主节点恢复后全量同步一次数据就可以了,关系也不是太大 方法二:修改系统配置 原来是 AOF rewrite 时一直埋头的调用 write(2),由系统自己去触发 sync。 默认配置 _background_ratio=10,也就是占用了 10% 的可用内存才会开始后台 flush 而我的服务器有 8G 内存,很明显一次 flush 太多数据会造成阻塞,所以最后果断设置了sysctl _bytes=(32M) 问题解决 错误 9: 解决: 看着是启动的时候加载 AOF 文件到内存,然后被 liveness 杀掉了 随着命令不断写入 AOF,文件会越来越大,为了解决这个问题,redis 引入了 AOF 重写机制压缩文件。 文件能缩小的原因是: AOF 重写可以手动触发和自动触发: auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 16mb 所以这里处理下,控制 AOF 文件大小: 注意:这里依旧没能解决问题,文件依旧很大,而且会造成大量的磁盘 IO,最终导致 redis 失去响应 彻底解决: 之后 文件一直稳定在 255M

「故障演练」 Redis Cluster集群,当master宕机,主从切换

性能不够,缓存来凑

一个高并发系统肯定少不了缓存的身影,为了保证缓存服务的高可用,我们通常采用 Redis Cluster 集群模式。

描述:

集群部署采用了 3主3从拓扑结构, 数据读写 访问master节点, slave节点负责备份。

随便登录一台 redis 节点,都可以看到集群的slot的槽位分步区间,以及对应的主从节点映射关系。

人为模拟,master-1 机器意外宕机

此时,Redis Cluster 集群能自动感知,并自动完成主备切换,对应的slave会被选举为新的master节点

看下 redis cluster 集群最新的主从关系

看似也没什么问题,一切正常

此时 Spring Boot 应用依然在线服务,当我们再尝试操作缓存时,会报错

问题边界还是非常清晰的。

Redis Cluster 集群已经完成了切换。

但是 Spring Boot 客户端没有动态感知到Redis Cluster 的最新集群信息

原因分析:

SpringBoot 2.X 版本, Redis默认的连接池采用 Lettuce

当Redis 集群节点发生变化后,Letture默认是不会刷新节点拓扑

解决方案:

将 Letture二方包仲裁掉

然后,引入 Jedis相关二方包

编译代码,并重新启动 SpringBoot 微服务,万事俱备,只欠再次验证

重新模拟将 127.0.0.1:8001master 节点宕机,看看系统的日志

从打印的日志来看,客户端已经感知到了主备切换 ,并与最新的主节点127.0.0.1:8004初始化了 24 个连接。

然后,回归业务功能,读写缓存数据也都是操作最新的主节点。

还有一种方案: 刷新节点拓扑视图

Lettuce 官方描述:

解决方案:

编写代码

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Redis

“Redis轻松添加从节点-系统性能再飙升-零烦恼-零阻塞 (redis轻量级锁和redisson分布式锁的使用场景)” 的相关文章

Redis数据删除后-内存占用为何居高不下 (redis数据类型)

Redis数据删除后-内存占用为何居高不下 (redis数据类型)

作为面试经验丰富的开发人员,肯定会遇到过这样的问题:做了数据删除操作,为什么使用 top 命令时,仍然显示 Redis 占用了大量内存? 答案 这是因为当数据删除后,Re...

一站式-满足您的所有-解决方案-需求-Redis-Redis (一站式满足您的资金需求让您用款无忧)

一站式-满足您的所有-解决方案-需求-Redis-Redis (一站式满足您的资金需求让您用款无忧)

Introduction Redis is an efficient in-memory database designed to store data invarious formats, s...

Redis中分布式锁的防死锁机制 (redis中文网)

Redis中分布式锁的防死锁机制 (redis中文网)

分布式锁在分布式系统中是一种常见的需求。它用于防止对共享资源的并发访问,确保数据一致性和可靠性。在 Redis 中实现分布式锁可以通过使用 SETNX(SET if Not eXists)命令来尝...

Redis-使用哈希槽而非一致性哈希的原因 (redis淘汰策略有哪些)

Redis-使用哈希槽而非一致性哈希的原因 (redis淘汰策略有哪些)

引言 在分布式系统中,数据分片和负载均衡是至关重要的。哈希槽和一致性哈希两种方法都可以实现这些目标,但它们各有优缺点。本文将讨论为什么在某些情况下使用哈希槽而不是一致性哈希。 哈希槽 哈希...

引发业界震荡-Redis叛逃开源-得罪了 (引发业界震荡的因素)

引发业界震荡-Redis叛逃开源-得罪了 (引发业界震荡的因素)

Redis 许可变更:开源界的巨石 导言 近来,内存数据库供应商 Redis 宣布了一项重大变更,该变更将在开源界掀起轩然大波。Redis 将转向双许可模式,并采用更严格的许可条款。此举引起了社区...

上古程序猿推戴经常使用Redis的执著理由 (上古教程)

上古程序猿推戴经常使用Redis的执著理由 (上古教程)

最近,在知乎上看到这样一个疑问: 有些上古程序猿不时保持推戴经常使用怎样办? 终究用不用Redis?为什么用?怎样用?让咱们看看网友怎样说…… @灵剑...

Redis-全面了解数据耐久性和复原机制-深度解析-耐久化 (redis淘汰策略有哪些)

Redis-全面了解数据耐久性和复原机制-深度解析-耐久化 (redis淘汰策略有哪些)

我们都知道在关于的开发或许面试的环节中,很容易就会遇到这个关于Redis耐久化的疑问,而我们在面试的时刻,经常会有小同伴只能说出这个Redis耐久化的两种形式,后续或许还会对比一些区别,然而关于怎...

解锁你的海量数据摸索之旅-Redis-全文搜查-的弱小新配置 (解锁海量任务)

解锁你的海量数据摸索之旅-Redis-全文搜查-的弱小新配置 (解锁海量任务)

在2021年我就了解到earch这个名目,并曾经把它用于我的开源名目newbee-mall-pro中。 就我的经常使用体验来说,便捷场景下,用来平替Elasticsearch的经常使用场景曾...