互联网分布式系统架构分享


互联网分布式系统架构分享互联网分布式系统架构分享 54chen (陈臻) @ Qcon czhttp@gmail.com http://www.54chen.comwww.54chen.com 2011-04-10 互联网在中国互联网在中国 zz19871987年第一封电子邮件:穿越长城,走向年第一封电子邮件:穿越长城,走向 世界世界 zz分布式系统:近几年发展活跃分布式系统:近几年发展活跃 常见的搭配常见的搭配 zzmySQLmySQL zzMemcachedMemcached ••大量数据放在内存中大量数据放在内存中 ••极致优化极致优化mySQLmySQL ••读写数据有套路读写数据有套路 MysqlMysql--memcachedmemcached搭配搭配--读读 zz先从先从memcachedmemcached读取读取 zz如果有值,返回如果有值,返回 zz如果无值,从如果无值,从mysqlmysql读取,返回并写读取,返回并写 memcachememcache MysqlMysql--memcachedmemcached搭配搭配--写写 zz写入写入mysqlmysql,产生对应的,产生对应的keykey后删除后删除 memcachememcache的值的值 而节点之间的关系又如何呢?而节点之间的关系又如何呢? MemcachedMemcached节点间节点间 读取加速读取加速 一致性一致性hashhash 失效影响只到部分数据失效影响只到部分数据 读多写少读多写少::凑合凑合 MysqlMysql上动作上动作 同步备份同步备份 大多数一主多从大多数一主多从 垂直划分业务,多个一主多从垂直划分业务,多个一主多从 读多写少读多写少::凑合。凑合。 即便如此 使用使用mysqlmysql 还需要还需要 在代码中在代码中 小心翼翼小心翼翼 请看示例请看示例 小心翼翼的使用举例-忘记where zz 举例:举例:delete from delete from table_nametable_name zz 应该:应该:delete from delete from table_nametable_name where id = ?where id = ? 习惯性加上习惯性加上limitlimit 操作之前操作之前: : 连对机器了么?写条件了么?要备份么?连对机器了么?写条件了么?要备份么? 小心翼翼的使用举例小心翼翼的使用举例--操作列操作列 zz 举例:举例:date(time_columndate(time_column) = ) = ““20092009--0606--0909”” zz 应该:应该:date between date between ““20092009--0606--09 00:00:0009 00:00:00”” and and ““20092009--0606--09 23:59:5909 23:59:59”” zz 举例:举例:timestamp + 3600 > timestamp + 3600 > unix_timestampunix_timestamp()() zz 应该:应该:timestamp > timestamp > unix_timestampunix_timestamp() () –– 36003600 zz 举例:举例:order by order by view_countview_count + + post_countpost_count * 5* 5 zz 应该:单搞一列叫应该:单搞一列叫weightweight 小心翼翼的使用举例小心翼翼的使用举例--忘记引号忘记引号 zz mobile varchar(14) not nullmobile varchar(14) not null zz 举例:举例:where mobile = 13800138000where mobile = 13800138000 zz 应该:应该: where mobile = where mobile = ““1380013800013800138000”” 小心翼翼的使用举例小心翼翼的使用举例--limitlimit的问题的问题 zz 举例:举例:select * from table limit select * from table limit limitlimit 60000000, 10060000000, 100 zz 应该:应该:select * from table where id>60000000 limit 100select * from table where id>60000000 limit 100 小心翼翼的使用举例小心翼翼的使用举例--randrand的问题的问题 zz 举例:举例:select * from select * from online_useronline_user order by rand() limit order by rand() limit 100100 zz 应该:应该: {{ select * from select * from online_useronline_user where page = $where page = $rand_pagerand_page {{ select * from select * from online_useronline_user where id > $where id > $rand_posrand_pos limit 100limit 100 {{ select * from select * from online_useronline_user + + memcachedmemcached …… 任何一个不小心任何一个不小心 zzMysqlMysql锁死锁死 zz速度慢速度慢 zz负载高负载高 让让codingcoding更加轻松更加轻松 zz不担心不担心 zz够放心够放心 zz睡安心睡安心 DynamoDynamo zz去年很热的去年很热的nono--sqlsql zzKeyKey--valuevalue zz非常不错的各非常不错的各种实现种实现 进入进入DynamoDynamo的世界的世界 zz一致性哈希一致性哈希 zzCAPCAP原则原则 zzMerkleMerkle Tree Tree zzGossipGossip协议协议 zzhinted handoffhinted handoff数据数据 zz向量时钟向量时钟 进入进入DynamoDynamo的世界的世界 目标:目标:99.9%99.9%的请求延迟要在的请求延迟要在300300毫秒以内毫秒以内 数据同步与负载均衡数据同步与负载均衡 一致性哈希一致性哈希 zz保障数据在有节点变动时影响范围最小保障数据在有节点变动时影响范围最小 zzDynamoDynamo设计时,使用了虚拟节点的概念设计时,使用了虚拟节点的概念 虚拟节点虚拟节点 zz虚拟节点让负载均衡虚拟节点让负载均衡 zz即便有节点变动也负载均衡即便有节点变动也负载均衡 CAPCAP原则原则 zz ConsistencyConsistency(一致性)(一致性) zz AvailabilityAvailability(可用性)(可用性) zz Partition tolerancePartition tolerance(分区容错性)(分区容错性) zz 定理:任何分布式系统只可同时满足二点,没法三者兼顾。定理:任何分布式系统只可同时满足二点,没法三者兼顾。 zz 忠告:架构师不要将精力浪费在如何设计能满足三者的完美分布式系统,而是应该进行取舍。忠告:架构师不要将精力浪费在如何设计能满足三者的完美分布式系统,而是应该进行取舍。 z NRW: Dynamo的CAP NRWNRW zzNN:复制的次数;:复制的次数; zzRR:读数据的最小节点数;:读数据的最小节点数; zzWW:写成功的最小分区数。:写成功的最小分区数。 NRW:NRW:这三个数的具体作用这三个数的具体作用 zz 用来灵活地调整用来灵活地调整DynamoDynamo系 统 的可用性与一致性。系 统 的可用性与一致性。 zz 例例:: zz 如果如果R=1R=1,表示最少只需要去一个节点读数据即可,读到即返回,这,表示最少只需要去一个节点读数据即可,读到即返回,这 时是可用性是很高的,但并不能保证数据的一致性,时是可用性是很高的,但并不能保证数据的一致性, zz 如果说如果说WW同时为同时为11,那可用性更新是最高的一种情况,但这时完全不,那可用性更新是最高的一种情况,但这时完全不 能保障数据的一致性,因为在可供复制的能保障数据的一致性,因为在可供复制的NN个节点里,只需要写成功个节点里,只需要写成功 一次就返回了,也就意味着,有可能在读的这一次并没有真正读到需一次就返回了,也就意味着,有可能在读的这一次并没有真正读到需 要的数据(一致性相当的不好)。要的数据(一致性相当的不好)。 zz 如果如果W=R=N=3W=R=N=3,每次写的时候,都保证所有要复制的点都写成功,,每次写的时候,都保证所有要复制的点都写成功, 读的时候也是都读到,这样子读出来的数据一定是正确的,但是其性读的时候也是都读到,这样子读出来的数据一定是正确的,但是其性 能大打折扣,也就是说,数据的一致性非常的高,但系统的可用性却能大打折扣,也就是说,数据的一致性非常的高,但系统的可用性却 非常低了。非常低了。 zz 如果如果R + W > NR + W > N能够保证我们能够保证我们““读我们所写读我们所写””,,DynamoDynamo推荐使用推荐使用322322的的 组合。组合。 MerkleMerkle TreeTree zz 将每一个数据对应的将每一个数据对应的keykey--valuevalue建立成一个建立成一个hash treehash tree zz 微小的变化也会引发顶层的不一致微小的变化也会引发顶层的不一致 zz 用来通知各同步节点之间的分区数据变化用来通知各同步节点之间的分区数据变化 Gossip协议 zz当集群里的一个节点出现故障当集群里的一个节点出现故障 zz或者增加一个节点或者增加一个节点 zz周知各节点的协议周知各节点的协议 什么是Gossip协议? 什么是Gossip协议? hinted handoffhinted handoff数据数据 zz当集群里的一个节点出现故障当集群里的一个节点出现故障 zz数据自动进入临近的节点数据自动进入临近的节点handoffhandoff区区 zz收到恢复通知后自动恢复收到恢复通知后自动恢复handoffhandoff数据数据 向量时钟向量时钟 vector clockvector clock zz 在写入数据时,各个节点对数据本身都一个向量记录在写入数据时,各个节点对数据本身都一个向量记录 zz 在读取多个节点时,进行向量计算从而得出最正确结果在读取多个节点时,进行向量计算从而得出最正确结果 [a,1][a,1] aa节点节点 时钟计数时钟计数11 [b,2][b,2] bb节点节点 时钟计数时钟计数22 向量时钟向量时钟 vector clockvector clock zz 在写入数据时,各个节点对数据本身都一个向量记录在写入数据时,各个节点对数据本身都一个向量记录 zz 在读取多个节点时,进行向量计算从而得出最正确结果在读取多个节点时,进行向量计算从而得出最正确结果 [a,1][a,1] aa节点节点 时钟计数时钟计数11 [b,2][b,2] bb节点节点 时钟计数时钟计数22 这些,构成这些,构成DynamoDynamo 然后是然后是cassandracassandra zzFacebookFacebook出品出品 20082008年开源年开源 zzCassandraCassandra最初作者最初作者AvinashAvinash LakshmanLakshman (Amazon's Dynamo(Amazon's Dynamo的作者之一的作者之一)) CassandraCassandra偷懒的地方偷懒的地方 zz大分区大分区 zzCassandraCassandra未用未用vector clockvector clock,而只用,而只用 client timestampsclient timestamps 简化了冲突选择简化了冲突选择 CassandraCassandra牛牛XX的地方的地方 实现了实现了bigTablebigTable 数据模型数据模型 基于列族基于列族 ((Column FamilyColumn Family)) 然后是voldemort zzLinkedInLinkedIn出品出品 zz重点在使用重点在使用HadoopHadoop存放收集整理数据存放收集整理数据 zz定死了节点数量定死了节点数量 国内一些国内一些dynamodynamo产品产品 zz人人网人人网nuclearnuclear zz豆瓣豆瓣beansdbbeansdb zz淘宝淘宝TairTair zz新浪新浪sinasina--sddsdd zz…… 感谢始祖感谢始祖 ThanksThanks 54chen(54chen(陈臻陈臻)) czhttp@gmail.comczhttp@gmail.com http://www.54chen.comhttp://www.54chen.com
还剩37页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

yd6n

贡献于2013-11-07

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf