您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 其它相关文档 > 互联网分步式系统架构分享_陈臻
互联网分布式系统架构分享互联网分布式系统架构分享54chen(陈臻)@Qconczhttp@gmail.com年第一封电子邮件:穿越长城,走向年第一封电子邮件:穿越长城,走向世界世界zz分布式系统:近几年发展活跃分布式系统:近几年发展活跃常见的搭配常见的搭配zzmySQLmySQLzzMemcachedMemcached••大量数据放在内存中大量数据放在内存中••极致优化极致优化mySQLmySQL••读写数据有套路读写数据有套路MysqlMysql--memcachedmemcached搭配搭配--读读zz先从先从memcachedmemcached读取读取zz如果有值,返回如果有值,返回zz如果无值,从如果无值,从mysqlmysql读取,返回并写读取,返回并写memcachememcacheMysqlMysql--memcachedmemcached搭配搭配--写写zz写入写入mysqlmysql,产生对应的,产生对应的keykey后删除后删除memcachememcache的值的值而节点之间的关系又如何呢?而节点之间的关系又如何呢?MemcachedMemcached节点间节点间读取加速读取加速一致性一致性hashhash失效影响只到部分数据失效影响只到部分数据读多写少读多写少::凑合凑合MysqlMysql上动作上动作同步备份同步备份大多数一主多从大多数一主多从垂直划分业务,多个一主多从垂直划分业务,多个一主多从读多写少读多写少::凑合。凑合。即便如此使用使用mysqlmysql还需要还需要在代码中在代码中小心翼翼小心翼翼请看示例请看示例小心翼翼的使用举例-忘记wherezz举例:举例:deletefromdeletefromtable_nametable_namezz应该:应该:deletefromdeletefromtable_nametable_namewhereid=?whereid=?习惯性加上习惯性加上limitlimit操作之前操作之前::连对机器了么?写条件了么?要备份么?连对机器了么?写条件了么?要备份么?小心翼翼的使用举例小心翼翼的使用举例--操作列操作列zz举例:举例:date(time_columndate(time_column)=)=““20092009--0606--0909””zz应该:应该:datebetweendatebetween““20092009--0606--0900:00:000900:00:00””andand““20092009--0606--0923:59:590923:59:59””zz举例:举例:timestamp+3600timestamp+3600unix_timestampunix_timestamp()()zz应该:应该:timestamptimestampunix_timestampunix_timestamp()()––36003600zz举例:举例:orderbyorderbyview_countview_count++post_countpost_count*5*5zz应该:单搞一列叫应该:单搞一列叫weightweight小心翼翼的使用举例小心翼翼的使用举例--忘记引号忘记引号zzmobilevarchar(14)notnullmobilevarchar(14)notnullzz举例:举例:wheremobile=13800138000wheremobile=13800138000zz应该:应该:wheremobile=wheremobile=““1380013800013800138000””小心翼翼的使用举例小心翼翼的使用举例--limitlimit的问题的问题zz举例:举例:select*fromtablelimitselect*fromtablelimitlimitlimit60000000,10060000000,100zz应该:应该:select*fromtablewhereid60000000limit100select*fromtablewhereid60000000limit100小心翼翼的使用举例小心翼翼的使用举例--randrand的问题的问题zz举例:举例:select*fromselect*fromonline_useronline_userorderbyrand()limitorderbyrand()limit100100zz应该:应该:{{select*fromselect*fromonline_useronline_userwherepage=$wherepage=$rand_pagerand_page{{select*fromselect*fromonline_useronline_userwhereid$whereid$rand_posrand_poslimit100limit100{{select*fromselect*fromonline_useronline_user++memcachedmemcached……任何一个不小心任何一个不小心zzMysqlMysql锁死锁死zz速度慢速度慢zz负载高负载高让让codingcoding更加轻松更加轻松zz不担心不担心zz够放心够放心zz睡安心睡安心DynamoDynamozz去年很热的去年很热的nono--sqlsqlzzKeyKey--valuevaluezz非常不错的各非常不错的各种实现种实现进入进入DynamoDynamo的世界的世界zz一致性哈希一致性哈希zzCAPCAP原则原则zzMerkleMerkleTreeTreezzGossipGossip协议协议zzhintedhandoffhintedhandoff数据数据zz向量时钟向量时钟进入进入DynamoDynamo的世界的世界目标:目标:99.9%99.9%的请求延迟要在的请求延迟要在300300毫秒以内毫秒以内数据同步与负载均衡数据同步与负载均衡一致性哈希一致性哈希zz保障数据在有节点变动时影响范围最小保障数据在有节点变动时影响范围最小zzDynamoDynamo设计时,使用了虚拟节点的概念设计时,使用了虚拟节点的概念虚拟节点虚拟节点zz虚拟节点让负载均衡虚拟节点让负载均衡zz即便有节点变动也负载均衡即便有节点变动也负载均衡CAPCAP原则原则zzConsistencyConsistency(一致性)(一致性)zzAvailabilityAvailability(可用性)(可用性)zzPartitiontolerancePartitiontolerance(分区容错性)(分区容错性)zz定理:任何分布式系统只可同时满足二点,没法三者兼顾。定理:任何分布式系统只可同时满足二点,没法三者兼顾。zz忠告:架构师不要将精力浪费在如何设计能满足三者的完美分布式系统,而是应该进行取舍。忠告:架构师不要将精力浪费在如何设计能满足三者的完美分布式系统,而是应该进行取舍。zNRW:Dynamo的CAPNRWNRWzzNN:复制的次数;:复制的次数;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+WNR+WN能够保证我们能够保证我们““读我们所写读我们所写””,,DynamoDynamo推荐使用推荐使用322322的的组合。组合。MerkleMerkleTreeTreezz将每一个数据对应的将每一个数据对应的keykey--valuevalue建立成一个建立成一个hashtreehashtreezz微小的变化也会引发顶层的不一致微小的变化也会引发顶层的不一致zz用来通知各同步节点之间的分区数据变化用来通知各同步节点之间的分区数据变化Gossip协议zz当集群里的一个节点出现故障当集群里的一个节点出现故障zz或者增加一个节点或者增加一个节点zz周知各节点的协议周知各节点的协议什么是Gossip协议?什么是Gossip协议?hintedhandoffhintedhandoff数据数据zz当集群里的一个节点出现故障当集群里的一个节点出现故障zz数据自动进入临近的节点数据自动进入临近的节点handoffhandoff区区zz收到恢复通知后自动恢复收到恢复通知后自动恢复handoffhandoff数据数据向量时钟向量时钟vectorclockvectorclockzz在写入数据时,各个节点对数据本身都一个向量记录在写入数据时,各个节点对数据本身都一个向量记录zz在读取多个节点时,进行向量计算从而得出最正确结果在读取多个节点时,进行向量计算从而得出最正确结果[a,1][a,1]aa节点节点时钟计数时钟计数11[b,2][b,2]bb节点节点时钟计数时钟计数22向量时钟向量时钟vectorclockvectorclockzz在写入数据时,各个节点对数据本身都一个向量记录在写入数据时,各个节点对数据本身都一个向量记录zz在读取多个节点时,进行向量计算从而得出最正确结果在读取多个节点时,进行向量计算从而得出最正确结果[a,1][a,1]aa节点节点时钟计数时钟计数11[b,2][b,2]bb节点节点时钟计数时钟计数22这些,构成这些,构成DynamoDynamo然后是然后是cassandracassandrazzFacebookFacebook出品出品20082008年开源年开源zzCassandraCassandra最初作者最初作者AvinashAvinashLakshmanLakshman(Amazon'sDynamo(Amazon'sDynamo的作者之一的作者之一))CassandraCassandra偷懒的地方偷懒的地方zz大分区大分区zzCassandraCassandra未用未用vectorclockvectorclock,而只用,而只用clienttimestampsclienttimestamps简化了冲突选择简化了冲突选择CassandraCassandra牛牛XX的地方的地方实现了实现了bigTablebigTable数据模型数据模型基于列族基于列族((ColumnFamilyColumnFamily))然后是voldemortzzLinkedInLinkedIn出品出品zz重点在使用重点在使用HadoopHadoop存放收集整理数据存放收集整理数据zz定死了节点数量定死了节点数量国内一些国内
本文标题:互联网分步式系统架构分享_陈臻
链接地址:https://www.777doc.com/doc-3972077 .html