×

mysql canal

mysql canal(sql server 中有没有类似于阿里canal的功能)

admin admin 发表于2023-10-26 18:39:42 浏览44 评论0

抢沙发发表评论

本文目录

sql server 中有没有类似于阿里canal的功能

早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求。不过早期的数据库同步业务,主要是基于trigger的方式获取增量变更,不过从2010年开始,阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅&消费的业务,从此开启了一段新纪元。ps. 目前内部使用的同步,已经支持mysql5.x和oracle部分版本的日志解析

mysql有基于LRU缓冲池,其它辅助缓存如memcached和redis的意义应该就不需要了,还是有其它需要的理由

1、首先明确是不是一定要上缓存,当前架构的瓶颈在哪里,若瓶颈真是数据库操作上,再继续往下看。2、明确memcached和redis的区别,到底要使用哪个。前者终究是个缓存,不可能永久保存数据(LRU机制),支持分布式,后者除了缓存的同时也支持把数据持久化到磁盘等,redis要自己去实现分布式缓存(貌似最新版本的已集成),自己去实现一致性hash。因为不知道应用场景,不好说一定要用memcache还是redis,说不定用mongodb会更好,比如在存储日志方面。3、缓存量大但又不常变化的数据,比如评论。4、思路是对的,清晰明了,读DB前,先读缓存,如果有直接返回,如果没有再读DB,然后写入缓存层并返回。5、考虑是否需要主从,读写分离,考虑是否分布式部署,考虑是否后续水平伸缩。6、想要一劳永逸,后续维护和扩展方便,那就将现有的代码架构优化,按你说的替换数据库组件需要改动大量代码,说明当前架构存在问题。可以利用现有的一些框架,比如SpringMVC,将应用层和业务层和数据库层解耦。再上缓存之前把这些做好。7、把读取缓存等操作做成服务组件,对业务层提供服务,业务层对应用层提供服务。8、保留原始数据库组件,优化成服务组件,方便后续业务层灵活调用缓存或者是数据库。9、不建议一次性全量上缓存,最开始不动核心业务,可以将边缘业务先换成缓存组件,一步步换至核心业务。10、刷新内存,以memcached为例,新增,修改和删除操作,一般采用lazy load的策略,即新增时只写入数据库,并不会马上更新Memcached,而是等到再次读取时才会加载到Memcached中,修改和删除操作也是更新 数据库,然后将Memcached中的数据标记为失效,等待下次读取时再加载。大方向两种方案:1、脚本同步:自己写脚本将数据库数据写入到redis/memcached。这就涉及到实时数据变更的问题(mysql row binlog的实时分析),binlog增量订阅Alibaba 的canal ,以及缓存层数据 丢失/失效 后的数据同步恢复问题。2、业务层实现:先读取nosql缓存层,没有数据再读取mysql层,并写入数据到nosql。nosql层做好多节点分布式(一致性hash),以及节点失效后替代方案(多层hash寻找相邻替代节点),和数据震荡恢复了。

canal 备用mysql怎么接上的

在mysql中 配置canal数据库管理用户,配置相应权限# mysql -uroot -prootCREATE USER canal IDENTIFIED BY ’canal’;GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO ’canal’@’%’ IDENTIFIED BY ’canal’ WITH GRANT OPTION;FLUSH PRIVILEGES;安装canal本文使用的是:canal.deployer-1.0.22.tar.gz# mkdir canal# tar -zxvf canal.deployer-1.0.22.tar.gz -C canal修改配置信息:# vim conf/canal.propertiescanal.id= 1canal.ip=canal.port= 11111canal.zkServers=192.168.10.1:2181# vim conf/example/instance.properties## mysql serverIdcanal.instance.mysql.slaveId = 1234# position info, 需要改成自己的数据库信息canal.instance.master.address = 127.0.0.1:3306# username/password,需要改成自己的数据库信息canal.instance.dbUsername = canalcanal.instance.dbPassword = canal

canal传递过来的bin-log会丢失

1、开启bin-log,路径要设置在mysql用户所属文件夹下例如:log-bin=/home/123/bin-log 123的所属用户就要是Mysql /usr/libexec/mysqld: Shutdown complete140116 16:17:06 mysqld ended这种报错有可能是设置bin-log日志路径时,没有指定在Mysql所属用户的目录下。也有另外一种可能是:mysql》 select @@max_join_size;+-----------------+| @@max_join_size |+-----------------+| 705032704 |+-----------------+1 row in set (0.00 sec)mysql》 SET sql_max_join_size=4294967295;Query OK, 0 rows affected (0.00 sec)设置了max_join_size参数,当然,一般来说这个参数的默

如何有效的跟踪线上 MySQL 实例表和权限的变

