debezium 监控数据库事件(docker独立容器模式)

10 篇文章 0 订阅
6 篇文章 0 订阅

 

Debezium是什么?

Debezium是一组分布式服务,用于捕获数据库中的更改变化,以便您的应用程序可以看到这些更改并做出响应。Debezium在更改事件流中记录每个数据库表内的所有行级更改,应用程序只需读取这些流,即可按发生事件的顺序查看更改事件。

 

Debezium安装

1.服务器安装docker

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum makecache fast
sudo yum -y install docker-ce
sudo systemctl start docker
sudo systemctl enable docker.service

2.安装docker-compose

curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

3.创建镜像和运行容器

 

运行zookeeper容器

在新终端窗口中使用以下命令

docker run -it --rm --name zookeeper -p 2181:2181 -p 2888:2888 -p 3888:3888 debezium/zookeeper:1.4

-it:容器是交互式的,这意味着终端的标准输入和输出已附加到容器上,会实时显示容器运行的日志

--rm 停止时将其移除,按ctrl+c后,容器就会被删除

--name 给容器命名,容器的名称。

-p 2181:2181 -p 2888:2888 -p 3888:3888

将容器的三个端口映射到Docker主机上的相同端口。这使其他容器(以及容器外部的应用程序)能够与ZooKeeper通信。

运行成功后,会打印日志,如图所示

 

 

运行kafka容器

在新终端窗口中运行以下命令

docker run -it --rm --name kafka -p 9092:9092 --link zookeeper:zookeeper debezium/kafka:1.4

--link zookeeper:zookeeper 可以访问名称zookeeper的容器网络以及给这个链接设置个别名:zookeeper

您将始终从Docker容器中连接到Kafka。这些容器中的任何一个都可以kafka通过链接与该容器进行通信。如果您需要从Docker容器外部连接到Kafka 在启动kafka容器时,需要设置环境变量,命令如下

docker run -it --rm --name kafka -p 9092:9092 --link zookeeper:zookeeper -e ADVERTISED_HOST_NAME=10.167.51.14 debezium/kafka:1.4

启动成功后,日志如下

 

 运行一个用于测试的demo数据库,本次测试使用mysql数据库

在新终端窗口中运行以下命令

docker run -it --rm --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=debezium -e MYSQL_USER=mysqluser -e MYSQL_PASSWORD=mysqlpw debezium/example-mysql:1.4

启动成功后,显示日志如下

demo数据库详情

 

 

启动一个Kafka Connect服务,这个服务是用来管理各个数据库的监视工作,并且公开了REST API进行数据库连接器的管理。

在新终端窗口中运行以下命令

docker run -it --privileged=true --rm --name connect -p 8083:8083 -e GROUP_ID=1  -e CONFIG_STORAGE_TOPIC=my_connect_configs -e OFFSET_STORAGE_TOPIC=my_connect_offsets -e STATUS_STORAGE_TOPIC=my_connect_statuses --link zookeeper:zookeeper --link kafka:kafka --link mysql:mysql debezium/connect:1.4

启动成功日志如下

检查Kafka Connect服务的状态:http://10.167.51.14:8083/

检查在Kafka Connect中注册的连接器列表:http://10.167.51.14:8083/connectors/

注册数据库连接器,本次使用mysql连接器测试

curl -i -X POST -H "Accept:application/json" -H "Content-Type:application/json" localhost:8083/connectors/ -d '{ "name": "inventory-connector", "config": { "connector.class": "io.debezium.connector.mysql.MySqlConnector", "tasks.max": "1", "database.hostname": "mysql", "database.port": "3306", "database.user": "debezium", "database.password": "dbz", "database.server.id": "184054", "database.server.name": "dbserver1", "database.include.list": "inventory", "database.history.kafka.bootstrap.servers": "kafka:9092", "database.history.kafka.topic": "dbhistory.inventory" } }'

如果是windows用户,需要转义

curl -i -X POST -H "Accept:application/json" -H "Content-Type:application/json" localhost:8083/connectors/ -d '{ \"name\": \"inventory-connector\", \"config\": { \"connector.class\": \"io.debezium.connector.mysql.MySqlConnector\", \"tasks.max\": \"1\", \"database.hostname\": \"mysql\", \"database.port\": \"3306\", \"database.user\": \"debezium\", \"database.password\": \"dbz\", \"database.server.id\": \"184054\", \"database.server.name\": \"dbserver1\", \"database.include.list\": \"inventory\", \"database.history.kafka.bootstrap.servers\": \"kafka:9092\", \"database.history.kafka.topic\": \"dbhistory.inventory\" } }'

