在Doris中,提供直接从mysql中拿取实时数据。他的主要原理就是使用canal作为mysql的slave节点服务器,然后doris相当于是客户端去canal服务器上订阅数据,然后把数据写入到doris中。此方式导入数据属于实时导入。下面我们演示下。
一、在服务器上安装mysql,并且开启binlog
这里在之前的文章里面已经介绍过了。可以参考《如何使用docker搭建一个mysql5.7的主从环境》。这里我们已经安装过了
备注:切记这里的mysql的binlog模式需要选择row模式,例如:
binlog-format=ROW # 选择 ROW 模式
二、安装部署一个canal服务端
这里的canal我们之前也编写过相关的安装文档,可参考《CDC工具Canal的安装并且使用JAVA客户端读取数据变更》。这里我们也已经安装完毕了。
三、在mysql中创建user表
需要在mysql中创建一张原始表,这里我们还是使用之前的表结构,mysql中创建的user表示例sql如下:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL COMMENT '姓名', `age` tinyint(3) DEFAULT NULL COMMENT '年龄', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
四、在doris中创建对应的user表
这里由于是mysql的binlog同步的,因此在这里咱们doris中的目标表也需要和mysql的表对应,因此我们在这里也需要创建一张user表。
CREATE TABLE `user` ( `id` int(11) NOT NULL, `name` varchar(20) DEFAULT NULL COMMENT '姓名', `age` tinyint(3) DEFAULT NULL COMMENT '年龄' ) UNIQUE KEY(`id`) COMMENT "OLAP" DISTRIBUTED BY HASH(`id`) BUCKETS 1 properties( "replication_num" = "1" );
备注:这里使用binlog同步到doris的话,doris的表必须只能使用unique的数据类型。不能使用其他的数据类型。
同时使用binlog同步到doris的话,需要在doris中开启BATCH_DELETE功能,开启的命令是:
ALTER TABLE user ENABLE FEATURE "BATCH_DELETE";
五、在doris中创建一个同步的作业
目前两边的表已经创建好了,此时的话,我们在doris中创建一个同步的作业即可。
CREATE SYNC `demo`.`user_job` ( FROM `demo`.`user` INTO `user` (id,name,age) ) FROM BINLOG ( "type" = "canal", "canal.server.ip" = "192.168.0.236", "canal.server.port" = "11111", "canal.destination" = "example", "canal.username" = "slave1", "canal.password" = "slave1" );
六、测试
此时我们去mysql中插入一条数据,然后看下doris中是否被及时同步过来了。
可以看到没有任何问题。说明使用mysql的binlog同步数据到doris也是没有任何问题的。
在这里我们说下创建job的每一行参数说明:
1)CREATE SYNC `demo`.`user_job`
这里代表创建的是一个job,整个job也是挂靠到库上面的,上面代表是在demo这个库中创建一个名称为user_job的job任务
2)FROM `demo`.`user` INTO `user`
这里的from里面的库.表是mysql中的库表,into后面的表是doris中的表。
3)(id,name,age)
这里是映射下字段,也就是需要同步哪些字段。
4)"type" = "canal",
这里的类型选择canal即可,写死即可。
5)"canal.server.ip" = "192.168.0.236"
这里是canal的地址,一般建议选择局网内部的内网ip,这样子传输快一些。
6)"canal.server.port" = "11111"
这是canal开放的同步端口,如果没有修改的话,一般都是11111端口。
7)"canal.destination" = "example"
这个参数是canal实例的参数,这个参数的值是在${canal_home}/conf/canal.properties里面找,写成对应即可。
8)"canal.username" = "slave1","canal.password" = "slave1"
这里是canal中的instance.properties文件里面配置的请求mysql的账户名和密码。
9)canal.batchSize=8192
这个参数我们没有在配置里面列举出来,他主要是指:每批从canal server处获取的batch大小的最大值,默认8192。所以保持默认值即可。
最后备注下:
1、使用binlog的方式同步数据到doris中,doris的表只能是unique模型,不支持其他数据模型。
2、需要在doris中为每一张表开启BATCH_DELETE功能。
3、如果同步数据出现问题,也就是doris中没有看到数据,那么需要检查下canal的配置,检查下doris的sync job。可以在job里面添加如下配置参数:
canal.debug=true
这样的话,会将batch和每一行数据的详细信息都打印出来,但是会影响性能,生产上需要把这个参数给关闭掉。
4、想要查看当前库里面有哪些sync job的话,可以使用如下的命令:
show sync job;
就可以看到所有的job信息。
还没有评论,来说两句吧...