当您在使用PolarDB MySQL遇到查询慢的问题时,可以通过数据传输服务DTS(Data Transmission Service),将企业线上的PolarDB MySQL中的生产数据实时同步到阿里云Elasticsearch(简称ES)中进行搜索分析。本文介绍具体的实现方法。
背景信息
- 数据传输服务DTS是一种集数据迁移、数据订阅及数据实时同步于一体的数据传输服务,详情请参见数据传输服务DTS。DTS支持同步的SQL操作包括:Insert、Delete、Update。
注意 进行数据同步时,请选择DTS支持的数据源及其版本,详情请参见支持的数据库、同步初始化类型和同步拓扑。
- PolarDB是阿里云自研的下一代关系型云数据库,有三个独立的引擎,分别可以100%兼容MySQL、100%兼容PostgreSQL、高度兼容Oracle语法。存储容量最高可达100TB,单库最多可扩展到16个节点,适用于企业多样化的数据库应用场景,详情请参见PolarDB MySQL概述。
- Elasticsearch是一个基于Lucene的实时分布式的搜索与分析引擎,它提供了一个分布式服务,可以使您快速的近乎于准实时的存储、查询和分析超大数据集,通常被用来作为构建复杂查询特性和需求强大应用的基础引擎或技术,详情请参见什么是阿里云Elasticsearch。
本文适用的场景:对实时同步要求较高的关系型数据库中数据的同步场景。
注意事项
- DTS在执行全量数据初始化时将占用源库和目标库一定的读写资源,可能会导致数据库的负载上升,在数据库性能较差、规格较低或业务量较大的情况下(例如源库有大量慢SQL、存在无主键表或目标库存在死锁等),可能会加重数据库压力,甚至导致数据库服务不可用。因此您需要在执行数据同步前评估源库和目标库的性能,同时建议您在业务低峰期执行数据同步(例如源库和目标库的CPU负载在30%以下)。
- DTS不支持同步DDL操作,如果源库中待同步的表在同步的过程中,已经执行了DDL操作,您需要先移除同步对象,然后在Elasticsearch实例中移除该表对应的索引,最后新增同步对象。详情请参见移除同步对象和新增同步对象。
- 如果源库中待同步的表需要执行增加列的操作,您只需先在Elasticsearch实例中修改对应表的mapping,然后在源库中执行相应的DDL操作,最后暂停并启动DTS同步实例即可。
准备工作
- 创建阿里云Elasticsearch实例,并开启实例的自动创建索引功能。
具体操作步骤请参见步骤一:创建实例和配置YML参数。本文使用6.7版本的实例。说明 阿里云Elasticsearch为了保证用户操作数据的安全性,默认把自动创建索引的配置设置为不允许。通过DTS同步数据的时候,使用的是提交数据的方式创建索引,而不是Create index API的方式。所以在使用数据同步之前,需要先开启集群的自动创建索引功能。
- 创建云数据库PolarDB MySQL集群,并开启Binlog。
- 创建PolarDB MySQL数据库和表,并插入测试数据。
具体操作步骤请参见管理数据库。本文使用的表结构和测试数据如下。
- 建表语句
CREATE TABLE `product` ( `id` bigint(32) NOT NULL AUTO_INCREMENT, `name` varchar(32) NULL, `price` varchar(32) NULL, `code` varchar(32) NULL, `color` varchar(32) NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8;
- 测试数据
INSERT INTO `estest`.`product` (`id`,`name`,`price`,`code`,`color`) VALUES (1,'mobile phone A','2000','amp','golden'); INSERT INTO `estest`.`product` (`id`,`name`,`price`,`code`,`color`) VALUES (2,'mobile phone B','2200','bmp','white'); INSERT INTO `estest`.`product` (`id`,`name`,`price`,`code`,`color`) VALUES (3,'mobile phone C','2600','cmp','black'); INSERT INTO `estest`.`product` (`id`,`name`,`price`,`code`,`color`) VALUES (4,'mobile phone D','2700','dmp','red'); INSERT INTO `estest`.`product` (`id`,`name`,`price`,`code`,`color`) VALUES (5,'mobile phone E','2800','emp','silvery');
- 建表语句
在文档使用中是否遇到以下问题
更多建议
匿名提交