數(shù)據(jù)庫遷移流程:
遷移前:遷移評(píng)估
遷移中:結(jié)構(gòu)遷移 數(shù)據(jù)遷移 數(shù)據(jù)校驗(yàn) 流量切割 業(yè)務(wù)驗(yàn)證 反向回滾
遷移后:壓測(cè) 巡檢
架構(gòu)思考
交互層:
產(chǎn)品模塊:數(shù)據(jù)遷移,數(shù)據(jù)訂閱,數(shù)據(jù)同步
通用服務(wù):用戶管理,權(quán)限管理,審核,基本任務(wù)信息管理,變更管理
核心設(shè)計(jì):任務(wù)的流程:創(chuàng)建,啟動(dòng),停止,釋放,審核,健全
控制層:
運(yùn)維:監(jiān)控,啟停,擴(kuò)容
引擎層:
數(shù)據(jù)遷移:Datax
數(shù)據(jù)訂閱:canal
數(shù)據(jù)同步:otter
其他參考:dbswitch,flink cdc
一、 dbswitch (https://gitee.com/dromara/dbswitch)
1、 工具介紹
功能描述
一句話,dbswitch工具提供源端數(shù)據(jù)庫向目的端數(shù)據(jù)庫的批量遷移同步功能,支持?jǐn)?shù)據(jù)的全量和增量方式同步。包括:
結(jié)構(gòu)遷移
支持字段類型、主鍵信息、建表語句等的轉(zhuǎn)換,并生成建表SQL語句。
支持基于正則表達(dá)式轉(zhuǎn)換的表名與字段名映射轉(zhuǎn)換。
數(shù)據(jù)同步。
基于JDBC的分批次讀取源端數(shù)據(jù)庫數(shù)據(jù),并基于insert/copy方式將數(shù)據(jù)分批次寫入目的數(shù)據(jù)庫。
支持有主鍵表的?增量變更同步?(變化數(shù)據(jù)計(jì)算Change Data Calculate)功能(千萬級(jí)以上數(shù)據(jù)量的性能尚需在生產(chǎn)環(huán)境驗(yàn)證)
2、 一鍵安裝部署
curl -sSL https://gitee.com/dromara/dbswitch/attach_files/1696955/download > /tmp/dbswitch_install.sh && bash /tmp/dbswitch_install.sh
3、登錄(基于web方式)
http://10.0.71.39:9088/#/dashboard
密碼 admin/123456
4、基于配置文件使用方式
dbswitch工具提供基于conf/config.yml配置的dbswitch-data模塊啟動(dòng)方式和基于conf/application.yml的dbswitch-admin模塊的WEB端使用方式;
1) 配置文件
配置文件信息請(qǐng)見部署包中的:conf/config.yml
(注:也同時(shí)支持使用conf/config.properties
配置文件名的properties格式),示例配置如下:
dbswitch:
source:
# source database connection information
## support multiple source database connection
url: jdbc:oracle:thin:@172.17.2.10:1521:ORCL
driver-class-name: 'oracle.jdbc.driver.OracleDriver'
driver-path: D:/Workspace/dbswitch/driver/oracle/oracle-12c
username: 'system'
password: '123456'
# source database configuration parameters
## fetch size for query source database
fetch-size: 10000
## schema name for query source schemas, separate by ','
source-schema: 'TANG'
## table type which include or exclude,option: TABLE,VIEW
table-type: 'TABLE'
## table name include from table lists, separate by ','
source-includes: ''
## table name exclude from table lists, separate by ','
source-excludes: ''
## table name convert mapper by regular expression
regex-table-mapper:
- from-pattern: '^'
to-value: 'T_'
## columns name convert mapper by regular expression like regex-table-mapper
regex-column-mapper:
target:
# target database connection information
## Best support for Oracle/PostgreSQL/Greenplum/DM(But not is Hive) etc.
url: jdbc:postgresql://172.17.2.10:5432/test
driver-class-name: org.postgresql.Driver
driver-path: D:/Workspace/dbswitch/driver/postgresql/postgresql-11.4
username: test
password: 123456
# target database configuration parameters
## schema name for create/insert table data
target-schema: public
## table name to uppper case, option: UPPER,LOWER,NONE
table-name-case: UPPER
## column name to uppper case, option: UPPER,LOWER,NONE
column-name-case: UPPER
## whether drop-create table when target table exist
target-drop: true
## whether create table support auto increment for primary key field
create-table-auto-increment: false
## whether use insert engine to write data for target database
## Only useful for PostgreSQL/Greenplum database
writer-engine-insert: false
## whether use change data synchronize to target database table
change-data-sync: true
配置參數(shù) | 配置說明 | 示例 | 備注 |
---|---|---|---|
dbswitch.source.url | 來源端JDBC連接的URL | jdbc:oracle:thin:@10.17.1.158:1521:ORCL | 可為:oracle/mysql/mariadb/sqlserver/postgresql/db2/dm/kingbase8/highgo |
dbswitch.source.driver-class-name | 來源端數(shù)據(jù)庫的驅(qū)動(dòng)類名稱 | oracle.jdbc.driver.OracleDriver | 對(duì)應(yīng)數(shù)據(jù)庫的驅(qū)動(dòng)類 |
dbswitch.source.driver-path | 來源端數(shù)據(jù)庫的驅(qū)動(dòng)JAR所在目錄 | D:/Workspace/dbswitch/driver/oracle/oracle-12c | 對(duì)應(yīng)數(shù)據(jù)庫的驅(qū)動(dòng)JAR所在目錄 |
dbswitch.source.username | 來源端連接帳號(hào)名 | test | 無 |
dbswitch.source.password | 來源端連接帳號(hào)密碼 | 123456 | 無 |
dbswitch.source.fetch-size | 來源端數(shù)據(jù)庫查詢時(shí)的fetch_size設(shè)置 | 10000 | 需要大于100有效 |
dbswitch.source.source-schema | 來源端的schema名稱 | dbo,test | 多個(gè)之間用英文逗號(hào)分隔 |
dbswitch.source.table-type | 來源端表的類型 | TABLE | 可選值為:TABLE、VIEW ,分別代表物理表和試圖表 |
dbswitch.source.source-includes | 來源端schema下的表中需要包含的表名稱 | users1,orgs1 | 支持多個(gè)表(多個(gè)之間用英文逗號(hào)分隔);支持支持正則表達(dá)式(不能含有逗號(hào)) |
dbswitch.source.source-excludes | 來源端schema下的表中需要過濾的表名稱 | users,orgs | 不包含的表名稱,多個(gè)之間用英文逗號(hào)分隔 |
dbswitch.source.regex-table-mapper | 基于正則表達(dá)式的表名稱映射關(guān)系 | [{“from-pattern”: “^”,“to-value”: “T_”}] | 為list類型,元素存在順序關(guān)系 |
dbswitch.source.regex-column-mapper | 基于正則表達(dá)式的字段名映射關(guān)系 | [{“from-pattern”: “$”,“to-value”: “_x”}] | 為list類型,元素存在順序關(guān)系 |
dbswitch.target.url | 目的端JDBC連接的URL | jdbc:postgresql://10.17.1.90:5432/study | 可為:oracle/sqlserver/postgresql/greenplum,mysql/mariadb/db2/dm/kingbase8/highgo也支持,但字段類型兼容性問題比較多 |
dbswitch.target.driver-class-name | 目的端數(shù)據(jù)庫的驅(qū)動(dòng)類名稱 | org.postgresql.Driver | 對(duì)應(yīng)數(shù)據(jù)庫的驅(qū)動(dòng)類 |
dbswitch.target.driver-path | 目的端數(shù)據(jù)庫的驅(qū)動(dòng)JAR所在目錄 | D:/Workspace/dbswitch/driver/postgresql/postgresql-11.4 | 對(duì)應(yīng)數(shù)據(jù)庫的驅(qū)動(dòng)JAR所在目錄 |
dbswitch.target.username | 目的端連接帳號(hào)名 | test | 無 |
dbswitch.target.password | 目的端連接帳號(hào)密碼 | 123456 | 無 |
dbswitch.target.target-schema | 目的端的schema名稱 | public | 目的端的schema名稱只能有且只有一個(gè) |
dbswitch.target.table-name-case | 表名大小寫轉(zhuǎn)換策略 | UPPER | 可選值為: UPPER,LOWER,NONE |
dbswitch.target.column-name-case | 列名大小寫轉(zhuǎn)換策略 | UPPER | 可選值為: UPPER,LOWER,NONE |
dbswitch.target.target-drop | 是否執(zhí)行先drop表然后create表命令,當(dāng)target.datasource-target.drop=true時(shí)有效 | true | 可選值為:true、false |
dbswitch.target.create-table-auto-increment | 是否執(zhí)啟用支持create表時(shí)主鍵自增 | true | 可選值為:true、false |
dbswitch.target.writer-engine-insert | 是否使用insert寫入數(shù)據(jù) | false | 可選值為:true為insert寫入、false為copy寫入,只針對(duì)目的端數(shù)據(jù)庫為PostgreSQL/Greenplum的有效 |
dbswitch.target.change-data-sync | 是否啟用增量變更同步,dbswitch.target.target-drop為false時(shí)且表有主鍵情況下有效,千萬級(jí)以上數(shù)據(jù)量建議設(shè)為false | false | 可選值為:true、false |
注意: | |||
(1)如果dbswitch.source.source-includes不為空,則按照包含表的方式來執(zhí)行; | |||
(2)如果dbswitch.source.source-includes為空,則按照dbswitch.source.source-excludes排除表的方式來執(zhí)行。 | |||
(3)如果dbswitch.target.target-drop=false,dbswitch.target.change-data-synch=true;時(shí)會(huì)對(duì)有主鍵表啟用增量變更方式同步 | |||
(4)對(duì)于regex-table-mapper和regex-column-mappe,為基于正則表達(dá)式替換的表名映射和字段名映射,均可以為空(代表原名映射,即源的表t_a映射到目的端也為t_a) | |||
提示:如果要將源端所有表名(或者字段名)添加前綴,可以配置"from-pattern": “^”,“to-value”: “T_”; | |||
(5)支持的數(shù)據(jù)庫產(chǎn)品及其JDBC驅(qū)動(dòng)連接示例如下: |
MySQL/MariaDB數(shù)據(jù)庫
jdbc連接地址:jdbc:mysql://172.17.2.10:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai&tinyInt1isBit=false&rewriteBatchedStatements=true&useCompression=true
jdbc驅(qū)動(dòng)名稱: com.mysql.jdbc.Driver
與:
jdbc連接地址:jdbc:mariadb://172.17.2.10:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai&tinyInt1isBit=false&rewriteBatchedStatements=true&useCompression=true
jdbc驅(qū)動(dòng)名稱: org.mariadb.jdbc.Driver
Oracle數(shù)據(jù)庫
jdbc連接地址:jdbc:oracle:thin:@172.17.2.10:1521:ORCL 或 jdbc:oracle:thin:@//172.17.2.10:1521/ORCL
jdbc驅(qū)動(dòng)名稱:oracle.jdbc.driver.OracleDriver
SQL Server(>=2005)數(shù)據(jù)庫
jdbc連接地址:jdbc:sqlserver://172.17.2.10:1433;DatabaseName=test
jdbc驅(qū)動(dòng)名稱:com.microsoft.sqlserver.jdbc.SQLServerDriver
Sybase數(shù)據(jù)庫
jdbc連接地址:jdbc:sybase:Tds:172.17.2.10:5000/test?charset=cp936
jdbc驅(qū)動(dòng)名稱:com.sybase.jdbc4.jdbc.SybDriver
JDBC連接Sybase數(shù)據(jù)庫使用中文時(shí)只能使用CP936這個(gè)字符集
PostgreSQL/Greenplum數(shù)據(jù)庫
jdbc連接地址:jdbc:postgresql://172.17.2.10:5432/test
jdbc驅(qū)動(dòng)名稱:org.postgresql.Driver
DB2數(shù)據(jù)庫
jdbc連接地址:jdbc:db2://172.17.2.10:50000/testdb:driverType=4;fullyMaterializeLobData=true;fullyMaterializeInputStreams=true;progressiveStreaming=2;progresssiveLocators=2;
jdbc驅(qū)動(dòng)名稱:com.ibm.db2.jcc.DB2Driver
達(dá)夢(mèng)DM數(shù)據(jù)庫
jdbc連接地址:jdbc:dm://172.17.2.10:5236
jdbc驅(qū)動(dòng)名稱:dm.jdbc.driver.DmDriver
人大金倉Kingbase8數(shù)據(jù)庫
jdbc連接地址:jdbc:kingbase8://172.17.2.10:54321/MYTEST
jdbc驅(qū)動(dòng)名稱:com.kingbase8.Driver
神通Oscar數(shù)據(jù)庫
jdbc連接地址:jdbc:oscar://172.17.2.10:2003/OSRDB
jdbc驅(qū)動(dòng)名稱:com.oscar.Driver
南大通用GBase8a數(shù)據(jù)庫
jdbc連接地址:jdbc:gbase://172.17.2.10:5258/gbase
jdbc驅(qū)動(dòng)名稱:com.gbase.jdbc.Driver
翰高HighGo數(shù)據(jù)庫(可按PostgreSQL使用)
jdbc連接地址:jdbc:highgo://172.17.2.10:5866/highgo
jdbc驅(qū)動(dòng)名稱:com.highgo.jdbc.Driver
Apache Hive數(shù)據(jù)庫
jdbc連接地址:jdbc:hive2://172.17.2.12:10000/default
jdbc驅(qū)動(dòng)名稱:org.apache.hive.jdbc.HiveDriver
注意:當(dāng)前只支持hive version 3.x的賬號(hào)密碼認(rèn)證方式。
OpenGauss數(shù)據(jù)庫
jdbc連接地址:jdbc:opengauss://172.17.2.10:5866/test
jdbc驅(qū)動(dòng)名稱:org.opengauss.Driver
ClickHouse數(shù)據(jù)庫
jdbc連接地址:jdbc:clickhouse://172.17.2.10:8123/default
jdbc驅(qū)動(dòng)名稱:com.clickhouse.jdbc.ClickHouseDriver
SQLite數(shù)據(jù)庫
jdbc連接地址:jdbc:sqlite:/tmp/test.db 或者 jdbc:sqlite::resource:http://172.17.2.12:8080/test.db
jdbc驅(qū)動(dòng)名稱:org.sqlite.JDBC
注意:
(a) 本地文件方式:jdbc:sqlite:/tmp/test.db , 該方式適用于dbswitch為實(shí)體機(jī)器部署的場(chǎng)景。
(b) 遠(yuǎn)程文件方式: jdbc:sqlite::resource:http://172.17.2.12:8080/test.db ,該方式適用于容器方式部署的場(chǎng)景, 搭建文件服務(wù)器的方法可使 用如下docker方式快速部署(/home/files為服務(wù)器上存放sqlite數(shù)據(jù)庫文件的目錄):
docker run -d --name http_file_server -p 8080:8080 -v /home/files:/data inrgihc/http_file_server:latest
說明:遠(yuǎn)程服務(wù)器文件將會(huì)被下載到本地System.getProperty(“java.io.tmpdir”)所指定的目錄下(linux為/tmp/,Windows為C:/temp/),并以 sqlite-jdbc-tmp-{XXX}.db的方式進(jìn)行文件命名,其中{XXX}為文件網(wǎng)絡(luò)地址(例如上述為http://192.168.31.57:8080/test.db) 的字符串哈希值, 如果本地文件已經(jīng)存在則不會(huì)再次進(jìn)行下載而是直接使用該文件(當(dāng)已經(jīng)下載過文件后,遠(yuǎn)程服務(wù)器即使關(guān)閉了,該sqlite的jdbc-url任然可 用,直至本地的sqlite-jdbc-tmp-XXX.db文件被人為手動(dòng)刪除)
? 不支持內(nèi)存及其他方式;本地文件方式可以作為源端和目的端,而遠(yuǎn)程服務(wù)器方式只能作為源端。
(d) SQLite為單寫多讀方式,禁止人為方式造成多寫導(dǎo)致鎖表。
MongoDB數(shù)據(jù)庫
jdbc連接地址:jdbc:mongodb://172.17.2.12:27017/admin?authSource=admin&authMechanism=SCRAM-SHA-1
jdbc驅(qū)動(dòng)名稱:com.gitee.jdbc.mongodb.JdbcDriver
ElasticSearch數(shù)據(jù)庫
jdbc連接地址:jdbc:jest://172.17.2.12:9200?useHttps=false
jdbc驅(qū)動(dòng)名稱:com.gitee.jdbc.elasticsearch.JdbcDriver
2) 啟動(dòng)方法
linux系統(tǒng)下:
cd dbswitch-release-X.X.X/
bin/datasync.sh
windows系統(tǒng)下:
切換到dbswitch-release-X.X.X/bin/目錄下,雙擊datasync.cmd腳本文件即可啟動(dòng)
3) 額外說明
1)對(duì)于向目的庫為PostgreSQL/Greenplum的數(shù)據(jù)離線同步默認(rèn)采用copy方式寫入數(shù)據(jù),說明如下:
(a) 如若使用copy方式寫入,配置文件中需配置為postgresql的jdbc url和驅(qū)動(dòng)類(不能為greenplum的驅(qū)動(dòng)包),
(b) 如若使用insert方式寫入,需要在config.properties配置文件中設(shè)置如下參數(shù)為true:
dbswitch.target.writer-engine-insert=true
2)dbswitch離線同步工具支持的數(shù)據(jù)類型包括:整型、時(shí)間、文本、二進(jìn)制等常用數(shù)據(jù)類型;
3)Oracle的表雖然設(shè)置了主鍵,如果主鍵約束實(shí)際為DISABLED狀態(tài),那在進(jìn)行結(jié)構(gòu)轉(zhuǎn)換時(shí)會(huì)按照沒有此主鍵處理。
4)關(guān)于增量變更同步方式的使用說明
步驟A:先通過設(shè)置dbswitch.target.target-drop=true,dbswitch.target.change-data-sync=false;啟動(dòng)程序進(jìn)行表結(jié)構(gòu)和數(shù)據(jù)的全量同步;
步驟B:然后設(shè)置dbswitch.target.target-drop=false,dbswitch.target.change-data-sync=true;再啟動(dòng)程序?qū)Γㄓ兄麈I表)數(shù)據(jù)進(jìn)行增量變更同步。
注:如果待同步的兩端表結(jié)構(gòu)已經(jīng)一致或源端字段是目的端字段的子集,也可直接用步驟B配置進(jìn)行變更同步
二、TIS數(shù)據(jù)同步
1、 簡(jiǎn)介
實(shí)時(shí)ETL數(shù)倉
TIS的愿景是實(shí)現(xiàn)企業(yè)大數(shù)據(jù)ETL(Extraction-Transformation-Loading)全覆蓋的中臺(tái)產(chǎn)品,數(shù)據(jù)抽?。‥xtraction)是大數(shù)據(jù)處理所有環(huán)節(jié)中的第一步,也是最重要的環(huán)節(jié)。
最新版本的TIS數(shù)據(jù)抽取組件是基于:
- Alibaba DataX,并且在原生DataX之上添加了功能特性大大提高了DataX的可用性
- 實(shí)時(shí)數(shù)據(jù)同步框架Flink-CDC和Chunjun
![[Pasted image 20240410160903.png]]
當(dāng)業(yè)務(wù)分析場(chǎng)景中只需要T+1的數(shù)據(jù)報(bào)表分析,則只需要開啟基于DataX的批量數(shù)據(jù)同步功能。如需要啟用實(shí)時(shí)OLAP數(shù)據(jù)分析功能,則需要開啟基于Flink的實(shí)時(shí)數(shù)據(jù)同步功能。
2、 功能特性
基于Web UI的開箱即用
TIS基于ng-zorro-antd?UI組件開發(fā)了一套覆蓋DataX 任務(wù)定義、執(zhí)行、更新等生命周期的流程實(shí)現(xiàn),讓用戶輕松點(diǎn)擊鼠標(biāo),讓各種類型的數(shù)據(jù)在個(gè)端之間暢通無阻。
系統(tǒng)中提供了各種校驗(yàn)及錯(cuò)誤提示機(jī)制,讓用戶不需要直接編輯DataX JSON格式的腳本,而是,TIS系統(tǒng)自動(dòng)生成DataX JSON配置腳本。因此,大大避免了原生DataX配置目繁雜帶來的不必要的錯(cuò)誤。
支持分布式任務(wù)分發(fā)
原生開源版DataX解決方案是單機(jī)執(zhí)行的,由于單節(jié)點(diǎn)執(zhí)行任務(wù)吞吐量的限制,需要對(duì)DataX進(jìn)行二次開發(fā)才能在生產(chǎn)環(huán)境中部署。
TIS支持單節(jié)點(diǎn)
和分布式
兩種任務(wù)執(zhí)行模式。分布式
模式基于ZK的Curator分布式任務(wù)隊(duì)列實(shí)現(xiàn)Master-Slaver模式,由K8S容器中的Slaver節(jié)點(diǎn)來消費(fèi)任務(wù)。
全新的基于微內(nèi)核的運(yùn)行環(huán)境
按照DataX UserGuid介紹,為了運(yùn)行DataX需要在本地部署多個(gè)組件,對(duì)于普通小白用戶來說有一定門檻。
TIS采用微內(nèi)核的架構(gòu)設(shè)計(jì),參照J(rèn)enkins的插件架構(gòu)體系,初始安裝包只有300兆。運(yùn)行時(shí)根據(jù)需要,在控制臺(tái)中輕點(diǎn)鼠標(biāo),動(dòng)態(tài)加載具體的DataX Plugin(Reader/Writer)。
對(duì)于企業(yè)級(jí)大數(shù)據(jù)中臺(tái)產(chǎn)品內(nèi)部會(huì)有非常多的組件,但是用戶只會(huì)用到部分組件,采用微內(nèi)核按需加載的方式會(huì)帶來非常多的好處。
**功能覆蓋DataX大部分(Reader/Writer)Plugin
- 最新版本已經(jīng)支持了DataX官方大部分核心Reader/Writer插件,其他插件將會(huì)在后續(xù)版本中添加。
- 新版本額外添加了對(duì)TiDB Reader Plugin支持
重構(gòu)DataX的Classloader
重構(gòu)DataX默認(rèn)ClassLoadercom.alibaba.datax.core.util.container.JarLoader
,對(duì)其功能嫁接到了TIS的com.qlangtech.tis.datax.TISJarLoader
之上,實(shí)現(xiàn)了基于TIS平臺(tái)可視化的插件加載機(jī)制,提升了用戶體驗(yàn)。
支持RDBMS類型的Writer自動(dòng)生成目標(biāo)表
部分RDMS類型的Writer數(shù)據(jù)源如MySQL,Clickhouse等系統(tǒng)實(shí)現(xiàn)了通過反射Reader數(shù)據(jù)源的Meta信息,自動(dòng)生成Writer Plugin對(duì)應(yīng)的目標(biāo)數(shù)據(jù)表,免去了手動(dòng)創(chuàng)建Writer目標(biāo)表的DDL語句。
支持Hive
,Spark
表自動(dòng)創(chuàng)建,自動(dòng)添加Partition(基于日期的)
簡(jiǎn)化DataX部署方式:
原生DataX部署方案要求,需要在本地環(huán)境中支持Python運(yùn)行環(huán)境DataX UserGuid,根據(jù)以往經(jīng)驗(yàn),Python運(yùn)行環(huán)境的各種問題,常常導(dǎo)致DataX腳本無法正常執(zhí)行,其實(shí)Python只是起到了DataX命令行參數(shù)的傳遞的作用。 所以在TIS的DataX整合方案中已經(jīng)將Pyhton環(huán)境部署的環(huán)節(jié)去除掉了,這樣一來提高了DataX運(yùn)行穩(wěn)定性。
該部分待測(cè)
二、 數(shù)據(jù)庫結(jié)構(gòu)導(dǎo)入
mysqldump
三、數(shù)據(jù)結(jié)構(gòu)對(duì)比
mysqldiff
DBCompare --功能很雞肋
結(jié)構(gòu)修復(fù)
四、記錄數(shù)對(duì)比
mysqldbcompare
pt-table-checksum
pt-table-checksum
一致性修復(fù)
pt-table-sync
五、 增量同步
canal
flink cdc文章來源:http://www.zghlxwxcb.cn/news/detail-849304.html
六、其他功能文章來源地址http://www.zghlxwxcb.cn/news/detail-849304.html
到了這里,關(guān)于數(shù)據(jù)庫遷移平臺(tái)構(gòu)思001的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!