分布式RDBMS(Cobar)
來自: https://blog.huachao.me/2016/2/分布式RDBMS/
傳統的關系型數據庫在高并發,大數據的情況下性能會急劇降低,比如,一般MySQL的qps在10k以下,單表的數據量千萬級已經封頂。有鑒于此,程序員,DBA們想到通過多臺MySQL來分擔大量的查詢和分多臺機器來存儲,分布式RDBMS由此而生。
本文以阿里巴巴開源的 Cobar 為藍本,簡單敘述其設計的思想,要解決的問題,如果可能的話會簡單解釋一下其代碼結構。注意目前阿里云上分布式關系型數據庫的解決方案是 DRDS ,其使用的核心就是 Cobar 和 TDDL 。TDDL復雜度高,當前公布的文檔較少,只開源動態數據源,分表分庫部分還未開源,還需要依賴diamond,所以不討論了。
</div>
Cobar能用來干啥
一圖勝前言。對外表現為一個關系型數據庫,對內將記錄路由到各個工作DB,可以進行無限的水平擴展(scale out)。

Cobar也支持垂直拆分,即不同業務存儲不同的database。
Cobar作為一個proxy怎么路由到各個工作DB
Cobar作為一個proxy,實現了接收客戶端的鏈接和jdbc的協議,然后根據sql語句,查詢路由定義,然后路由到工作DB的。
- schema定義, 注意: schema/table中的rule,即為這個表對應的拆分規則
<?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEcobar:schemaSYSTEM"schema.dtd"> <cobar:schema xmlns:cobar="http://cobar.alibaba.com/"> <!--schema定義 --> <schema name="dbtest" dataNode="dnTest1"> <table name="tb2" dataNode="dnTest2,dnTest3" rule="rule1"/> </schema> <!--數據節點定義,數據節點由數據源和其他一些參數組織而成。--> <dataNode name="dnTest1"> <property name="dataSource"> <dataSourceRef>dsTest[0]</dataSourceRef> </property> </dataNode> <dataNode name="dnTest2"> <property name="dataSource"> <dataSourceRef>dsTest[1]</dataSourceRef> </property> </dataNode> <dataNode name="dnTest3"> <property name="dataSource"> <dataSourceRef>dsTest[2]</dataSourceRef> </property> </dataNode> <!--數據源定義,數據源是一個具體的后端數據連接的表示。--> <dataSource name="dsTest" type="mysql"> <property name="location"> <location>192.168.0.1:3306/dbtest1</location> <location>192.168.0.1:3306/dbtest2</location> <location>192.168.0.1:3306/dbtest3</location> </property> <property name="user">test</property> <property name="password"></property> <property name="sqlMode">STRICT_TRANS_TABLES</property> </dataSource> </cobar:schema>
</div>
- 拆分鍵定義
<?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEcobar:ruleSYSTEM"rule.dtd"> <cobar:rulexmlns:cobar="http://cobar.alibaba.com/"> <!--路由規則定義,定義什么表,什么字段,采用什么路由算法。--> <tableRule name="rule1"> <rule> <columns>id</columns> <algorithm><![CDATA[func1(${id})]]></algorithm> </rule> </tableRule> <!--路由函數定義,應用在路由規則的算法定義中,路由函數可以自定義擴展。--> <function name="func1" class="com.alibaba.cobar.route.function.PartitionByLong"> <property name="partitionCount">2</property> <property name="partitionLength">512</property> </function> </cobar:rule>
</div>
Cobar的工作流程
同樣的一圖勝千言。

最佳實踐
數據拆分策略
- 容量和訪問均衡。拆分鍵能夠使得記錄均勻地分布到各個工作DB上。
- 事務邊界。盡量地在一個工作DB上進行事務;如果涉及到多臺工作DB,那么使用消息隊列來達到最終一致性;分布式數據庫事務會有嚴重的性能問題,只在必須的時候使用
數據庫連接池
推薦使用阿里巴巴的 druid 作為數據庫連接池。注意其中的url,要配置為proxy的ip,也就是Cobar機器所在的ip。
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <!-- 基本屬性 url、user、password --> <property name="url" value="jdbc:mysql://ip:port/db?autoReconnect=true&rewriteBatchedStatements=true&socketTimeout=30000&connectTimeout=3000" /> <property name="username" value="root" /> <property name="password" value="123456" /> <!-- 配置初始化大小、最小、最大 --> <property name="maxActive" value="20" /> <property name="initialSize" value="3" /> <property name="minIdle" value="3" /> <!-- maxWait獲取連接等待超時的時間 --> <property name="maxWait" value="60000" /> <!-- timeBetweenEvictionRunsMillis間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- minEvictableIdleTimeMillis一個連接在池中最小空閑的時間,單位是毫秒--> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="validationQuery" value="SELECT 'z'" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> </bean>
</div> </div>
本文由用戶 cfer7367 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!