高并发的解决策略
发布日期:2021-10-05 07:45:47 浏览次数:2 分类:技术文章

本文共 2488 字,大约阅读时间需要 8 分钟。

首先说数据库层面

1.web应用和数据库部署在不同的服务器上

据库对象缓存策略

2.数据库服务器采用集群方式部署(如oracle的一个数据库多个实例的情况)

数据集群方式,能承担的负载是比较大的,数据库物理介质为一个磁盘阵列,多个数据库实例以虚拟IP方式向外部应用服务器提供数据库连接.

这种部署方式基本可以满足绝大多数常见web应用.

3.数据库采用主从部署: 

面向大众用户的博客/论坛.交友等系统中,有上百万用户,上千万的数据量,存在数据库查询,也有较多的数据库写操作,并且在多少情况读操作大于写操作.这时候考虑:

数据库读写分离,

主从复制:

几乎所有的主流数据库都支持复制,

以mysql为例,配置并不复杂,步骤如下:

1.开启主服务器上的二进制日志[mysql主从复制依据主服务器的二进制日志文件进行的,主服务器日志记录操作会在从服务器上重放,从而实现复制]

2.在主服务器和从服务器上分别进行简单配置

读写分离:

主从复制数据是异步完成,导致主从数据库中数据有一定延迟,读写分离必须考虑这一点.

以博客为例,用户登录后发表了一篇文章,他需要马上看到自己的文章,但是对于其它用户来讲可以允许延迟一段时间(1分钟/5分钟/30分钟),不会造成什么问题。这时对于当前用户就需要读主数据库,对于其他访问量更大的外部用户就可以读从数据库。

应用层面考虑

策略一  :cache缓存

在web/app层与db层之间加一层cache层

主要目的:

a. 减少数据库读取负担;

b. 提高数据读取速度。而且,cache存取的媒介是内存

而一台服务器的内存容量一般都是有限制的,不像硬盘容量可以做到TB级别。所以,可以考虑采用分布式的cache层,这样更易于破除内存容量的限制,同时又增加了灵活性。

缓存又分为两种:

1.架构方面的缓存[Apache提供了自己的缓存模块,也可以使用外加的Squid模块进行缓存]

2.网站程序开发方面的缓存

Memcached 介绍

开源的
分布式cache系统

原理:

Memcached处理的原子是每一个(key,value)对(以下简称kv对),key会通过一个hash算法转化成hash-key,便于查找、对比以及做到尽可能的散列。同时,memcached用的是一个二级散列,通过一张大hash表来维护

Memcached有两个核心组件组成:服务端(ms)和客户端(mc),

在一个memcached的查询中,mc先通过计算key的hash值来确定key对所处在的ms位置。

当ms确定后,客户端就会发送一个查询请求给对应的ms,让它来查找确切的数据。

因为这之间没有交互以及多播协议,所以memcached交互带给网络的影响是最小化的

举例说明:考虑以下这个场景,有三个mc分别是X,Y,Z,还有三个ms分别是A,B,C:

设置kv对

X想设置key=”foo”,value=”seattle”
X拿到ms列表,并对key做hash转化,根据hash值确定kv对所存的ms位置
B被选中了
X连接上B,B收到请求,把(key=”foo”,value=”seattle”)存了起来

获取kv对

Z想得到key=”foo”的value
Z用相同的hash算法算出hash值,并确定key=”foo”的值存在B上
Z连接上B,并从B那边得到value=”seattle”
其他任何从X,Y,Z的想得到key=”foo”的值的请求都会发向B

缓存数据库查询

现在memcached最流行的一种使用方式是缓存数据库查询,下面举一个简单例子说明:

App需要得到userid=xxx的用户信息,对应的查询语句类似:

“SELECT * FROM users WHERE userid = xxx”

App先去问cache,有没有“user:userid”(key定义可预先定义约束好)的数据,如果有,返回数据;如果没有,App会从数据库中读取数据,并调用cache的add函数,把数据加入cache中。