有很多种方式可以实现, 比如通过 migrate 等工具强制所有的操作都以统一的方式执行, 这需要开发人员做更多的配合, 所以这类工具在非规模话的业务场景中较难实现; 另外管理员或 DBA 也可以通过知识库比如 redmine 等类似的方式记录变更, 不过不可控因素很多, 特别依赖上线的流程, 也容易出现纰漏. 这就引申出本文要介绍的如何跟踪线上库表的变更, 下文以 MySQL 数据库介绍说明.

跟踪的方式

在 Postgresql 中, 由于触发器对各种操作都有很好的支持, 我们完全可以通过触发器的形式来记录所有 DDL 语句的变更. 与此相比, MySQL 则显得较为弱小, 我们只能以其它方式实现类似的目标. 下面以中间件, log, binlog, 注册 slave, mysqldiff 五种方式进行介绍.

1. 中间件

现有的中间件 atlas, kingshard, mycat 等, 都以 proxy 的角色部署于程序和 MySQL 之间, 所有发往 MySQL 的 sql 都通过 proxy 进行转发. 如下图所示, 我们可以在 proxy 层面增加一些 DDL, DML 相关语句的记录, 达到跟踪变更的目的.

+------+        +-------+        +-------+| app  |  ---》  | proxy |  ---》  | MySQL |+------+        +-------+        +-------+

这种方式自由度较高, 大家都可以随意定制. 不过需要一些开发能力, 另外 sql 的过滤也会影响到查询的性能, 通过中间件来直接修改表结构等操作也是有风险较大的方式.

2. log

这种方式很简单, 打开 MySQL 的 general log 或 audit log 即可记录所有的 sql 语句. 这种方式比较适合开发环境, 线上环境如果开启会产生很多日志, 弊远远大于利, 也不利于维护;

3. binlog

管理员或 DBA 同样可以解析 MySQL 的 binlog 来过滤表或权限的变更. 这种方式本质上等同第二种方式, 线上数据库需要开启 binlog 选项, 解析 binlog 也是很耗资源的操作. 线上如果实例较多, 这种方式特别不可取.

4. 注册 slave

注册 slave 的意思即通过 MySQL 的主从协议伪造一个假的 slave, 这样 master 会把所有的更新都发送过来, 再进行一些过滤的操作. 这种方式在同步数据或增量消费的场景特别适合, 这里只用于记录表或权限的变更确实是大材小用, 线上实例较多的话也不可取. 典型的工具有 myreplication, tungsten-replicator 以及阿里的 canal 等.

5. mysqldiff

实际上权限和表变更本身是低频率的操作事件, 上述的四种方式虽然都可以达到目标, 但本质上都是很耗费资源的操作. 考虑到这点, 我们可以通过对比的方式来实现权限及表结构变更的跟踪, 详见 sys-mysql-diff 工具. 考虑到通用性, sys-mysql-diff 工具每次都需要获取指定库的所有表的定义语句, 通过对比来生成对应的 DDL 语句. mysqldiff 则是对 sys-mysql-diff 工具的封装, 可以批量跟踪多个实例.

如何使用 mysqldiff

mysqldiff 工具是在 sys-mysql-diff 工具的基础上进行了一层封装, 所以本质上是通过 sys-mysql-diff 工具跟踪线上库的变化. 在实际的运用中, 需要注意以下几点:

1. 配置文件

mysqldiff 所需要的配置参考以下:

host = 10.0.21.7port = 3306db   = perconauser = user_mysqldiffpass = xxxxxxxxtag  = host_location

2. 权限

所有的变更结果都会保存到指定的 MySQL 库中的 mysql_diff 表, 即上述的  部分的用户为例, 需要赋予他们以下权限:

?

12grant select,insert,update on mysqldiff.* to user_mysqlmon@`10.0.21.%`;grant select on *.* to user_mysqldiff@`10.0.21.%` with grant option;

配置中的 db = information_schema 则表示跟踪所有的数据库;

3. 运行

运行 mysqldiff 命令进行跟踪:

# ./mysqldiff -conf conf.cnf -verbose2017/03/20 16:31:27 ---------------------------changes from 10.0.21.5:3301 changes from 10.0.21.7:3306 DROP TABLE `emp`;SET GLOBAL wait_timeout = 1000;2017/03/20 16:31:27 insert 10.0.21.17:3306/percona ok2017/03/20 16:31:27 ---------------------------

insert ... ok 一行表示将结果插入到了  中.

如何使用redis做mysql的缓存

