Redis 菜鸟进阶
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 菜鸟进阶的更多相关文章
- 【Java】Java网络编程菜鸟进阶:TCP和套接字入门
Java网络编程菜鸟进阶:TCP和套接字入门 JDK 提供了对 TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protoco ...
- JVM菜鸟进阶高手之路十(基础知识开场白)
转载请注明原创出处,谢谢! 最近没有什么实战,准备把JVM知识梳理一遍,先以开发人员的交流来谈谈jvm这块的知识以及重要性,依稀记得2.3年前用solr的时候老是经常oom,提到oom大家应该都不陌生 ...
- JVM菜鸟进阶高手之路十三(等你来战!!!)
转载请注明原创出处,谢谢! 前几天有个朋友问了我个问题,下面给大家分享下,希望大家积极在评论区进行评论留言,等你来战!!! 先来个趣味题,热身下,引出后面的jvm题目. 地上的影子是那个人的? 地上的 ...
- JVM菜鸟进阶高手之路十四:分析篇
转载请注明原创出处,谢谢! 题目回顾 JVM菜鸟进阶高手之路十三,问题现象就是相同的代码,jvm参数不一样,表现的现象不一样. private static final int _1MB = 1024 ...
- Linux-基础学习(六)-Redis的进阶学习
1. redis的进阶操作 1.1 redis的订阅操作 发布订阅的命令 PUBLISH channel msg 将信息 message 发送到指定的频道 channel SUBSCRIBE chan ...
- redis之进阶
redis之进阶 redis redis介绍 redis的功能特性 1,高速读写 2,数据类型丰富 3,支持持久化 4,多种内存分配及回收策略 5,支持事务 6,消息队列.redis用的多的还是发 ...
- 高效开发之SASS篇 灵异留白事件——图片下方无故留白 你会用::before、::after吗 link 与 @import之对比 学习前端前必知的——HTTP协议详解 深入了解——CSS3新增属性 菜鸟进阶——grunt $(#form :input)与$(#form input)的区别
高效开发之SASS篇 作为通往前端大神之路的普通的一只学鸟,最近接触了一样稍微高逼格一点的神器,特与大家分享~ 他是谁? 作为前端开发人员,你肯定对css很熟悉,但是你知道css可以自定义吗?大家 ...
- JVM菜鸟进阶高手之路一[z]
https://mp.weixin.qq.com/s/qD1LFmsOiqZHD8iZX97OfA? 问题现象 代码如下,使用 ParNew + Serial Old 回收器组合与使用 ParNew ...
- js菜鸟进阶-jQuery源码分析(1)-基本架构
导读: 本人JS菜鸟一枚,为加强代码美观和编程思想.所以来研究下jQuery,有需要进阶JS的同学很适合阅读此文!我是边看代码(jquery2.2.1),边翻“javascript高级程序设计”写的, ...
- ssm 整合 redis(进阶教程)
最后我建议大家使用 Spring StringRedisTemplate 配置,参阅: http://blog.csdn.net/hanjun0612/article/details/78131333 ...
随机推荐
- Linux神器strace的使用方法及实践
在Linux系统中,strace命令是一个集诊断.调试.统计与一体的工具,可用来追踪调试程序,能够与其他命令搭配使用,接下来就Linux系统调用工具strace的使用方法和实践给大家做个详细介绍,一起 ...
- 号外!5G+X联创营华为云官网上线,5G 创业春天来了!
摘要:为助力互联网行业客户与伙伴实现降本增效.抓住新趋势,华为云发起"5G+X"联创营计划. 会议室里,产品经理和程序员们唇枪舌战,陷入激烈得讨(zheng)论(chao). 产品 ...
- 手把手教你写一个spring IOC容器
摘要:spring框架的基础核心和起点毫无疑问就是IOC,IOC作为spring容器提供的核心技术,成功完成了依赖的反转:从主类的对依赖的主动管理反转为了spring容器对依赖的全局控制.今天就带大家 ...
- 认识Java的整形数据结构
摘要:java中一切都是对象,为什么int不用创建对象实例化,而可以直接使用? 本文分享自华为云社区<[Java]对基本类型-整型数据结构的认识>,作者: huahua.Dr . 整型数据 ...
- 云小课|三大灵魂拷问GaussDB(DWS)数据落盘安全问题
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:GaussDB(D ...
- 一通百通,带你一次性全理解Spring 中的Template
摘要:Template定义了问题的边界,子类定义了具体的实现,只要在模板的范围内玩耍就可以了. 本文分享自华为云社区<Spring 中的Template一次全理解,解析问题的本质>,作者: ...
- Java 网络编程 —— 实现非阻塞式的客户端
创建阻塞的 EchoClient 客户程序一般不需要同时建立与服务器的多个连接,因此用一个线程,按照阻塞模式运行就能满足需求 public class EchoClient { private Soc ...
- ajax补充说明 多对多三种创建方式 django内置序列化组件 ORM批量操作数据 分页器 form组件入门
目录 ajax补充说明 request.is_ajax() ajax回调函数接收返回值 ajax回调函数 接受json数据 第一种方式:后端使用json模块 第二种方式:后端返回JsonRespons ...
- Go--记录下踩map的坑
这两天新调个接口的时候,一直提示签名错误,但所需的时间,工号,token都是对的,完全没有头绪,卡了两天后,终于找到原因了 原因是我的校验信息,是要将时间,工号,token封装在一起成字符串,然后用m ...
- 【辅助工具】IDEA使用
IDEA使用 快捷键 快捷键 alt+enter:代码错误智能提示 alt+up:上个方法 alt+down:下个方法 alt+1:快速定位到项目窗口,还可边按键盘输文件名查找文件 alt+F7:定位 ...