首先要Canal服务端下载:链接: https://pan.baidu.com/s/1FwEnqPC1mwNXKRwJuMiLdg 密码: r8xf

连接数据库的时候需要给予连接数据库权限:在my.ini配置文件里加上 log-bin=mysql-bin 这个就行了

连接数据库的账号需要授权

CREATE USER cqlpz IDENTIFIED BY 'cqlpz';

GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'cqlpz'@'%';

FLUSH PRIVILEGES; 创建一个账号并给予权限

解压出来有4个目录

2.conf 里面canal.properties 配置canal自己的 比如多个服务连接,canal缓存名称

这是example里面的内容;

两个properties就是配置自己的数据库连接,meta.dat相当于启动canal服务过后的额缓存信息

3.lib 就是canal需要的jar

4.logs 日志文件

maven引入jar

 1 <dependency>
2 <groupId>com.alibaba.otter</groupId>
3 <artifactId>canal.client</artifactId>
4 <version>1.0.25</version>
5 </dependency>
6 <dependency>
7 <groupId>redis.clients</groupId>
8 <artifactId>jedis</artifactId>
9 <version>2.9.0</version>
10 </dependency>

java代码

1.连接canal服务

 // 创建链接
CanalConnector connector = CanalConnectors.newSingleConnector(
new InetSocketAddress(AddressUtils.getHostIp(), 端口),
"canal名称(虚拟数据名)",
"数据库账号",
"数据库密码");

2.连接某个数据库

connector.connect();
connector.subscribe("监控的数据库\\..*");
connector.rollback();

3.获取操作的事件

Message message = connector.getWithoutAck(数量); // 获取指定数量的数据
List<Entry> entrys=message.getEntries();
for (Entry entry : entrys) {
if (entry.getEntryType() == EntryType.TRANSACTIONBEGIN ||entry.getEntryType() == EntryType.TRANSACTIONEND) {
continue;
}
RowChange rowChage = null;
try {
rowChage = RowChange.parseFrom(entry.getStoreValue());
} catch (InvalidProtocolBufferException e) {
System.out.println("获取数据失败:"+e.getMessage());
}
EventType eventType = rowChage.getEventType();
for (RowData rowData : rowChage.getRowDatasList()) {
if (eventType.equals(EventType.DELETE)) {
rowData.getBeforeColumnsList();//删除的所有数据
} else if (eventType.equals(EventType.INSERT)) {
rowData.getAfterColumnsList();//添加的所有数据
}else if(eventType.equals(EventType.UPDATE)) {
rowData.getAfterColumnsList();//修改的所有数据
}
}

完整的java类

public class ClientSample {
private static Logger logger = LoggerFactory.getLogger(ClientSample.class); public void startCanalThread(){
Thread thread = new StartCanalThread();
thread.start();
}
/**
* canal 线程
*/
public class StartCanalThread extends Thread {
@Override
public void run() {
// 创建链接
CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress("localhost", 11111),
"longpizi",
"longpizi",
"cqlongpizi");
connector.connect();
connector.subscribe("test\\..*");
connector.rollback();
try {
while (true) {
// 获取指定数量的数据
Message message = connector.getWithoutAck(1000);
long batchId = message.getId();
if (batchId != -1 && message.getEntries().size() > 0) {
printEntry(message.getEntries());
}
connector.ack(batchId); // 提交确认
Thread.sleep(2000);
} }catch (Exception e){
logger.error("Canal线程异常,已终止:"+e.getMessage());
} finally {
//中断Canal连接
connector.disconnect();
}
}
} /**
* 数据库执行的操作
* @param entrys
*/
private static void printEntry( List<Entry> entrys) {
for (Entry entry : entrys) {
//操作事物 忽略
if (entry.getEntryType() == EntryType.TRANSACTIONBEGIN || entry.getEntryType() == EntryType.TRANSACTIONEND) { continue; }
RowChange rowChage = null;//执行事件信息
String database=null;//执行的数据库
String table=null;//执行的表
try {
database=entry.getHeader().getSchemaName();
table=entry.getHeader().getTableName();
rowChage = RowChange.parseFrom(entry.getStoreValue());
} catch (InvalidProtocolBufferException e) {
logger.error("获取数据失败:"+e.getMessage());
}
//获取执行的事件
EventType eventType = rowChage.getEventType();
for (RowData rowData : rowChage.getRowDatasList()) {
//删除操作
if (eventType.equals(EventType.DELETE)) {
redisDelete(rowData.getBeforeColumnsList(),database,table);
}
//添加操作
else if (eventType.equals(EventType.INSERT)) {
redisInsert(rowData.getAfterColumnsList(),database,table);
}
//修改操作
else if(eventType.equals(EventType.UPDATE)) {
redisUpdate(rowData.getAfterColumnsList(),database,table);
}
//修改表结构
else if(eventType.equals(EventType.ALTER)){
logger.info("修改表结构");
}
}
}
} /**
* 数据库执行了添加操作
* @param columns
* @param database
* @param table
*/
private static void redisInsert( List<Column> columns,String database,String table){
JSONObject json=new JSONObject();
for (Column column : columns) {
json.put(column.getName(), column.getValue());
}
System.out.println("数据库:"+database+"==>表:"+table+"==>添加数据:"+JSON.toJSONString(json));
} /**
* 数据库执行了修改操作
* @param columns
* @param database
* @param table
*/
private static void redisUpdate( List<Column> columns,String database,String table){
JSONObject json=new JSONObject();
for (Column column : columns) {
json.put(column.getName(), column.getValue());
}
System.out.println("数据库:"+database+"==>表:"+table+"==>修改数据:"+JSON.toJSONString(json));
} /**
* 数据库执行了删除操作
* @param columns
* @param database
* @param table
*/
private static void redisDelete( List<Column> columns,String database,String table){
JSONObject json=new JSONObject();
for (Column column : columns) {
json.put(column.getName(), column.getValue());
}
System.out.println("数据库:"+database+"==>表:"+table+"==>删除数据:"+JSON.toJSONString(json));
}
}