大方向两种方案:1.脚本同步:自己写脚本将数据库数据写入到redis/memcached。这就涉及到实时数据变更的问题(mysql row binlog的实时分析),binlog增量订阅Alibaba 的canal ,以及缓存层数据 丢失/失效 后的数据同步恢复问题。2.业务层实现:先读取nosql缓存层,没有数据再读取mysql层,并写入数据到nosql。nosql层做好多节点分布式(一致性hash),以及节点失效后替代方案(多层hash寻找相邻替代节点),和数据震荡恢复了。作者:liu kelin链接:

怎么在mysql中 配置canal数据库管理用户,配置相应权限

在mysql中 配置canal数据库管理用户,配置相应权限# mysql -uroot -prootCREATE USER canal IDENTIFIED BY ’canal’;GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO ’canal’@’%’ IDENTIFIED BY ’canal’ WITH GRANT OPTION;FLUSH PRIVILEGES;安装canal本文使用的是:canal.deployer-1.0.22.tar.gz# mkdir canal# tar -zxvf canal.deployer-1.0.22.tar.gz -C canal修改配置信息:# vim conf/canal.propertiescanal.id= 1canal.ip=canal.port= 11111canal.zkServers=192.168.10.1:2181# vim conf/example/instance.properties## mysql serverIdcanal.instance.mysql.slaveId = 1234# position info, 需要改成自己的数据库信息canal.instance.master.address = 127.0.0.1:3306# username/password,需要改成自己的数据库信息canal.instance.dbUsername = canalcanal.instance.dbPassword = canal

如何实现监控mysql,并将有变动的数据表写入指定的文件夹

首先介绍下 pt-stalk,它是 Percona-Toolkit 工具包中的一个工具,说起 PT 工具包大家都不陌生,平时常用的 pt-query-digest、 pt-online-schema-change 等工具都是出自于这个工具包,这里就不多介绍了。

pt-stalk 的主要功能是在出现问题时收集 OS 及 MySQL 的诊断信息,这其中包括:

1. OS 层面的 CPU、IO、内存、磁盘、网络等信息;

2. MySQL 层面的行锁等待、会话连接、主从复制,状态参数等信息。

而且 pt-stalk 是一个 Shell脚本,对于我这种看不懂 perl 的人来说比较友好,脚本里面的监控逻辑与监控命令也可以拿来参考,用于构建自己的监控体系。

三、使用

接着我们来看下如何使用这个工具。

pt-stalk 通常以后台服务形式监控 MySQL 并等待触发条件,当触发条件时收集相关诊断数据。

触发条件相关的参数有以下几个:

  • function:

    ∘ 默认为 status,代表监控 SHOW GLOBAL STATUS 的输出;

    ∘ 也可以设置为 processlist,代表监控 show processlist 的输出;

  • variable:

    ∘ 默认为 Threads_running,代表 监控参数,根据上述监控输出指定具体的监控项;

  • threshold:

    ∘ 默认为 25,代表 监控阈值,监控参数超过阈值,则满足触发条件;

    ∘ 监控参数的值非数字时,需要配合 match 参数一起使用,如 processlist 的 state 列;

  • cycles:

    ∘ 默认为 5,表示连续观察到五次满足触发条件时,才触发收集;

  • 连接参数:host、password、port、socket。

  • 其他一些重要参数:

  • iterations:该参数指定 pt-stalk 在触发收集几次后退出,默认会一直运行。

  • run-time:触发收集后,该参数指定收集多长时间的数据,默认 30 秒。

  • sleep:该参数指定在触发收集后,sleep 多久后继续监控,默认 300 秒。

  • interval:指定状态参数的检查频率,判断是否需要触发收集,默认 1 秒。

  • dest:监控数据存放路径,默认为 /var/lib/pt-stalk。

  • retention-time :监控数据保留时长,默认 30 天。

  • daemonize:以后台服务运行,默认不开启。

  • log:后台运行日志,默认为 /var/log/pt-stalk.log。

  • collect:触发发生时收集诊断数据,默认开启。

    ∘ collect-gdb:收集 GDB 堆栈跟踪,需要 gdb 工具。

    ∘ collect-strace:收集跟踪数据,需要 strace 工具。

    ∘ collect-tcpdump:收集 tcpdump 数据,需要 tcpdump 工具。

怎样做到从mysql 到 Hbase 或Hive的数据实时同步

1、想问下原来数据库中的数据会不会有更新和删除,如果有的话,想实时同步到hive中很难。另外即使能实时同步到hive中,hive中分析查询也速度也比较慢的。2、可以尝试MySQL-Binlog这个软件 ,开源中国上搜索即可

使用canal时为什么一定要给mysql一个canal用户

使用canal时为什么一定要给mysql一个canal用户在开发 Spark Streaming 的公共组件过程中,需要将 binlog 的数据(Array)转换为 Json 格式,供用户使用,本文提供一种转换的思路