分布式RDBMS(Cobar)

cfer7367 8年前發布 | 10K 次閱讀 數據庫 分布式系統

來自: https://blog.huachao.me/2016/2/分布式RDBMS/

傳統的關系型數據庫在高并發,大數據的情況下性能會急劇降低,比如,一般MySQL的qps在10k以下,單表的數據量千萬級已經封頂。有鑒于此,程序員,DBA們想到通過多臺MySQL來分擔大量的查詢和分多臺機器來存儲,分布式RDBMS由此而生。

本文以阿里巴巴開源的 Cobar 為藍本,簡單敘述其設計的思想,要解決的問題,如果可能的話會簡單解釋一下其代碼結構。注意目前阿里云上分布式關系型數據庫的解決方案是 DRDS ,其使用的核心就是 CobarTDDL 。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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!