高性能相关概念

mysql的逻辑架构

在这里插入图片描述

1.读锁(Read Lock) /写锁(Write Lock)

例子:读取邮箱信息并不麻烦,即使多个用户并发读取同一邮箱,也不会有什么问题。因为读操作不会造成任何修改,所以就不会出错。不过,假如一个程序正在读邮箱,另一个用户试图删除编号25的邮件,那将发生什么结果?结果可能是,某一正在读的用户报错退出,或者是他看到幅与邮箱的实际状态不符的错误视图。所以为了安全起见,即使读邮箱也必须特别注意。

可以把邮箱想象成数据库,把每封邮件想象成表中的行,就很容易发现,在这类场景里,问题都是类似的,如修改数据库表中的行,就十分类似于删除或修改邮箱文件中的邮件信息。

解决这类经典问题的方法是使用并发控制,并发控制的概念是很简单的。在处理并发读或并发写时,系统会使用一套锁系统来解决问题。这种锁系统由两类锁组成,通常称之为共享锁(Shared Lock)和排他锁(Exclusive Lock),或者叫读锁(Read Lock)和写锁(Write Lock)。

不用关心锁技术的具体实现方式,在这里描述相关锁概念如下:

某一资源上的读锁是共享的,或是说是互不阻塞的。在同一时间,多个用户可以读取同一资源,而互不干扰。另一方面,写锁是排他的,也就是说,一个写锁会阻塞其他的读锁和写锁,这是出于安全策略的考虑,在给定时间里,只有一个用户能写人资源,以防止用户在写操作的同时其他用户读取同一资源。

对数据库来说,随时随地都会发生锁定。当某一用户修改某一部分数据时,MySQL会禁止其他用户读取同一数据。大多数时候,MySQL都是以透明的方式实现锁的内部管理。

2.锁粒度( Lock Granularity))

​ 一种提高共享资源并发性的方法就是让锁定对象更有选择性。要记住只锁定部分须修改的数据,而不是所有的资源。更理想的方式是,只对要修改的数据片精确加锁。任何时间,在给定的资源上,被加锁的数据量越小,就可以允许更多的井发修改,只要相互之间互不冲突即可。

​ 这么做的间题是加锁也会消耗系统资源。每一种锁操作,如获得锁、检查锁是否已解除,以及释放锁等,都会增加系统的开销。如果系统花费大量时间来管理销,而不是读写数据,那么系统整体性能可能会因此受到影响。

​ 所谓的锁策略,就是在锁开销和数据安全之间寻求一种平衡,这种平衡也能影响系統性能。大多数的商业数据库服务器没有提供更多的选择,通常都是在表上施加行级锁(Row- Level Locking),并提供种种复杂的手段,在有锁的情况下改善系统的性能,

​ 而另一方面, MYSQL则提供了多种选择。每种 MYSQL存储引都可以实现独有的锁策略( Locking Policy)或 锁粒度( Lock Granularitey),在存储引擎设计中锁管理( Lock Management)是个非常重要的议题。将锁粒度调整到某一水平,也许就能为某种应用目的提供更佳的性能,不过,这也可能使存储引綮又不适用于其他的用途了。由于 MYSQL可以提供多种存储引,所以它不需要一个通用解决方案。下面将介绍两种最重要的锁策略

表锁( Table lock)

MYSQL支持大多数基本的锁策略,其中开销最小的锁策略是表锁。表锁类似于前文所述的邮箱加锁机制:它将整个表加。当一个用户对表进行写操作(如插入、野除、更新)时,用户可以获得一个写锁。写锁会禁止其他向用户的读写操作。另外,只有无人做写操作时,用户才能获得读锁,读锁之间是互不神突的

在特定的环境中,表锁可能性能良好。例如, READ LOCAL表锁支持某种类型的并发写操作。另外,写锁比读 有更高的优先级,即使有读操作用户已排在队列中,一个被中请的写锁仍可以排列在锁队列的前列(写锁会被安置在读锁之前,而读镇不能排在写锁之前)。

最然存储引擎管理自己的锁, MYSQL本身也能使用各种有效的表锁,以用于各种目的。例如, MYSQL服务器可以在语句中,如 ALTER TABLE语句中,使用表锁、而不用考虑存储引擎。

行级锁( Row locks)

行级锁可以支持最大的并发处理(同时也带来最大的锁开销)。众所周知,行级锁在 INNODB 和 Falcon 存储引擎中已得以实现,在其他一些存储引擎也有实现。行级锁由存储引擎实现,而不是由 MYSQL 服务器实现,服务器完全不了解存储引擎里的锁实现方式。

3.事务

ACID代表了原子性( Atomicity)、一致性( Consistency)隔离性( Isolation)和持久性( Durability)。这些概念与事务的处理标准密切关联,一个有效的事务处理系统必须满足相关标准。

原子性( Atomicity)

一个事务必须被视为一个单独的内部“不可分”的工作单元,以确保整个事务要么全部执行,要么全部回滚。当一个事务具有原子性时,该事务绝对不会被部分执行,要么完全执行,要么根本不执行。

一致性( Consistency)

数据库总是从一种一致性状态转换到另一种一致性状态。因为最终事务根本没有被提交,任何事务处理过程中所做的数据改变,也不会影响到数据库的内容。

隔离性( Isolation)

当某个事务的结果只有在完成之后才对其他事务可见。在上述例子中,当数据库执行完第3条语句,还未执后文讨论隔离级时,读者就会理解为什么我们所说的通常是“**不可见”( Invisible)**的。

持久性( Durability)

一旦一个事务提交,事务所做的数据改变将是永久的。这意味着数据改变已被记录,即使系统崩溃,数据也不会丢失。

4.隔离级

隔离的问题比想象的要复杂。SQL标准定义了4类隔离级,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。

下面简单介绍四种隔离级:

READ UNCOMITTED (读取未提交内容)

在READ UNCOMMITTED隔离级,所有事务都可以“看到”未提交事务的执行结果。在这种级别上,可能会产生很多问题,除非用户真的知道自己在做什么,并有很好的理由选择这样做。本隔离级很少用于实际应用,因为它的性能也不比其他级别好多少,而别的级别还有其他更多的优点。读取未提交数据,也被称之为“脏读”(Dirty Read)。

READ COMMITTED (读取提交内容)

大多数数据库系统的默认隔离级是READ COMMITTED (但这不是MySQL默认的!)。它满足了隔离的早先简单定义:一个事务在开始时,只能“看见”已经提交事务所做的改变,一个事务从开始到提交前,所做的任何数据改变都是不可见的,除非已经提交。这种隔离级别也支持所谓的“不可重复读”(Nonrepeatable Read),这意味着用户运行同一语句两次,看到的结果是不同的。

REPEATABLE READ (可重读)

REPEATABLE READ隔离级解决了READ UNCOMMITTED隔离级导致的问题。它确保同一事务的多个实例在并发读取数据时,会“看到同样的“數据行。不过理论上,这会导致另一个棘手问题:幻读(Phantom Read)。简单来说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插人了新行,当用户再读取该范围的数据行时,会发现有新的“幻影”(Phantom) 行。InnoDB 和Falcon存储引擎通过参版本并发控制(Multiversion Concurrency Control)机制解决了幻读问题。本章后面将进一步村论这部分内容。

REPEATABLE READ 是MySQL的默认事务隔离级。InnoDB 和Falcon存储引擎都遵循这种设置,可参考第6章,了解如何改变这种设置。其他一些存储引擎也以此为默认设置,不过具体设置还要看相关引擎的具体规定。

SERIALIZABLE (可串行化)

SERIALIZABLE是最高级别的隔离级,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,SERIALIZABLE 是在每个读的数据行上加锁。在这个级别,可能导致大量的超时(Timeout)现象和锁竞争(Lock Contention) 现象。作者很少看到有用户选择这种隔离级。但如果用户的应用为了数据的稳定性,需要强制减少并发的话,也可以选择这种隔离级。表1-1总结了各种隔离级及相关的缺点。

表1-1: ANSI SQL隔离级

隔离级脏读可能性不可重复读可能性幻读可能性加锁读
READ UNCOMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE

5.死锁

死锁是指两个或多个事务在同一资源上互相占用,并请求加锁时,而导致的恶性循环现象。当多个事务以不同顺序试围加锁同一资源时,就会产生死锁。任何时间,多个事务同时加锁-一个资源,-定产生死锁。

例如,设想下列两个事务同时处理stockPrice表:

事务1

START TRANSACTION;

UPDATE StockPrice SET close=45.50 WHERE stock id= 4 and date = ‘2002- 05-01’;

UPDATE StockPrice SET close=19.80 WHERE stock id= 3 and date = ‘2002 -05-02’;

COMMIT;

事务2

START TRANSACTION;

UPDATE StockPrice SET high=20.12 WHERE stock id= 3 and date = ‘2002 -05-02’;

UPDATE StockPrice SET high = 47.20 WHERE stock id= 4 and date = ‘2002-05-01’;

COMMIT;

如果很不幸凑巧,每个事务在处理过程中,都执行了第一个查询,更新了数据行,也加锁了该数据行。接着,每个事务都去试图更新第二个数据行,却发现该行已被(对方)加锁,然后两个事务都开始互相等待对方完成,陷入无限等待中,除非有外部因素介人,才能解除死锁。

