一、 MogDB
1. 什么是MogDB
- MogDB是云和恩墨基于openGauss開源數據庫的內核進行研發,推出的一款極致易用的企業級關系型數據庫。MogDB具備金融級高可用和全密態計算的極致安全、面向多核處理器的極致性能、AI自診斷調優的極致智能能力,能夠滿足從核心交易到復雜計算的企業級業務需求。
- 云和恩墨致力于發揮全棧產品加服務的企業優勢,優先支持鯤鵬算力,在 MogDB 的運行平臺、管理工具、SQL審核和運維服務等方向推出整體解決方案,為用戶提供可信賴的企業級產品和服務,為 openGauss 的開源生態持續貢獻力量。
2. 適用場景
- 大并發、大數據量、以聯機事務處理為主的交易型應用場景,如電商、金融、O2O、電信CRM/計費等,應用可按需選擇不同的主備部署模式。
- 在工業監控與遠程控制、智慧城市能力延展、智能家居、車聯網等物聯網應用場景下,傳感設備多、采樣率高、數據存儲為追加模型,滿足操作和分析并重的要求。
二、 ShardingSphere
1. 什么是ShardingSphere
- Apache ShardingSphere 是一套開源的分布式數據庫解決方案組成的生態圈,它由 JDBC、Proxy 和 Sidecar(規劃中)這 3 款既能夠獨立部署,又支持混合部署配合使用的產品組成。 它們均提供標準化的數據水平擴展、分布式事務和分布式治理等功能,可適用于如 Java 同構、異構語言、云原生等各種多樣化的應用場景。
2. 適用場景
-
Apache ShardingSphere 旨在充分合理地在分布式的場景下利用關系型數據庫的計算和存儲能力,而并非實現一個全新的關系型數據庫。 關系型數據庫當今依然占有巨大市場份額,是企業核心系統的基石,未來也難于撼動,我們更加注重在原有基礎上提供增量,而非顛覆。
-
Apache ShardingSphere 5.x 版本開始致力于可插拔架構,項目的功能組件能夠靈活的以可插拔的方式進行擴展。 目前,數據分片、讀寫分離、數據加密、影子庫壓測等功能,以及 MySQL、PostgreSQL、SQLServer、Oracle 等 SQL 與協議的支持,均通過插件的方式織入項目。 開發者能夠像使用積木一樣定制屬于自己的獨特系統。Apache ShardingSphere 目前已提供數十個 SPI 作為系統的擴展點,仍在不斷增加中。
3. 開源數字
- ShardingSphere 已于2020年4月16日成為 Apache 軟件基金會的頂級項目。
- 星評增長時間線

- 貢獻者增長時間線

4. 架構圖

5. ShardingSphere Proxy
- 定位為透明化的數據庫代理端,提供封裝了數據庫二進制協議的服務端版本,用于完成對異構語言的支持。 目前提供 MySQL 和 PostgreSQL(兼容 openGauss 等基于 PostgreSQL 的數據庫)版本,它可以使用任何兼容 MySQL/PostgreSQL 協議的訪問客戶端(如:MySQL Command Client, MySQL Workbench, Navicat 等)操作數據,對 DBA 更加友好。
- 向應用程序完全透明,可直接當做 MySQL/PostgreSQL 使用。
- 適用于任何兼容 MySQL/PostgreSQL 協議的的客戶端。

三、如何聯動
1. 概述
- 通過ShardingSphere的Proxy功能作為MogDB數據庫的代理端進行數據的轉發分片和流轉。
- 本文通過TPCC標準程序BenchmarkSQL5.0作為模擬應用的壓力發起程序。
- 通過ShardingSphere的功能可以具備分布式數據庫的能力。
2. 架構圖

