Redis 菜鸟进阶


背景

最近产品一直要优化性能,加强高可用.
有一个课题是Redis高可用与性能调优.
我这边其实获取到的内容很有限.
最近济南疫情严重,自己锁骨骨折.
然后通勤时间基本上都用来查资料了.
但是毕竟水平有限..简单整理总结一下.
估计纰漏很多..需要进一步学习.

单点

观点: Redis是单线程结构.
需要注意事项:
1. Redis 在使用rdb模式在进行备份,或者是使用bgsave命令时
会folk一个线程出来进行保存, 减少阻塞时间.
2. Redis 6.0以上,增加IO多线程模式. 但是Redis的核心依旧是单线程.
3. IO多线程不建议太多, 超过CPU核数,或者是超过8个提升可能并不是非常明显. 单线程的Redis 是性能最好的redis
损耗和开销是最小的.
但是容量和连接是有限制的. 一个Redis最多不超过64k的TCP连接.
内部的maxclients 默认值是10000 关于性能最佳实践:
1. 建议直接物理机部署Redis. 或者是高性能虚拟机.
2. 建议选用高主频的CPU的服务器, 不要主频太低.
3. 如果有持久化,建议选用SSD高速存储设备, 避免影响吞吐量.
4. 不建议容器化,K8S内部署,会有性能损耗和开销.
5. 可以使用systemd守护进程进行服务保活.

集群

集群 是redis4.0 左右才开始支持的一种部署模式.
他主要是为了解决单点情况下的容量问题.
因为第一步针对key的CRC16的hash运算步骤,
所以实际上集群的性能是不如单点的redis性能好的
但是他可以支撑更多的容量,扩展产品的使用.
Redis Cluster的部署很简单. 但是需要注意使用
使用注意事项:
1. 需要客户端实现 Smart Client,完成重定向等工作
2. 批量操作限制,不支持跨 slot 查询,所以批量操作支持不友好
3. Key 事务操作支持有限,只支持多 key 在同一节点上的事务操作,当多个 Key 分布于不同的节点上时无法使用事务功能
4. Key 作为数据分区的最小粒度,不能将一个很大的键值对象如 hash、list 等映射到不同的节点
5. 不支持多数据库空间,单机下的 redis 可以支持到 16 个数据库,集群模式下只能使用 1 个数据库空间,即 db 0
Copy From https://juejin.cn/post/6865687858905088008
非常感谢原作者.

一键部署脚本

  • 三主三从一键部署脚本
  • 单一机器上面的测试环境.
# 需要有redis-server 存在于 PATH 中.
ps -ef |grep redis |grep 700 |awk '{print $2}' |xargs kill -9 rm -rf /redis_cluster_file700 mkdir -p /redis_cluster_file700
cat >/redis_cluster_file700/redis_cluster.template <<EOF
port \${PORT}
requirepass Testxxxx
masterauth Testxxxx
protected-mode no
daemonize yes
appendonly yes
dir /redis_cluster_file700/\${PORT}/data/
cluster-enabled yes
cluster-config-file /redis_cluster_file700/\${PORT}/conf/nodes.conf
cluster-node-timeout 15000
cluster-announce-ip `ip addr |grep inet |grep ens192 |awk '{print $2}' |awk -F "/" '{print $1}'`
cluster-announce-port \${PORT}
cluster-announce-bus-port 1\${PORT}
EOF cd /redis_cluster_file700
for port in `seq 7001 7006`; do \
mkdir -p ${port}/conf \
&& PORT=${port} envsubst < redis_cluster.template > ${port}/conf/redis.conf \
&& mkdir -p ${port}/data; \
done for port in $(seq 7001 7006); do \
redis-server /redis_cluster_file700/$port/conf/redis.conf; \
done redis-cli -a Testxxxx --cluster create \
`ip addr |grep inet |grep ens192 |awk '{print $2}' |awk -F "/" '{print $1}'`:7001 \
`ip addr |grep inet |grep ens192 |awk '{print $2}' |awk -F "/" '{print $1}'`:7002 \
`ip addr |grep inet |grep ens192 |awk '{print $2}' |awk -F "/" '{print $1}'`:7003 \
`ip addr |grep inet |grep ens192 |awk '{print $2}' |awk -F "/" '{print $1}'`:7004 \
`ip addr |grep inet |grep ens192 |awk '{print $2}' |awk -F "/" '{print $1}'`:7005 \
`ip addr |grep inet |grep ens192 |awk '{print $2}' |awk -F "/" '{print $1}'`:7006 \
--cluster-replicas 1

