1.fork耗时导致高并发请求延时
1>.问题描述:
①.在RDB和AOF的时候,其实会有生成RDB快照,或者对AOF进行rewrite重写等耗费磁盘IO的过程,在这个(RDB,AOF)过程中Redis主进程会fork一个子进程去执行,fork的过程中,子进程是需要拷贝父/主进程的空间内存页表的,拷贝的过程也是会耗费一定的时间的;
一般来说,如果父进程内存有1个G的数据,那么fork的过程可能会耗费在20ms左右,如果是10G~30G,那么就会耗费20 * 10,甚至20 * 30,也就是几百毫秒的时间;
②.Redis的"info stats"命令中的"latest_fork_usec",可以看到最近一次fork的时长;
③.Redis单机QPS一般在几万,fork过程可能一下子就会拖慢几万条操作的请求时长,从几毫秒变成1秒;
2>.优化思路:
fork耗时跟Redis主进程的内存有关系,一般控制Redis的内存在10GB以内,避免fork耗时过长从而拖慢客户端的请求,而且slave -> master有时要做全量复制,master实例内存(数据)太大会出现各种各样的问题;
2.AOF的阻塞问题
1>.问题描述:
①.Redis做aof持久化时,会先将数据写入AOF缓冲区,然后单独开一个线程每秒做一次fsync操作;但是Redis主线程每次fsync时都会检查两次fsync的时间,如果距离上次fsync时间超过了2秒,那么写请求就会阻塞;
②.everysec,最多丢失2秒的数据;一旦fsync超过2秒的延时,整个redis就被拖慢;
2>.优化思路:
优化硬盘写入速度,建议采用SSD,不要用普通的机械硬盘,使用SSD大幅度提升磁盘读写的速度;
3.主从复制延迟问题
主从复制可能会超时严重,这个时候需要良好的监控和报警机制;
例如:
在"info replication"命令中,可以看到master和slave复制的offset,做一个差值就可以看到对应的延迟量;如果延迟过多,那么就进行报警;
4.主从复制风暴问题
如果一个master挂载了多个slave,当集群故障所有节点重启导致一下子让多个slave从master去执行全量复制,一份大的rdb同时发送到多个slave,会导致网络带宽被严重占用;如果一个master真的要挂载多个slave,那尽量用树状结构(一级一级往下延伸),不要用星型结构(同一级/层多对一);
5.Linux内核参数(可以在Redis启动提示根据提示信息配置)
5.1.vm.overcommit_memory
1>.取值
0: 检查有没有足够内存,没有的话申请内存失败
1: 允许使用内存直到用完为止(推荐使用!)
2: 内存地址空间不能超过swap + 50%
2>.具体配置
# cat /proc/sys/vm/overcommit_memory
# echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
# sysctl vm.overcommit_memory=1
5.2.swapiness
1>.查看Linux内核版本
# cat /proc/version
如果linux内核版本<3.5,那么swapiness设置为0,这样系统宁愿swap也不会oom killer(杀掉进程);
如果linux内核版本>=3.5,那么swapiness设置为1,这样系统宁愿swap也不会oom killer(杀掉进程);
2>.具体配置:
# echo 0 > /proc/sys/vm/swappiness
# echo vm.swapiness=0 >> /etc/sysctl.conf
5.3.最大打开文件句柄
# ulimit -n 10032 10032
自己去上网搜一下,不同的操作系统,版本,设置的方式都不太一样;
6.Redis的企业级的架构
6.1.Redis的第一套企业级的架构
如果你的数据量不大,单master就可以容纳,一般来说你的缓存的总量在10G以内就可以,那么建议按照以下架构去部署Redis:
Redis持久化+备份方案+容灾方案+replication(主从+读写分离)+sentinal(哨兵集群,3个节点,高可用性)
6.2.Redis的第二套企业级架构
如果你的数据量很大,缓存的总量超过10G,例如一些大型电商网站的商品详情页的架构(对标那些国内排名前三的大电商网站,*宝,*东,*宁易购),海量数据:
Redis-Cluster(多master分布式存储数据,水平扩容)
Redis-Cluster可以支撑更多的数据量,1T+以上没问题,只要扩容master即可;读写QPS分别都达到几十万都没问题,只要扩容master即可;支撑99.99%可用性也没问题,slave -> master的主备切换,冗余slave去进一步提升可用性的方案!