当取的数据需要更新,app会调用cache的update函数,来保持数据库与cache的数据同步。

从上面的例子我们也可以发现,一旦数据库的数据发现变化,我们一定要及时更新cache中的数据,来保证app读到的是同步的正确数据。当然我们可以通过定时器方式记录下cache中数据的失效时间,时间一过就会激发事件对cache进行更新,但这之间总会有时间上的延迟,导致app可能从cache读到脏数据

策略二:图片服务器分离:

对于Web服务器来说,不管是Apache、IIS还是其他容器,图片是最消耗资源的于是我们有必要将图片与页面进行分离

策略三:负载均衡

软件四层交换:

使用Linux上常用的LVS(Linux Virtual Server)来解决,.提供了基于心跳线heartbeat的实时灾难应对解决方案

一个典型的使用负载均衡的策略就是,在软件或者硬件四层交换的基础上搭建squid集群:这样的架构低成本、高性能还有很强的扩张性,随时往架构里面增减节点都非常容易 -----------有时一个很小的squid参数或者apache参数设置,对于系统性能的影响就会很大。
硬件四层交换:
使用第三层和第四层信息包的报头信息,根据应用区间识别业务流,将整个区间段的业务流分配到合适的应用服务器进行处理。 第四层交换功能就象是虚IP,指向物理服务器。它传输的业务服从的协议多种多样,有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上,需要复杂的载量平衡算法。在IP世界,业务类型由终端TCP或UDP端口地址来决定,在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决定。
在硬件四层交换产品领域,有一些知名的产品可以选择,比如Alteon、F5等,这些产品很昂贵,但是物有所值,能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了。

转载地址:https://blog.csdn.net/lixld/article/details/37933319 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:数据库连接池框架:c3p0
下一篇:java模式

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年03月06日 23时56分07秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

linux服务文件编写,linux编写systemd下服务脚本 2019-04-21
hdfs linux 目录是否存在,Linux中判断hdfs文件是否存在 2019-04-21
linux学习需要什么基础,学linux需要什么基础? 2019-04-21
linux vim编辑kconfig 无法wq,Linux-4.9.2内核在mini2440上的移植(三)——编译环境测试... 2019-04-21
高斯勒让德在c语言中的程序,c语言:用递归方法编写程序,求n阶勒让德多项式的值... 2019-04-21
c语言单片机电子时钟,新人求个51单片机的电子时钟汇编语言(C语言的还没学到)... 2019-04-21
c++语言文件流,C++文件流 2019-04-21
android 动态毛玻璃,Android毛玻璃背景效果简单实现代码 2019-04-21
android 按钮提示,的Android按钮工具提示 2019-04-21
iphone通讯录 android,3个方法,教你如何快速而又有效的将联系人从iPhone转移到安卓... 2019-04-21
android horizontalscrollview 滑动事件,ScrollView的滑动监听(以HorizontalScrollView为例) 2019-04-21
win7自定义html为桌面,Win7系统自定义桌面主题的方法 2019-04-21
单系统 台电x80pro_台电x80 pro (ID:E3E6)安装remix OS系统教程整理 2019-04-21
linux存储pdf伟岸_python的reportlab库介绍、制作pdf和作图 2019-04-21
安徽信息技术初中会考上机考试模拟_2020年中小学寒假、考试时间定下了! 2019-04-21
ubuntu 退出anaconda环境_从零开始深度学习第15讲:ubuntu16.04 下深度学习开发环境搭建与配置... 2019-04-21
稳定币usda是哪个发行的_武夷山币装帧款曝光,共4款设计,你喜欢哪款? 2019-04-21
可变车道怎么走不违章_走ETC竟比人工车道贵50%!交警:这3点不知道,吃亏的是自己... 2019-04-21
苹果笔记本的end键_笔记本用户的大烦恼:触控板,想好好用你不容易 2019-04-21
趣玩机器人什么时候成立的_【直播回顾】当我们谈机器人集成调试的时候在谈什么... 2019-04-21