一站式结构化数据存储Tablestore实战手册_第1页
一站式结构化数据存储Tablestore实战手册_第2页
一站式结构化数据存储Tablestore实战手册_第3页
一站式结构化数据存储Tablestore实战手册_第4页
一站式结构化数据存储Tablestore实战手册_第5页
已阅读5页,还剩200页未读 继续免费阅读

下载本文档

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

文档简介

卷首语奠定了风靡全球的大数据技术基础。Bigtable启发了诸多NoSQL数据库的诞生,比如Cassandra、HBase、Tablestore等。其中表格存储Tablestore是阿里云存储团队基于Bigtable思想自研的分布式结构化数据存储,历经十年发展,覆盖了国内外30+统架构中扮演着什么角色?如何十分钟内学会一款分布式数据库?本书将带大家从零开始上手表格存储Tablestore简介控制台入门指南TablestoreSDK开发指南表格存储Tablestore简介表格存储Tablestore简介近十年来互联网技术得到了飞速的发展,越来越多的行业逐渐加入到了互联网的阵营中来,同如何优化第一点是存储,可以按照访问频率、数据量将数据划分为热数据与冷数据。热数据的特点为规模小、访问频率高、事务相关性强。冷数据的特点为规模大、访问频率低、事务相关性弱。66存储和流量卸载是数据分层架构的体现,数据分层存储架构在众多业务场景得到了广泛应用,例如电商订单场景,关于订单场景分层架构实现可参考基于MySQL+Tablestore分层存储架构的大规模订单系统实践,文章中讲解的订单场景里选择了表格存储Tablestore作为什么是表格存储的特性,支持PB级数据存储和千万TPS毫秒存储、搜索和分析多功能一体的一站式结构化数据存储平台。表格存储Tablestore的整体架77十分钟快速上手准备工作88下载命令行工具/aliyun-tablestore-cli/aliyun-tablestore-cli-windows-amd64-2021-11-11.zip/aliyun-tablestore-cli/aliyun-tablestore-cli-linux-amd64-2021-11-11.zip/aliyun-tablestore-cli/aliyun-tablestore-cli-linux-arm64-2021-11-11.zip/aliyun-tablestore-cli/aliyun-tablestore-cli-macos-amd64-2021-11-11.zip99启动命令行#___##1.登录阿里云官网,进入表格存储控制台。单击AccessKey管理。开通表格存储服务执行enable_service命令一次性免费开通服务,若已开通请跳过此步骤。enableenable_service创建实例执行create_instance命令创建实例。执行create_instancehelp可查看详细参数信息和配置实例和服务地址提示:可选择公网地址作为访问服务地址,格式为https://instanceN快速上手宽表模型模型简介多个属性列即可。主键列表中第一个主键将作为分区键,按照分区键值的范围将数据负载均衡订单表数据结构宽表操作","v":2498.99},{"c":"totalPrice","v":1599.0},{"c":"sName","v":"售郑七"},{"c":"pId","v":"p0c":"oId","v":"o0057022192"},{"c":"hasPaid","v":false},{"c":"sId","v":"s0007"},{"c":"ord518510583886,"isint":true},{"c":"pName","v":"oppoK1"},{"c":"cName","v":"消郑七"},{"c":"pType","v":"手机"},{"c":"pCount","v":1,"isint":true},{"c":"cId","v":"c0017"}]'ce","v":1599.0},{"c":"payTime","v":1509615334404,"isint":truesName","v":"售周五"},{"c":"pId","v":"p0003004"},{"c":"oId","v":"o0039248410"},{true},{"c":"sId","v":"s0015"},{"c":"orderTime","v":150vox21"},{"c":"cName","v":"消冯八"},{"c":"pType","v":"手机"},{"c":"pCount","v":1,"isint":true},{"c":e","v":2002.0},{"c":"payTime","v":149156ame","v":"售楚十"},{"c":"pId","v":"p0005001"},{"c":"oId","v":"o0003171350"},{"c":"he},{"c":"sId","v":"s0021"},{"c":"orderTime","v":1491560154808,pad"},{"c":"cName","v":"消赵一"},{"c":"pType","v":"平板"},{"c":"pCount","v":3,"isint":true},{"c":"c","v":3199.98},{"c":"totalPrice","v":3199.98},{"c":"sName","v":"售周五"},{"c":"pId",{"c":"oId","v":"o0036473830"},{"c":"hasPaid","v":false},{"c":"sId","v":"s0015"},{"c":"v":1508226047439,"isint":true},{"Type","v":"手机"},{"c":"pCount","v":1,"isint":true},{"c":"cId","v":"d0006"}]'ce","v":2299.21},{"c":"totalPrice","v":6897.63},{"c":"sName","v":"售郑七"},{"c":"pId","v"},{"c":"oId","v":"o0035062633"},{"c":"hasPaid","v":false},{"c":"sId","v":"s0007"},{"c":"orderTime"v":1507519847532,"isint":true},{"c":"pName","v":"小米6"},{"c":"cName","v":"消周五"},{"c":"pType","v":"手机"},{"c":"pCount","v":3,"isint":true},{"c":"cId","v":"c0015"}]'/s.Totalsucceedcount39800CREATETABLE`order`(`id`VARCHAR(1024),`cId`MEDIUMTEXT,`cName`MEDIUMTEXT,`hasPaid`BOOL,`oId`MEDIUMTEXT,`orderTime`BIGINT(20),`pBrand``pCount``pBrand``pCount``pId`MEDIUMTEXT,`pName`MEDIUMTEXT,`pPrice`DOUBLE,`pType`MEDIUMTEXT,`payTime`BIGINT(20),``sId`MEDIUMTEXT,`sName`MEDIUMTEXT,`totalPrice`DOUBLE,PRIMARYKEY(`id`)*`order`"售周五"totalPrice"售周五"`order``order`高级特性执行create_search_index命令创建多元索引。注意:创建多元索引后会按照表中数据量大小产生少量费用,删除索引后停止计费。多元索引create_search_indexcreate_search_index-t{+分钟快速上手<}+分钟快速上手<`order`;`order`pBrand;*`order`快速上手时序模型模型简介时序模型是针对时间序列数据的特点进行设计的,可适用于物联网设备监控、设备采集数据、下面将以一张车辆状态表car_data为例,带您体验表格存储Tablestore时序模型的时序表操作d'[{"c":"duration","v":121,"isint":true},{"c":"mileage","v":6480,"isint":true},{"c":"power","v":69,"isint":true},{"c":"speed","v":24,"isint":true},{"c":"temperature","v":13,"isint":true}]'--time1636460),|measurement|data_source|tags+分钟快速上手<*`car_data::meta`_m_name="car_data"andtag_value_at(_tags,"brand")="andtag_value_at(_tags,"mod|_m_name|_data_source|_tags|_attributes|_meta_update_time|`car_data::meta``car_data::meta`tag_value_at(_tags,"brand")="brand2";示例三:查询度量名称为“car_data”并且数据源为“car_0000001”车辆,返回“power”_time,_field__name,_long_valueasvalue`car_data`_m_name="car_data"and_data_source="c+分钟快速上手<||示例四:查询度量名称为“car_data”并且数据源为“car_000002”的车辆最大行驶速度。max(_long_value)asspeed`car_data`where_m_name="car_data"and_data_source="c示例五:对度量名称为“car_data”并且数据源为“car_0000001”的车辆的室温数据按照时SELECTSELECTmin(_long_value)astemperature`car_data`time_sectime_secASC_+分钟快速上手<控制台入门指南·Tablestore控制台入门指南00万按量读写吞吐供大家体验测试使用。下面将开始介绍如何通过Tablestore控制台创表格存储(按量付费)服务协议,点击立即开通。2.选择地域,点击创建实例。每个实例相当于一个数据库。下图示例中将c_name字段修改为分词字符串-单字分词类型,获取对c_name字段进行全文TablestoreSDK开发指南·JavaSDK开发入门准备工作l服务地址(Endpoint)。可选择公网地址进行测试。开发简介订单表开发步骤"",//yourendpoint,此处可选择公网地址"",////operation_method(syncClinet);//operation}publicpublicstaticvoidcreatetableMeta.addPrimaryKeyColumn("order_id",PrimaryKeyType.STRING);//设置主键CreateTableRequestcresyncClient.createTable(createTableRequest);//发送创建表请求System.out.println("createordertablesucceed");}rowPutChange.setPrimaryKey(PrimaryKeyBuilder.createPrimaryKeyBuilder().addPrimaryKeyColumn("order_id",PrimaryKeyValue.fromString("o1"))//设置主键rowPutChange.addColnewColumn("customer_name",ColumnValue.fromString("消十一")),//设置属性列信息newColumn("product_nnewColumn("product_type",ColumnValue.fromSsyncClient.putRow(newPutRowRequest(rowPutChange));//发送插入数据请求System.out.println("pu}criteria.setPrimaryKey(PrimaryKeyBuilder.createPrimaryKeyBuilder().addPrimaryKeyColumn("order_id",PrimaryKeyValue.fromString("o1"))//设置主键GetRowResponseresponse=syncClient.getRow(newGetRowRequest(criteria));//发送读取数据请求System.out.println(respon}publicpublicstaticvoidcreateSearchIndCreateSearchIndexRequestcrnewCreateSearchIndexRequest("order","order_index");//设置表名和索引名indexSchema.setFieldSchemas(Arrays.asList(//设置索引结构newFieldSchema("customer_name",FieldType.KEYWnewFieldSchema("order_timnewFieldSchema("pay_time",FielnewFieldSchema("product_name",FieldType.TEXT),newFieldSchema("prodcreateSearchIndexRequest.setIndexSchema(indexSchema);syncClient.createSearchIndex(createSearchIndexRequest);//发送创建索引请求System.out.println("createsearchindexs}.tableName("order").indexName("order_index")//设置表名、索引名.searchQuery(SearchQuery.newB.query(QueryBuilders.term("product_type","手机"))//查询类型为手机的记录.getTotalCount(true)//获取查询命中的行数System.out.println(row);.tableName("order").indexName("order_index")//设置表名、索引名.searchQuery(SearchQuery.newB.query(QueryBuilders.match("product_name","iphone"))//搜索产品名中包含iphone的行.getTotalCount(true)//获取查询命中的行数System.out.println(row);}.tableName("order").indexName("order_index")//设置表名、索引名.searchQuery(SearchQuery.newB.must(QueryBuilders.term("customer_name","消+一")).getTotalCount(true)//获取查询命中的行数System.out.println(row);publicpublicstaticvoiddeleteSedeleteSearchIndexRequest.setTableNamdeleteSearchIndexRequest.setIndexName("order_syncClient.deleteSearchIndex(deleteSearchIndexRequest);System.out.println("deletesearc}publicpublicstaticvoiddeleteTable(syncClient.deleteTable(newDeleteTableRequest("order"));//发送删除数据表请求System.out.println("deletetablesucceed"}准备工作l服务地址(Endpoint)。可选择公网地址进行测试。开发简介订单表开发步骤client:=tablestore.NewClient("",//yourendpoint,此处可选择公网地址}funcfunccreateOrderTable(client*tablestore.TableStoreClient){tableMeta.AddPrimaryKeyColumn("order_id",tablestore.PrimaryKeyType_STRING)//设置主键client.CreateTable(createtableRequest)//发送创建数据表请求fmt.Println("createtablesucceed")}/添加主键值。主键顺序与数据类型需与表结构保持一致。putPk.AddPrimaryKeyCo//添加属性列putRowChange.AddColumn("customer_name","消十一")putRowChange.AddColu//更新前置条件,默认可以设置为RowExistenceExpectation_IGNOREputRowChange.SetCondition(tablestore.RowExistenceExputRowChange.ReturnType=tablestore}putPk.AddPrimaryKeyColumn("order_id","o1")//设置读取的主键}funcfunccreateSearchIndex(client*tablestore.TableStoreClient){request.IndexName="order_indeFieldType:tablestore.FieldType_KEYWORD,//设置字段类型。Index:proto.Bool(true),//设置开启索引。EnableSortAndAgg:proto.Bool(true),//设置开启排序与统计聚合功能。}}}FieldName:proto.String(FieldType:tablestore.FieldType_TEXT,}}FieldSchemasFieldSchemas:schemas,//设置多元索引包含的字段。}client.CreateSearchIndex(request)//调用client创建多元索引。fmt.Println("CreateSearchIndex}funcfuncsearchQuery1(client*tablestore.TsearchRequest.SetTableName("order1").//设置表名SetIndexName("order_index").//设置多元索引名SetSearchQuery(search.NewSearchQuery().SetQuery(&search.TermQuery{"productSetLimit(10).SetGetTotalCo//设置返回所有列searchRequest.SetColumnsearchResponse,_:=client.Search(searchReq}}}funcfuncsearchQuery2(client*tablestore.TsearchRequest.SetTableName("order")searchRequest.SetIndexName("order_index")query.FieldName="product_name"//设置要匹配的字段。searchQuery.SetGetT//设置返回所有列searchRequest.SetColumnsearchRequest.SetSearchQuery(searchsearchResponse,_:=client.Search(searchReq}}funcfuncsearchQuery3(client*tasearchRequest.SetTableName("order")searchRequest.SetIndexName("order_index")//设置返回所有列searchRequest.SetColumntermQuery.Term="消+一" {searchRequest.SetSearchQuery(searchsearchResponse,_:=client.Search(sear}}}funcfuncdeleteSearchIndex(client*tablestore.TableStoreClient){request.IndexName="order_indeclient.DeleteSearchIndex(request)//调用client删除多元索引。fmt.Println("Delete}funcfuncdeleteTable(client*tablestore.TableStoreClient){client.DeleteTable(deleteTableRequest)//发送删除数据表请求}PythonSDK开发入门准备工作l服务地址(Endpoint)。可选择公网地址进行测试。开发简介订单表开发步骤client=OTSClient("https://order-in#operation_method(client)##创建数据表schema_of_primary_key=[('order_id','STRING')]table_meta=TableMeta("order",schema_of_primary_key)#设置表数据生命周期为永久,设置表最大版本数为1#默认设置表预留读写cu为0#发送创建数据表请求client.create_table(table_meta,table_option,reserved_throughput)attribute_columns=[('customer__name','消十一'),('product_consumed,return_row=client.put_row(table_name,row,concolumns_to_get=['customer_name','product__name','product_type','order_time','pay_time']consumed,return__row,next_token=client.get_row(table_name,primary_key,columns_to_print('Valueofattribute:%sdefdefcreateSearchIndexfield_a=FieldSchema('customer__name',FieldType.KEYWORD,index=True,enable_sort_andfield_b=FieldSchema('order_time',FieldType.KEYWORD,index=True,enable_sort_and_aggfield_c=FieldSchema('pay_time',FieldType.KEYWORD,index=True,enable_sort_and_agg=Tfield_d=FieldSchema('product_type',FieldType.TEXT,index=True,store=True,anafield_e=FieldSchema('customer__name',FieldType.KEYWORD,index=True,enable_sort_andfields=[field_a,field_b,field_c,field_d,field_e]client.create_search_index("order","order_index",index_meta)))TermQuery('customer_name','消+一'),])get_total_count=True),)defdefdelete_search_index(index_name):client.delete_search_index("order","order_index")defdefdelete_table():client.delete_table("order")准备工作l服务地址(Endpoint)。可选择公网地址进行测试。开发简介订单表开发步骤accessKeySecret:'',endpoint:'"https://order-instance.cmaxRetries:20,//默认20次重试,可以省略此参数。{name:'order_id',]capacityUnit:{timeToLive:-1,//数据的过期时间,单位为秒,-1代表永不过期。如果设置过期时间为一年,即为maxVersions:1//保存的最大版本数,设置为1代表每列上最多保存一个版本(保存最新的版本client.createTable(params,functio}console.log('success:',data);condition:newTableStore.Condition(TableStore.RowExistenceExpectation.IGNORE,null)primattributeColumns:[attributeColumns:[{'customer_name':'消十一'},{'product_type':'手机' returnContent:{retur}console.log('success:',data);maxVersions:1//最多可读取的版本数,设置为1即代表最多可读取1个版本。}}console.log('success:',data);client.createSearchIndex({tableName:'order',//设置数据表名称。indexName:'order_index',//设置多元索引名称。schema:{{fieldType:TableStore.FieldType.KEYWORD,//设置字段名和字段类型。index:true,//设置开启索引。enableSortAndAgg:true,//设置开启排序与统计聚合功能。{{fieldName:"pay_tim{fieldName:"product_name",fieldType:TableStore.FieldType.TEXT,{fieldName:"pay_tim}}}console.log('success:',console.log('success:',data);client.search({queryType:TableStore.QueryTterm:"手机"getTotalCount:true//结果中的TotalCount可以表示表中数据的总行数,默认为false,表示不返columnToGet:{//返回列设置RETURN_SPECIFIED(自定义)、RETURN_ALL(所有列)和RETUreturnType:TableStore.ColumnReturnType.RETURN_ALL}}console.log('success:',JSON.stringiclient.search({fieldName:"product_name",//设置要匹配的列。text:"iphone"//设置要匹配的值。getTotalCount:true//结果中的TotalCount可以表示表中数据的总行数,默认为false,表示不返回。columnToGet:{//返回列设置RETURN_SPECIFIED(自定义)、RETURN_ALL(所有列)和RETURN_NONE(不返回)。returnType:TableStore.ColumnReturnType.RETURN_ALL}}}console.log('success:',JSON.stringiclient.search({getTotalCount:false,//结果中的TotalCount可以表示表中数据的总行数,默认为false,表示不返回。queryType:TableStore.QueryType.BOOL{queryType:TableStore.QueryType.TERterm:"消十一"{}}columnToGet:{//返回列设置RETURN_SPECIFIED(自定义)、RETURN_ALL(所有列)和RETUreturnType:TableStore.ColumnReturnType.RETURN_ALL}}console.log('success:',JSON.stringiclient.deleteSearchIndex({tableName:'order',//设置数据表名称。indexName:'order_index'//设置多元索引名称。}}console.log('success:',data);client.deleteTable(params,funct}console.log('success:',data);场景实战基于MySQL+Tablestore分层存储架构的大规模订单系统实践-架构篇背景订单系统存在于各行各业,如电商订单、银行流水、运营商话费账单等,是一个非常广泛、通用的系统。对于这类系统,在过去十几年发展中已经形成了经典的做法。但是随着互联网的发展,以及各企业对数据的重视,需要存储和持久化的订单量越来越大,数据的重视程度与数据规模的膨胀带来了新的挑战。首先,订单量对于数据的存储、持久化、访问带来了挑战,这不仅增加了开发面对的困难,也为系统的运维带来了挑战。其次,随着大数据技术的发展以及运能力来处理对事务强需求的写操作与部分读操作;利用Tablestore的检索能力、大需求场景订单系统,面向C端,除了在系统性能要求高外,对于数时处理、数据批处理都有一定的要求。而对于C端客户、产品运营……l……运营同学需要能够在不影响线上的情况下使用SQL对实时数据进行分析,能够根据非主键字段进行检索;他们还需要系统对流批计算的支持,需要流式数据处理来进行实时数据统计,需要l系统复杂度低,不需要维护多个集群,也不需要关注各集群间的传统订单系统然会相当具有难度,需要更大的集群以及大量数据的迁移工作。数据迭代、膨胀带来的困扰,多维查询、统计场景。伴随着订单数据量的增加,用户会采取分库、分表方案应对,通过这种伪分布式方案,解决数据膨胀带来的问题。但数据一旦达到瓶颈,便需要重新创建更大规模的引入双数据的方案应运而生,通过实时数据、历史数据分存的方案,可以一定程度解决数据量膨胀问题。该方案将数据归类成两部分存储:实时数据、历史数据。同时通过数据同步服务,但是,该方案牺牲了历史订单数据对用户、商家、平台的使用价值,假设了历史数据的需求频率极低。但是一旦有需求,便需要全表扫描该方案虽然解决了数据膨胀带来的扩容问题,也能够支持数据检索。但可以看到的是,客户要维护至少两套集群,关注两处数据同步任务,该方案的系统复杂度很高,运维成本也会很高。数据检索问题,但其系统复杂,维护成本高;另外,这种方案无法对数据分析工作、数据再加据流批处理以及ETL再加工工作,且系统复杂度低,运维成本低,能够满足大规模订单系统的表格存储(Tablestore)是阿里云自研的多模型结构化数据存储,提供海量结构化数据存储以作。这不仅加重了开发者的开发工作,也提高了运维难度。在Tablestore中,阿里云提供Tablestore的同步工作。用户只需要进行少量的开发和配置工作就可以完成数据实时同步Tablestore提供了二级索引和多元索引来支持数据的检索。二级索引可以完成基于主键列定义列的数据查询,例如查询用户过去一个月成交的订单情况。而多元索引,基于倒排索引和列式存储,对外提供了更加强大的数据检索功能,他解决大数据的复杂查询难题。它可以实现接Spark,可以完成对全量历史数据的分析工作。这样,在Tablestore中存储近期数据,在总结基于MySQL+Tablestore分层存储架构的大规模订单系统实践-数据同步DTS篇多款工具可以实现这一功能,他们有的是开源工具如Canal,有的是阿里云端服务如DTS。下同步工具介绍l可以通过编程来进行增量同步,但有一定延时,源表需要通过字段区分哪些记Canal数据传输服务(DataTransmissionService,简称DTS)支持关系型数据库、NoSQL、大数据服务开通CREATECREATETABLE`order_contract`(`oId`varchar(50)NOTNULL,`create_time`datetimeNOTNULLCOMMENT'下单时间',`pay_time`datetimeDEFAULTNULLCOMMENT'支付时间',`has_paid`tinyint(4)DEFAULTNULLCOMMENT'是否已经支付',`c_id`varchar(20)DEFAULTNULLCOMMENT'消费者id',`c_name`varchar(20)DEFAULTNULLCOMMENT'消费者姓名',`p_brand`tinytextCOMMENT'产品品牌',`p_count`mediumint(9)DEFAULTNULLCOMMENT'产品数量',`p_id`varchar(20)DEFAULTNULLCOMMENT'产品id',`p_name`varchar(20)DEFAULTNULLCOMMENT'产品名',`p_price`decimal(16,2)DEFAULTNULLCOMMENT'产品价格',`s_id`varchar(20)DEFAULTNULLCOMMENT'店铺id',`s_name`varchar(20)DEFAULTNULLCOMMENT'店铺名称',`total_price`decimal(16,2)DEFAULTNULLCOMMENT'总价格',PRIMARYKEY(`oId`);进入DTS首页。点击立即购买。若有压测等需要大量同步记录的需求,同步链路规格参数可以适当选大,每种链路的传输数据在选择同步对象页,同步初始化这里,结构初始化、全量数据初始选项都要进行勾选。源库对象,选择源表order_contract,点击中间红框中的按钮,将表传送配置完成后,向下滑动窗口,点击“下一步”进入高级配置。继续点击预检查并启动,进行启数据同步测试c_id为“客户1”牌s_idd格式,比如“store1”店铺名称为“旗舰店1”//创建订单//创建订单item.setCreateTime(nowT);itemitem.setPayTime(nowT);item.setHasPaid(truitem.setpCount(count);//商品数量item.setpPrice(priceitem.setTotalPrice(it}System.out.println("}System.out.println(}insertintoorder_contract(oId,create_time,pay_time,has_paid,c_id,c__name,p_brand,p_count,p_id,p_name,p_price,s_id,s_name,total_price)values(#{item.oId},#{item.createTime},#{item.payTime},#{item.hasPaid},#{item.cId},#{item.cName},#{item.pCount},#{item.pId},#{item.pName},#{item.pPrice},#{item.sId},#{item.sNae.printStackTrace();}}用户也可以手动执行SQL插入测试数据。使用下面的存储过程可以直接通过SQL写入测试数INSERTINTOtest(oId,create_time,pay_time,has_paid,c_id,c_name,p_brand,p_count,p_id,p_name,p_price,s_id,s_name,total_price)VALUES(CONCAT(unix_timestamp(now()),"_",c_id),now(),now(),true,c_id,CONCAT("客户",userId),CONCAT("品牌",brandId),c,CONCONCAT("产品store",s总结基于MySQL+Tablestore分层存储架构的大规模订单系统实践-数据同步Canal篇步数据。Canal部署简单,易于运维,且相比于DTS,CREATETABLECREATETABLE`order_contract_canal`(`oId`varchar(50)NOTNULL,`create_time`datetimeNOTNULLCOMMENT'下单时间',`pay_time`datetimeDEFAULTNULLCOMMENT'支付时间',`has_paid`tinyint(4)DEFAULTNULLCOMMENT'是否已经支付',`c_id`varchar(20)DEFAULTNULLCOMMENT'消费者id',`c_name`varchar(20)DEFAULTNULLCOMMENT'消费者姓名',`p_brand`tinytextCOMMENT'产品品牌',`p_count`mediumint(9)DEFAULTNULLCOMMENT'产品数量',`p_id`varchar(20)DEFAULTNULLCOMMENT'产品id',`p_name`varchar(20)DEFAULTNULLCOMMENT'产品名',`p_price`decimal(16,2)DEFAULTNULLCOMMENT'产品价格',`s_id`varchar(20)DEFAULTNULLCOMMENT'店铺id',`s_name`varchar(20)DEFAULTNULLCOMMENT'店铺名称',`total_price`decimal(16,2)DEFAULTNULLCOMMENT'总价格',PRIMARYKEY(`oId`),KEY`idx_sid`(`s_id`),KEYKEY`idx_paytime_sid`(`pay_time`,`s_id`)USINGBTREE,KEY`idx_cid`(`c_id`),KEY`idx_paytime_cid_totalprice`(`pay_time`,`c_id`,`total_price`)USINGBTREE,KEY`idx_sid_paytime`(`s_id`,`pay_time`),KEY`idx_sid_paytime_totalprice`(`s_id`,`pay_time`,`total_price`),KEY`idx_paytime_totalprice_pbrand`(`p_price`,`total_price`,`pay_time`)USINGBTREE,KEY`idx_paytime`(`pay_time`),KEY`idx_pbrand_paytime`(`p_brand`(10),`pay_time`)值canal.instance.ma6canal.instance.dbct_canal].*_otscanal-adapter下的zip包作为安装包,该安装包与官网安装包部署路径相同,配置、启动方值是estore说明此适配器下游是是是值是是e,则若数据同步重试后仍否jackson:canal.conf:accessKeyaccessKey:canal.tcp.zookeeper.hosts:canal.tcp.batch.size:500canal.tcp.username:canal.tcp.password:srcDataSources:url:jdbc:mysql://:3306/test_ots?useUnicodtablestore.accessSecretId:****tablestore.accessSecretKey:****destination:test_otsdatabase:test_otstable:order_contract_canaltargetTable:canal_target_ordercreate_time:pay_time:has_paid:c_id:p_brand:p_count:p_id:p_name:p_price:s_id:total_price:commitBatch:200#批量提交的大小是是是是是是是是是是否否否全量同步数据增量同步数据curl"localhost:8081/syncSwitchcurl"localhost:8081/syncSwitchcurl"localhost:8081/syncSwitch/test_ots"curl"localhost:8081/syncSwitch/test_ots"总结基于MySQL+Tablestore分层存储架构的大规模订单系统实践-订单搜索篇背景……l……因此,开发者对于数据库在非主键查询、多列的自由组合查询等复杂查询需求上会有比较高的Tablestore的多元索引,能够支持此类数据检索工作,且具有操作简单、维护成本低等多元索引简介Tablestore的多元索引,底层使用自研索引引擎,基于倒排索引和列式存储,可以支持非列查询、全文检索、前缀查询、模糊查询、多字段自由组合查询、嵌套查询、地理位置查询和入多元索引。由于这个异步操作,多元索引中的数据相比于基础表数据存在一定延迟,这个延迟在几秒到十几秒的量级。由图可以看出,基于主键列的读取会由基础表进行支持;而多元索引会承担相对更加复杂的非主键列查询、全文检索、组合查询、聚合查询等查询功能。架构实多元索引创建商品名称(p_name)、客户名称(c_name)、卖家名称(s_name)、商品单价(p_price)、支付时间(pay_time)、客户id//组装请求参数searchQuery.setGetTotaapplierNameQuery.setFieldName("p_braSearchRequestsearchRequest=newSearchRequest("order_contract","order_contract_indsearchRequest.setColumnsToGet(columnsToGet);//进行搜索//解析返回数据userList.add(r.getColumn("c_id")}}}//组装请求参数searchQuery.setGetTotaapplierNameQuery.setFieldName("p_braSearchRequestsearchRequest=newSearchRequest("order_contract","order_contract_indsearchRequest.setColumnsToGet(columnsToGet);//进行搜索//解析返回数据userList.add(r.getColumn("c_id")}}}//组装请求参数searchQuery.setGetTotawildcardQuery.setFieldName("p_name");SearchRequestsearchRequest=newSearchRequest("order_contract","order_contract_indsearchRequest.setColumnsToGet(columnsToGet);//进行搜索//解析返回数据userList.add(r.getColumn("c_id")}}}除了上文提到的查询方式外,多元索引还支持许多丰富的查询方式,例如模糊查询、地理位置l多元索引不需要遵守最左匹配原则,可以一张索引支持所有需求。而JAVA中访问Tablestore代码如下,执行时间秒级。.tableName("order_contract").indexName("order_contract_index")SearchQuery.newBuilder().query(QueryBuilders.bool().must(QueryBuilders.range("total_price").must(QueryBuilders.wildcard("p_brand","*牌22*")).sort(newSort(Arrays.asList(newFieldSort("p_price",W条。.tableName("order_contract").indexName("order_contract_index").addColumnsToGet("c_id","total_price")SearchQuery.newBuilder().addGroupBy(GroupByBuilders.groupByField("c_id","c_id")//进行搜索总结Tablestore的多元索引功能对类似海量订单场景下的搜索功能提供了较好的支持。使用多基于MySQL+Tablestore分层存储架构的大规模订单系统实践-SQL查询和分析total_priceDOUBLE,selectcount(*),s_idfromorder_contractwherepay_time>1628784000000groupbys_idorde性能比较因此在复杂组合检索条件下,可能需要构建很多索引表才能够满足检索需求,这不仅会占用很金额在2000元以上的订单,按订单金额倒序取selectoId,c_id,c_name,c_nselectoId,c_id,c_name,c_name,p_brand,p_name,total_p_contractwheres_i符合筛选条件的记录有s_id,pay_time,to统计某用户2022000元以上的订单,按支付时selectoId,c_id,c_name,c_nselectoId,c_id,c_name,c_name,p_brand,p_name,total_price,s_idfromorder_contractwherec_iMySQL在字段c_i搜索2021年6selectoId,c_id,s_id,月30日零点以selectoId,c_id,s_id,tottotal_price,c_name,来成交额在999ice,c_name,p_brand,pay_tip_brand,pay_time,5元以上,且商品品牌中包含特定关键字的订wheretotal_pricce,total_price,pay单,按商品单价倒序排列取前1_time建有联合索MySQL中建立_price,pay_ti此类需求在订单系统的报表工作、数据分析、运营推广当中会非常常见,主要考验数据库对聚表格中列举了三种依赖聚合操作的场景,对于每种场景,给出了各SQL语句以及运行时间。Q实环境当中,很难像这里的三个场景都建立了恰当的索引,甚至并不会建立类似于pay_time,加糟糕。多元索引不需遵守最左匹配原则,可以以一份索引覆盖所有列,因此也不存在回表问铺成交订单selects_id,countMySQL建有pay_tim回表。时间范围内记录铺成交订单fromorder_contractwherselects_id,count(*),sum(total_price)a执行时间在一个小时MySQL建有pay_tim回表。时间范围内记录SELECTc_id,sum(toSELECTc_id,sum(total_prital_price)asaFROMySQL建有pay_time,c_id,total_price的联合索引,无需回表。时间范围内记录数约1总结基于MySQL+Tablestore分层存储架构的大规模订单系统实践-基于DLA的联邦查询在订单系统中,基于订单数据对客户和商家商品进行画像分析是一种常见的需求。常见的分析l根据非主键列、分区键的条件组合检索工作,例如查询过去一天异常订单列表、查询过l即使采用了分布式的MySQL框架解决了数据存储和一些简单查询上的索引能力会非常差,一般情况下,分布式MySQL架构会采用多数据备份的方式支持不同的分区键,但画像分析、数据检索场景可能涉及到需要进行检索的字段非常多,采用多数Q其中li_s1831126559450753为文create_timeString,has_paidint,s_idString,s_nameString,total_pricedoub

温馨提示

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

评论

0/150

提交评论