为了解决这种问题,数据库系统实现了各种死锁检测和死锁超时机制。对于更复杂的系统,例如InnoDB存储擎,可以预知循环相关性,并立刻返回错误。这种解决方式实际很有效,否则死锁将导致很慢的查询。其他的解决方式,是让查询达到一个锁等待超时时间,然后再放弃争用,但这种方法不够好。目前InnoDB处理死锁的方法是,回滚拥有最少排他行级锁的事务(一种对最易回滚事务的大致估算)

锁现象和锁顺序是因存储引擎而异的,某些存储引擎可能会因为使用某种顺序的语向导致死锁,其他的却不会。死锁现象具有双重性:有些是因真实的数据冲突产生的,无法避免,有些则是因为存储引擎的工作方式导致的。

如果不以部分或全部的方式回滚某个事务,死锁将无法解除。在事务性的系统中,这是个无法更改的事实。用户在设计应用时,就应考虑这种问题的处理,许多应用在事务开始时,可以做简单的判定,决定重做事务。

6.事务日志

事务日志可使事务处理过程更加高效。和每次数据一改变就更新磁盘中表数据的方式不同,存储引擎可以先更新数据在内存中的拷贝。这非常快。然后,存储引擎将数据改变记录写人事务日志,它位于磁盘上,因此具有持久性。这相对较快,因为追加日志事件导致的写操作,只涉及了磁盘很小区城上的顺序I/O (Sequential 1/O),而替代了写磁盘中表所需要的大量随机I/O (RandomI/O)。 最后,相关进程会在某个时间把表数据更新到磁盘上。因此,大多存储引擎都选用了这种技术,也是通常所说的预写式日志(Write Ahead Logging), 利用两次磁盘写人操作把数据改变写人磁盘(注3)。

如果数据更新已写入事务日志,却还未写入磁盘的表中,而发生系统崩溃,存储引擎将会在重启后恢复相关数据改变。具体的恢复方式因存储引擎而异。

