Unistorcluster方案书.doc_第1页
Unistorcluster方案书.doc_第2页
Unistorcluster方案书.doc_第3页
Unistorcluster方案书.doc_第4页
Unistorcluster方案书.doc_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【新浪研发】【Unistor Cluster 方案书】【0.3】Unistor Cluster方案书(V0.3)变更记录日期状态描述作者2011-9-25V0.1初稿cwinux2011-9-27V0.2增加了【其他】中的【指令列表】、【数据更新与查询】、【数据同步】cwinux2011-9-28V0.3对文档进行了review,修订了错别字,调整了排版。cwinux 版本声明 Unistor Cluster方案书及时相关文档、代码版权归新浪公司所有。目录1简述62UniStor Cluster架构72.1总体架构72.2Table架构92.3Unistor架构103设计思想113.1人工思想113.2自动思想113.3数据切分思想123.4数据re-banlance思想133.5一个分组内的master-slave数据一致性思想133.6跨IDC实现思想134dataset分组及unistord负载分析135优点分析166可靠性分析166.1UnistorD失效166.2UnistorP失效176.3Unistor失效176.4IDC失效177问答177.1Unistor数据是否可用mysql存储?177.2安全问题?187.3是否会支持SQL?187.4是否支持对value的field条件查询?187.5是否支持事务?197.6是否将会支持自动re-banlance?197.7是否会支持map-reduce?198主要API接口198.1指令接口198.2数据更新与查询接口318.3数据同步接口369其他371 简述当一个数据库表无法容纳所有数据的时候,常见的办法就是分表;当数据量大到一个mysql实例都无法存储的时候,就会采用分库多mysql实例来存储。当一个数据集采用多mysql实例存储的时候,数据集操作的transaction已经被放弃了。同时,为了保证分表、分库数据的对外透明性,很多公司都在开发mysql的访问代理层,来解决此问题。但,即便采用mysql的访问代理层,在数据的分组结构重新改变的过程中,也无法真正实现变更过程的对外透明性,主要原因是:底层mysql的数据再分组处理,不是由mysql的代理层来控制完成的。如果有一个表: 它可以实现mysql的一个表的数据的存储,同时具有mysql基于字段的查询与修改。 它可以存下你所有的数据而无需担心日后的扩容、分表问题; 它具有足够的读写性能而无需采用master-slave进行读写分离、甚至都无需前端的memcache; 它永远在线而无需考虑可用性问题; 它可以随意的增、删表的字段而不会对表造成block; 它的读、写是原子性的而无需考虑锁同步; 它允许有自己的多个【associate】的表,实现数据的其他不同维度的数据索引。 它可以让你文本、图片等格式的数据并存而无需担心编码问题。 它允许字段有任意的计数器而且还可以设置上、下门限。 它允许你对记录的某个版本快照进行修改而无需担心覆盖别的修改。 它出现故障的时候,只影响一小部分数据读写(可能仅仅是不可写)而不是全部。 它可以让你操作某条数据,也可以遍历整个数据表。 它能够按照你的要求,自动将expire数据删除而无需你劳神; 它支持数据的读写压缩(外部gzip,内部snoopy)。当然,同时它也有一些约束 这个表必须具有唯一的一条索引,而且是必须是Primary Key(可以是多个字段的联合索引)。 不能对主键进行修改,若需要修改只能执行delete、add操作。此就是本设计所描述的Unistor cluster所能给你提供的。对于这样的一个系统,是否是你当前所需要的?对于这样的一个表,就是一个unistor cluster,你可以有任意数量的这样cluster以存储业务的不同数据。从功能描述来看,Unistor Cluster与Bigtable、HBASE非常像。但Unistor Cluster数据是存于本地,因此具有更低的随机读取成本;同时,Unistor Cluster更多关注基于主键的数据关系,key类型允许用户自定义,可是多个字段的组合,其更贴近现实中的一张数据库表。下面,详细讲述此cluster结构、实现、功能及优缺点。2 UniStor Cluster架构2.1 总体架构结构说明如下:(一) 访问代理UnistorP:UnistorP是Unistor cluster的访问代理,对外隐藏Unistor cluster的分组细节,实现透明访问。Unistorp可以有任意数量,可以采用DNS轮询或vip实现负载均衡。Unistorp必须向Unistord进行注册,以便接收来自Unistord的分组变更、分组master变更通知。Unistorp主动连接unistord的master。对于没有注册的unistorp,unistord拒绝连接。UnistorP同时连接UnistorD的master与slave。Unistorp启动的时候,首先从unistord slave同步分组信息,同步后再从unistord master接收实时分组变化信息。UnistorP与UnistorD的所有通信,都采用confirm模式,保证消息正确送达。当UnistorP无法连接UnistorD的master及slave的任何一个,则会自动关闭自己的数据查询(相当自我摘除),直到实现与master或slave的某一个连接。(二) Unistor cluster控制中心:UnistordUnistorD是unitor cluster的控制中心,采用master-热备-任意个slave的架构。Master与热备见通过HA实现高可用,而slave可以有多个。Unistord: 存储这个cluster的数据分组、分布信息。 控制unistor存储的dataset的split、迁移。 实现一个unistor分组内的master的选择。 将unistorp需要的各种分组信息的变化,在变化前或变化后实时的分发给各个unistorp并获取unistorp的确认。 接收unistor及unistorp的各种告警,并自动作出对应的调整。Unistord存储的各种信息,可以在mysql中实现持久化存储。所有的Unistor(table数据由unistor存储,下一部分讲解table结构的时候介绍)、UnistorP实例必须在UnistorD注册。Unistor、unistorp主动连接unistorD master,没有在master中注册的会被拒绝连接并告警。(三) Table:Table就是具有b+tree primary的数据表,整个table分割根据primary key分割成一个一个的dataset,由unistor实现dataset的分布式存储。Table可以有自己的associate表,用于存储table数据集其它维度的primary key 索引(任何的非唯一索引,只要增加一个或几个字段,都可以变为unique index)。具体的Table结构,在下部分讲解。 (四)slave集群对于一个cluster,可以在其他IDC,建立slave cluster。Slave cluster也有master,但其master不能接受数据,只是负责从主cluster的master同步数据。当master cluster 失效后,可以将slave cluster修改为master cluster。此时,会存在丢失部分数据的风险,因此,需要根据先前master cluster形成binlog数据,追加此部分数据(对于一个cluster 内部unistor的master-slave变化,cluster会自动补全丢失的数据)。2.2 Table架构上图是一个Table的结构。每个Table有一个B+TREE的primary key。根据key的范围,将整个数据集分割为一个一个dataset,而unistor负责dataset的存储(一个unistor可以管理多个dataset)。Unistor可以分为很多组,每组有N个unistor存储完全一样的dataset。对于一个组内的unistor,采用master-slave的结构,至于一组中的哪个unistor是master,由unistord决定并通知到其他同组unistor,以便从master同步数据。对于unistor管理的每个dataset,都是独立的数据存储文件以实现隔离。Dataset可以在再分割、合并、在不同分组的unistor间搬移。所有这些活动由管理员发起,由unistord自动控制执行(也可以根据既定的策略,编写自动化脚本进行控制,对于自动化控制,不在本设计范围内)2.3 Unistor架构Unistor内部的架构比较复杂,中心思想是:不同的工作由不同的线程负责处理以不同类型任务间的隔离,避免相互间干扰(比如会有专门的dataset split线程;专门的dataset迁移线程;专门的binlog分发线程等)。 需要注意的是,unistor的数据write是单线程的。3 设计思想3.1 人工思想本设计中,数据分组定义、数据分组在unistor的分布是由运维人员定义、管理的。具体是:1、 海量数据是以dataset为单位实现存储的。每个dataset所存储数据的范围是由运维人员定义并设置到cluster的unistord。2、 Cluster分多少组,每组管理哪些dataset,也是由运维人员决定的。3、 何时对一个dataset进行split?何时将一个dataset从一个分组迁移到另外一个分组?这些工作都是运维人员控制的。之所以是人工控制,原因如下:1、 简单。2、 可控。3、 由于dataset是重量级的dataset,无需经常分割、迁移。因此可以委托管理员处理。4、 Unistor cluster对控制中心(unistord)的依赖最小化,当前架构下,控制中心失效也不影响cluster的运行,只是cluster处于freeze状态,无法变更。5、 Dataset对unistorP(代理层)实现隐藏,unistorP只需要知道某个key在某个unistor分组即可,而无需知道所在的dataset。这样,在unistor内,可以任意对dataset进行split而无需让外界知晓。当然,运维人员也可以根据自己的规则,自动化这些过程。但,系统会提供自动化需要的各种接口,但内部不会考虑自动化。3.2 自动思想Unistor cluster集群对一些的事情进行自动调度:1、 当一个unistor分组内的master失效的时候,自动选出新的unistor master,并通知unistorP。2、 Dataset split及split后的自动上线。3、 Dataset迁移及迁移完成后的自动上线。4、 失效unistor的unistorP的通知。5、 增加新的unistor分组并上线。6、 一个分组内增加新服务器、自动完成数据copy、同步后自动上线。3.3 数据切分思想3.3.1 数据集的分割整个数据集是以b+tree的方式组织的,而且b+tree的key不能重复(primary key)。对整个数据集按照b+tree key的范围,划分成一个一个的dataset,实现对所有数据的存储。因此,每个dataset都管理一段key连续的数据begin_key, end_key)(需要注意,begin_key是闭区间,end_key为开区间)。每个dataset的有一个唯一的dataset_id。对于dataset_id,需要满足如下条件:1、 是32位的无符号整数。2、 Key大的dataset的dataset id也大。因此,在对数据集进行划分的时候,也同时需要对dataset id进行划分。key_begin, key_end)的dataset id 范围为dataset_id_begin, dataset_id_end),而key_begin, key_end)采用(dataset_id_begin + dataset_id_end)/ 2作为其dataset id。为什么需要这么做,是跟随后数据同步设计有关的。对一个dataset进行迁移的时候,不但需要迁移数据,而且需要迁移其对应的binlog,而其binlog就是通过dataset id识别的。同时,对于unistor cluster与cwx-mq系统是联通的,对于数据的修改,可以转变为mq系统的消息。而mq从unistor cluster订阅数据变更消息,也是基于dataset-id进行的。其订阅一个dataset的数据变更消息不是直接订阅其dataset_id的消息,而是订阅 dataset_id_begin, dataset_id_end)范围的消息,此防止日后dataset分组的变更带来数据的遗漏。3.3.2 Unistor分组管理的数据集定义在【架构图】中,已经画出了Unistor cluster的数据存储结构:u 整个数据有N个Unistor分组管理。u 每个分组内采用master-slave结构,实现多点备份及master失效切换。 对于一个分组内的一个unistor实例,可以管理多个dataset。由于系统不自动对dataset进行调度,因此dataset大小对系统没有影响,因此:u 一个dataset越大越好。u 一个unistor管理的dataset越少越好。(多了麻烦,当然,为了数据热点的消除,dataset越小越好)。由于dataset存在拆分、迁移的问题,因此,为了不影响系统的cache,建议dataset最大尺寸为unistor 可用内存的1/41/2。3.4 数据re-banlance思想由于存储空间、访问负载的均衡问题,需要进行存储、访问的均衡。这就是dataset的re-banlance问题。Unistor cluster的数据re-banlance是有运维人员发起,有unistord控制并自动执行的。具体搬移的过程,见【迁移dataset】指令的描述。3.5 一个分组内的master-slave数据一致性思想对于任何的数据变更,master都会为数据分配唯一的变更序列号sid,此sid也就是key的版本号。Slave根据自己当前的sid,从master顺序同步所有的数据变更,而且无条件的更新变更,故可以实现与master的一致。Master与slave的不一致,会发生在当前的master失效时。新选择出的master可能与down掉的master或slave不一致。此不一致由unistor cluster自动完成处理,之所以能够自动处理,是由于unstor存储的每一个key都已版本号,此版本号就是更新数据的sid号。自动一致化处理的流程如下:1、 若新master的数据多,则没有问题,slave从master同步数据就可以了。2、 若新master的数据少,slave从master同步的时候会发现此问题,会将多出的数据通知master,由master进行决策。若需要接受,则master以binlog的方式分发下去实现同步。3.6 跨IDC实现思想一个unistor cluster不跨机房,若需要跨机房,则需要在另外的IDC机房构建一套当前cluster的slave cluster,slave cluster会自动从master cluster同步数据而实现cluster间的一致性更新。4 dataset分组及unistord负载分析对于unistor cluster,其存储的数据按照b+tree组织的。对于存储的数据,按照key的范围划分成一个个的dataset。而这些dataset,被分成N个组,存储于不同的服务器。每一个组可以都多台服务器,实现master-slave结构。也就是说组内的数据存储是采用master-slave架构体系的。下面对数据容量进行分析。1、 对于unistor cluster的dataset来说,不但可以分割、可以合并,而且同一个cluster的不同dataset大小是可以不同的。2、 假设一个cluster的dataset超过8G进行分割,则组成其数据dataset的平均大小应该为6G(最小4G,最大8G)。3、 Table定义对象Table需要对其定义,主要是定义primary的组成、associate表的primary key。定义的内容如下:u Field name:128字节,记录组成key的字段名字u Type:1字节,为数字类型表示字段类型。u Primary:1字节,是否为主键还是associate primary的key。u Order:对于primary来说,定义其组成主键的次序。对于此数据结构,一个table只有一个定义记录,因此空间占用可以忽略。4、 对于一个dataset,在unistord占用的空间如下:u Dataset id:4字节整数,可以有40亿dataset id。u Dataset 开始key: 具体大小取决于cluster key,按32字节(256签名,对于字符串,可以以key的一部分作为分割边界)计算。u Dataset 结束key: 按32字节计算。u 所属于的服务器分组:4字节整数,可以有40亿分组。u 记录数: 4字节u Dataset空间大小:4字节,单位为K。可以表示256T大小的dataset。可见,每个dataset占用的空间为88字节。5、 对于服务器分组记录,在unistord占用空间如下。u 分组id:4字节u 分组的名字:64字节u 用户名: 32字节u 口令: 32字节对于一个分组,其分组记录为132字节大小。6、 对于一个分组所包含的dataset记录。u Group id:4字节u Dataset id:4字节一个记录为8字节。7、 对于分组unistor实例记录,其在unistord占用的空间如下:u Unistor实例的ip地址:16字节u Unistor实例所属的分组:4字节u 状态及属性位 :4字节对于一个unistor实例记录,总共24字节。下面,分析1P数据的集群的unistord内存空间需求:u 1P数据需要的dataset:1024 * 1024G/6 = 174763n 【dataset】定义的空间占用:174763 * 88 = 14Mu 若个unistor实例存储100G数据(100G/6G = 17也就是说,每个unistor实例管理17个dataset文件),存在3分备份,则需要的分组为:10240分组。n 分组定义占用的空间: 10240 * 132 = 1320Kn 分组与dataset关系: 10240 * 8 = 80Kn Unistor实例: 10240 * 3 * 24 = 720K 因此,与分组表相关的数据总内存占用为:14M + 1230K + 80K + 780K 16M。 此时,Unistord需要内存为16M。同时,unistord与unistor的持久链接10240 * 3个,假设平均每一分钟与unistor一次通信,unistord的通信均值为:10240 * 3/ 60 = 512/s。而unistor的并发能力应超过1万/s,也就是只是峰值的1/20(定时报告各个dataset的信息)。若unistorp保存所有的分组信息,则占用内存也就是20M。其可以持久化map,并实现与unistord的增量更新(实时)与定时刷新(1小时)。而且unistorp从unistord的slave同步数据。 对于unistorP而言,其只需知道每个分组的范围即可,无需知道每个服务器上的dataset。这样,unistor内dataset就可以任意分割了。5 优点分析n 可以按需扩容前面已经介绍了扩容,因此可以实现按需扩容。n 扩容是可控的。Dataset的定义,dataset的unistor分布是人工定义并通知unistord实施的,因此扩容的过程是可控的。n 读写高通性。由于数据的读写无需访问Unistord;而且写的时候也无需多写,读的时候也无需多读,同时没有采用paxos,因此,其读写能力是:总的读写能力= 每组的读写能力 * 分组数量。而每组的读写能力,就是master-slave架构下的读写能力。这是在分布情况下的最佳性能。n 可以实现key的遍历由于一个cluster就是一个基于key的b+tree,因此,可以实现key的遍历。n 跨IDC数据同步 由于Cluster是完全基于消息的,通过消息同步可以实现多个IDC、具有主、从关系的cluster的数据同步。6 可靠性分析6.1 UnistorD失效UnistorD失效是指当前的UnistorD Master失效了。此时,UnistorD 的热备会通过HA主动切换为Master对外提供服务。在Master不失效的时间内,整个Unistor Cluster处于freeze冻结状态。在Freeze状态,Unistor cluster以下的事情无法做:1、 若一个分组内的Unistor master失效,则无法选出新的master,此分组不可写。2、 无法添加新的UnistorP、Unistor。3、 无法对dataset进行split及在不同unistor分组间进行迁移。可见,Unistord Master的失效,只影响cluster 集群内部关系的变更而不影响服务提供,因此,对UnistorD Master的高可用性要求不高。6.2 UnistorP失效由于有多个UnistorP,因此,一个UnistorP失效无所谓。UnistorP可以采用vip也可以使用dns轮询技术以实现其透明扩容。6.3 Unistor失效由于每个分组的Unistor实例有多个,因此,只某个Unistor失效无所谓。6.4 IDC失效若master cluster所在的IDC失效,则可将slave cluster设置为master cluster,并将数据的访问转到新的master cluster。若slave cluster所在的IDC失效,则处理更简单:只需要将对slave cluster的读,route到其他cluster上就可以了。7 问答7.1 Unistor数据是否可用mysql存储?由于Unistor采用插件型存储engine,因此,可以实现底层以mysql为数据存储介质的存储engine。但存在如下问题: Dataset分隔的锁表问题几百万、几千万甚至上亿的数据一分为二,需要将数据select出一半的数据。此数据量级的select会造出mysql锁表而影响更新操作。而且此过程是比较漫长的,即便采用MVC,也是影响非常大的。 Mysql的master-slave架构由于一组内的unistor的master,是由unistord动态选择的,因此,即便使用mysql,也不会使用mysql自己的master-slave实现同组数据的同步。 性能问题mysql性能远不如直接使用bdb嵌入型引擎性能高。而且mysql不支持uncommit-read。而且也不适合存储类似图片等大数据。7.2 安全问题?1、 Unistorp安全:UnistorP支持用户的认证,其功能是:n 用户的口令验证。(口令可以由unistord统一变更、控制)n 用户是否对操作的table(也就是某个unistor-cluster)具有读写权限。2、 Unistord的安全:采用用户口令认证的方式登录unistord的管理。而作为unistord的web管理系统,同样存在用户管理,可以采用内网登陆。3、 Unistor的安全Unistor主动连接unistorD,因此管理端口不存安全问题(unistor需要到unistord中注册,因此,unistord也能够识别unistor)。Unistor与UnistorP的连接采用Ip白名单方式,白名单由unistord统一分发(unistorp需要到unistord注册,因此unistord知道全部的unistorp)。因此,安全也不存在问题。7.3 是否会支持SQL?以后会支持。SQL必须是基于全部或按照主键定义次序的部分主键的。此功能当前不考虑,而且,对于SQL的支持,也是在UnistorP层实现。7.4 是否支持对value的field条件查询?当前只支持基于主键、部分主键(列表查询)的查询。以后的版本会支持查询条件中包含field,当然,也必须是基于主键的field条件过滤。7.5 是否支持事务?对于单个key的更新,unistor cluster是原子的。Unistor cluster不会支持一个事务包含多个key的更新操作,其本质原因是unistor cluster是异步、分布的系统,实现跨dataset的事务代价非常高。此外,unistor cluster是面向消息的,对于需要跨指令的事务场景,完全可以由应用可以通过消息日志,自己实现失败的回滚。(ebay的交易系统完全没有使用transaction,而是通过日志实现交易的完整性)7.6 是否将会支持自动re-banlance?不会的。当前支持re-banlance的系统,基本上都要求dataset具有相同的大小。而Unistore cluster设计的出发点,就是允许用户根据业务数据特点,建立大小不一的dataset集合。但系统会定时回报(或主动查询)每个dataset的记录数、大小信息;当用户需要对dataset分割的时候,系统会按照用户的需要(记录数平分或尺寸平分),给出建议的分割点。Unistor cluster会自动执行用户发出的dataset分割、合并指令。当然,运维人员可以基于unistord的dataset 分割、迁移 api,实现基于自己re-banlance策略的自动re-banlance系统。也就是说,自动re-banlance系统是外挂的。7.7 是否会支持map-reduce?当前不考虑。但,为了日后的可能,要求所有的dataset独立存储。如对于bdb,每个dataset存在于一个单独的database file中,不允许多个dataset共用data file。8 主要API接口8.1 指令接口除了【取消】指令外,其他任何指令必须串行执行,也就是说,上一个指令没有执行完(失败也是执行完)或者执行完但执行结果没有删除,不能执行下一个指令。(之所以删除执行结果后才认为指令执行完成,完全是为了保证其可靠性)。对于耗时的指令(如dataset的split、dataset迁移)都是异步执行的。当指令完成的时候,unistor会通知unistord。若指令完成的时候unistord不在线,则执行结果会持久化的缓存在处理指令的unistor上,待unistord上线后传送。Unistord确认指令结果后,必须显式的删除。若不删除,则无法执行下一条指令。对于任何指令在执行的过程中都是具有记忆性的。也就是说,当执行的unistor异常终止并重启后,停止前正在执行的指令要么失败,要么继续执行。对于某些指令,在执行期间可以取消。8.1.1 指令取消u 功能描述取消已经提交给unistor的指令。若指令已经完成或失败,则取消失败。u 使用场合:若一个指令执行长时间没有结束而又有高优先级的指令需要执行。u 是否可以取消不可。u 是否异步执行否。u 发送者Unistordu 接受者Unistoru 约束待【取消】的指令没有结束。u 命令参数n cmd_idu 返回值:n Ret:0成功;其他值失败。n Err:ret不为0时候的错误原因。8.1.2 删除执行完的指令(或失败)u 功能描述执行完的指令,其状态信息必须显式删除。此如同os的进程退出,必须显式的wait一样。u 使用场合:清空上一个指令的执行状态信息。u 是否可以取消不可。u 是否异步执行否。u 发送者Unistordu 接受者Unistoru 约束有未清除的指令状态。u 命令参数n cmd_idu 返回值:n Ret:0成功;其他值失败。n Err:ret不为0时候的错误原因。8.1.3 创建datasetu 功能描述创建不在当前cluster管理key范围内的新dataset。添加dataset是往分组中添加的,需要对分组中的unistor一个一个的添加。都成功之后才添加成功。在分组中的所有unistor都成功添加后,还需要激活dataset。在dataset激活前,slave的unistor可以接收本dataset的数据(收到数据的时候,自动激活),但master不可以,master必须显式激活。激活的顺序是:slave-master。u 使用场合:此命令使用有两个场合,分别如下:n Unistor cluster初始化的时候。n Key是递增的,为将要增加的key建立dataset。u 是否可以取消不可。u 是否异步执行否。u 发送者Unistordu 接受者Unistoru 约束只有一个分组中的所有unistor添加dataset都成功后、并且最后在master对其激活后,unistord才能unistorp通知unistor的key管理范围改变,也就是dataset生效。u 命令参数n Id:dataset id,原则为(begin_id + end_id)/2。Id一定大于begin_id,小于end_id。n Begin:key的开始值,空表示从最小值开始,为begin, end)的半开半闭区间。n End:key的结束值,空表示以最大值结束,为begin, end)的半开半闭区间。n begin_id:dataset占用的dataset id区间的最小值,为begin_id, end_id)的半开半闭区间。n end_id:dataset占用的dataset_id区间的最大值。为begin_id, end_id)的半开半闭区间。u 返回值:n Ret:0:指令接受;其他值错误。n Err:ret不等于0时的错误消息。8.1.4 active/或inactive datasetu 功能描述Active或inctive一个dataset。为了保证一个分组内的dataset数据的一致性,新dataset添加完成后必须激活才能使用,但此约束对master及slave的要求不一样。Master必须激活才能接收数据,而slave收到数据后自动激活。对于inactive,是将一个active的dataset变为inactive,以便对dataset进行修改。Inactive必须正对master节点的dataset。当dataset处于inactive状态后,dataset无法接收数据。u 使用场合:激活新添加的dataset。u 是否可以取消不可。u 是否异步执行否。u 发送者Unistordu 接受者Unistoru 约束无。u 命令参数n Id:dataset的id。n Active:1:激活;0:inactiveu 返回值:n Ret:0成功;其他值失败。n Err:ret不为0时候的错误原因。8.1.5 修改datasetu 功能描述修改dataset的信息。u 使用场合:当dataset创建有误或者调整管理范围的时候。u 是否可以取消不可。u 是否异步执行否。u 发送者Unistordu 接受者Unistoru 约束无。u 命令参数n Id:dataset idn Begin:key的开始值,空表示从最小值开始,为begin, end)的半开半闭区间。n End:key的结束值,空表示以最大值结束,为begin, end)的半开半闭区间。n begin_id:dataset占用的dataset id区间的最小值,为begin_id, end_id)的半开半闭区间。n end_id:dataset占用的dataset_id区间的最大值。为begin_id, end_id)的半开半闭区间。说明:begin、end、begin_id、end_id都可以修改,但,需要承担修改的责任。修改的时候,首先修改master,只有master成功才能修改slave。u 返回值:n Ret:0成功;其他值失败。n Err:ret不为0时候的错误原因。8.1.6 删除datasetu 功能描述删除一个unistor已经不负责管理的dataset。当一个dataset已经移到另外unistor时,需要将dataset从先前的unistor删除。u 使用场合:主要的使用场合是dataset搬移完成后,将dataset从先前的unistor删除。u 是否可以取消不可。u 是否异步执行否。u 发送者Unistordu 接受者Unistoru 约束无。u 命令参数n idu 返回值:n Ret:0成功;其他值失败。n Err:ret不为0时候的错误原因。8.1.7 获取split的位置信息u 功能描述当一个dataset太大或者需要将其一部分移到其他unistor分组的时候,需要对其进行split时。在执行split前首先需要通过此指令获取split的参考信息,以便制定分割点。u 使用场合:需要对一个dataset进行split时。u 是否可以取消可。u 是否异步执行是。u 发送者Unistordu 接受者Unistoru 约束无。u 命令参数n Id:dataset idn split:数据统计的间隔点。最大为100。u 返回值:n Ret:0成功;其他值失败。n Split: num-1个(数量对应的key,空间对应的key)对。每个数据对表示:对于第1/num *(num-1)个统计点,按照记录数量、存储空间来分,对应的key边界。n Cmd_id:ret=0时的指令id。n Err:ret不为0时候的错误原因。8.1.8 Split datasetu 功能描述对指定的dataset,分割成多个dataset。分割完成后,旧的dataset会自动删除。在split dataset的时候,需要注意尽量少影响当前的cache,因此,dataset必须在适当的时候进行split。u 使用场合:当一个dataset太大需要分成多个或者需要将dataset的一部分移到另外一个分组的时候。u 是否可以取消可。u 是否异步执行是。u 发送者Unistordu 接受者Unistoru 约束无。u 命令参数n Id:dataset idn Split:【id:begin;id_begin;end;id_end】;【id:begin;id_begin;end;id_end】,定义分离成各个新dataset的信息。u 返回值:n Ret:0成功接收;其他值失败。n Cmd_id:ret=0时的指令id。n Err:ret不为0时候的错误原因。8.1.9 迁移datasetu 功能描述将一个dataset从一个group迁移到另外一个group,迁移是迁移到新分组的master,新分组的slave,会自动同步这些数据。数据转移是在两个分组的master间执行的。处理流程如下:1) Unistord通知一个unistor(A)从另外一个unistor(B)接收一个dataset(C)。2) Unistor(A)接收unistord的指令,从指定的unistor(B)接受指定的dataset(C)。3) Unistor(B)按照Key的顺序,将dataset(C)的数据发送给unistor(A)。4) 当Dataset(C)的数据发送完毕时,Unistor(B)通知Unistor(A)发送完毕,开始发送自dataset传送以来的dataset新增binlog。5) 发送dataset(C)新增的binlog数据。当全部发送完毕的时候,unistor(B)通知unistor(A),dataset(C)处于同步状态,但binlog继续同步(dataset(C)还会有新数据)。6) Unistor(A)向UnistorD报告,已经完成了dataset(C)的同步。7) UnistorD修改dataset分组信息,并通知各个unistorP,dataset(C)范围的数据已经从Unistor(B)调整到Unistor(A)并得到确认(10秒超时)。8) 通知Unistor(B) de-active dataset(C),此时unistor(B)拒绝接受dataset(C)的数据。9) 当dataset(C)的所有binlog数据,已经同步unistor(A)后,unistor(B)通知Unistor(A)同步完成。Unistor(A)停止从unistor(B)接收dataset(C)的binlog。10) 到此,迁移完成。11) 根据需要,可以执行将dataset(C)从原unistor分组中删除。u 使用场合:进行group 间负载re-banlance。u 是否可以取消可以。u 是否异步执行是。u 发送者Unistordu 接受者Unistoru 约束若迁移的过程中在【7)】之前失败,则整个迁移过程失败。需要从unistor(A)中删除指定的迁移的dataset(包括其slave)。若在【7)】及之后失败,则强行将dataset(C)迁移到unistor(A)。此时,可能会有一点点dataset(C)的binlog数据遗留unistor(B),若需要转移,则通过人工手段迁移。(失败的时候,会报告从unistor(B)同步dataset(C) binlog的断点sid。u 命令参数n Id:要转移的dataset idn Source_ip:要转移的dataset所在分组master的ip地址,(端口号都一致,无需传递)n Zip:是否压缩传输n Chunk:发送数据包得大小n Window:发送chunk的窗口大小,此同tcp的滑窗类似,控制流量。u 返回值:n Ret:0成功接收,开始同步;其他值失败。n Cmd_id:ret=0时的指令id。n Err:ret不为0时候的错误原因。8.1.10 分组增加新服务器u 功能描述往一个分组中增加新的slave unistor。执行过程如下: 启动一个新的unistor(A) 实例。 在unistord,将新unistor(A)加入所属的分组。 Unistord通知unistor(A) 从所在分组的unistor master同步所有数据。 Unistor(A)连接master,请求同步所有数据。 Master首先传送dataset的开始sid。(用于master down后,从断点位置重新传送) master开始发送所有dataset。 发送完dataset后,开始从sid开始,发送binlog。 当binlog达到当前最新位置的时候,master通知unistor(A)达到同步状态。 Unistor(A)通知unistord,已经完成了同步。 Unistord将unistor(A)启用,并通知各个unistorP。u 使用场合:往一个分组增加新服务器。u 是否可以取消或挂起可。u 是否异步执行是。u 发送者Unistordu 接受者Unistoru 约束Master禁止做任何dataset的变更。若同步中间master出现任何异常,则会从新的master继续同步。u 命令参数n Ip:进行同步的master。u 返回值:n Ret:0成功;其他值失败。n Err:ret不为0时候的错误原因。8.1.11 增加新分组增加新分组没有新指令。就是在unistord增加新分组信息后,在新分组中【创建】、往新分组迁移dataset。8.1.12 Unistor 分组内master的选择u 功能描述当一个分组的master失效后,unistord从slave选择新master。判别的标准需要满足如下要求: Unistord失去与master的持久链

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论