Kettle数据库连接中的集群与分片

目录

1. 在数据库连接中使用集群

2. 创建数据库分区schemas

3. 启用数据库分区

4. 例子

(1)将三个mysql实例的数据导入到另一个mysql实例

(2)将一个mysql实例的数据分发到三个mysql实例

(3)将三个mysql实例的数据导入到另三个mysql实例

(4)将三个mysql实例的数据导入相同实例的不同表中


        本文介绍Kettle 8.3中数据库分区的使用。

1. 在数据库连接中使用集群

        在Kettle的数据库连接对话框中,可定义数据库分区,如图1所示。

图1

        在“集群”标签,勾选“使用集群”,然后定义三个分区。这里的分区实际指的是数据库实例,需要指定自定义的分区ID,数据库实例的主机名(IP)、端口、数据库名、用户名和密码。定义分区的目的是为了从某一个分区甚至某一个物理数据库读取和写入数据。一旦在数据库连接里面定义了数据库分区,就可以基于这个信息创建了一个分区schema。

        在“一般”标签,只要指定连接名称、连接类型和连接方式,在“设置”中都可以为空,如图2所示。Kettle假定所有的分区都是同一数据库类型和连接类型。

图2

        定义好分区后点击“测试”,结果如图3所示。

图3

 

2. 创建数据库分区schemas

        在“主对象树”的“数据库分区schemas”上点右键“新建”,在弹出窗口中输入“分区schema名称”,然后点击“导入分区”按钮,如图4所示。

图4

        选择上一步定义的数据库连接 mysql_only_shared,点“确定”按钮后,如图5所示。

图5

        此时已经导入了上一步定义的三个数据库分区。点击“OK”保存。这样就定义了一个名为shared_source的数据库分区schema。再用同样的方法定义一个名为shared_target的数据库分区schema,所含分区也从mysql_only_shared导入。

        至此,我们已经定义了一个包含三个分区的数据库连接,并将分区信息导入到两个数据库分区schema,如图6所示。

图6

        现在可以在任何步骤里面应用这两个数据库分区schema(就是说使用这个分区的数据库连接)。Kettle将为每个数据库分区产生一个步骤复制,并且它将连接物理数据库。

3. 启用数据库分区

        点击步骤右键,选择“分区...”菜单项,如图7所示。

图7

        此时会弹出一个对话框,选择使用哪个分区方法,如图8所示。

图8

        分区方法可以是下面的一种:

  • None:不使用分区,标准的“Distribute rows”(轮询)或“Copy rows”(复制)规则被应用。
  • Mirror to all partitions:使用已定义的数据库分区schema中的所有分区。
  • Remainder of division:Kettle标准的分区方法。通过分区编号除以分区数目,产生的余数被用来决定记录行将发往哪个分区。例如在一个记录行里,如果有 “73” 标识的用户身份,而且有3个分区定义,这样这个记录行属于分区1,编号30属于分区0,编号14属于分区2。需要指定基于分区的字段

        选择“Mirror to all partitions”,在弹出窗口中选择已定义的分区schema,如图9所示。

图9

        经此一番设置后,该步骤就将以分区方式执行,如图10所示。

图10

4. 例子

(1)将三个mysql实例的数据导入到另一个mysql实例

        转换如图11所示。

图11

        表输入步骤如图12所示。

图12

        该步骤虽然连接的是mysql_only_shared。因为是按分区方式执行,实际读取的是三个分区的数据。三个分区的t1表数据如图13所示。

图13

        表输出步骤连接的是172.16.1.105的test.t4表,如图14所示。

图14

该转换执行的逻辑为:
db1.t1 + db2.t1 + db3.t1 -> db4.t4

        转换执行后,172.16.1.105的test.t4表数据如图15所示。

图15

        如果将图12中的数据库连接改为mysql_172.16.1.105,连接172.16.1.105的test.t1表。mysql_172.16.1.105本身没有设置“使用集群”,则转换将从172.16.1.105取数据,但依然为每个分区复制一份步骤,其结果等同于3线程的复制分发。转换执行后,172.16.1.105的test.t4表数据如图16所示。

图16

(2)将一个mysql实例的数据分发到三个mysql实例

        转换如图17所示。

图17

        表输入步骤如图18所示。

图18

        该步骤连接172.16.1.105的test.t4表。

        表输出步骤如图19所示。

图19

        该步骤虽然连接的是mysql_only_shared。因为是按分区方式执行,会向三个分区中的t2表输出数据。

该转换执行的逻辑为:
db4.t4 -> db1.t2
db4.t4 -> db2.t2
db4.t4 -> db3.t2

        转换执行后,三个分区的test.t2表数据如图20所示。

图20

(3)将三个mysql实例的数据导入到另三个mysql实例

        转换如图21所示。

图21

        输入步骤使用的是shared_source分区schema,而输出步骤使用的是shared_target分区schema。

        表输入步骤如图22所示。

图22

        该步骤连接三个分区的test.t1表。

        表输出步骤如图23所示。

图23

        向三个分区的test.t2表输出数据。

该转换执行的逻辑为:
db1.t1 + db2.t1 + db3.t1 -> db4.t2
db1.t1 + db2.t1 + db3.t1 -> db5.t2
db1.t1 + db2.t1 + db3.t1 -> db6.t2

        转换执行后,三个分区的test.t2表数据如图20所示。虽然最终结果与上一个例子相同,但执行逻辑是不同的。

(4)将三个mysql实例的数据导入相同实例的不同表中

        转换如图24所示。

图24

        与前一个例子只有一点区别:输入步骤与输出步骤使用的是同一个分区schema(shared_source)。

该转换执行的逻辑为:
db1.t1 -> db1.t2
db2.t1 -> db2.t2
db3.t1 -> db3.t2

        转换执行后,三个分区的test.t2表数据如图25所示。

图25

        在数据库连接中定义分区时需要注意一点,分区ID应该唯一,如果多个分区ID相同,则所有具有相同ID的分区都会连接到第一个具有该ID的分区。例如,我们把mysql_only_shared的分区定义改为如图26所示:

图26

        103与104两个分区的分区ID都是2。然后重新导入shared_source,并再次执行图24的转换。三个分区的test.t2表数据如图27所示。

图27

        可以看到,103的t2表插入了两条数据,而104没有执行任何操作(并没有truncate表)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章