您的位置:首页 > 数据库

浅谈高并发环境下的服务器和数据库技术

2015-07-23 15:43 267 查看
众所周知,在web开发中,服务器和数据库是影响整个网站的关键。在传统的web开发中,只需要使用apache服务器和关系数据库就能很好的满足我们的需要,但是当用户数目增加时,当数据量增大时,服务器和关系数据库就会遭到性能的瓶颈。本文将浅要谈谈高并发海量数据环境下的服务器和数据库技术。

1.服务器技术

apache服务器

Apache服务器支持的最大用户连接数为2000,在传统的web开发中,网站的用户数目不大(一般不超过10000),这样子,apache服务器足以胜任传统的网站(公司内部的系统,小型网站)访问需求。再加上apache本身的安全性和稳定性,它足以胜任小型网站的开发。但是一个大型的网站(baidu,sina)每秒钟可以达到百万级,单纯使用apache服务器就会出现网站页面打不开,网站崩溃的现象。这个是由于apache本身的性能所致。使用nginx可以解决高并发需求。

nginx服务器简介

反向代理(ReverseProxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。由于外部网络上的主机并不会配置并使用这个代理服务器,普通代理服务器也被设计为Internet上搜寻多个不确定的服务器,而不是针对Internet上多个客户机的请求访问某一个固定的服务器,因此普通的Web代理服务器不支持外部对内部网络的访问请求。当一个代理服务器能够代理外部网络上的主机,访问内部网络时,这种代理服务的方式称为反向代理服务。

Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器也是一个IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。Nginx 可以在大多数 Unix like OS 上编译运行,并有Windows 移植版。以下是目前市场上主流服务器占用率的图片:




在全球的前1000网站中,nginx服务器是主流选择。知名的网站诸如,诸如Facebook,GitHub、百度、腾讯、阿里巴巴、新浪、网易、腾讯、CSDN、酷六、水木社区、豆瓣等都是使用nginx的网站。

nginx的反向代理为什么能提高网站性能?

CPU,
内存,
带宽都不是瓶颈,瓶颈是网络IO次数.用比较通俗的话来比喻就是,快递一次给你送十个包裹,你完全无压力。

但是如果他一天分十次给你送十个包裹,要十次interrupt你,你就崩溃了.反向代理起的作用就是当你的收发室,收集了十个包裹再一次发给你.

对于后端是动态服务来说,比如Java和PHP。这类服务器(如JBoss和PHP-FPM)的IO处理能力往往不高。Nginx有个好处是它会把Request在读取完整之前buffer住,这样交给后端的就是一个完整的HTTP请求,从而提高后端的效率,而不是断断续续的传递(互联网上连接速度一般比较慢)。同样,Nginx也可以把response给buffer住,同样也是减轻后端的压力。

nginx与apache区别

(1)核心区别:最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程 。

(2)抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能 。同样是web 服务,比apache 占用更少的内存及资源 。

(3)nginx处理静态文件好,耗费内存少. Nginx 静态处理性能比 Apache 高 3倍以上。

(4)处理负载均衡时,nginx也是优于apache的。

(5)处理动态请求时,由于apache的成熟和稳定,在这方面apache是优于nginx的

nginx+apache+tomcat服务器架构模式

由于Nginx和Apache各自的优势,现在很多人选择了让两者在服务器中共存。在服务器端让Nginx在前,Apache在后。由Nginx做负载均衡和反向代理,并且处理静态文件,讲动态请求(如PHP应用)交给Apache去处理,然后辅以tomcat服务器,就形成了nginx+apache+tomcat服务器架构模式。

2.数据库

关系数据库瓶颈

(1) 高并发读写需求

网站的用户并发性非常高,往往达到每秒上万次读写请求,对于传统关系型数据库来说,硬盘I/O是一个很大的瓶颈

(2)海量数据的高效率读写

网站每天产生的数据量是巨大的,对于关系型数据库来说,在一张包含海量数据的表中查询,效率是非常低的

(3)高扩展性和可用性

在基于web的结构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,数据库却没有办法像web server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移。

NOSQL

随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。它指代那些非关系型的,分布式的,且一般不保证遵循ACID原则的数据存储系统。

非关系型数据库提出另一种理念,例如,以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,这样就不会局限于固定的结构,可以减少一些时间和空间的开销。使用这种方式,用户可以根据需要去添加自己需要的字段,这样,为了获取用户的不同信息,不需要像关系型数据库中,要对多表进行关联查询。仅需要根据id取出相应的value就可以完成查询。但非关系型数据库由于很少的约束,他也不能够提供像SQL所提供的where这种对于字段属性值情况的查询。并且难以体现设计的完整性。他只适合存储一些较为简单的数据,对于需要进行较复杂查询的数据,SQL数据库显的更为合适。

SQL VS NoSQL

关系型数据库的最大特点就是事务的一致性:传统的关系型数据库读写操作都是事务的,具有ACID的特点,这个特性使得关系型数据库可以用于几乎所有对一致性有要求的系统中,如典型的银行系统。

但是,在网页应用中,尤其是SNS应用中,一致性却不是显得那么重要,用户A看到的内容和用户B看到同一用户C内容更新不一致是可以容忍的,或者说,两个人看到同一好友的数据更新的时间差那么几秒是可以容忍的,因此,关系型数据库的最大特点在这里已经无用武之地,起码不是那么重要了。

相反地,关系型数据库为了维护一致性所付出的巨大代价就是其读写性能比较差,而像微博、facebook这类SNS的应用,对并发读写能力要求极高,关系型数据库已经无法应付(在读方面,传统上为了克服关系型数据库缺陷,提高性能,都是增加一级memcache来静态化网页,而在SNS中,变化太快,memchache已经无能为力了),因此,必须用新的一种数据结构存储来代替关系数据库。

关系数据库的另一个特点就是其具有固定的表结构,因此,其扩展性极差,而在SNS中,系统的升级,功能的增加,往往意味着数据结构巨大变动,这一点关系型数据库也难以应付,需要新的结构化数据存储。

NoSQL主要分类

键值(Key-Value)数据库
(1)产品:Riak、Redis、Memcached、Amazon’s
Dynamo、Project Voldemort

(2)有谁在使用:GitHub(Riak)、BestBuy(Riak)、Twitter(Redis和Memcached)、StackOverFlow(Redis)、
Instagram(Redis)、Youtube(Memcached)、Wikipedia(Memcached)

(3)适用的场景:储存用户信息,比如会话、配置文件、参数、购物车等等。这些信息一般都和ID(键)挂钩,这种情景下键值数据库是个很好的选择。

(3)redis简介

关系型数据库中通常采用memcache来提高高并发读写。Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。但是Memcache存在以下问题:Memcached与MySQL数据库数据一致性问题。


通过使用redis解决Memcache的问题:

1. Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别。Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。

2. Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。而memcache只是简单的K/V缓存。

面向文档(Document-Oriented)数据库
面向文档数据库会将数据以文档的形式储存。在一个关系型数据库中,一篇博客(包含文章内容、评论、评论的投票)会被打散在多张数据表中。在MongoDB中,能用一个文档来表示一篇博客,评论与投票作为文档数组,放在正文主文档中。这样数据更易于管理,消除了传统关系型数据库中影响性能和水平扩展性的“JOIN”操作。

(1)产品:MongoDB、CouchDB、RavenDB

(2)有谁在使用:SAP(MongoDB)、Codecademy(MongoDB)、Foursquare(MongoDB)
NBC News(RavenDB)

(3)适用的场景

日志。企业环境下,每个应用程序都有不同的日志信息。Document-Oriented数据库并没有固定的模式,所以我们可以使用它储存不同的信息。

(4)Mongodb使用场景

* 网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。

* 缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。

* 高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对MapReduce引擎的内置支持。

* 用于对象及JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储及查询。存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各种复杂的文件类型。我们称这种存储形式为
BSON(Binary Serialized dOcument Format)。

列存储(Wide Column Store/Column-Family)数据库
列存储数据库将数据储存在列族(column family)中,一个列族存储经常被一起查询的相关数据。

(1)产品:Cassandra、HBase

(2) 有谁在使用:Ebay(Cassandra)、Instagram(Cassandra)、NASA(Cassandra)、Twitter(Cassandra
and HBase)、Facebook(HBase)、Yahoo!(HBase)适用的场景

(3) 1.日志。因为我们可以将数据储存在不同的列中,每个应用程序可以将信息写入自己的列族中。 2.博客平台。我们储存每个信息到不同的列族中。举个例子,标签可以储存在一个,类别可以在一个,而文章则在另一个。

有关高并发服务器数据库技术就先说这么多吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: