一站式結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)Tablestore實(shí)戰(zhàn)手冊(cè)_第1頁(yè)
一站式結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)Tablestore實(shí)戰(zhàn)手冊(cè)_第2頁(yè)
一站式結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)Tablestore實(shí)戰(zhàn)手冊(cè)_第3頁(yè)
一站式結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)Tablestore實(shí)戰(zhàn)手冊(cè)_第4頁(yè)
一站式結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)Tablestore實(shí)戰(zhàn)手冊(cè)_第5頁(yè)
已閱讀5頁(yè),還剩200頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

卷首語(yǔ)奠定了風(fēng)靡全球的大數(shù)據(jù)技術(shù)基礎(chǔ)。Bigtable啟發(fā)了諸多NoSQL數(shù)據(jù)庫(kù)的誕生,比如Cassandra、HBase、Tablestore等。其中表格存儲(chǔ)Tablestore是阿里云存儲(chǔ)團(tuán)隊(duì)基于Bigtable思想自研的分布式結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ),歷經(jīng)十年發(fā)展,覆蓋了國(guó)內(nèi)外30+統(tǒng)架構(gòu)中扮演著什么角色?如何十分鐘內(nèi)學(xué)會(huì)一款分布式數(shù)據(jù)庫(kù)?本書(shū)將帶大家從零開(kāi)始上手表格存儲(chǔ)Tablestore簡(jiǎn)介控制臺(tái)入門(mén)指南TablestoreSDK開(kāi)發(fā)指南表格存儲(chǔ)Tablestore簡(jiǎn)介表格存儲(chǔ)Tablestore簡(jiǎn)介近十年來(lái)互聯(lián)網(wǎng)技術(shù)得到了飛速的發(fā)展,越來(lái)越多的行業(yè)逐漸加入到了互聯(lián)網(wǎng)的陣營(yíng)中來(lái),同如何優(yōu)化第一點(diǎn)是存儲(chǔ),可以按照訪(fǎng)問(wèn)頻率、數(shù)據(jù)量將數(shù)據(jù)劃分為熱數(shù)據(jù)與冷數(shù)據(jù)。熱數(shù)據(jù)的特點(diǎn)為規(guī)模小、訪(fǎng)問(wèn)頻率高、事務(wù)相關(guān)性強(qiáng)。冷數(shù)據(jù)的特點(diǎn)為規(guī)模大、訪(fǎng)問(wèn)頻率低、事務(wù)相關(guān)性弱。66存儲(chǔ)和流量卸載是數(shù)據(jù)分層架構(gòu)的體現(xiàn),數(shù)據(jù)分層存儲(chǔ)架構(gòu)在眾多業(yè)務(wù)場(chǎng)景得到了廣泛應(yīng)用,例如電商訂單場(chǎng)景,關(guān)于訂單場(chǎng)景分層架構(gòu)實(shí)現(xiàn)可參考基于MySQL+Tablestore分層存儲(chǔ)架構(gòu)的大規(guī)模訂單系統(tǒng)實(shí)踐,文章中講解的訂單場(chǎng)景里選擇了表格存儲(chǔ)Tablestore作為什么是表格存儲(chǔ)的特性,支持PB級(jí)數(shù)據(jù)存儲(chǔ)和千萬(wàn)TPS毫秒存儲(chǔ)、搜索和分析多功能一體的一站式結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)平臺(tái)。表格存儲(chǔ)Tablestore的整體架77十分鐘快速上手準(zhǔn)備工作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啟動(dòng)命令行#___##1.登錄阿里云官網(wǎng),進(jìn)入表格存儲(chǔ)控制臺(tái)。單擊AccessKey管理。開(kāi)通表格存儲(chǔ)服務(wù)執(zhí)行enable_service命令一次性免費(fèi)開(kāi)通服務(wù),若已開(kāi)通請(qǐng)?zhí)^(guò)此步驟。enableenable_service創(chuàng)建實(shí)例執(zhí)行create_instance命令創(chuàng)建實(shí)例。執(zhí)行create_instancehelp可查看詳細(xì)參數(shù)信息和配置實(shí)例和服務(wù)地址提示:可選擇公網(wǎng)地址作為訪(fǎng)問(wèn)服務(wù)地址,格式為https://instanceN快速上手寬表模型模型簡(jiǎn)介多個(gè)屬性列即可。主鍵列表中第一個(gè)主鍵將作為分區(qū)鍵,按照分區(qū)鍵值的范圍將數(shù)據(jù)負(fù)載均衡訂單表數(shù)據(jù)結(jié)構(gòu)寬表操作","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":"手機(jī)"},{"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":"手機(jī)"},{"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":"手機(jī)"},{"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":"手機(jī)"},{"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`高級(jí)特性執(zhí)行create_search_index命令創(chuàng)建多元索引。注意:創(chuàng)建多元索引后會(huì)按照表中數(shù)據(jù)量大小產(chǎn)生少量費(fèi)用,刪除索引后停止計(jì)費(fèi)。多元索引create_search_indexcreate_search_index-t{+分鐘快速上手<}+分鐘快速上手<`order`;`order`pBrand;*`order`快速上手時(shí)序模型模型簡(jiǎn)介時(shí)序模型是針對(duì)時(shí)間序列數(shù)據(jù)的特點(diǎn)進(jìn)行設(shè)計(jì)的,可適用于物聯(lián)網(wǎng)設(shè)備監(jiān)控、設(shè)備采集數(shù)據(jù)、下面將以一張車(chē)輛狀態(tài)表car_data為例,帶您體驗(yàn)表格存儲(chǔ)Tablestore時(shí)序模型的時(shí)序表操作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";示例三:查詢(xún)度量名稱(chēng)為“car_data”并且數(shù)據(jù)源為“car_0000001”車(chē)輛,返回“power”_time,_field__name,_long_valueasvalue`car_data`_m_name="car_data"and_data_source="c+分鐘快速上手<||示例四:查詢(xún)度量名稱(chēng)為“car_data”并且數(shù)據(jù)源為“car_000002”的車(chē)輛最大行駛速度。max(_long_value)asspeed`car_data`where_m_name="car_data"and_data_source="c示例五:對(duì)度量名稱(chēng)為“car_data”并且數(shù)據(jù)源為“car_0000001”的車(chē)輛的室溫?cái)?shù)據(jù)按照時(shí)SELECTSELECTmin(_long_value)astemperature`car_data`time_sectime_secASC_+分鐘快速上手<控制臺(tái)入門(mén)指南·Tablestore控制臺(tái)入門(mén)指南00萬(wàn)按量讀寫(xiě)吞吐供大家體驗(yàn)測(cè)試使用。下面將開(kāi)始介紹如何通過(guò)Tablestore控制臺(tái)創(chuàng)表格存儲(chǔ)(按量付費(fèi))服務(wù)協(xié)議,點(diǎn)擊立即開(kāi)通。2.選擇地域,點(diǎn)擊創(chuàng)建實(shí)例。每個(gè)實(shí)例相當(dāng)于一個(gè)數(shù)據(jù)庫(kù)。下圖示例中將c_name字段修改為分詞字符串-單字分詞類(lèi)型,獲取對(duì)c_name字段進(jìn)行全文TablestoreSDK開(kāi)發(fā)指南·JavaSDK開(kāi)發(fā)入門(mén)準(zhǔn)備工作l服務(wù)地址(Endpoint)。可選擇公網(wǎng)地址進(jìn)行測(cè)試。開(kāi)發(fā)簡(jiǎn)介訂單表開(kāi)發(fā)步驟"",//yourendpoint,此處可選擇公網(wǎng)地址"",////operation_method(syncClinet);//operation}publicpublicstaticvoidcreatetableMeta.addPrimaryKeyColumn("order_id",PrimaryKeyType.STRING);//設(shè)置主鍵CreateTableRequestcresyncClient.createTable(createTableRequest);//發(fā)送創(chuàng)建表請(qǐng)求System.out.println("createordertablesucceed");}rowPutChange.setPrimaryKey(PrimaryKeyBuilder.createPrimaryKeyBuilder().addPrimaryKeyColumn("order_id",PrimaryKeyValue.fromString("o1"))//設(shè)置主鍵rowPutChange.addColnewColumn("customer_name",ColumnValue.fromString("消十一")),//設(shè)置屬性列信息newColumn("product_nnewColumn("product_type",ColumnValue.fromSsyncClient.putRow(newPutRowRequest(rowPutChange));//發(fā)送插入數(shù)據(jù)請(qǐng)求System.out.println("pu}criteria.setPrimaryKey(PrimaryKeyBuilder.createPrimaryKeyBuilder().addPrimaryKeyColumn("order_id",PrimaryKeyValue.fromString("o1"))//設(shè)置主鍵GetRowResponseresponse=syncClient.getRow(newGetRowRequest(criteria));//發(fā)送讀取數(shù)據(jù)請(qǐng)求System.out.println(respon}publicpublicstaticvoidcreateSearchIndCreateSearchIndexRequestcrnewCreateSearchIndexRequest("order","order_index");//設(shè)置表名和索引名indexSchema.setFieldSchemas(Arrays.asList(//設(shè)置索引結(jié)構(gòu)newFieldSchema("customer_name",FieldType.KEYWnewFieldSchema("order_timnewFieldSchema("pay_time",FielnewFieldSchema("product_name",FieldType.TEXT),newFieldSchema("prodcreateSearchIndexRequest.setIndexSchema(indexSchema);syncClient.createSearchIndex(createSearchIndexRequest);//發(fā)送創(chuàng)建索引請(qǐng)求System.out.println("createsearchindexs}.tableName("order").indexName("order_index")//設(shè)置表名、索引名.searchQuery(SearchQuery.newB.query(QueryBuilders.term("product_type","手機(jī)"))//查詢(xún)類(lèi)型為手機(jī)的記錄.getTotalCount(true)//獲取查詢(xún)命中的行數(shù)System.out.println(row);.tableName("order").indexName("order_index")//設(shè)置表名、索引名.searchQuery(SearchQuery.newB.query(QueryBuilders.match("product_name","iphone"))//搜索產(chǎn)品名中包含iphone的行.getTotalCount(true)//獲取查詢(xún)命中的行數(shù)System.out.println(row);}.tableName("order").indexName("order_index")//設(shè)置表名、索引名.searchQuery(SearchQuery.newB.must(QueryBuilders.term("customer_name","消+一")).getTotalCount(true)//獲取查詢(xún)命中的行數(shù)System.out.println(row);publicpublicstaticvoiddeleteSedeleteSearchIndexRequest.setTableNamdeleteSearchIndexRequest.setIndexName("order_syncClient.deleteSearchIndex(deleteSearchIndexRequest);System.out.println("deletesearc}publicpublicstaticvoiddeleteTable(syncClient.deleteTable(newDeleteTableRequest("order"));//發(fā)送刪除數(shù)據(jù)表請(qǐng)求System.out.println("deletetablesucceed"}準(zhǔn)備工作l服務(wù)地址(Endpoint)??蛇x擇公網(wǎng)地址進(jìn)行測(cè)試。開(kāi)發(fā)簡(jiǎn)介訂單表開(kāi)發(fā)步驟client:=tablestore.NewClient("",//yourendpoint,此處可選擇公網(wǎng)地址}funcfunccreateOrderTable(client*tablestore.TableStoreClient){tableMeta.AddPrimaryKeyColumn("order_id",tablestore.PrimaryKeyType_STRING)//設(shè)置主鍵client.CreateTable(createtableRequest)//發(fā)送創(chuàng)建數(shù)據(jù)表請(qǐng)求fmt.Println("createtablesucceed")}/添加主鍵值。主鍵順序與數(shù)據(jù)類(lèi)型需與表結(jié)構(gòu)保持一致。putPk.AddPrimaryKeyCo//添加屬性列putRowChange.AddColumn("customer_name","消十一")putRowChange.AddColu//更新前置條件,默認(rèn)可以設(shè)置為RowExistenceExpectation_IGNOREputRowChange.SetCondition(tablestore.RowExistenceExputRowChange.ReturnType=tablestore}putPk.AddPrimaryKeyColumn("order_id","o1")//設(shè)置讀取的主鍵}funcfunccreateSearchIndex(client*tablestore.TableStoreClient){request.IndexName="order_indeFieldType:tablestore.FieldType_KEYWORD,//設(shè)置字段類(lèi)型。Index:proto.Bool(true),//設(shè)置開(kāi)啟索引。EnableSortAndAgg:proto.Bool(true),//設(shè)置開(kāi)啟排序與統(tǒng)計(jì)聚合功能。}}}FieldName:proto.String(FieldType:tablestore.FieldType_TEXT,}}FieldSchemasFieldSchemas:schemas,//設(shè)置多元索引包含的字段。}client.CreateSearchIndex(request)//調(diào)用client創(chuàng)建多元索引。fmt.Println("CreateSearchIndex}funcfuncsearchQuery1(client*tablestore.TsearchRequest.SetTableName("order1").//設(shè)置表名SetIndexName("order_index").//設(shè)置多元索引名SetSearchQuery(search.NewSearchQuery().SetQuery(&search.TermQuery{"productSetLimit(10).SetGetTotalCo//設(shè)置返回所有列searchRequest.SetColumnsearchResponse,_:=client.Search(searchReq}}}funcfuncsearchQuery2(client*tablestore.TsearchRequest.SetTableName("order")searchRequest.SetIndexName("order_index")query.FieldName="product_name"http://設(shè)置要匹配的字段。searchQuery.SetGetT//設(shè)置返回所有列searchRequest.SetColumnsearchRequest.SetSearchQuery(searchsearchResponse,_:=client.Search(searchReq}}funcfuncsearchQuery3(client*tasearchRequest.SetTableName("order")searchRequest.SetIndexName("order_index")//設(shè)置返回所有列searchRequest.SetColumntermQuery.Term="消+一" {searchRequest.SetSearchQuery(searchsearchResponse,_:=client.Search(sear}}}funcfuncdeleteSearchIndex(client*tablestore.TableStoreClient){request.IndexName="order_indeclient.DeleteSearchIndex(request)//調(diào)用client刪除多元索引。fmt.Println("Delete}funcfuncdeleteTable(client*tablestore.TableStoreClient){client.DeleteTable(deleteTableRequest)//發(fā)送刪除數(shù)據(jù)表請(qǐng)求}PythonSDK開(kāi)發(fā)入門(mén)準(zhǔn)備工作l服務(wù)地址(Endpoint)。可選擇公網(wǎng)地址進(jìn)行測(cè)試。開(kāi)發(fā)簡(jiǎn)介訂單表開(kāi)發(fā)步驟client=OTSClient("https://order-in#operation_method(client)##創(chuàng)建數(shù)據(jù)表schema_of_primary_key=[('order_id','STRING')]table_meta=TableMeta("order",schema_of_primary_key)#設(shè)置表數(shù)據(jù)生命周期為永久,設(shè)置表最大版本數(shù)為1#默認(rèn)設(shè)置表預(yù)留讀寫(xiě)cu為0#發(fā)送創(chuàng)建數(shù)據(jù)表請(qǐng)求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")準(zhǔn)備工作l服務(wù)地址(Endpoint)??蛇x擇公網(wǎng)地址進(jìn)行測(cè)試。開(kāi)發(fā)簡(jiǎn)介訂單表開(kāi)發(fā)步驟accessKeySecret:'',endpoint:'"https://order-instance.cmaxRetries:20,//默認(rèn)20次重試,可以省略此參數(shù)。{name:'order_id',]capacityUnit:{timeToLive:-1,//數(shù)據(jù)的過(guò)期時(shí)間,單位為秒,-1代表永不過(guò)期。如果設(shè)置過(guò)期時(shí)間為一年,即為maxVersions:1//保存的最大版本數(shù),設(shè)置為1代表每列上最多保存一個(gè)版本(保存最新的版本client.createTable(params,functio}console.log('success:',data);condition:newTableStore.Condition(TableStore.RowExistenceExpectation.IGNORE,null)primattributeColumns:[attributeColumns:[{'customer_name':'消十一'},{'product_type':'手機(jī)' returnContent:{retur}console.log('success:',data);maxVersions:1//最多可讀取的版本數(shù),設(shè)置為1即代表最多可讀取1個(gè)版本。}}console.log('success:',data);client.createSearchIndex({tableName:'order',//設(shè)置數(shù)據(jù)表名稱(chēng)。indexName:'order_index',//設(shè)置多元索引名稱(chēng)。schema:{{fieldType:TableStore.FieldType.KEYWORD,//設(shè)置字段名和字段類(lèi)型。index:true,//設(shè)置開(kāi)啟索引。enableSortAndAgg:true,//設(shè)置開(kāi)啟排序與統(tǒng)計(jì)聚合功能。{{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:"手機(jī)"getTotalCount:true//結(jié)果中的TotalCount可以表示表中數(shù)據(jù)的總行數(shù),默認(rèn)為false,表示不返columnToGet:{//返回列設(shè)置RETURN_SPECIFIED(自定義)、RETURN_ALL(所有列)和RETUreturnType:TableStore.ColumnReturnType.RETURN_ALL}}console.log('success:',JSON.stringiclient.search({fieldName:"product_name",//設(shè)置要匹配的列。text:"iphone"http://設(shè)置要匹配的值。getTotalCount:true//結(jié)果中的TotalCount可以表示表中數(shù)據(jù)的總行數(shù),默認(rèn)為false,表示不返回。columnToGet:{//返回列設(shè)置RETURN_SPECIFIED(自定義)、RETURN_ALL(所有列)和RETURN_NONE(不返回)。returnType:TableStore.ColumnReturnType.RETURN_ALL}}}console.log('success:',JSON.stringiclient.search({getTotalCount:false,//結(jié)果中的TotalCount可以表示表中數(shù)據(jù)的總行數(shù),默認(rèn)為false,表示不返回。queryType:TableStore.QueryType.BOOL{queryType:TableStore.QueryType.TERterm:"消十一"{}}columnToGet:{//返回列設(shè)置RETURN_SPECIFIED(自定義)、RETURN_ALL(所有列)和RETUreturnType:TableStore.ColumnReturnType.RETURN_ALL}}console.log('success:',JSON.stringiclient.deleteSearchIndex({tableName:'order',//設(shè)置數(shù)據(jù)表名稱(chēng)。indexName:'order_index'//設(shè)置多元索引名稱(chēng)。}}console.log('success:',data);client.deleteTable(params,funct}console.log('success:',data);場(chǎng)景實(shí)戰(zhàn)基于MySQL+Tablestore分層存儲(chǔ)架構(gòu)的大規(guī)模訂單系統(tǒng)實(shí)踐-架構(gòu)篇背景訂單系統(tǒng)存在于各行各業(yè),如電商訂單、銀行流水、運(yùn)營(yíng)商話(huà)費(fèi)賬單等,是一個(gè)非常廣泛、通用的系統(tǒng)。對(duì)于這類(lèi)系統(tǒng),在過(guò)去十幾年發(fā)展中已經(jīng)形成了經(jīng)典的做法。但是隨著互聯(lián)網(wǎng)的發(fā)展,以及各企業(yè)對(duì)數(shù)據(jù)的重視,需要存儲(chǔ)和持久化的訂單量越來(lái)越大,數(shù)據(jù)的重視程度與數(shù)據(jù)規(guī)模的膨脹帶來(lái)了新的挑戰(zhàn)。首先,訂單量對(duì)于數(shù)據(jù)的存儲(chǔ)、持久化、訪(fǎng)問(wèn)帶來(lái)了挑戰(zhàn),這不僅增加了開(kāi)發(fā)面對(duì)的困難,也為系統(tǒng)的運(yùn)維帶來(lái)了挑戰(zhàn)。其次,隨著大數(shù)據(jù)技術(shù)的發(fā)展以及運(yùn)能力來(lái)處理對(duì)事務(wù)強(qiáng)需求的寫(xiě)操作與部分讀操作;利用Tablestore的檢索能力、大需求場(chǎng)景訂單系統(tǒng),面向C端,除了在系統(tǒng)性能要求高外,對(duì)于數(shù)時(shí)處理、數(shù)據(jù)批處理都有一定的要求。而對(duì)于C端客戶(hù)、產(chǎn)品運(yùn)營(yíng)……l……運(yùn)營(yíng)同學(xué)需要能夠在不影響線(xiàn)上的情況下使用SQL對(duì)實(shí)時(shí)數(shù)據(jù)進(jìn)行分析,能夠根據(jù)非主鍵字段進(jìn)行檢索;他們還需要系統(tǒng)對(duì)流批計(jì)算的支持,需要流式數(shù)據(jù)處理來(lái)進(jìn)行實(shí)時(shí)數(shù)據(jù)統(tǒng)計(jì),需要l系統(tǒng)復(fù)雜度低,不需要維護(hù)多個(gè)集群,也不需要關(guān)注各集群間的傳統(tǒng)訂單系統(tǒng)然會(huì)相當(dāng)具有難度,需要更大的集群以及大量數(shù)據(jù)的遷移工作。數(shù)據(jù)迭代、膨脹帶來(lái)的困擾,多維查詢(xún)、統(tǒng)計(jì)場(chǎng)景。伴隨著訂單數(shù)據(jù)量的增加,用戶(hù)會(huì)采取分庫(kù)、分表方案應(yīng)對(duì),通過(guò)這種偽分布式方案,解決數(shù)據(jù)膨脹帶來(lái)的問(wèn)題。但數(shù)據(jù)一旦達(dá)到瓶頸,便需要重新創(chuàng)建更大規(guī)模的引入雙數(shù)據(jù)的方案應(yīng)運(yùn)而生,通過(guò)實(shí)時(shí)數(shù)據(jù)、歷史數(shù)據(jù)分存的方案,可以一定程度解決數(shù)據(jù)量膨脹問(wèn)題。該方案將數(shù)據(jù)歸類(lèi)成兩部分存儲(chǔ):實(shí)時(shí)數(shù)據(jù)、歷史數(shù)據(jù)。同時(shí)通過(guò)數(shù)據(jù)同步服務(wù),但是,該方案犧牲了歷史訂單數(shù)據(jù)對(duì)用戶(hù)、商家、平臺(tái)的使用價(jià)值,假設(shè)了歷史數(shù)據(jù)的需求頻率極低。但是一旦有需求,便需要全表掃描該方案雖然解決了數(shù)據(jù)膨脹帶來(lái)的擴(kuò)容問(wèn)題,也能夠支持?jǐn)?shù)據(jù)檢索。但可以看到的是,客戶(hù)要維護(hù)至少兩套集群,關(guān)注兩處數(shù)據(jù)同步任務(wù),該方案的系統(tǒng)復(fù)雜度很高,運(yùn)維成本也會(huì)很高。數(shù)據(jù)檢索問(wèn)題,但其系統(tǒng)復(fù)雜,維護(hù)成本高;另外,這種方案無(wú)法對(duì)數(shù)據(jù)分析工作、數(shù)據(jù)再加據(jù)流批處理以及ETL再加工工作,且系統(tǒng)復(fù)雜度低,運(yùn)維成本低,能夠滿(mǎn)足大規(guī)模訂單系統(tǒng)的表格存儲(chǔ)(Tablestore)是阿里云自研的多模型結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ),提供海量結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)以作。這不僅加重了開(kāi)發(fā)者的開(kāi)發(fā)工作,也提高了運(yùn)維難度。在Tablestore中,阿里云提供Tablestore的同步工作。用戶(hù)只需要進(jìn)行少量的開(kāi)發(fā)和配置工作就可以完成數(shù)據(jù)實(shí)時(shí)同步Tablestore提供了二級(jí)索引和多元索引來(lái)支持?jǐn)?shù)據(jù)的檢索。二級(jí)索引可以完成基于主鍵列定義列的數(shù)據(jù)查詢(xún),例如查詢(xún)用戶(hù)過(guò)去一個(gè)月成交的訂單情況。而多元索引,基于倒排索引和列式存儲(chǔ),對(duì)外提供了更加強(qiáng)大的數(shù)據(jù)檢索功能,他解決大數(shù)據(jù)的復(fù)雜查詢(xún)難題。它可以實(shí)現(xiàn)接Spark,可以完成對(duì)全量歷史數(shù)據(jù)的分析工作。這樣,在Tablestore中存儲(chǔ)近期數(shù)據(jù),在總結(jié)基于MySQL+Tablestore分層存儲(chǔ)架構(gòu)的大規(guī)模訂單系統(tǒng)實(shí)踐-數(shù)據(jù)同步DTS篇多款工具可以實(shí)現(xiàn)這一功能,他們有的是開(kāi)源工具如Canal,有的是阿里云端服務(wù)如DTS。下同步工具介紹l可以通過(guò)編程來(lái)進(jìn)行增量同步,但有一定延時(shí),源表需要通過(guò)字段區(qū)分哪些記Canal數(shù)據(jù)傳輸服務(wù)(DataTransmissionService,簡(jiǎn)稱(chēng)DTS)支持關(guān)系型數(shù)據(jù)庫(kù)、NoSQL、大數(shù)據(jù)服務(wù)開(kāi)通CREATECREATETABLE`order_contract`(`oId`varchar(50)NOTNULL,`create_time`datetimeNOTNULLCOMMENT'下單時(shí)間',`pay_time`datetimeDEFAULTNULLCOMMENT'支付時(shí)間',`has_paid`tinyint(4)DEFAULTNULLCOMMENT'是否已經(jīng)支付',`c_id`varchar(20)DEFAULTNULLCOMMENT'消費(fèi)者id',`c_name`varchar(20)DEFAULTNULLCOMMENT'消費(fèi)者姓名',`p_brand`tinytextCOMMENT'產(chǎn)品品牌',`p_count`mediumint(9)DEFAULTNULLCOMMENT'產(chǎn)品數(shù)量',`p_id`varchar(20)DEFAULTNULLCOMMENT'產(chǎn)品id',`p_name`varchar(20)DEFAULTNULLCOMMENT'產(chǎn)品名',`p_price`decimal(16,2)DEFAULTNULLCOMMENT'產(chǎn)品價(jià)格',`s_id`varchar(20)DEFAULTNULLCOMMENT'店鋪id',`s_name`varchar(20)DEFAULTNULLCOMMENT'店鋪名稱(chēng)',`total_price`decimal(16,2)DEFAULTNULLCOMMENT'總價(jià)格',PRIMARYKEY(`oId`);進(jìn)入DTS首頁(yè)。點(diǎn)擊立即購(gòu)買(mǎi)。若有壓測(cè)等需要大量同步記錄的需求,同步鏈路規(guī)格參數(shù)可以適當(dāng)選大,每種鏈路的傳輸數(shù)據(jù)在選擇同步對(duì)象頁(yè),同步初始化這里,結(jié)構(gòu)初始化、全量數(shù)據(jù)初始選項(xiàng)都要進(jìn)行勾選。源庫(kù)對(duì)象,選擇源表order_contract,點(diǎn)擊中間紅框中的按鈕,將表傳送配置完成后,向下滑動(dòng)窗口,點(diǎn)擊“下一步”進(jìn)入高級(jí)配置。繼續(xù)點(diǎn)擊預(yù)檢查并啟動(dòng),進(jìn)行啟數(shù)據(jù)同步測(cè)試c_id為“客戶(hù)1”牌s_idd格式,比如“store1”店鋪名稱(chēng)為“旗艦店1”//創(chuàng)建訂單//創(chuàng)建訂單item.setCreateTime(nowT);itemitem.setPayTime(nowT);item.setHasPaid(truitem.setpCount(count);//商品數(shù)量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();}}用戶(hù)也可以手動(dòng)執(zhí)行SQL插入測(cè)試數(shù)據(jù)。使用下面的存儲(chǔ)過(guò)程可以直接通過(guò)SQL寫(xiě)入測(cè)試數(shù)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("客戶(hù)",userId),CONCAT("品牌",brandId),c,CONCONCAT("產(chǎn)品store",s總結(jié)基于MySQL+Tablestore分層存儲(chǔ)架構(gòu)的大規(guī)模訂單系統(tǒng)實(shí)踐-數(shù)據(jù)同步Canal篇步數(shù)據(jù)。Canal部署簡(jiǎn)單,易于運(yùn)維,且相比于DTS,CREATETABLECREATETABLE`order_contract_canal`(`oId`varchar(50)NOTNULL,`create_time`datetimeNOTNULLCOMMENT'下單時(shí)間',`pay_time`datetimeDEFAULTNULLCOMMENT'支付時(shí)間',`has_paid`tinyint(4)DEFAULTNULLCOMMENT'是否已經(jīng)支付',`c_id`varchar(20)DEFAULTNULLCOMMENT'消費(fèi)者id',`c_name`varchar(20)DEFAULTNULLCOMMENT'消費(fèi)者姓名',`p_brand`tinytextCOMMENT'產(chǎn)品品牌',`p_count`mediumint(9)DEFAULTNULLCOMMENT'產(chǎn)品數(shù)量',`p_id`varchar(20)DEFAULTNULLCOMMENT'產(chǎn)品id',`p_name`varchar(20)DEFAULTNULLCOMMENT'產(chǎn)品名',`p_price`decimal(16,2)DEFAULTNULLCOMMENT'產(chǎn)品價(jià)格',`s_id`varchar(20)DEFAULTNULLCOMMENT'店鋪id',`s_name`varchar(20)DEFAULTNULLCOMMENT'店鋪名稱(chēng)',`total_price`decimal(16,2)DEFAULTNULLCOMMENT'總價(jià)格',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包作為安裝包,該安裝包與官網(wǎng)安裝包部署路徑相同,配置、啟動(dòng)方值是estore說(shuō)明此適配器下游是是是值是是e,則若數(shù)據(jù)同步重試后仍否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#批量提交的大小是是是是是是是是是是否否否全量同步數(shù)據(jù)增量同步數(shù)據(jù)curl"localhost:8081/syncSwitchcurl"localhost:8081/syncSwitchcurl"localhost:8081/syncSwitch/test_ots"curl"localhost:8081/syncSwitch/test_ots"總結(jié)基于MySQL+Tablestore分層存儲(chǔ)架構(gòu)的大規(guī)模訂單系統(tǒng)實(shí)踐-訂單搜索篇背景……l……因此,開(kāi)發(fā)者對(duì)于數(shù)據(jù)庫(kù)在非主鍵查詢(xún)、多列的自由組合查詢(xún)等復(fù)雜查詢(xún)需求上會(huì)有比較高的Tablestore的多元索引,能夠支持此類(lèi)數(shù)據(jù)檢索工作,且具有操作簡(jiǎn)單、維護(hù)成本低等多元索引簡(jiǎn)介T(mén)ablestore的多元索引,底層使用自研索引引擎,基于倒排索引和列式存儲(chǔ),可以支持非列查詢(xún)、全文檢索、前綴查詢(xún)、模糊查詢(xún)、多字段自由組合查詢(xún)、嵌套查詢(xún)、地理位置查詢(xún)和入多元索引。由于這個(gè)異步操作,多元索引中的數(shù)據(jù)相比于基礎(chǔ)表數(shù)據(jù)存在一定延遲,這個(gè)延遲在幾秒到十幾秒的量級(jí)。由圖可以看出,基于主鍵列的讀取會(huì)由基礎(chǔ)表進(jìn)行支持;而多元索引會(huì)承擔(dān)相對(duì)更加復(fù)雜的非主鍵列查詢(xún)、全文檢索、組合查詢(xún)、聚合查詢(xún)等查詢(xún)功能。架構(gòu)實(shí)多元索引創(chuàng)建商品名稱(chēng)(p_name)、客戶(hù)名稱(chēng)(c_name)、賣(mài)家名稱(chēng)(s_name)、商品單價(jià)(p_price)、支付時(shí)間(pay_time)、客戶(hù)id//組裝請(qǐng)求參數(shù)searchQuery.setGetTotaapplierNameQuery.setFieldName("p_braSearchRequestsearchRequest=newSearchRequest("order_contract","order_contract_indsearchRequest.setColumnsToGet(columnsToGet);//進(jìn)行搜索//解析返回?cái)?shù)據(jù)userList.add(r.getColumn("c_id")}}}//組裝請(qǐng)求參數(shù)searchQuery.setGetTotaapplierNameQuery.setFieldName("p_braSearchRequestsearchRequest=newSearchRequest("order_contract","order_contract_indsearchRequest.setColumnsToGet(columnsToGet);//進(jìn)行搜索//解析返回?cái)?shù)據(jù)userList.add(r.getColumn("c_id")}}}//組裝請(qǐng)求參數(shù)searchQuery.setGetTotawildcardQuery.setFieldName("p_name");SearchRequestsearchRequest=newSearchRequest("order_contract","order_contract_indsearchRequest.setColumnsToGet(columnsToGet);//進(jìn)行搜索//解析返回?cái)?shù)據(jù)userList.add(r.getColumn("c_id")}}}除了上文提到的查詢(xún)方式外,多元索引還支持許多豐富的查詢(xún)方式,例如模糊查詢(xún)、地理位置l多元索引不需要遵守最左匹配原則,可以一張索引支持所有需求。而JAVA中訪(fǎng)問(wèn)Tablestore代碼如下,執(zhí)行時(shí)間秒級(jí)。.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")//進(jìn)行搜索總結(jié)Tablestore的多元索引功能對(duì)類(lèi)似海量訂單場(chǎng)景下的搜索功能提供了較好的支持。使用多基于MySQL+Tablestore分層存儲(chǔ)架構(gòu)的大規(guī)模訂單系統(tǒng)實(shí)踐-SQL查詢(xún)和分析total_priceDOUBLE,selectcount(*),s_idfromorder_contractwherepay_time>1628784000000groupbys_idorde性能比較因此在復(fù)雜組合檢索條件下,可能需要構(gòu)建很多索引表才能夠滿(mǎn)足檢索需求,這不僅會(huì)占用很金額在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統(tǒng)計(jì)某用戶(hù)2022000元以上的訂單,按支付時(shí)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日零點(diǎn)以selectoId,c_id,s_id,tottotal_price,c_name,來(lái)成交額在999ice,c_name,p_brand,pay_tip_brand,pay_time,5元以上,且商品品牌中包含特定關(guān)鍵字的訂wheretotal_pricce,total_price,pay單,按商品單價(jià)倒序排列取前1_time建有聯(lián)合索MySQL中建立_price,pay_ti此類(lèi)需求在訂單系統(tǒng)的報(bào)表工作、數(shù)據(jù)分析、運(yùn)營(yíng)推廣當(dāng)中會(huì)非常常見(jiàn),主要考驗(yàn)數(shù)據(jù)庫(kù)對(duì)聚表格中列舉了三種依賴(lài)聚合操作的場(chǎng)景,對(duì)于每種場(chǎng)景,給出了各SQL語(yǔ)句以及運(yùn)行時(shí)間。Q實(shí)環(huán)境當(dāng)中,很難像這里的三個(gè)場(chǎng)景都建立了恰當(dāng)?shù)乃饕?,甚至并不?huì)建立類(lèi)似于pay_time,加糟糕。多元索引不需遵守最左匹配原則,可以以一份索引覆蓋所有列,因此也不存在回表問(wèn)鋪成交訂單selects_id,countMySQL建有pay_tim回表。時(shí)間范圍內(nèi)記錄鋪成交訂單fromorder_contractwherselects_id,count(*),sum(total_price)a執(zhí)行時(shí)間在一個(gè)小時(shí)MySQL建有pay_tim回表。時(shí)間范圍內(nèi)記錄SELECTc_id,sum(toSELECTc_id,sum(total_prital_price)asaFROMySQL建有pay_time,c_id,total_price的聯(lián)合索引,無(wú)需回表。時(shí)間范圍內(nèi)記錄數(shù)約1總結(jié)基于MySQL+Tablestore分層存儲(chǔ)架構(gòu)的大規(guī)模訂單系統(tǒng)實(shí)踐-基于DLA的聯(lián)邦查詢(xún)?cè)谟唵蜗到y(tǒng)中,基于訂單數(shù)據(jù)對(duì)客戶(hù)和商家商品進(jìn)行畫(huà)像分析是一種常見(jiàn)的需求。常見(jiàn)的分析l根據(jù)非主鍵列、分區(qū)鍵的條件組合檢索工作,例如查詢(xún)過(guò)去一天異常訂單列表、查詢(xún)過(guò)l即使采用了分布式的MySQL框架解決了數(shù)據(jù)存儲(chǔ)和一些簡(jiǎn)單查詢(xún)上的索引能力會(huì)非常差,一般情況下,分布式MySQL架構(gòu)會(huì)采用多數(shù)據(jù)備份的方式支持不同的分區(qū)鍵,但畫(huà)像分析、數(shù)據(jù)檢索場(chǎng)景可能涉及到需要進(jìn)行檢索的字段非常多,采用多數(shù)Q其中l(wèi)i_s1831126559450753為文create_timeString,has_paidint,s_idString,s_nameString,total_pricedoub

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論