分布式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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!