微服务面试篇(二)

41 阅读5分钟

Canal 是怎么伪装成 MySQL slave?

MySQL 主从复制机制下,slave(从库)会向 master(主库)发送 dump 协议请求,master 则将 binlog(二进制日志,记录数据库所有变更操作)发送给 slave。Canal 模拟了这个过程:

  1. 建立连接:Canal 启动后,会向 MySQL 数据库发起连接请求,这个请求的过程和 MySQL slave 向 master 建立连接是类似的。它使用标准的 MySQL 客户端协议,以类似从库的身份与 MySQL 主库进行通信。
  2. 请求 binlog 日志:成功建立连接后,Canal 会像 MySQL slave 一样,发送 dump 协议请求,告知 MySQL 主库需要获取 binlog 日志。MySQL 主库在接收到请求后,就会将 binlog 内容发送给 Canal。
  3. 解析与处理:Canal 接收到 binlog 日志后,对其进行解析,将二进制格式的日志内容转化为易于理解和处理的结构化数据,比如 SQL 语句或者数据变更事件,然后再将这些解析后的数据发送给下游的应用程序(如消息队列 )。

Canal 数据同步异常了怎么处理?

  1. 检查网络连接

    • 确认 Canal 服务器与 MySQL 主库之间的网络是否畅通,可通过 ping 命令或者尝试在 Canal 服务器上直接连接 MySQL 主库来验证。
    • 检查 Canal 服务器与下游应用(如消息队列、数据同步程序 )之间的网络连接,确保数据能够正常发送和接收。
  2. 查看 Canal 日志

    • Canal 运行时会生成日志文件,一般位于其安装目录下的 logs 文件夹。查看日志可以获取详细的异常信息,比如连接失败的原因、解析 binlog 时遇到的错误等。
    • 根据日志中的错误提示,针对性地解决问题,例如权限不足导致无法连接 MySQL,就需要在 MySQL 中为 Canal 配置合适的权限。
  3. 检查 MySQL 主库状态

    • 确认 MySQL 主库是否正常运行,有无磁盘空间不足、CPU 负载过高等问题,这些问题可能导致 binlog 生成或发送异常。
    • 查看 MySQL 的 binlog 设置,如 binlog 格式是否正确配置(Canal 一般支持 Row 格式的 binlog),binlog 过期清理策略是否会影响 Canal 获取到完整的变更日志。
  4. 排查下游应用问题

    • 如果 Canal 将数据发送到消息队列,检查消息队列是否正常工作,队列是否已满、消息生产和消费是否存在异常等。
    • 对于数据同步程序,查看其日志和运行状态,确认是否能够正确接收和处理 Canal 发送的数据,有无代码逻辑错误导致同步失败。

项目中如何进行索引同步的?

结合前面的架构图,一般是这样进行索引同步:

  1. 监听消息队列:商品信息同步程序监听消息队列(如 MQ),一旦接收到 Canal 发送过来的数据变更消息(增删改操作对应的消息 )。

  2. 解析消息并确定操作类型:同步程序解析消息内容,判断是新增、删除还是修改商品的操作。

  3. 操作 Elasticsearch 索引

    • 新增操作:根据接收到的商品数据,在 Elasticsearch 中创建对应的文档索引,将商品信息按照 Elasticsearch 的文档格式进行存储,并设置合适的字段映射,以支持后续的搜索功能。
    • 删除操作:根据消息中的商品标识(如商品 ID),在 Elasticsearch 中找到对应的文档并删除其索引。
    • 修改操作:先根据商品标识找到 Elasticsearch 中对应的文档,然后更新文档中的相关字段信息,完成索引的更新。

如何保证 Canal+MQ 同步消息的顺序性?

  1. 基于 MySQL 事务顺序:MySQL 的 binlog 是按照事务提交的顺序记录数据变更的,Canal 解析 binlog 也是按照这个顺序进行的。只要保证 Canal 能够完整、有序地获取 binlog 信息,就能确保解析出来的数据变更顺序和在 MySQL 中的事务顺序一致。

  2. 消息队列分区与顺序消费

    • 分区设计:在消息队列(如 Kafka)中,将同一类业务数据(比如同一商品分类、同一店铺的商品数据 )发送到同一个分区。因为在 Kafka 中,分区内的消息是严格有序的。
    • 顺序消费:消费端(如商品信息同步程序 )使用单线程或者顺序消费的机制来消费同一个分区的消息。这样可以保证按照消息在队列中的顺序进行处理,进而保证数据同步的顺序性。
  3. 唯一标识与幂等处理

    • 为每个数据变更消息添加唯一标识(比如基于商品 ID 和操作时间戳生成唯一 ID)。
    • 消费端在处理消息时,先检查是否已经处理过具有相同唯一标识的消息。如果已经处理过,则直接跳过,避免重复处理导致的顺序混乱和数据不一致问题。这就是幂等处理,即使消息出现重复消费,也能保证最终的数据状态是正确的。