整理的高性能高并发服务器架构文章,内容预览:  初创网站与开源软件 6  谈谈大型高负载网站服务器的优化心得! 8  Lighttpd+Squid+Apache搭建高效率Web服务器 9  浏览量比较大的网站应该从哪几个方面入手? 17  用负载均衡技术建设高负载站点 20  大型网站的架构设计问题 25  开源平台的高并发集群思考 26  大型、高负载网站架构和应用初探 时间:30-45分钟 27  说说大型高并发高负载网站的系统架构 28  mixi技术架构 51 mixi.jp:使用开源软件搭建的可扩展SNS网站 51 总概关键点: 51 1,Mysql 切分,采用Innodb运行 52 2,动态Cache 服务器 -- 52 美国Facebok.com,中国Yeejee.com,日本mixi.jp均采用开源分布式缓存服务器Memcache 52 3,图片缓存和加 52  memcached+squid+apache deflate解决网站大访问量问题 52  FeedBurner:基于MySQL和JAVA的可扩展Web应用 53  YouTube 的架构扩展 55  了解一下 Technorati 的后台数据库架构 57  Myspace架构历程 58  eBay 的数据量 64  eBay 的应用服务器规模 67  eBay 的数据库分布扩展架构 68  从LiveJournal后台发展看大规模网站能优化方法 70 一、LiveJournal发展历程 70 二、LiveJournal架构现状概况 70 三、从LiveJournal发展中学习 71 1、一台服务器 71 2、两台服务器 72 3、四台服务器 73 4、五台服务器 73 5、更多服务器 74 6、现在我们在哪里: 75 7、现在我们在哪里 78 8、现在我们在哪里 79 9、缓存 80 10、Web访问负载均衡 80 11、MogileFS 81  Craigslist 的数据库架构 81  Second Life 的数据拾零 82  eBay架构的思想金矿 84  一天十亿次的访问-eBay架构(一) 85  七种缓存使用武器 为网站应用和访问加速发布时间: 92  可缓存的CMS系统设计 93  开发大型高负载类网站应用的几个要点 105  Memcached和Lucene笔记 110  使用开源软件,设计高性能可扩展网站 110  面向高负载的架构Lighttpd+PHP(FastCGI)+Memcached+Squid 113  思考高并发高负载网站的系统架构 113  "我在SOHU这几年做的一些门户级别的程序系统(C/C++开发)" 115  中国顶级门户网站架构分析1 116  中国顶级门户网站架构分析 2 118  服务器的大用户量的承载方案 120  YouTube Scalability Talk 121  High Performance Web Sites by Nate Koechley 123 One dozen rules for faster pages 123 Why talk about performance? 123 Case Studies 124 Conclusion 124  Rules for High Performance Web Sites 124  对于应用高并发,DB千万级数量该如何设计系统哪? 125  高性能服务器设计 130  优势与应用:再谈CDN镜像加速技术 131  除了程序设计优化,zend+ eacc(memcached)外,有什么办法能提高服务器的负载能力呢? 135  如何规划您的大型JAVA多并发服务器程序 139  如何架构一个“Just so so”的网站? 148  最便宜的高负载网站架构 152  负载均衡技术全攻略 154  海量数据处理分析 164  一个很有意义的SQL的优化过程(一个电子化支局中的大数据量的统计SQL) 166  如何优化大数据量模糊查询(架构,数据库设置,SQL..) 168  求助:海量数据处理方法 169 # re: 求助:海量数据处理方法 回复 更多评论 169  海量数据库查询方略 169  SQL Server 2005对海量数据处理 170  分表处理设计思想和实现 174  Linux系统高负载 MySQL数据库彻底优化(1) 179  大型数据库的设计与编程技巧 本人最近开发一个访问统计系统,日志非常的大,都保存在数据库里面。 我现在按照常规的设计方法对表进行设计,已经出现了查询非常缓慢地情形。 大家对于这种情况如何来设计数据库呢?把一个表分成多个表么?那么查询和插入数据库又有什么技巧呢? 谢谢,村里面的兄弟们! 183  方案探讨,关于工程中数据库的问题. 184  web软件设计时考虑你的能解决方案 190  大型Java Web系统服务器选型问题探讨 193  高并发高流量网站架构 210 1.1 互联网的发展 210 1.2 互联网网站建设的新趋势 210 1.3 新浪播客的简介 211 2.1 镜像网站技术 211 2.2 CDN内容分发网络 213 2.3 应用层分布式设计 214 2.4 网络层架构小结 214 3.1 第四层交换简介 214 3.2 硬件实现 215 3.3 软件实现 215  网站架构的高性能和可扩展 233  资料收集:高并发 高性能 高扩展 Web 2.0 站点架构设计及优化策略 243  CommunityServer能问题浅析 250 鸡肋式的多站点支持 250 内容数据的集中式存储 250 过于依赖缓存 250 CCS的雪上加霜 250 如何解决? 251  Digg PHP's Scalability and Performance 251  YouTube Architecture 253 Information Sources 254 Platform 254 What's Inside? 254 The Stats 254 Recipe for handling rapid growth 255 Web Servers 255 Video Serving 256 Serving Video Key Points 257 Serving Thumbnails 257 Databases 258 Data Center Strategy 259 Lessons Learned 260 1. Jesse • Comments (78) • April 10th 261 Library 266 Friendster Architecture 273 Information Sources 274 Platform 274 What's Inside? 274 Lessons Learned 274  Feedblendr Architecture - Using EC2 to Scale 275 The Platform 276 The Stats 276 The Architecture 276 Lesson Learned 277 Related Articles 278 Comments 279 Re: Feedblendr Architecture - Using EC2 to Scale 279 Re: Feedblendr Architecture - Using EC2 to Scale 279 Re: Feedblendr Architecture - Using EC2 to Scale 280  PlentyOfFish Architecture 281 Information Sources 282 The Platform 282 The Stats 282 What's Inside 283 Lessons Learned 286  Wikimedia architecture 288 Information Sources 288 Platform 288 The Stats 289 The Architecture 289 Lessons Learned 291  Scaling Early Stage Startups 292 Information Sources 293 The Platform 293 The Architecture 293 Lessons Learned 294  Database parallelism choices greatly impact scalability 295  Introduction to Distributed System Design 297 Table of Contents 297 Audience and Pre-Requisites 298 The Basics 298 So How Is It Done? 301 Remote Procedure Calls 305 Some Distributed Design Principles 307 Exercises 308 References 309  Flickr Architecture 309 Information Sources 309 Platform 310 The Stats 310 The Architecture 311 Lessons Learned 316 Comments 318 How to store images? 318 RE: How to store images? 318  Amazon Architecture 319 Information Sources 319 Platform 320 The Stats 320 The Architecture 320 Lessons Learned 324 Comments 329 Jeff.. Bazos? 329 Werner Vogels, the CTO of 329 Re: Amazon Architecture 330 Re: Amazon Architecture 330 Re: Amazon Architecture 330 It's WSDL 330 Re: It's WSDL 331 Re: Amazon Architecture 331  Scaling Twitter: Making Twitter 10000 Percent Faster 331 Information Sources 332 The Platform 332 The Stats 333 The Architecture 333 L
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值