这样就可把操作的数据更新到redis里面了

Canal监控Mysql同步到Redis(菜鸟也能搭建)的更多相关文章

  1. mysql同步之otter/canal环境搭建完整详细版

    接上一篇mysql 5.7多源复制(用于生产库多主库合并到一个查询从库). 这一篇详细介绍otter/canal环境搭建以及当同步出现异常时如何排查.本文主要参考https://blog.csdn.n ...

  2. Zabbix监控mysql配置及故障告警配置

    本文主要介绍zabbix监控mysql的配置,包含使用zabbix自带模板监控mysql相关信息及自定义key监控mysql同步情况.同时介绍了触发器的创建及zabbix通过邮件方式告警配置. 一.配 ...

  3. Canal 实战 | 第一篇:SpringBoot 整合 Canal + RabbitMQ 实现监听 MySQL 数据库同步更新 Redis 缓存

    一. Canal 简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同 ...

  4. canal整合springboot实现mysql数据实时同步到redis

    业务场景: 项目里需要频繁的查询mysql导致mysql的压力太大,此时考虑从内存型数据库redis里查询,但是管理平台里会较为频繁的修改增加mysql里的数据 问题来了: 如何才能保证mysql的数 ...

  5. 转载:阿里canal实现mysql binlog日志解析同步redis

    from: http://www.cnblogs.com/duanxz/p/5062833.html 背景 早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求.不过早期的数 ...

  6. Docker安装canal、mysql进行简单测试与实现redis和mysql缓存一致性

    一.简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费. 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求 ...

  7. 【菜鸟玩Linux开发】通过MySQL自动同步刷新Redis

    在服务端开发过程中,一般会使用MySQL等关系型数据库作为最终的存储引擎,Redis其实也可以作为一种键值对型的数据库,但在一些实际场景中,特别是关系型结构并不适合使用Redis直接作为数据库.这俩家 ...

  8. zabbix3.0.4监控mysql主从同步

    zabbix3.0.4监控mysql主从同步 1.监控mysql主从同步原理: 执行一个命令 mysql -u zabbix -pzabbix -e 'show slave status\G' 我们在 ...

  9. 监控mysql主从同步状态脚本

    监控mysql主从同步状态脚本 示例一: cat check_mysql_health #!/bin/sh slave_is=($(mysql -S /tmp/mysql3307.sock -uroo ...

随机推荐

  1. UML-设计模式-缓存策略

    继续前一章<本地服务容错> 问题:考虑加载内存ProductCatalog缓存和基于LocalProducts文件缓存的可选方案: 一种是惰性初始化(lazy init):当实际读取外部产 ...

  2. ..\OBJ\CAN.axf: Error: L6411E: No compatible library exists with a definition of startup symbol __main.

    ..\OBJ\CAN.axf: Error: L6411E: No compatible library exists with a definition of startup symbol __ma ...

  3. const成员函数返回*this

    #include <iostream> using namespace std; class A{ public: A &set(char); const A &displ ...

  4. CTF -攻防世界-crypto新手区(1~4)

    题目已经提示用base64直接解密就行 base64解密网址 http://tool.oschina.net/encrypt?type=3 题目提示是凯撒密码 http://www.zjslove.c ...

  5. mysql出现 too many connections

    出现这个问题的原因网上大致都是说这三种 1.慢sql 2.大量持久性的连接 3.程序没有及时关闭连接 解决方式 mysql -u 账号 -p 输入密码 show processlist; kill掉s ...

  6. linux下创建swap分区

    两种不同的方式创建swap分区 第一种方法: fdisk /dev/sda n (新建一个分区为/dev/sda6) t (修改分区的id) 82 (swap的id为82) w (重写分区表) par ...

  7. MVC——EF 回顾总结

    回顾一下MVC的知识点. 其实开始 我在学校的知识对MVC 还是很模糊的一个概念.只是记得结合EasyUI 增删改查 和分页,代码都是模糊的 进过这段时间的学习,让我对MVC 有了一个很清楚的认识. ...

  8. ubuntu服务器上配置tomcat

    前言 嗯,最近想在自己的腾讯云服务器上跑个项目玩玩,由于服务器是重装的系统,所以,只能自己手动装tomcat. 不过,tomcat是基于java的,必须又java环境tomcat才能够使用,因此首先要 ...

  9. ubuntu下git的使用

    1.安装git sudo apt-get install git sudo apt-get install git-core 2.配置git lzb@lzb:~$ git config --globa ...

  10. unity学习 5.x解包

    using System.Collections;using System.Collections.Generic;using UnityEngine; public class bundleload ...