Redis cluster集群内的Redis互为多组主从 , 同时每个节点都可以接受请求,在拓展集群的时候比较方便 。客户端可以向任意一个节点发送请求 , 如果是它的“负责”的内容,则直接返回内容 。否则,查找实际负责Redis节点,然后将地址告知客户端,客户端重新请求 。
对于使用缓存服务的客户端来说,这一切是透明的 。
内存缓存服务在切换的时候,是有一定风险的 。从A集群切换到B集群的过程中 , 必须保证B集群提前做好“预热”(B集群的内存中的热点数据,应该尽量与A集群相同 , 否则,切换的一瞬间大量请求内容,在B集群的内存缓存中查找不到,流量直接冲击后端的数据库服务 , 很可能导致数据库宕机) 。
4. 减少数据库“写”
上面的机制,都实现减少数据库的“读”的操作,但是,写的操作也是一个大的压力 。写的操作,虽然无法减少,但是可以通过合并请求,来起到减轻压力的效果 。这个时候 , 我们就需要在内存缓存集群和数据库集群之间,建立一个修改同步机制 。
先将修改请求生效在cache中,让外界查询显示正常 , 然后将这些sql修改放入到一个队列中存储起来 , 队列满或者每隔一段时间,合并为一个请求到数据库中更新数据库 。
除了上述通过改变系统架构的方式提升写的性能外,MySQL本身也可以通过配置参数innodb_flush_log_at_trx_commit来调整写入磁盘的策略 。如果机器成本允许,从硬件层面解决问题,可以选择老一点的RAID(Redundant Arrays of independent Disks,磁盘列阵)或者比较新的SSD(Solid State Drives,固态硬盘) 。
5. NoSQL存储
不管数据库的读还是写,当流量再进一步上涨,终会达到“人力有穷时”的场景 。继续加机器的成本比较高,并且不一定可以真正解决问题的时候 。这个时候,部分核心数据,就可以考虑使用NoSQL的数据库 。NoSQL存储,大部分都是采用key-value的方式 , 这里比较推荐使用上面介绍过Redis,Redis本身是一个内存cache,同时也可以当做一个存储来使用 , 让它直接将数据落地到磁盘 。
这样的话,我们就将数据库中某些被频繁读写的数据,分离出来 , 放在我们新搭建的Redis存储集群中,又进一步减轻原来MySQL数据库的压力,同时因为Redis本身是个内存级别的Cache , 读写的性能都会大幅度提升 。
国内一线互联网公司,架构上采用的解决方案很多是类似于上述方案,不过,使用的cache服务却不一定是Redis , 他们会有更丰富的其他选择,甚至根据自身业务特点开发出自己的NoSQL服务 。
6. 空节点查询问题
当我们搭建完前面所说的全部服务,认为Web系统已经很强的时候 。我们还是那句话,新的问题还是会来的 。空节点查询,是指那些数据库中根本不存在的数据请求 。例如 , 我请求查询一个不存在人员信息,系统会从各级缓存逐级查找,最后查到到数据库本身 , 然后才得出查找不到的结论,返回给前端 。因为各级cache对它无效,这个请求是非常消耗系统资源的 , 而如果大量的空节点查询,是可以冲击到系统服务的 。
在我曾经的工作经历中,曾深受其害 。因此 , 为了维护Web系统的稳定性,设计适当的空节点过滤机制 , 非常有必要 。
我们当时采用的方式,就是设计一张简单的记录映射表 。将存在的记录存储起来 , 放入到一台内存cache中 , 这样的话,如果还有空节点查询,则在缓存这一层就被阻挡了 。
推荐阅读
- 公众号怎么做赚钱,公众号要怎么赚钱
- 怎么让硬盘不被删除软件,如何让硬盘数据不被恢复
- 怎么用chatgpt手机,chatpic怎么打开
- 钉钉群家长会直播回放,钉钉群直播开家长会
- 二分查找java完整代码 二分查询 java
- 如何快速推广网站,怎么快速推广网站
- 手机上怎么看u盘视频,手机上怎么看u盘视频教程
- 火影手游直播素材免费吗,火影游戏直播视频
- c语言中源函数 c语言中源文件是什么意思