尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MySQL到Elasticsearch实时数据同步方案与Canal实践

MySQL到Elasticsearch实时数据同步方案与Canal实践 1. 项目概述MySQL到ES的数据同步方案选型在数据驱动的业务场景中将关系型数据库MySQL的变更实时同步到搜索引擎ElasticsearchES是常见的架构需求。这种同步能充分发挥MySQL的事务处理能力和ES的全文检索优势典型的应用场景包括电商商品搜索、日志分析平台和内容推荐系统。我最终选择Canal作为同步工具主要基于以下几点考量低侵入性Canal通过解析MySQL的binlog实现数据捕获对业务系统零侵入实时性相比定时批处理方案Canal能达到秒级延迟稳定性经过阿里巴巴生产环境验证支持断点续传和故障恢复扩展性支持自定义消息队列和数据处理逻辑提示Canal 1.1.5版本后已原生支持ES6.x和7.x的适配建议使用较新版本避免兼容性问题2. 环境准备与组件部署2.1 基础环境配置服务器规格建议最低配置2核CPU/4GB内存/50GB磁盘测试环境生产推荐4核CPU/16GB内存/SSD磁盘视数据量调整软件版本要求# 版本兼容性矩阵 MySQL ≥5.7 (需开启binlog) Java 8/11 Elasticsearch 6.x/7.x Canal ≥1.1.52.2 MySQL关键配置必须开启binlog并配置ROW模式这是Canal工作的基础# 在my.cnf中增加配置 [mysqld] log-binmysql-bin binlog-formatROW server_id1 binlog_row_imageFULL expire_logs_days3执行以下SQL创建Canal专用账号CREATE USER canal% IDENTIFIED BY Canal123; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO canal%; FLUSH PRIVILEGES;2.3 Elasticsearch部署建议对于生产环境建议至少3节点集群# elasticsearch.yml关键配置 cluster.name: canal-cluster node.name: node-1 network.host: 0.0.0.0 discovery.seed_hosts: [node1:9300, node2:9300] cluster.initial_master_nodes: [node-1, node-2]3. Canal服务端部署与配置3.1 安装与基础配置下载并解压Canalwget https://github.com/alibaba/canal/releases/download/canal-1.1.7/canal.deployer-1.1.7.tar.gz tar -zxvf canal.deployer-1.1.7.tar.gz -C /opt/canal修改核心配置文件conf/canal.properties# 修改以下关键参数 canal.id1 canal.ip0.0.0.0 canal.port11111 canal.zkServers canal.instance.filter.regex.*\\..* canal.mq.topicexample3.2 实例配置配置MySQL连接实例conf/example/instance.properties# 数据库连接配置 canal.instance.mysql.slaveId1234 canal.instance.master.address127.0.0.1:3306 canal.instance.dbUsernamecanal canal.instance.dbPasswordCanal123 canal.instance.connectionCharsetUTF-8 # 表过滤规则 canal.instance.filter.regextest\\..*3.3 启动与验证启动服务./bin/startup.sh验证日志tail -f logs/canal/canal.log # 正常会看到start successful...日志4. 数据同步核心实现4.1 同步模式选择直接模式适合简单场景// 示例通过CanalClient直接获取数据变更 CanalConnector connector CanalConnectors.newSingleConnector( new InetSocketAddress(127.0.0.1, 11111), example, , ); connector.connect(); connector.subscribe(test\\..*);MQ模式生产推荐# 修改canal.properties启用Kafka canal.serverMode kafka kafka.bootstrap.servers 127.0.0.1:9092 kafka.acks all4.2 ES数据映射策略建议在同步前预先创建ES索引和mappingPUT /products { mappings: { properties: { id: {type: long}, name: { type: text, analyzer: ik_max_word }, price: {type: double}, update_time: { type: date, format: yyyy-MM-dd HH:mm:ss } } } }4.3 增量同步实现使用Canal-Adapter进行ES同步配置# conf/es7/product.yml dataSourceKey: defaultDS destination: example groupId: g1 esMapping: _index: products _type: _doc _id: _id upsert: true sql: SELECT id AS _id, name, price, update_time FROM product5. 生产环境优化方案5.1 性能调优参数Canal服务端# canal.properties canal.instance.memory.buffer.size32m canal.instance.memory.buffer.memunit1024 canal.instance.transaction.size1024ES写入优化# adapter配置 commitBatch: 3000 syncInterval: 10005.2 监控与告警建议配置以下监控指标Canal延迟时间canal.delayES写入QPSes.indexing.rateMySQL binlog位置canal.log.position使用Prometheus采集示例# prometheus.yml scrape_configs: - job_name: canal static_configs: - targets: [canal-server:11112]6. 故障排查手册6.1 常见问题速查表现象可能原因解决方案无数据同步MySQL binlog未开启检查my.cnf配置字段缺失表结构变更未同步重启adapter实例ES写入慢批量参数过小调整commitBatch重复数据主键冲突检查_id映射规则6.2 日志分析技巧典型错误日志CanalParseException: parse row data failed通常表示表结构变更导致解析失败需要检查MySQL表结构重置Canal位点重建ES索引7. 高级应用场景7.1 多表关联同步通过SQL关联查询实现宽表同步SELECT o.id AS _id, o.order_no, p.name AS product_name, u.username FROM orders o LEFT JOIN products p ON o.product_id p.id LEFT JOIN users u ON o.user_id u.id7.2 历史数据初始化使用DataX进行全量同步{ job: { content: [{ reader: { name: mysqlreader, parameter: { username: canal, password: Canal123, column: [*], connection: [{ table: [products], jdbcUrl: [jdbc:mysql://127.0.0.1:3306/test] }] } }, writer: { name: elasticsearchwriter, parameter: { endpoint: http://127.0.0.1:9200, index: products, type: _doc } } }] } }8. 安全防护措施8.1 访问控制方案网络层限制Canal服务端口访问11111配置ES的IP白名单应用层# canal.properties canal.admin.manager.urlhttp://127.0.0.1:8089/api/v1/${canal.admin.manager.url.base} canal.admin.passwd4ACFE3202A5FF5CF8.2 数据加密建议MySQL开启SSL连接ES配置HTTPS传输Canal到ES的通道使用TLS加密9. 版本升级策略平滑升级步骤停止adapter服务备份配置文件升级Canal服务端验证新版本功能逐步升级adapter节点重要升级前务必检查版本兼容性矩阵特别是ES大版本升级时可能需要重建索引10. 扩展架构设计对于超大规模场景建议采用以下架构MySQL → Canal Server → Kafka → Canal Adapter Cluster → ES关键配置参数# Kafka分区策略 canal.mq.partition0 canal.mq.partitionsNum3 canal.mq.partitionHashtest\\..*:id在实际生产环境中我们通过这套架构实现了日均10亿级数据的稳定同步平均延迟控制在3秒以内。其中最关键的是合理设置Kafka分区数和Adapter实例数的比例通常建议分区数是实例数的2-3倍。
返回列表