哨兵

其实我没太安装过哨兵
这里说一下哨兵应对的场景(解决的问题):
1. 只依靠持久化方案,在服务器下线后无法恢复服务
2. 使用主从复制,在 master 节点下线后,
可以手动将 slave 节点切换为 master,但是不能自动完成故障转移 哨兵的实现机制:
1. 监控(Monitoring):Sentinel会不断的检查你的主节点和从节点是否正常工作。
2. 通知(Notification):被监控的Redis实例如果出现问题,
Sentinel可以通过API(pub)通知系统管理员或者其他程序。
3. 自动故障转移(Automatic failover):如果一个 master 离线,Sentinel 会开始进行故障转移,
master 下的一个slave 会被选为新的 master,其他的 slave 会开始复制新的 master。
应用可以通过 Redis 服务的通知机制更新新的master 地址。
4. 配置提供(Configuration provider):客户端可以把 Sentinel 作为权威的配置发布者来获得最新的 master 地址。
如果发生了故障转移,Sentinel 集群会通知客户端新的 master 地址,并刷新 Redis 的配置。 哨兵这里其实是一些缺点的:
1. Sentinel 模式下,写操作仍然只能在 Sentinel 提供的 master
数据节点上执行,无法负载均衡. 写操作的支撑能力比较弱.
2. 持久化时 master 节点刷盘阻塞,服务请求成功率下降
3. slave 节点存储能力受到单机的限制
4. 分区问题:原 master redis 3 断开与 redis 1 和 redis 2 的连接,
此时 redis 1 和 redis 2 执行故障转移,
达到大多数,选择 redis 1 为 master。
这样,redis 1 和 redis 3 都能接受写请求,但数据无法同步,数据不一致 也是学习自:
https://juejin.cn/post/6865687858905088008
但是我理解. 如果sentinel 自己的集群出问题, 也会出现脑裂或者是其他问题
还是需要应用服务器做规划和处理的.

主从-读写分离

可以使用Redis Master-Slave + Keepalive +VIP 的方式进行实现.
需要自己编写脚本. 定时探测Master是否正常, 如果Master不正确则需要进行替换
需要注意的是 肯定有 20s-30s的延迟(多次判断.重启Redis等.)
优点:
1. 可用性高.
2. 与原生redis几乎完全一致的体验.
3. 实现成本较低. 业务层几乎无任何修改.
缺点:
1. Master宕机时有延迟. 无法做到无感.
2. 多了一个VIP层,性能会有开销.
3. 本质还是一个Redis来提供服务. 性能和容量没有提高.

Redis 菜鸟进阶的更多相关文章

  1. 【Java】Java网络编程菜鸟进阶:TCP和套接字入门

    Java网络编程菜鸟进阶:TCP和套接字入门 JDK 提供了对 TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protoco ...

  2. JVM菜鸟进阶高手之路十(基础知识开场白)

    转载请注明原创出处,谢谢! 最近没有什么实战,准备把JVM知识梳理一遍,先以开发人员的交流来谈谈jvm这块的知识以及重要性,依稀记得2.3年前用solr的时候老是经常oom,提到oom大家应该都不陌生 ...

  3. JVM菜鸟进阶高手之路十三(等你来战!!!)

    转载请注明原创出处,谢谢! 前几天有个朋友问了我个问题,下面给大家分享下,希望大家积极在评论区进行评论留言,等你来战!!! 先来个趣味题,热身下,引出后面的jvm题目. 地上的影子是那个人的? 地上的 ...

  4. JVM菜鸟进阶高手之路十四:分析篇

    转载请注明原创出处,谢谢! 题目回顾 JVM菜鸟进阶高手之路十三,问题现象就是相同的代码,jvm参数不一样,表现的现象不一样. private static final int _1MB = 1024 ...

  5. Linux-基础学习(六)-Redis的进阶学习

    1. redis的进阶操作 1.1 redis的订阅操作 发布订阅的命令 PUBLISH channel msg 将信息 message 发送到指定的频道 channel SUBSCRIBE chan ...

  6. redis之进阶

    redis之进阶   redis redis介绍 redis的功能特性 1,高速读写 2,数据类型丰富 3,支持持久化 4,多种内存分配及回收策略 5,支持事务 6,消息队列.redis用的多的还是发 ...

  7. 高效开发之SASS篇 灵异留白事件——图片下方无故留白 你会用::before、::after吗 link 与 @import之对比 学习前端前必知的——HTTP协议详解 深入了解——CSS3新增属性 菜鸟进阶——grunt $(#form :input)与$(#form input)的区别

    高效开发之SASS篇   作为通往前端大神之路的普通的一只学鸟,最近接触了一样稍微高逼格一点的神器,特与大家分享~ 他是谁? 作为前端开发人员,你肯定对css很熟悉,但是你知道css可以自定义吗?大家 ...

  8. JVM菜鸟进阶高手之路一[z]

    https://mp.weixin.qq.com/s/qD1LFmsOiqZHD8iZX97OfA? 问题现象 代码如下,使用 ParNew + Serial Old 回收器组合与使用 ParNew ...

  9. js菜鸟进阶-jQuery源码分析(1)-基本架构

    导读: 本人JS菜鸟一枚,为加强代码美观和编程思想.所以来研究下jQuery,有需要进阶JS的同学很适合阅读此文!我是边看代码(jquery2.2.1),边翻“javascript高级程序设计”写的, ...

  10. ssm 整合 redis(进阶教程)

    最后我建议大家使用 Spring StringRedisTemplate 配置,参阅: http://blog.csdn.net/hanjun0612/article/details/78131333 ...

随机推荐

  1. 【小白学YOLO】一文带你学YOLOv1 Testing

    摘要:本文将为初学者带详细分析如何进行YOLOv1 Testing的内容. YOLOv1 Testing 进入testing阶段,我们已经得到98个bounding box和confidence还有C ...

  2. linux添加用户,修改用户密码,修改用户权限,设置root用户操作

    1.添加普通用户 [root@server ~]# useradd chenjiafa   //添加一个名为chenjiafa的用户[root@server ~]# passwd chenjiafa  ...

  3. ByConity 社区回顾|ByConity 和开发者们一起展望未来,携手共进!

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 新年伊始,我们想在这里感谢一群 ByConity 社区的小伙伴们. 正是因为有社区的开发者的支持,截止到 2023 ...

  4. Centos7 怎么永久关闭防火墙

    1.连接到centos主机,然后输入命令"systemctl status firewalld.service"并按下回车键. 2.然后在下方可以查看得到 " activ ...

  5. 文件名: ?Ciwindows\system32 inetsrconfiglapplicationHost.config 错误:无法写入配置文件

    出现原因:出现这个问题,一般是在程序运行的时候更新程序,导致的. 解决方案: Microsoft Windows [版本 6.3.9600] (c) 2013 Microsoft Corporatio ...

  6. Jenkins 多分支流水线(SVN)

    实际应用过程中,一般多分支流水线的方式用得比较多一些, master 对应 生成环境 develop 对应 测试环境, 将不同分支的代码构建到不同的环境中 添加 Jenkinsfile 文件 Jenk ...

  7. FB08、F.80凭证冲销校验增强

    1业务场景 当使用FB08和F.80在前台冲销会计凭证时,需要限制三种不同的会计凭证类型,并报消息到相应的程序中处理这三种会计凭证类型. 2技术实现 在BADI和二代中均未找到合适的增强点,因此根据在 ...

  8. 【HZERO】权限管理

    Hzero数据权限介绍 https://open.hand-china.com/community/detail/625872021372407808#3.4 开发建议 Permission注解属性介 ...

  9. 一、linux单机版mongo安装(带密码验证)

    系列导航 一.linux单机版mongo安装(带密码验证) 二.mongo集群搭建 三.java连接mongo数据库 四.java对mongo数据库增删改查操作 五.mongo备份篇 mongoexp ...

  10. 【调试】netconsole的使用

    开发环境 客户端 开发板:FireFly-RK3399 Linux 4.4 IP:192.168.137.110 服务端 VMware Workstation Pro16,ubuntu 18.04 I ...