使用debezium + kafka + kafka connect,使用debezium來讀取binlog,並通過kafka connect將讀取的內容放入kafka topic中。應用再消費這個kafka佇列,並把消費的資訊寫入Elasticsearch。這樣可以Mysql資料庫中表的行列的變化就可以同步寫入Elasticsearch之中。
Debezium是一個CDC(change data capture)系統。所起的角色如下圖。 可以安裝配置Debezium去監控資料庫。然後應用就可以消費每個行級別的改變。 只有已提交的更改才是可見的,不用擔心事務(transaction)或者更改被回滾(roll back)。
1.先安裝docker
docker安裝
2.安裝zookeeper 通過docker, 命令如下:
docker run -it --rm --name zookeeper -p 2181:2181 -p 2888:2888 -p 3888:3888 debezium/zookeeper:0.9
3.docker安裝kafka:
docker run -it --rm --name kafka -p 9092:9092 --link zookeeper:zookeeper debezium/kafka:0.9
4.安裝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:0.9
啟動mysql客戶端
docker run -it --rm --name mysqlterm --link mysql --rm mysql:5.7 sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
把$符號的引數換成具體的引數即可進入mysql的客戶端。
kafka下載後解壓 啟動命令 1. bin/zookeeper-server-start.sh config/zookeeper.properties 2. bin/kafka-server-start.sh config/server.properties 3. bin/connect-distributed.sh config/connect-distributed.properties 啟動kafka connect
建立topic
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
列出所有topic
bin/kafka-topics.sh --list --zookeeper localhost:2181
傳送訊息
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
消費訊息
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
docker 啟動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:0.8
複製程式碼
elasticsearch 增加模板 使用的版本為4.2.1 下載地址參考 download.elastic.co/elasticsear…
elasticsearch外網IP無法訪問題
1. vim config/elasticsearch.yml
2.增加:network.host: 0.0.0.0
3.重啟ok
若報問題
ERROR: [2] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
ulimit -n 65535
參加官網文件連結(https://www.elastic.co/guide/en/elasticsearch/reference/current/setting-system-settings.html#limits.conf)
複製程式碼
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
解決辦法:切換root賬戶 vim /etc/sysctl.conf
增加一行 vm.max_map_count=655360
接著執行 sysctl -p
curl -XPUT http://localhost:9200/_template/dbcart_template_0 -d ' { "template": "dbcart*", "order": 0, "mappings": { "default": { "_source": { "enabled": true } }, "type": { "properties":{"orderNumber":{"index":"not_analyzed","type":"string"},"quantity":{"index":"not_analyzed","type":"string"},"productId":{"index":"not_analyzed","type":"string"}} } } }'