基于Amoeba的数据水平切分

数据水平切分这种方式应该是大家都能想到的,但数据切分以后我们如何访问我们的应用,我 们应用如何按照规则做实时的数据切分?在应用层面还是其他层?这个难题可以托付给Amoeba来解决。 Amoeba提供对dba非常友好的数据切分规则表达式。

在前面章节的第二小节,已经有一个通过Amoeba将员工ID通过奇偶不同水平切分到两台机器上的实例。这里会使用一些稍稍复杂一些的函数来完成。

假设我们messagedb 需要根据id hash进行水平切分,我们可以根据hash范围分成2台:

规则1: abs(hash(id)) mod 2 = 0 → blogdb-1

规则2: abs(hash(id)) mod 2 = 1 → blogdb-2

这里abs、hash 都是amoeba 规则中使用到的函数,amoeba允许开发人员增加新的规则函数,这在本章节的Amoeba自定义函数配置详解小节中介绍。

数据的水平切分主要通过对rule.xml文件的配置,如以下这个配置示例:

Example 4.1. 通过配置rule.xml完成水平分区

<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE amoeba:rule SYSTEM "rule.dtd">

<amoeba:rule xmlns:amoeba="http://amoeba.meidusa.com/">
...
   <tableRule name="MESSAGE" schema="test" defaultPools="blogdb-1,blogdb-2">1
      <rule name="rule1">
         <parameters>ID</parameters>2
         <expression><![CDATA[ abs(hash(id)) mod 2 = 0 ]]></expression>3
         <defaultPools>blogdb-1</defaultPools>4
      </rule>
      <rule name="rule2">
         <parameters>ID</parameters>
         <expression><![CDATA[ abs(hash(id)) mod 2 = 1 ]]></expression>
         <defaultPools>blogdb-2</defaultPools>
      </rule>
   </tableRule>
...
</amoeba:rule>

1

配置该表的表明和数据库名,defaultPools为需要MESSAGE表被分片到的两个数据库节点以逗号分隔符。defaultPools属性中的数据库节点须是dbServers.xml中配置的虚拟数据库节点或真实数据库节点。

2

parameters元素定义了用作分区规则的字段,这里是MESSAGE.ID。

3 4

expression元素定义了分区规则,可以从这里了解到rule1中ID哈希取绝对值后模2为0的数据被分片到blogdb-1上。