四、安裝數據庫
1. 安裝
- 安裝兩個單機數據庫,數據庫安裝參考 http://www.sunline.cc/db/70779
五、配置ShardingSphere
1. 安裝JAVA JDK
[root@db1 lee]# yum install java* -y
[root@db1 lee]# tail -3 ~/.bashrc
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.h5.oe1.aarch64
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME
2. 編譯
[root@db1 lee]# git clone https://github.com/apache/shardingsphere.git
[root@db1 lee]# cd shardingsphere-master
[root@db1 shardingsphere-master]# nohup ./mvnw clean install -DskipTests -Prelease -T1C -Djacoco.skip=true -Dcheckstyle.skip=true -DskipITs -Drat.skip=true -Dmaven.javadoc.skip=true -B &
[root@db1 shardingsphere-master]# tail -20 nohup.out
[INFO] shardingsphere-integration-agent-test-plugins ...... SUCCESS [ 0.492 s]
[INFO] shardingsphere-integration-agent-test-common ....... SUCCESS [ 1.173 s]
[INFO] shardingsphere-integration-agent-test-metrics ...... SUCCESS [ 2.401 s]
[INFO] shardingsphere-integration-agent-test-zipkin ....... SUCCESS [ 2.285 s]
[INFO] shardingsphere-integration-agent-test-jaeger ....... SUCCESS [ 2.285 s]
[INFO] shardingsphere-integration-agent-test-opentelemetry SUCCESS [ 2.425 s]
[INFO] shardingsphere-integration-scaling-test ............ SUCCESS [ 1.020 s]
[INFO] shardingsphere-integration-scaling-test-mysql ...... SUCCESS [ 2.379 s]
[INFO] shardingsphere-rewrite-test ........................ SUCCESS [ 1.112 s]
[INFO] shardingsphere-optimize-test ....................... SUCCESS [ 0.927 s]
[INFO] shardingsphere-distribution ........................ SUCCESS [ 0.421 s]
[INFO] shardingsphere-src-distribution .................... SUCCESS [ 5.154 s]
[INFO] shardingsphere-jdbc-distribution ................... SUCCESS [ 1.845 s]
[INFO] shardingsphere-proxy-distribution .................. SUCCESS [ 7.516 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:28 min (Wall Clock)
[INFO] Finished at: 2021-10-29T11:36:59+08:00
[INFO] ------------------------------------------------------------------------
[root@db1 target]# pwd
/lee/shardingsphere-master/shardingsphere-distribution/shardingsphere-proxy-distribution/target
[root@db1 target]# ls
apache-shardingsphere-5.0.0-RC1-SNAPSHOT-shardingsphere-proxy-bin.tar.gz archive-tmp
apache-shardingsphere-5.0.0-RC1-SNAPSHOT-shardingsphere-proxy-bin.tar.gz.sha512 maven-shared-archive-resources
[root@db1 target]# mv apache-shardingsphere-5.0.0-RC1-SNAPSHOT-shardingsphere-proxy-bin.tar.gz proxy.tar.gz
[root@db1 target]# cp proxy.tar.gz /lee/ss/
apache-shardingsphere-5.0.0-RC1-SNAPSHOT-shardingsphere-proxy-bin.tar.gz 為proxy程序。
3. 修改配置文件
文件過長注釋部分已經省略
- 主配置文件
[root@db1 conf]# cat server.yaml
rules:
- !AUTHORITY
users:
- root@%:root
- sharding@:sharding
provider:
type: ALL_PRIVILEGES_PERMITTED
props:
max-connections-size-per-query: 2
proxy-frontend-flush-threshold: 128 # The default value is 128.
proxy-backend-query-fetch-size: 1000
-
users部分為ShardingSphere的賬號密碼,屬于ShardingSphere的對象和數據庫對象無關。
-
分片文件
[root@db1 conf]# cat config-sharding.yaml
schemaName: tpcc
dataSources:
ds_0:
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 3000
minPoolSize: 1
password: tpcc@123
url: jdbc:postgresql://192.168.2.157:26000/tpcc?serverTimezone=UTC&useSSL=false&loggerLevel=OFF
username: tpcc
ds_1:
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 3000
minPoolSize: 1
password: tpcc@123
url: jdbc:postgresql://192.168.2.158:26000/tpcc?serverTimezone=UTC&useSSL=false&loggerLevel=OFF
username: tpcc
rules:
- !SHARDING
bindingTables:
- bmsql_warehouse, bmsql_customer
- bmsql_stock, bmsql_district, bmsql_order_line
defaultDatabaseStrategy:
none:
defaultTableStrategy:
none:
keyGenerators:
snowflake:
props:
worker-id: 123
type: SNOWFLAKE
tables:
bmsql_config:
actualDataNodes: ds_0.bmsql_config
bmsql_warehouse:
actualDataNodes: ds_${0..1}.bmsql_warehouse
databaseStrategy:
standard:
shardingColumn: w_id
shardingAlgorithmName: bmsql_warehouse_database_inline
bmsql_district:
actualDataNodes: ds_${0..1}.bmsql_district
databaseStrategy:
standard:
shardingColumn: d_w_id
shardingAlgorithmName: bmsql_district_database_inline
bmsql_customer:
actualDataNodes: ds_${0..1}.bmsql_customer
databaseStrategy:
standard:
shardingColumn: c_w_id
shardingAlgorithmName: bmsql_customer_database_inline
bmsql_item:
actualDataNodes: ds_${0..1}.bmsql_item
databaseStrategy:
standard:
shardingColumn: i_id
shardingAlgorithmName: bmsql_item_database_inline
bmsql_history:
actualDataNodes: ds_${0..1}.bmsql_history
databaseStrategy:
standard:
shardingColumn: h_w_id
shardingAlgorithmName: bmsql_history_database_inline
bmsql_oorder:
actualDataNodes: ds_${0..1}.bmsql_oorder_${0..1}
databaseStrategy:
standard:
shardingColumn: o_w_id
shardingAlgorithmName: bmsql_oorder_database_inline
tableStrategy:
standard:
shardingColumn: o_c_id
shardingAlgorithmName: bmsql_oorder_table_inline
bmsql_stock:
actualDataNodes: ds_${0..1}.bmsql_stock
databaseStrategy:
standard:
shardingColumn: s_w_id
shardingAlgorithmName: bmsql_stock_database_inline
bmsql_new_order:
actualDataNodes: ds_${0..1}.bmsql_new_order
databaseStrategy:
standard:
shardingColumn: no_w_id
shardingAlgorithmName: bmsql_new_order_database_inline
bmsql_order_line:
actualDataNodes: ds_${0..1}.bmsql_order_line
databaseStrategy:
standard:
shardingColumn: ol_w_id
shardingAlgorithmName: bmsql_order_line_database_inline
shardingAlgorithms:
bmsql_warehouse_database_inline:
type: INLINE
props:
algorithm-expression: ds_${w_id % 2}
bmsql_district_database_inline:
type: INLINE
props:
algorithm-expression: ds_${d_w_id % 2}
bmsql_customer_database_inline:
type: INLINE
props:
algorithm-expression: ds_${c_w_id % 2}
bmsql_item_database_inline:
type: INLINE
props:
algorithm-expression: ds_${i_id % 2}
bmsql_history_database_inline:
type: INLINE
props:
algorithm-expression: ds_${h_w_id % 2}
bmsql_oorder_database_inline:
type: INLINE
props:
algorithm-expression: ds_${o_w_id % 2}
bmsql_oorder_table_inline:
type: INLINE
props:
algorithm-expression: bmsql_oorder_${o_c_id % 2}
bmsql_stock_database_inline:
type: INLINE
props:
algorithm-expression: ds_${s_w_id % 2}
bmsql_new_order_database_inline:
type: INLINE
props:
algorithm-expression: ds_${no_w_id % 2}
bmsql_order_line_database_inline:
type: INLINE
props:
algorithm-expression: ds_${ol_w_id % 2}
- schemaName 為數據庫用戶名
- dataSources為數據源可配置1至多個
- rules為分片規則,%2為取id列分成2份到兩個數據庫。
4. 啟動proxy
[root@db1 bin]# pwd
/lee/ss/proxy/bin
[root@db1 bin]# ./start.sh 3307
Starting the ShardingSphere-Proxy ...
The classpath is /lee/ss/proxy/conf:.:/lee/ss/proxy/lib/*:/lee/ss/proxy/ext-lib/*
Please check the STDOUT file: /lee/ss/proxy/logs/stdout.log
[root@db1 bin]# cat /lee/ss/proxy/logs/stdout.log
Thanks for using Atomikos! Evaluate http://www.atomikos.com/Main/ExtremeTransactions for advanced features and professional support
or register at http://www.atomikos.com/Main/RegisterYourDownload to disable this message and receive FREE tips & advice
[INFO ] 2021-11-01 15:53:05.643 [main] o.a.s.p.i.BootstrapInitializer - Database name is `PostgreSQL`, version is `9.2.4`
[INFO ] 2021-11-01 15:53:05.837 [main] o.a.s.p.frontend.ShardingSphereProxy - ShardingSphere-Proxy start success
- 可以在腳本后指定proxy的啟動端口
5. 測試連接
[lee@node157 ~]$ gsql -d tpcc -Usharding -h 192.168.2.136 -p3307 -Wsharding
gsql ((MogDB 2.1.0 build ) compiled at 2021-10-26 19:07:06 commit 0 last mr )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
tpcc=>
六、 調試BenchmarkSQL
1. 查看配置文件
[root@db1 run]# cat props.mogdb.ss
db=postgres
driver=org.postgresql.Driver
conn=jdbc:postgresql://192.168.2.136:3307/tpcc?prepareThreshold=1&batchMode=on&fetchsize=10&loggerLevel=off
user=sharding
password=sharding
warehouses=100
loadWorkers=50
terminals=500
runTxnsPerTerminal=0
runMins=10
limitTxnsPerMin=0
terminalWarehouseFixed=true
newOrderWeight=45
paymentWeight=43
orderStatusWeight=4
deliveryWeight=4
stockLevelWeight=4
resultDirectory=ss_result_%tY-%tm-%td_%tH%tM%tS
2. 生成原始數據
[root@db1 run]# ./runDatabaseBuild.sh props.mogdb.ss
部分日志
# ------------------------------------------------------------
# Loading SQL file ./sql.postgres/buildFinish.sql
------------------------------------------------------------
-- ----
-- Extra commands to run after the tables are created, loaded,
-- indexes built and extra's created.
-- PostgreSQL version.
-- ----
3. 運行TPCC程序
[root@db1 data]# numactl -C 0-25,30-55 ./runBenchmark.sh props.mogdb.ss
13:55:30,137 [main] INFO jTPCC : Term-00,
13:55:30,140 [main] INFO jTPCC : Term-00, +-------------------------------------------------------------+
13:55:30,140 [main] INFO jTPCC : Term-00, BenchmarkSQL v5.0
13:55:30,140 [main] INFO jTPCC : Term-00, +-------------------------------------------------------------+
13:55:30,140 [main] INFO jTPCC : Term-00, (c) 2003, Raul Barbosa
13:55:30,140 [main] INFO jTPCC : Term-00, (c) 2004-2016, Denis Lussier
13:55:30,142 [main] INFO jTPCC : Term-00, (c) 2016, Jan Wieck
13:55:30,142 [main] INFO jTPCC : Term-00, +-------------------------------------------------------------+
13:55:30,142 [main] INFO jTPCC : Term-00,
13:55:30,142 [main] INFO jTPCC : Term-00, db=postgres
13:55:30,142 [main] INFO jTPCC : Term-00, driver=org.postgresql.Driver
13:55:30,143 [main] INFO jTPCC : Term-00, conn=jdbc:postgresql://192.168.2.136:3307/tpcc?prepareThreshold=1&batchMode=on&fetchsize=10&loggerLevel=off
13:55:30,143 [main] INFO jTPCC : Term-00, user=sharding
13:55:30,143 [main] INFO jTPCC : Term-00,
13:55:30,143 [main] INFO jTPCC : Term-00, warehouses=100
13:55:30,143 [main] INFO jTPCC : Term-00, terminals=500
13:55:30,144 [main] INFO jTPCC : Term-00, runMins=10
13:55:30,144 [main] INFO jTPCC : Term-00, limitTxnsPerMin=0
13:55:30,145 [main] INFO jTPCC : Term-00, terminalWarehouseFixed=true
13:55:30,145 [main] INFO jTPCC : Term-00,
13:55:30,145 [main] INFO jTPCC : Term-00, newOrderWeight=45
13:55:30,145 [main] INFO jTPCC : Term-00, paymentWeight=43
13:55:30,145 [main] INFO jTPCC : Term-00, orderStatusWeight=4
13:55:30,145 [main] INFO jTPCC : Term-00, deliveryWeight=4
13:55:30,145 [main] INFO jTPCC : Term-00, stockLevelWeight=4
13:55:30,145 [main] INFO jTPCC : Term-00,
13:55:30,145 [main] INFO jTPCC : Term-00, resultDirectory=ss_result_%tY-%tm-%td_%tH%tM%tS
13:55:30,145 [main] INFO jTPCC : Term-00, osCollectorScript=null
13:55:30,145 [main] INFO jTPCC : Term-00,
13:55:30,157 [main] INFO jTPCC : Term-00, copied props.mogdb.ss to ss_result_2021-11-01_135530/run.properties
13:55:30,157 [main] INFO jTPCC : Term-00, created ss_result_2021-11-01_135530/data/runInfo.csv for runID 835
13:55:30,157 [main] INFO jTPCC : Term-00, writing per transaction results to ss_result_2021-11-01_135530/data/result.csv
13:55:30,158 [main] INFO jTPCC : Term-00,
13:55:30,237 [main] INFO jTPCC : Term-00, C value for C_LAST during load: 165
13:55:30,237 [main] INFO jTPCC : Term-00, C value for C_LAST this run: 92
13:55:30,237 [main] INFO jTPCC : Term-00, Running Average tpmTOTAL: 626491.25 Current tpmTOTAL: 41415216 Memory Usage: 858MB / 1001MB
14:05:31,197 [Thread-158] INFO jTPCC : Term-00,
14:05:31,197 [Thread-158] INFO jTPCC : Term-00,
14:05:31,197 [Thread-158] INFO jTPCC : Term-00, Measured tpmC (NewOrders) = 281818.72
14:05:31,198 [Thread-158] INFO jTPCC : Term-00, Measured tpmTOTAL = 626481.78
14:05:31,198 [Thread-158] INFO jTPCC : Term-00, Session Start = 2021-11-01 13:55:31
14:05:31,198 [Thread-158] INFO jTPCC : Term-00, Session End = 2021-11-01 14:05:31
14:05:31,198 [Thread-158] INFO jTPCC : Term-00, Transaction Count = 6265412
14:05:31,198 [Thread-158] INFO jTPCC : executeTime[Payment]=87346178
14:05:31,198 [Thread-158] INFO jTPCC : executeTime[Order-Status]=3979084
14:05:31,198 [Thread-158] INFO jTPCC : executeTime[Delivery]=24407579
14:05:31,198 [Thread-158] INFO jTPCC : executeTime[Stock-Level]=3583178
14:05:31,198 [Thread-158] INFO jTPCC : executeTime[New-Order]=180651188
- 數據未經過充分調優僅供參考
七、何謂夢幻
- 單一數據庫整合成一個大型分布式,即兼顧了單機數據庫的穩定,又產生了分布式數據庫的能力。
- 兼容多種數據庫,目前支持 MySQL, PostgreSQL, SQLServer, Oracle, openGauss 以及符合 SQL92 規范的 SQL 方言。
- 面對超負荷的流量或其他不正常狀態下,針對某一節點進行熔斷和限流,實現從數據庫到計算節點打通的一體化管理能力,在故障中為組件提供細粒度的控制能力,并盡可能的提供自愈的可能。
- 透明化分庫分表,盡量對業務無感知,像使用一個數據庫一樣使用水平分片之后的數據庫集群。
- 支持多種事物粒度選擇
本地事物:在不開啟任何分布式事務管理器的前提下,讓每個數據節點各自管理自己的事務。
兩階段提交:基于XA協議實現的分布式事務對業務侵入很小。 它最大的優勢就是對使用方透明,用戶可以像使用本地事務一樣使用基于XA協議的分布式事務。 XA協議能夠嚴格保障事務 ACID 特性。
柔性事務: 如果將實現了 ACID 的事務要素的事務稱為剛性事務的話,那么基于 BASE 事務要素的事務則稱為柔性事務。 BASE 是基本可用、柔性狀態和最終一致性這三個要素的縮寫。
| 本地事物 | 兩(三)階段事務 | 柔性事務 | |
|---|---|---|---|
| 業務改造 | 無 | 無 | 實現相關接口 |
| 一致性 | 不支持 | 支持 | 最終一致 |
| 隔離性 | 不支持 | 支持 | 業務方保證 |
| 并發性能 | 無影響 | 嚴重衰退 | 略微衰退 |
| 適合場景 | 業務方處理不一致 | 短事務 & 低并發 | 長事務 & 高并發 |
- 讀寫分離,通過負載均衡策略將查詢請求疏導至不同從庫。

- 架構,平臺,系統,數據庫版本,靈活多變,通過ShardingSphere可以實現MogDB和openGauss甚至和PostgreSQL在同一個集群中,參與靈活。

最后修改時間:2021-11-10 16:08:19
「喜歡這篇文章,您的關注和贊賞是給作者最好的鼓勵」
關注作者
【版權聲明】本文為墨天輪用戶原創內容,轉載時必須標注文章的來源(墨天輪),文章鏈接,文章作者等基本信息,否則作者和墨天輪有權追究責任。如果您發現墨天輪中有涉嫌抄襲或者侵權的內容,歡迎發送郵件至:contact@modb.pro進行舉報,并提供相關證據,一經查實,墨天輪將立刻刪除相關內容。




