1. 程式人生 > >阿里巴巴中介軟體TDDL用於連線資料庫,分表分庫查詢

阿里巴巴中介軟體TDDL用於連線資料庫,分表分庫查詢

1.建立資料來源

          由DBA來做。

           一般資料來源有3層:

          (1)Matrix

                     分庫分表,資料路由,對應一個應用,下面有若干個group

          (2)Group

                     主備切換,讀寫分離,對應一組主備資料庫,下面有若干atom

          (3)Atom

                     對應一個數據庫例項


2.建立分庫分表規則

              (1)編寫規則檔案

                        實際上就是spring配置檔案的一部分

[html] view plain copy print?
  1. <?xmlversion="1.0"encoding="gb2312"?>
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"  
  3. "http://www.springframework.org/dtd/spring-beans.dtd">
  4. <beans>
  5.    <!--這個bean配置為TDDL規則總配置-->
  6.     <beanid="vtabroot"class="com.taobao.tddl.interact.rule.VirtualTableRoot"
    init-method="init">
  7.        <!--沒有被配置在tableRules的邏輯表都將在這個group裡,以單表形式執行-->
  8.         <propertyname="defaultDbIndex"value="TDDL_DEFAULT_GROUP"/>
  9.        <!--資料庫型別,預設是mysql -->
  10.         <propertyname="dbType"value="MYSQL"></property>
  11.        <!--該map配置有分表的邏輯表,有幾個表有分表就配置幾個鍵值對(該事例表示只有三個表需要分表)-->
  12.         <propertyname="tableRules">
  13.             <map>
  14.                <!-- key是邏輯表名,value指的是對應具體配置的id -->
  15.                 <entrykey="user"value-ref="user_bean"></entry>
  16.                <!--邏輯表名為admin,具體的分表規則在id="admin_bean"的配置中-->
  17.                 <entrykey="admin"value-ref="admin_bean"></entry>
  18.                <!--這張表是單表,可以配置在這,不配置的話預設走defaultDbIndex -->
  19.                 <entrykey="picture"value-ref="picture_bean"></entry>
  20.             </map>
  21.         </property>
  22.     </bean>
  23.    <!--按照user_id取模劃分64張表,表明具體為'user_0000'-'user_0063',  
  24.           'user_0000'-'user_0031'在'TDDL_0000_GROUP'中,  
  25.           'user_0032'-'user_0063'在'TDDL_0001_GROUP'中-->
  26.     <beanid="user_bean"class="com.taobao.tddl.interact.rule.TableRule">
  27.        <!-- groupKey格式框架,{}中的數將會被dbRuleArray的值替代,並保持位數-->
  28.         <propertyname="dbNamePattern"value="TDDL_{0000}_GROUP"/>
  29.        <!--具體的分庫規則-->
  30.        <propertyname="dbRuleArray">
  31.            <!--按照user_id取模劃分64張表,結果除以32後分到兩個庫中-->
  32.             <value>(#user_id,1,64#.longValue() % 64).intdiv(32)</value>
  33.         </property>
  34.        <!--具體表名格式框架,{}中的數將會被tbRuleArray的值替代,並保持位數-->
  35.         <propertyname="tbNamePattern"value="user_{0000}"></property>
  36.        <!--具體的分表規則-->
  37.         <propertyname="tbRuleArray">
  38.            <!--按照user_id取模劃分64張表-->
  39.             <value>#user_id,1,64#.longValue() % 64</value>
  40.         </property>
  41.        <!--全表掃描開關,預設關閉,是否允許應用端在沒有給定分表鍵值的情況下查詢全表-->
  42.         <propertyname="allowFullTableScan"value="true"/>
  43.     </bean>
  44.    <!--按照user_id取模劃分4張表,表名具體為'admin_00'-'admin_03',  
  45.          所有表都在'TDDL_DEFAULT_GROUP'中-->
  46.     <beanid="admin_bean"class="com.taobao.tddl.interact.rule.TableRule">
  47.        <!--分庫規則,該表沒有分庫,所有表都在這個group上-->
  48.         <propertyname="dbNamePattern"value="TDDL_DEFAULT_GROUP"/>
  49.         <propertyname="tbNamePattern"value="admin_{00}"></property>
  50.         <propertyname="tbRuleArray">
  51.             <value>#user_id,1,4#.longValue() % 4</value>
  52.         </property>
  53.     </bean>
  54.    <!--即不分庫也不分表-->
  55.     <beanid="picture_bean"class="com.taobao.tddl.interact.rule.TableRule">
  56.         <propertyname="dbNamePattern"value="TDDL_DEFAULT_GROUP"/>
  57.         <propertyname="tbNamePattern"value="picture"></property>
  58.     </bean>
  59. </beans>
<?xml version="1.0" encoding="gb2312"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

   <!--這個bean配置為TDDL規則總配置-->

    <bean id="vtabroot" class="com.taobao.tddl.interact.rule.VirtualTableRoot" init-method="init">

       <!--沒有被配置在tableRules的邏輯表都將在這個group裡,以單表形式執行-->

        <property name="defaultDbIndex" value="TDDL_DEFAULT_GROUP" />

       <!--資料庫型別,預設是mysql -->

        <property name="dbType" value="MYSQL"></property>

       <!--該map配置有分表的邏輯表,有幾個表有分表就配置幾個鍵值對(該事例表示只有三個表需要分表)-->

        <property name="tableRules">

            <map>

               <!-- key是邏輯表名,value指的是對應具體配置的id -->

                <entry key="user" value-ref="user_bean"></entry>

               <!--邏輯表名為admin,具體的分表規則在id="admin_bean"的配置中-->

                <entry key="admin" value-ref="admin_bean"></entry>

               <!--這張表是單表,可以配置在這,不配置的話預設走defaultDbIndex -->

                <entry key="picture" value-ref="picture_bean"></entry>

            </map>

        </property>

    </bean>

   <!--按照user_id取模劃分64張表,表明具體為'user_0000'-'user_0063',

          'user_0000'-'user_0031'在'TDDL_0000_GROUP'中,

          'user_0032'-'user_0063'在'TDDL_0001_GROUP'中-->

    <bean id="user_bean" class="com.taobao.tddl.interact.rule.TableRule">

       <!-- groupKey格式框架,{}中的數將會被dbRuleArray的值替代,並保持位數-->

        <property name="dbNamePattern" value="TDDL_{0000}_GROUP" />

       <!--具體的分庫規則-->

       <property name="dbRuleArray">

           <!--按照user_id取模劃分64張表,結果除以32後分到兩個庫中-->

            <value>(#user_id,1,64#.longValue() % 64).intdiv(32)</value>

        </property>

       <!--具體表名格式框架,{}中的數將會被tbRuleArray的值替代,並保持位數-->

        <property name="tbNamePattern" value="user_{0000}"></property>

       <!--具體的分表規則-->

        <property name="tbRuleArray">

           <!--按照user_id取模劃分64張表-->

            <value>#user_id,1,64#.longValue() % 64</value>

        </property>

       <!--全表掃描開關,預設關閉,是否允許應用端在沒有給定分表鍵值的情況下查詢全表-->

        <property name="allowFullTableScan" value="true" />

    </bean>

   <!--按照user_id取模劃分4張表,表名具體為'admin_00'-'admin_03',

         所有表都在'TDDL_DEFAULT_GROUP'中-->

    <bean id="admin_bean" class="com.taobao.tddl.interact.rule.TableRule">

       <!--分庫規則,該表沒有分庫,所有表都在這個group上-->

        <property name="dbNamePattern" value="TDDL_DEFAULT_GROUP" />

        <property name="tbNamePattern" value="admin_{00}"></property>

        <property name="tbRuleArray">

            <value>#user_id,1,4#.longValue() % 4</value>

        </property>

    </bean>

   <!--即不分庫也不分表-->

    <bean id="picture_bean" class="com.taobao.tddl.interact.rule.TableRule">

        <property name="dbNamePattern" value="TDDL_DEFAULT_GROUP" />

        <property name="tbNamePattern" value="picture"></property>

    </bean>
</beans>

              (2)使用規則

                         1)遠端配置

                                在tddl 的ops中->TDDL配置管理->新增配置,然後將編寫的規則檔案內容複製進去,提交即可

                         2)本地配置

                                將規則檔案放置在專案路徑中即可

3.建立應用

              (1)新增依賴

[html] view plain copy print?
  1. <dependency>
  2.     <groupId>com.taobao.tddl</groupId>
  3.     <artifactId>tddl-client</artifactId>
  4.     <type>jar</type>
  5. </dependency>
		<dependency>
			<groupId>com.taobao.tddl</groupId>
			<artifactId>tddl-client</artifactId>
			<type>jar</type>
		</dependency>
              (2)在spring配置檔案中配置tddl
[html] view plain copy print?
  1. <beanid="s2sTddlGroupDataSource"class="com.taobao.tddl.jdbc.group.TGroupDataSource"init-method="init">
  2.      <propertyname="appName"value="${alibaba.intl.s2s.tddl.appname}"></property>
  3.      <!--<property name="appRuleFile" value="tddl-rule.xml"></property>-->
  4.      <propertyname="dbGroupKey"value="${alibaba.intl.s2s.tddl.groupname}"></property>
  5.      <propertyname="dataSourceType"value="DruidDataSource"></property>
  6.      <propertyname="dynamicRule"value="true"></property>
  7.      <!--<property name="useLocalConfig" value="true"></property>-->
  8. </bean>
    <bean id="s2sTddlGroupDataSource" class="com.taobao.tddl.jdbc.group.TGroupDataSource" init-method="init">
         <property name="appName" value="${alibaba.intl.s2s.tddl.appname}"></property>
         <!--<property name="appRuleFile" value="tddl-rule.xml"></property>-->

         <property name="dbGroupKey" value="${alibaba.intl.s2s.tddl.groupname}"></property>
         <property name="dataSourceType" value="DruidDataSource"></property>
         <property name="dynamicRule" value="true"></property>
         <!--<property name="useLocalConfig" value="true"></property>-->
    </bean>

                         appName指的是應用的名稱,需要和在tddl ops上配置的appName一致

                         dynamicRule表示配置放在diamond上,useLocalConfig表示配置放置在本地,appRuleFile表示本地的規則檔案的路徑   

              (3)有了這個資料來源之後,就可以將資料來源配置到jdbc、ibatis等Template中了
[html] view plain copy print?
  1. <beanid="s2sSqlMapClient"class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
  2.     <propertyname="configLocation"value="/biz/sqlmap-s2s.xml"/>
  3.     <propertyname="dataSource"ref="s2sTddlGroupDataSource"/>
  4. </bean>
    <bean id="s2sSqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
        <property name="configLocation" value="/biz/sqlmap-s2s.xml" />
        <property name="dataSource" ref="s2sTddlGroupDataSource" />
    </bean>

              然後就可以像使用一個數據庫一張表一樣進行開發了