使用canal将mysql同步到es中
因为自己项目中需要用到mysql数据同步到es中,查找了相关资料最后决定用canal来做,所以便有了本文,下面一起来看如何使用canal吧 根据 https://github.com/alibaba/canal 上的原理解释,我们知道 canal 会模拟 mysql slave 的交互协议,伪装自己为 mysql slave,然后向 mysql master 发送 dump 协议。 mysql master 收到 dump 请求,开始推送 binary log 给 slave(也就是 canal),然后 canal 解析 binary log 对象(原始为 byte流)。 经 canal 解析过的对象,我们使用起来就非常的方便了。 再根据 https://github.com/alibaba/canal/releases 提供的版本信息,你会发现 canal 其实相当于一个中间件,专门用来解析 MySQL 的 binlog 日志。canal 解析好了之后,会封装成一个数据对象,通过 protobuf3.0 协议进行交互,让 canal 客户端进行消费。 根据上面的解释,以及 canal 提供的版本信息,我们在使用 canal 的时候,首选要安装一个 canal.deployer-1.1.4.tar.gz 进行解析 MySQL 的 binlog 日志。 下载后,复制 canal.deployer-1.1.4.tar.gz 到 MySQL 主机上,比如放在 /usr/local/soft/目录下。然后依次执行下面的命令: 然后修改 canal 的配置文件 vim conf/example/instance.properties 这三项改成你自己的,比如我的配置如下: 然后保存并退出。(VI 模式下,按 Esc 输入 :wq 回车退出。) 接着,我们检查一下 MySQL 的配置。确定版本和是否开启了 binlog 日志,以及日志格式。 canal 支持 binlog 格式为 ROW 的模式。如果你没开启 binlog,并且格式是非 row 的,建议修改一下 mysql 的配置文件。 执行 mysql –help | grep my.cnf 找到 mysql 的 my.cnf 文件。 执行 vim /etc/my.cnf 命令。添加下面 3 个配置。 然后保存并退出。 接着执行 sudo service mysqld restart 重启 MySQL。 需要注意的是你的 mysql 用户,必须要有 REPLICATION SLAVE 权限。该权限授予 slave 服务器以该账户连接 master 后可以执行 replicate 操作的权利。 如果没有权限,则使用 root 账户登录进 MySQL,执行下面的语句,创建用户,分配权限。 MySQL 启动后,就可以开启 canal 服务了。 开启后,观察 canal 服务的日志,确保服务正常。 查看 canal 的日志 确定没有问题后,开始编写我们的测试程序。 pom.xml 中导入下面的依赖。 使用JAVA进行测试 然后执行 main 方法。你再修改修改 MySQL 中的数据,你会发现所有改变都同步过来了。上面是使用的Java代码进行运行,如果想用canal.adapter来进行运行可以下载 放入服务器中,依次执行下面命令 然后修改配置文件 : 然后将需要运行存储到es的的yml文件放入到 目录下。例如: 然后开启canal-adapter服务 /usr/local/soft/canal-adapter/bin/startup.sh 查看 canal-adapter 的日志,确定没有问题后修改数据 就可以同步到es了 注意: 1、canal-adapter自带mysql连接使用的5.x的,如果自己安装的是高版本的mysql需要自己去/usr/local/soft/canal-adapter/lib增加对应的jar包 2、因项目中同步es使用的sql中有数据库中没有的字段,导致原生程序一直报异常,后修改源码中 加了一个判断后才可以 3、es中使用的date字段类型和数据库中不一致,所以这里又修改了部分源码兼容我们项目中的类型 可以根据各自情况修改。
canal可以实现主从切换吗
可以。该参数在主备库的配置大小不一致。 从主库传递到备库的binlog event大小超过了主库或者备库的max_allowed_packet大小。可以查看变量值:SHOW GLOBAL VARIABLES LIKE "%max_allowed_packet%"; 看两个库的值是否一致。在对应个binlog文件中找不到对应的偏移量position,可以通过mysqlbinlog命令查看,发现没有要报错要找的1104(position),可以切换到存在的position位点。
canal+Kafka实现mysql与redis数据同步
前言 上篇文章简单介绍canal概念,本文结合常见的缓存业务去讲解canal使用。在实际开发过程中,通常都会把数据往redis缓存中保存一份,做下简单的查询优化。如果这时候数据库数据发生变更操作,就不得不在业务代码中写一段同步更新redis的代码,但是这种 数据同步的代码和业务代码糅合在一起 看起来不是很优雅,而且还会出现数据不一致问题。那能不能把这部分同步代码从中抽离出来,形成独立模块呢?答案是肯定的,下面通过canal结合Kafka来实现mysql与redis之间的数据同步。 架构设计 通过上述结构设计图可以很清晰的知道用到的组件:MySQL、Canal、Kafka、ZooKeeper、Redis。 Kafka&Zookeeper搭建 首先在 官网 下载Kafka: 下载后解压文件夹,可以看到以下几个文件: Kafka内部自带了zookeeper,所以暂不需要去下载搭建zookeeper集群,本文就使用Kafka自带zookeeper来实现。 通过上述zookeeper启动命令以及Kafka启动命令把服务启动,可以通过以下简单实现下是否成功: Canal搭建 canal搭建具体可以参考上文,这里只讲解具体的参数配置: 找到/conf目录下的canal.properties配置文件: 然后配置instance,找到/conf/example/instance.properties配置文件: 经过上述配置后,就可以启动canal了。 测试 环境搭建完成后,就可以编写代码进行测试。 1、引入pom依赖 2、封装Redis工具类 在application.yml文件增加以下配置: 封装一个操作Redis的工具类: 3、创建MQ消费者进行同步 创建一个CanalBean对象进行接收: 最后就可以创建一个消费者CanalConsumer进行消费: 测试Mysql与Redis同步 mysql对应的表结构如下: 启动项目后,新增一条数据: 可以在控制台看到以下输出: 如果更新呢?试一下Update语句: 同样可以在控制台看到以下输出: 经过测试完全么有问题。 总结 既然canal这么强大,难道就没缺点嘛?答案当然是存在的啦,比如:canal只能同步增量数据、不是实时同步而是准实时同步、MQ顺序问题等; 尽管有一些缺点,毕竟没有一样技术或者产品是完美的,最重要是合适。比如公司目前有个视图服务提供宽表搜索查询功能就是通过 同步Mysql数据到Es采用Canal+Kafka的方式来实现的。
canal开机自启动
发现一个有意思的事情,canal 如果不正常退出服务,比如虚拟机强制重启等,canal开机就无法正常启动,报错如下 found canal.pid , Please run stop.sh first ,then startup.sh canal is started ; 说的就是找到了canal.pid 请先运行stop.sh,实际上canal服务已经停止了. 这个时候就简单点;
skim \ canal \wool这英语怎么念呢??
思king母 \堪啊\娃
canal同步MQ配置
第一步: canal原理是把自己伪装成一个mysql的从节点来读取mysql主库的binlog日志。 所以需要mysql主库先开启binlog日志功能。可以参考其他帖子打开binlog功能。 ps!!!!! 这里有一个非常值得注意的问题就是canal采集到MQ数据中使用的是binlog的的row模式 一定要是row模式。并且canal中配置canal.instance.filter.regex 如果配制指定采集某几个表一定要在mysql中配置binlog_rows_query_log_events是OFF模式的。否则canal中的canal.instance.filter.regex过滤器不生效。 第二步: canal服务解压之后 其中canal_local.properties是canal控制台配置文件 canal.properties 是canal基础服务配置文件 ht_order_sync文件夹 是canal的服务实例 ht_product_sync文件夹 是canal的服务实例 上面这些是比较关键的文件 其中ht_order_sync 和 ht_product_sync 是我自己创建的文件名字可以随便叫什么都可以 如果是全新的canal解压之后 有一个example文件那个就是样例文件。 我创建了 ht_order_sync 和 ht_product_sync 是因为我有两个业务需求是 同步订单业务 和 商品业务 所以创建了两个实例,canal启动之后会加载自己创建的文件夹。 cd 进入 ht_order_sync文件夹后 如下图 我们一般需要改的只有 instance.properties 这个文件。其他文件是记录binlog的同步位置的文件。删除之后就重置binlog的采集位置,所以不要轻易删除。 下面打开instance.properties 如下图 图中 1 是要采集的mysql的账号和密码 2 是要采集的哪张表可以配置全部也可以配置部分我是配置了部分表可以直接写库和表名,我库名用了变量后面讲怎么传进来的 3 是黑明单结合上面那个白名单用的 我固定了采集某几张表所以不要配置 4 是采集的每一行的变动会发送到配置的mq的topic中作为mysql的一条改动数据(增删改) mq数据如下图会包含改动前和改动后的数据表名库名等等。 上图是我做的一个insert的样例数据,type类型就是insert,还有update和delete 有字段类型描述 old 是改动前的数据 因为insert 操作所以是null 如果是update操作此处会有值 可以做变更监听逻辑 data是当前改动后的数据。 上面说的都是具体实例配置 下面贴出canal的实例上层配置文件也就是canal服务配置文件 canal.properties 如下图. 一张图截图放不下放了三张图 图上编号 1 是代表canal采集到信息推送到哪里。tcp是代表可以推送到程序采集模式 如果是mq配置成对应的mq比如 kafka活着rocketmq等等 2 是canal.destinations 扫描上面说的自己创建的实例 配置几个文件夹扫描几个 canal.auto.scan = true 的意思是自动扫描自己创建的实例。 所以应该可以把canal.auto.scan 配置成false然后配置canal.destinations自己创建的文件夹 即可 3 canal.mq.flatMessage = true 关注一下 采集的消息的消息方式之前好像不设置成true没采集到,已经忘了 也需要配置 mq读取 也使用这个方式。 可以参考一下官网等等。 4 配置成了rocketMQ那么就配置 相关的主题等等 结束
canal除了运河还有什么意思
canal英 [kəˈnæl] 美 [kəˈnæl] n.运河,沟渠; 管道; 气管; 食道; vt.建运河; 疏导; [例句]He would attach a cable around the chassis of the car and winch it up on to the canal bank. 他会把钢丝绳拴在汽车底盘上,用卷扬机把汽车吊到运河岸上。 [其他]复数:canals
canal怎么翻译
canal运河
canal和river的区别
形成、储水量不同。1、形成上。canal是运河的意思,是人工开凿形成的,而river是江、河的意思,是天然形成的。2、储水量上。canal运河人工开凿的储水量有一定的限度,而river江、河的储水量是没有限度的。
浅谈:canal配置方式
canal配置方式有两种: spring配置的原理是将整个配置抽象为两部分: 通过spring的PropertyPlaceholderConfigurer通过机制将两部分融合,生成一个instance实例对象,每个instance对应的组件都是相互独立的,互不影响。 properties配置文件分为两部分: a.在canal.properties定义了canal.destinations后,需要在canal.conf.dir对应的目录下建立同名的文件 比如: canal.destinations = example1,example2 ,这时需要创建example1和example2两个目录,每个目录里各自有一份instance.properties. ps. canal自带了一份instance.properties demo,可直接复制conf/example目录进行配置修改。 b. 如果canal.properties未定义instance列表,但开启了canal.auto.scan时 目前默认支持的xxx-instance.xml有四种: spring/memory-instance.xml介绍: spring/file-instance.xml介绍: spring/default-instance.xml介绍: spring/group-instance.xml介绍: https://github.com/alibaba/canal/wiki/AdminGuide
canal是什么意思
canal英 [kəˈnæl] 美 [kəˈnæl]n.运河,沟渠; 管道; 气管; 食道vt.建运河; 疏导1. The rough rock walls were like the sides of a deep canal. 凸凹不平的石墙就像一条很深的运河的河岸。来自柯林斯例句2. Long-mothballed projects like widening the Suez Canal are being dusted off. 诸如拓宽苏伊士运河等长期束之高阁的计划正被重新采用。来自柯林斯例句3. Hearing can be affected by ear wax blocking the ear canal. 耳垢堵塞耳道可能会影响听力。来自柯林斯例句
canal什么意思
canal的意思:运河。读音:英[kəˈnæl]、美[kəˈnæl]。释义:n. 运河;[地理] 水道;[建] 管道;灌溉水渠vt. 在…开凿运河n. (Canal)人名;(英、法、西、意、葡)卡纳尔;(土)贾纳尔变形:复数 canals。同近义词:pipeline/klongn. [水运]运河;[地理]水道;[建]管道;灌溉水渠canal造句如下:1、The construction of the canal is a huge project.修建运河是一项浩大的工程。2、The patient has a lesion in his alimentary canal.这个病人的消化道出现了病变。3、I saw the Martian canal through an astronomical telescope.我通过天文望远镜看到了火星运河。4、The Beijing-Hangzhou Grand Canal has played a major role throughout Chinese history.京杭大运河在整个中国历史上发挥了重要的作用。5、Container ship wedged in Suez Canal.货轮“卡死”苏伊士运河。
canal怎么读
canal的读法是:【kəˈnæl】。一、词组1、Suez Canal:苏伊士运河。2、Erie Canal:伊利运河。3、semicircular canal:半规管。4、Rideau Canal:里多运河。5、alimentary canal:消化道;消化管。6、root canal therapy:根管治疗术;根管疗法。7、Spinal canal:髓管;脊柱管;脊椎管。8、Vertebral canal:椎管。9、canal rays:极隧射线。二、双语例句1、You can take a boat through its 177 canals.你可以乘船通过这里的177条运河。2、Traffic is light on Venice"s canals.威尼斯运河上交通顺畅。3、It is unique because of its beautiful canals and bridges.威尼斯因其漂亮的运河和桥梁而独具特色。