mysql ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์ค์๊ฐ์ผ๋ก ํ์ธํ๊ณ ์ถ์ด์ searchํ๊ณ ์ ๋ฆฌํ๋ค.
mysql ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ค์๊ฐ ํ์ธ
๊ฐ์์ด๋ฒ์ ์๋ก ์งํ๋๋ ํ๋ก์ ํธ์์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํด์ผํ๋ค.๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณํ๊ฐ ์์ ๋, ์ค์๊ฐ์ผ๋ก ํ์ธํ ์ ์๋ ๊ธฐ๋ฅ์ ๋ํด์ search ํ๋ค.์ค์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ณ ์ถ์๋๋ฐ
bonory.tistory.com
์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค์ ๋ก ์งํํด๋ณด๋ ค๊ณ ํ๋ค.
์ฐ์ ๋๋ docker๋ก zookeeper, kafka, kafka-connect, mysql์ ์ฌ๋ฆด ๊ฒ์ด๋ค
๊ทธ๋์ docker-compose.yml์ ์๋์ ๊ฐ์ด ์์ฑํ๋ค
docker-compose.yml
version: '3'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- "2181:2181"
kafka:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
ports:
- "9092:9092"
kafka-connect:
image: debezium/connect:latest
ports:
- "8083:8083"
environment:
BOOTSTRAP_SERVERS: kafka:9092
GROUP_ID: "1"
CONFIG_STORAGE_TOPIC: my_connect_configs
OFFSET_STORAGE_TOPIC: my_connect_offsets
STATUS_STORAGE_TOPIC: my_connect_statuses
KEY_CONVERTER_SCHEMAS_ENABLE: "false"
VALUE_CONVERTER_SCHEMAS_ENABLE: "false"
depends_on:
- kafka
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: robotworld
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
command:
--server-id=1
--log-bin=mysql-bin
--binlog-format=ROW
--binlog-row-image=FULL
volumes:
mysql_data:
driver: local
mysql
- volumes : ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๊ธฐ ์ํด MySQL ๋ฐ์ดํฐ ๋๋ ํฐ๋ฆฌ๋ฅผ ํธ์คํธ ๋๋ ํฐ๋ฆฌ ๋๋ Docker ๋ณผ๋ฅจ์ ๋ง์ดํธ
- command : MySQL ์๋ฒ ์คํ ์ ํ์ํ binlog ์ค์ ์ ์ถ๊ฐ
- --server-id=1 : MySQL ์๋ฒ์ ๊ณ ์ ํ ID๋ฅผ ์ง์
- --log-bin=mysql-bin : ๋ฐ์ด๋๋ฆฌ ๋ก๊ทธ ํ์ผ์ ๊ธฐ๋ณธ ์ด๋ฆ์ ์ง์ ํ์ฌ binlog๋ฅผ ํ์ฑํ
- --binlog-format=ROW : ํ ๊ธฐ๋ฐ์ binlog ํ์์ ์ค์
- --binlog-row-image=FULL : ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ์ ์ ์ฒด ํ์ ๊ธฐ๋ก
volumes
- mysql_data: MySQL ๋ฐ์ดํฐ ํ์ผ์ ์ ์ฅํ Docker ๋ณผ๋ฅจ ์ด๋ฆ
- driver: local
- ๋ก์ปฌ ๋๋ผ์ด๋ฒ๋ฅผ ์ฌ์ฉํ์ฌ Docker ๋ณผ๋ฅจ ์์ฑ
- ๊ธฐ๋ณธ์ ์ผ๋ก Docker๊ฐ ์ ๊ณตํ๋ ๋ก์ปฌ ์คํ ๋ฆฌ์ง ์ฌ์ฉ
mysql์ binlog ํ์ฑํ๊ธฐ
์ ์ค์ ์ผ๋ก ์์ฑ๋ mysql container์ ์ ์ํด์ ์ ์์ ์ผ๋ก binlog๊ฐ ํ์ฑํ ๋์๋์ง ํ์ธํ๋ค.
- docker exec -it [comtainer id] bash
- mysql -u root -p
- SHOW VARIABLES LIKE 'log_bin';
- ON์ด๋ฉด ์ค์ ์๋ฃ
- SHOW VARIABLES LIKE 'binlog_format';
- ROW์ด๋ฉด ์ค์ ์๋ฃ
Kafka Connect API๋ฅผ ํตํด Debezium MySQL ์ปค๋ฅํฐ๋ฅผ ๋ฑ๋ก
๋ฑ๋กํ๊ธฐ ์ , Kafka Connect๊ฐ ์ ๋๋ก ์คํ์ค์ธ์ง ํ์ธ
curl http://localhost:8083/connectors
>> ๋น ๋ฆฌ์คํธ ํน์ ์ด๋ฏธ ๋ฑ๋ก๋ ๋ชฉ๋ก์ ๋ฐํํ๋ฉด ์ ์์ ์ผ๋ก ๋์ํ๋ ๊ฒ์
Kafka Connect API๋ RESTful API์ด๋ฏ๋ก curl ๋๋ Postman๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ค HTTP ์์ฒญ์ผ๋ก ํ์ธํ๋ค.
curl -X POST http://localhost:8083/connectors -H "Content-Type: application/json" -d '{
"name": "mysql-connector",
"config": {
"connector.class": "io.debezium.connector.mysql.MySqlConnector",
"database.hostname": "mysql",
"database.port": "3306",
"database.user": "root",
"database.password": "root",
"database.server.id": "1",
"database.server.name": "mysql_server",
"database.whitelist": "robotworld",
"database.history.kafka.bootstrap.servers": "kafka:9092",
"database.history.kafka.topic": "schema-changes.robotworld",
"include.schema.changes": "true",
"database.serverTimezone": "UTC",
"topic.prefix": "mysql_server"
}
}'
์ ๋ณด๋ด๊ณ , ์ปค๋ฅํฐ ์ฑ๊ณตํ๋ฉด ์ด๋ฐ ์๋ต ๋ฐ์
{
"name": "mysql-connector",
"config": {
"connector.class": "io.debezium.connector.mysql.MySqlConnector",
"database.hostname": "mysql",
"database.port": "3306",
"database.user": "root",
"database.password": "root",
"database.server.id": "1",
"database.server.name": "mysql_server",
"database.whitelist": "robotworld",
"database.history.kafka.bootstrap.servers": "kafka:9092",
"database.history.kafka.topic": "schema-changes.robotworld",
"include.schema.changes": "true",
"database.serverTimezone": "UTC",
"topic.prefix": "mysql_server",
"name": "mysql-connector"
},
"tasks": [],
"type": "source"
}
์ปค๋ฅํฐ ์ฐ๊ฒฐ ํ์ธ
curl -X GET http://localhost:8083/connectors/mysql-connector/status
์ปค๋ฅํฐ ์ ๊ฑฐ
curl -X DELETE http://localhost:8083/connectors/mysql-connector
์ด์ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ๋ฉด ํด๋น ๋ด์ฉ์ด Kafka๋ก ์คํธ๋ฆฌ๋ฐ ๋๋ค.
- Kafka ํ ํฝ์์ ๋ฐ์ดํฐ ํ์ธ: MySQL์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค(robotworld)์ ์ฝ์ , ์ ๋ฐ์ดํธ ๋๋ ์ญ์ ์์ ์ ์ํํ๋ฉด ํด๋น ๋ณ๊ฒฝ ์ฌํญ์ด Kafka ํ ํฝ์ ๋ฐ์. Kafka CLI ๋๋ Kafka Console Consumer๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ฐ์ดํฐ ํ์ธ/์ฌ์ฉ ๊ฐ๋ฅ
docker exec -it <kafka-container-id> kafka-console-consumer --bootstrap-server kafka:9092 --topic mysql_server.robotworld.<your_table_name> --from-beginning
- Kafka ํ ํฝ ํ์ธ: Kafka Console Consumer๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๊ฐ ํ ํฝ์ ์ ์์ ์ผ๋ก ๋ค์ด์ค๋์ง ํ์ธ ๊ฐ๋ฅ !
'๐ฉ๐ปโ๐ป > DB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[MySQL] localhost ๋น๋ฐ๋ฒํธ ๊น๋จน์๋ค (0) | 2025.02.14 |
---|---|
ํฌ๋กค๋ง ๋ฐ์ดํฐ ์ ์ฌ SQL vs NoSQL (0) | 2025.02.06 |
[MongoDB] ๊ฐ๋จํ ๊ฐ๋ ์ ๋ฆฌ (0) | 2025.01.10 |
mysql ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ค์๊ฐ ํ์ธ (2) | 2024.10.02 |