连接器配置:

{
  "name": "inventory-connector",  
  "config": {  
    "connector.class": "io.debezium.connector.mysql.MySqlConnector",
    "tasks.max": "1",  
    "database.hostname": "mysql",  
    "database.port": "3306",
    "database.user": "debezium",
    "database.password": "dbz",
    "database.server.id": "184054",  
    "database.server.name": "dbserver1",  
    "database.include.list": "inventory",  
    "database.history.kafka.bootstrap.servers": "kafka:9092",  
    "database.history.kafka.topic": "schema-changes.inventory"  
  }
}

name:连接器的名称。
connector.class:连接器的实现类
tasks.max:任何时候都只能执行一项任务。由于MySQL连接器读取MySQL服务器的binlog,因此使用单个连接器任务可确保正确的顺序和事件处理。Kafka Connect服务使用连接器来启动一个或多个完成该任务的任务,并自动在Kafka Connect服务群集中分配正在运行的任务。如果任何服务停止或崩溃,这些任务将重新分配给正在运行的服务。
database.hostname:数据库主机,它是运行MySQL服务器(mysql)的Docker容器的名称。Docker在容器内操作网络堆栈,以便可以/etc/hosts使用容器名称作为主机名来解析每个链接的容器。如果MySQL在正常网络上运行,则应为此值指定IP地址或可解析的主机名。
database.server.name:唯一的服务器ID和名称。服务器名称是MySQL服务器或服务器集群的逻辑标识符。该名称将用作所有Kafka主题的前缀。
database.include.list:仅inventory将检测数据库中的更改。
database.history.kafka.bootstrap.servers:kafka节点
database.history.kafka.topic:连接器将使用此代理(向其发送事件的代理)和主题名称在Kafka中存储数据库架构的历史记录。重新启动后,连接器将恢复binlog连接器应开始读取的时间点上存在的数据库的架构。

 

连接器注册成功后,使用以下命令来查看数据库的变化

docker run -it --rm --name watcher --link zookeeper:zookeeper --link kafka:kafka debezium/kafka:1.4 watch-topic -a -k dbserver1.inventory.customers

也可以通过java代码进行监听kafka

package com.cch.tool.debezium;



import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;

import java.util.Arrays;
import java.util.Properties;

public class CustomerDemo {
    public static void main(String[] args) throws InterruptedException {
        Properties properties = new Properties();
        properties.put("bootstrap.servers", "10.167.51.14:9092");
        properties.put("group.id", "group-2");
        //session.timeout.ms:消费者在被认为死亡之前可以与服务器断开连接的时间,默认是3s 。
        properties.put("session.timeout.ms", "30000");
        //消费者是否自动提交偏移量,默认值是true,避免出现重复数据和数据丢失,可以把它设为 false。
        properties.put("enable.auto.commit", "false");
        properties.put("auto.commit.interval.ms", "1000");
        //auto.offset.reset:消费者在读取一个没有偏移量的分区或者偏移量无效的情况下的处理
        //earliest:在偏移量无效的情况下,消费者将从起始位置读取分区的记录。
        //latest:在偏移量无效的情况下,消费者将从最新位置读取分区的记录
        properties.put("auto.offset.reset", "earliest");
        properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        // max.partition.fetch.bytes:服务器从每个分区里返回给消费者的最大字节数
        //fetch.max.wait.ms:消费者等待时间,默认是500。
        // fetch.min.bytes:消费者从服务器获取记录的最小字节数。
        // client.id:该参数可以是任意的字符串,服务器会用它来识别消息的来源。
        // max.poll.records:用于控制单次调用 call () 方住能够返回的记录数量
        //receive.buffer.bytes和send.buffer.bytes:指定了 TCP socket 接收和发送数据包的缓冲区大小,默认值为-1

        KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<>(properties);
        kafkaConsumer.subscribe(Arrays.asList("dbserver1.inventory.customers"));
        while (true) {
            ConsumerRecords<String, String> records = kafkaConsumer.poll(100);
            for (ConsumerRecord<String, String> record : records) {
                System.out.printf("offset = %d, value = %s", record.offset(), record.value());
                System.out.println("=====================>");
            }
        }

    }
}


参考资料:https://debezium.io/documentation/reference/1.4/tutorial.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值