docker+mysql+canal+kafka环境搭建
软件版本
macOS 11.4
Docker version 20.10.7
canal-admin v1.1.5
canal-server v1.1.5
mysql 5.7
mysql 8
wurstmeister/kafka 2.13-2.7.0
zookeeper 3.6.3
docker常用命令
- 查询容器(加上-a可以查询所有容器,包括失败容器)
docker ps
- 进入容器
docker exec -it mysql bash
- 查看所有容器的IP
docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
Mysql配置
mysql5.7
1)、docker容器运行(此步骤只是先将容器配置以及数据复制到宿主机)
docker run -d --name mysql5.7 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
2)、拷贝容器配置及数据
\\ 需先建立目录
mkdir /docker/mysql/5.7/data
mkdir /docker/mysql/5.7/conf
\\ 拷贝数据(这是mysql的表数据以及日志数据)
docker cp mysql5.7:/var/lib/mysql ~/docker/mysql/5.7/data
\\ 拷贝配置文件
docker cp mysql5.7:/etc/mysql ~/docker/mysql/5.7/conf
3)、删除容器
docker stop mysql5.7
docker rm mysql5.7
4)、运行加了容器卷映射的容器(注意这里容器卷的映射和上面拷贝的地址是不一样的,多加了一层目录)。这里制定了root账户的密码是123456
docker run \
-d \
--name mysql5.7 \
-p 3306:3306 \
-v ~/docker/mysql/5.7/data/mysql:/var/lib/mysql \
-v ~/docker/mysql/5.7/conf/mysql:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
5)、修改配置,开启binlog,以row形式进行增量记录
修改 /home/docker/mysql/5.7/conf/mysql下的my.cnf、mysql.cnf、mysql.conf.d下的或者conf.d下的任一文件。server-id需在mysql中保持唯一
log-bin=/var/lib/mysql/mysql-bin
server-id=123454
binlog-format=ROW
如上面配置未生效,可执行命令修改
docker exec mysql5.7 bash -c "echo 'log-bin=/var/lib/mysql/mysql-bin' >> /etc/mysql/mysql.conf.d/mysqld.cnf"
docker exec mysql5.7 bash -c "echo 'server-id=123454' >> /etc/mysql/mysql.conf.d/mysqld.cnf"
6)、重启容器
docker restart mysql5.7
7)、连接mysql,在mysql中执行下列脚本。查看容器是否开启binlog(为NO则为开启,OFF为没开启)
mysql -uroot -p
SHOW GLOBAL VARIABLES LIKE '%log_bin%';
7)、添加canal用户
#更新一下用户密码,这里是把账户为canal的密码修改为使用mysql_native_password规则生成,密码为canal。
ALTER USER 'canal'@'%' IDENTIFIED WITH mysql_native_password BY 'canal';
#刷新权限
FLUSH PRIVILEGES;
kafka
先启动zookeeper
docker run -d --name zookeeper -p 2181:2181 zookeeper:3.6.3
启动kafka
docker run -d --name kafka \
-p 9092:9092 \
-e KAFKA_BROKER_ID=0 \
-e KAFKA_ZOOKEEPER_CONNECT=zookeeper的ip:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://当前主机的ip:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka:2.13-2.7.0
canal-server
canal-server是真正工作的。是将自己伪装成mysql的从库去获取mysql的binlog并解析,可以自己选择是tcp, kafka, rocketMQ, rabbitMQ这几种中选择一种方式推送解析后的日志数据。我这里选择的是kafka,因为kafka的吞吐量是在mq中是最好的。
启动canal-server
docker run \
-d \
-e canal.instance.master.address=mysql的ip:3306 \
-e canal.instance.dbUsername=canal \
-e canal.instance.dbPassword=canal \
--name canal-server \
-p 11111:11111 \
canal/canal-server:v1.1.5
修改配置
server配置文件/canal-server/conf/canal.properties
# tcp, kafka, rocketMQ, rabbitMQ
canal.serverMode = kafka
kafka.bootstrap.servers = kafka的ip:9092
instance配置文件/canal-server/conf/example/instance.properties
canal.instance.master.address=数据库的ip:3306
canal.instance.dbUsername=数据库连接名
canal.instance.dbPassword=数据库连接密码
这里环境就搭建完成了