当前位置:首页 > PHP教程 > php高级应用 > 列表

使用Canal实现PHP应用程序与MySQL数据库的实时数据同步

发布:smiling 来源: PHP粉丝网  添加日期:2023-07-11 18:27:02 浏览: 评论:0 

Canal是阿里巴巴开源的一个数据同步工具,可实现MySQL数据库到其他数据源的实时同步,PHP应用程序中可轻松使用,提高系统的可靠性和实时性,提供了丰富的API和文档支持。

canal简介

由阿里巴巴开源 github地址:https://github.com/alibaba/canal

Canal是阿里巴巴开源的一个基于MySQL协议的数据同步工具,可以将MySQL数据库中的数据实时同步到其他数据源中。在PHP应用程序中,可以使用Canal轻松实现与MySQL数据库的实时数据同步,减少了数据同步的延迟和数据丢失的风险,提高了系统的可靠性和实时性。

Canal提供了丰富的API和文档支持,可以方便地进行集成和使用

伪装成mysql从服务器,解析mysql的binlog文件

我主要是用来做redis缓存的更新&以及商品订阅降价的通知

安装:

  1. # 这玩意依赖java 
  2. # java8以后版本的jdk根据 stdout.log 中的报错对 startup.sh 中的执行参数进行更改 
  3.  
  4. # 我的下载canal位置为 /download/canal 
  5. cd /download/canal 
  6. # 下载 得到 canal.deployer-1.1.5.tar.gz 
  7. wget http://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.deployer-1.1.5.tar.gz 
  8. # 解压 
  9. tar -zxvf canal-1.1.5/canal.deployer-1.1.5.tar.gz 
  10. # /download/canal/当前目录结构 
  11. # bin 可执行sh 
  12. # conf 配置 
  13. # lib 包 
  14. # plugin 插件 
  15. # logs 日志   stdout.log 位置: /download/canal/logs/canal/stdout.log 

配置:

  1. # 配置canal上的数据库连接设置  
  2. vim /download/canal/conf/example/instance.properties 
  3. canal.instance.master.address=127.0.0.1:3306 
  4.  
  5. # 通过mysql show master status 中的 File 
  6. canal.instance.master.journal.name=mysql-bin.000001 
  7. # 通过mysql show master status 中的 Position 
  8. canal.instance.master.position=856 
  9. # 连接mysql的用户名 一定要有读取binlog的权限 
  10. canalcanal.instance.dbUsername=canal 
  11. canalcanal.instance.dbPassword=canal 
  12.  
  13. # 可以这么创建用户 
  14. CREATE USER 'canal'@'%' IDENTIFIED by 'canal'; 
  15. GRANT SELECT,REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%'; 
  16. FLUSH PRIVILEGES 

启动

/download/canal/bin/startup.sh

安装php与canal连接的组件

# github地址

https://github.com/xingwenge/canal-php

# 我在laravel中使用,所以选择composer的安装方式

composer require xingwenge/canal_php

简单示例:

  1. //我在laravel下的public同级下建bin/core.php 
  2. require __DIR__.'/../vendor/autoload.php'
  3. use xingwenge\canal_php\CanalClient; 
  4. use xingwenge\canal_php\CanalConnectorFactory; 
  5. use xingwenge\canal_php\Fmt; 
  6. try { 
  7.     $client = CanalConnectorFactory::createClient(CanalClient::TYPE_SOCKET_CLUE); 
  8.     # $client = CanalConnectorFactory::createClient(CanalClient::TYPE_SWOOLE); 
  9.     $client->connect("127.0.0.1", 11111); 
  10.     $client->checkValid(); 
  11. //    $client->subscribe("1001", "example", ".*\\..*"); 
  12.     $client->subscribe("1001""example""laravel.school"); # 设置过滤 
  13.     while (true) { 
  14.         $message = $client->get(100); 
  15.         if ($entries = $message->getEntries()) { 
  16.             foreach ($entries as $entry) { 
  17.                 Fmt::println($entry); 
  18.             } 
  19.         } 
  20.         sleep(1); 
  21.     } 
  22.     $client->disConnect(); 
  23. } catch (\Exception $e) { 
  24.     echo $e->getMessage(), PHP_EOL; 

结果展示:

使用Canal实现PHP应用程序与MySQL数据库的实时数据同步

使用Canal实现PHP应用程序与MySQL数据库的实时数据同步

Tags: Canal PHP+MySQL PHP实时数据同步

分享到: