Logstash는 다양한 데이터 소스와 Elasticsearch를 연동하는 데 유용한 도구입니다. 특히, 기존의 관계형 데이터베이스(RDBMS)에서 데이터를 ES로 이동시키는 데 매우 유용한 JDBC 플러그인을 제공합니다. 이 글에서는 Logstash의 JDBC 플러그인을 설치하고, 이를 통해 RDBMS 데이터를 Elasticsearch로 전송하는 방법을 소개하겠습니다.
1. MySQL
설치
테스트를 위한 MySQL을 Ubunut에 도커로 설치하고, employee라는 테이블을 만듭니다.
# MySQL 도커 이미지 다운로드
sudo docker pull mysql
# 다운로드 이미지 확인
sudo docker images
# MySQL 컨테이너 실행
sudo docker run --name mysql -p 3600:3600 -v mysql_volume:/var/lib/mysql/ -d -e "MYSQL_ROOT_PASSWORD=pass123" mysql
# --name mysql: MySQL 컨테이너 이름
# -v mysql_volume:/var/lib/mysql/ : mysql_volume 이라는 볼륨을 마운트하여 데이터 유지
# -p 3600:3600: 로컬 시스템의 3306을 MySQK 컨테이너의 3306을 맵핑
# -e "MYSQL_ROOT_PASSWORD=P@ssword!@#$": root 암호 설정
# MySQL 컨테이너가 실행 중인지 확인
sudo docker ps
MySQL 설치가 끝났다면, MySQL 컨테이너 안에 있는 bash shell로 접속해서 MySQL로 로그인할께요.
sudo docker exec -it mysql bash
mysql --version
mysql -u root -p
SELECT VERSION();

테이블 생성
여기에 github에서 다운로드 받은 인사 정보를 넣었습니다.
CREATE DATABASE my_database;
USE my_database;
CREATE TABLE employee (
EMPLOYEE_ID INT AUTO_INCREMENT PRIMARY KEY,
FIRST_NAME VARCHAR(50),
LAST_NAME VARCHAR(50),
EMAIL VARCHAR(100),
PHONE_NUMBER VARCHAR(20),
HIRE_DATE DATE,
JOB_ID VARCHAR(10),
SALARY DECIMAL(10, 2),
COMMISSION_PCT DECIMAL(5, 2),
MANAGER_ID INT,
DEPARTMENT_ID INT
);
INSERT INTO employee (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
VALUES
(202, 'Pat', 'Fay', 'PFAY@example.com', '603-123-6666', STR_TO_DATE('17-AUG-05', '%d-%b-%y'), 'MK_REP', 6000.00, NULL, 201, 20),
(203, 'Susan', 'Mavris', 'SMAVRIS@example.com', '515-123-7777', STR_TO_DATE('07-JUN-02', '%d-%b-%y'), 'HR_REP', 6500.00, NULL, 101, 40),
(204, 'Hermann', 'Baer', 'HBAER@example.com', '515-123-8888', STR_TO_DATE('07-JUN-02', '%d-%b-%y'), 'PR_REP', 10000.00, NULL, 101, 70),
(205, 'Shelley', 'Higgins', 'SHIGGINS@example.com', '515-123-8080', STR_TO_DATE('07-JUN-02', '%d-%b-%y'), 'AC_MGR', 12008.00, NULL, 101, 110),
(206, 'William', 'Gietz', 'WGIETZ@example.com', '515-123-8181', STR_TO_DATE('07-JUN-02', '%d-%b-%y'), 'AC_ACCOUNT', 8300.00, NULL, 205, 110),
(100, 'Steven', 'King', 'SKING@example.com', '515-123-4567', STR_TO_DATE('17-JUN-03', '%d-%b-%y'), 'AD_PRES', 24000.00, NULL, NULL, 90),
(101, 'Neena', 'Kochhar', 'NKOCHHAR@example.com', '515-123-4568', STR_TO_DATE('21-SEP-05', '%d-%b-%y'), 'AD_VP', 17000.00, NULL, 100, 90),
(102, 'Lex', 'De Haan', 'LDEHAAN@example.com', '515-123-4569', STR_TO_DATE('13-JAN-01', '%d-%b-%y'), 'AD_VP', 17000.00, NULL, 100, 90),
(103, 'Alexander', 'Hunold', 'AHUNOLD@example.com', '590-423-4567', STR_TO_DATE('03-JAN-06', '%d-%b-%y'), 'IT_PROG', 9000.00, NULL, 102, 60),
(104, 'Bruce', 'Ernst', 'BERNST@example.com', '590-423-4568', STR_TO_DATE('21-MAY-07', '%d-%b-%y'), 'IT_PROG', 6000.00, NULL, 103, 60),
(105, 'David', 'Austin', 'DAUSTIN@example.com', '590-423-4569', STR_TO_DATE('25-JUN-05', '%d-%b-%y'), 'IT_PROG', 4800.00, NULL, 103, 60),
(106, 'Valli', 'Pataballa', 'VPATABAL@example.com', '590-423-4560', STR_TO_DATE('05-FEB-06', '%d-%b-%y'), 'IT_PROG', 4800.00, NULL, 103, 60),
(107, 'Diana', 'Lorentz', 'DLORENTZ@example.com', '590-423-5567', STR_TO_DATE('07-FEB-07', '%d-%b-%y'), 'IT_PROG', 4200.00, NULL, 103, 60),
(108, 'Nancy', 'Greenberg', 'NGREENBE@example.com', '515-124-4569', STR_TO_DATE('17-AUG-02', '%d-%b-%y'), 'FI_MGR', 12008.00, NULL, 101, 100),
(109, 'Daniel', 'Faviet', 'DFAVIET@example.com', '515-124-4169', STR_TO_DATE('16-AUG-02', '%d-%b-%y'), 'FI_ACCOUNT', 9000.00, NULL, 108, 100),
(110, 'John', 'Chen', 'JCHEN@example.com', '515-124-4269', STR_TO_DATE('28-SEP-05', '%d-%b-%y'), 'FI_ACCOUNT', 8200.00, NULL, 108, 100),
(111, 'Ismael', 'Sciarra', 'ISCIARRA@example.com', '515-124-4369', STR_TO_DATE('30-SEP-05', '%d-%b-%y'), 'FI_ACCOUNT', 7700.00, NULL, 108, 100),
(112, 'Jose Manuel', 'Urman', 'JMURMAN@example.com', '515-124-4469', STR_TO_DATE('07-MAR-06', '%d-%b-%y'), 'FI_ACCOUNT', 7800.00, NULL, 108, 100),
(113, 'Luis', 'Popp', 'LPOPP@example.com', '515-124-4567', STR_TO_DATE('07-DEC-07', '%d-%b-%y'), 'FI_ACCOUNT', 6900.00, NULL, 108, 100),
(114, 'Den', 'Raphaely', 'DRAPHEAL@example.com', '515-127-4561', STR_TO_DATE('07-DEC-02', '%d-%b-%y'), 'PU_MAN', 11000.00, NULL, 100, 30),
(115, 'Alexander', 'Khoo', 'AKHOO@example.com', '515-127-4562', STR_TO_DATE('18-MAY-03', '%d-%b-%y'), 'PU_CLERK', 3100.00, NULL, 114, 30),
(116, 'Shelli', 'Baida', 'SBAIDA@example.com', '515-127-4563', STR_TO_DATE('24-DEC-05', '%d-%b-%y'), 'PU_CLERK', 2900.00, NULL, 114, 30),
(117, 'Sigal', 'Tobias', 'STOBIAS@example.com', '515-127-4564', STR_TO_DATE('24-JUL-05', '%d-%b-%y'), 'PU_CLERK', 2800.00, NULL, 114, 30),
(118, 'Guy', 'Himuro', 'GHIMURO@example.com', '515-127-4565', STR_TO_DATE('15-NOV-06', '%d-%b-%y'), 'PU_CLERK', 2600.00, NULL, 114, 30),
(119, 'Karen', 'Colmenares', 'KCOLMENA@example.com', '515-127-4566', STR_TO_DATE('10-AUG-07', '%d-%b-%y'), 'PU_CLERK', 2500.00, NULL, 114, 30),
(120, 'Matthew', 'Weiss', 'MWEISS@example.com', '650-123-1234', STR_TO_DATE('18-JUL-04', '%d-%b-%y'), 'ST_MAN', 8000.00, NULL, 100, 50),
(121, 'Adam', 'Fripp', 'AFRIPP@example.com', '650-123-2234', STR_TO_DATE('10-APR-05', '%d-%b-%y'), 'ST_MAN', 8200.00, NULL, 100, 50),
(122, 'Payam', 'Kaufling', 'PKAUFLIN@example.com', '650-123-3234', STR_TO_DATE('01-MAY-03', '%d-%b-%y'), 'ST_MAN', 7900.00, NULL, 100, 50),
(123, 'Shanta', 'Vollman', 'SVOLLMAN@example.com', '650-123-4234', STR_TO_DATE('10-OCT-05', '%d-%b-%y'), 'ST_MAN', 6500.00, NULL, 100, 50),
(124, 'Kevin', 'Mourgos', 'KMOURGOS@example.com', '650-123-5234', STR_TO_DATE('16-NOV-07', '%d-%b-%y'), 'ST_MAN', 5800.00, NULL, 100, 50),
(125, 'Julia', 'Nayer', 'JNAYER@example.com', '650-124-1214', STR_TO_DATE('16-JUL-05', '%d-%b-%y'), 'ST_CLERK', 3200.00, NULL, 120, 50),
(126, 'Irene', 'Mikkilineni', 'IMIKKILI@example.com', '650-124-1224', STR_TO_DATE('28-SEP-06', '%d-%b-%y'), 'ST_CLERK', 2700.00, NULL, 120, 50),
(127, 'James', 'Landry', 'JLANDRY@example.com', '650-124-1334', STR_TO_DATE('14-JAN-07', '%d-%b-%y'), 'ST_CLERK', 2400.00, NULL, 120, 50),
(128, 'Steven', 'Markle', 'SMARKLE@example.com', '650-124-1434', STR_TO_DATE('08-MAR-08', '%d-%b-%y'), 'ST_CLERK', 2200.00, NULL, 120, 50),
(129, 'Laura', 'Bissot', 'LBISSOT@example.com', '650-124-5234', STR_TO_DATE('20-AUG-05', '%d-%b-%y'), 'ST_CLERK', 3300.00, NULL, 121, 50),
(130, 'Mozhe', 'Atkinson', 'MATKINSO@example.com', '650-124-6234', STR_TO_DATE('30-OCT-05', '%d-%b-%y'), 'ST_CLERK', 2800.00, NULL, 121, 50),
(131, 'James', 'Marlow', 'JAMRLOW@example.com', '650-124-7234', STR_TO_DATE('16-FEB-05', '%d-%b-%y'), 'ST_CLERK', 2500.00, NULL, 121, 50),
(132, 'TJ', 'Olson', 'TJOLSON@example.com', '650-124-8234', STR_TO_DATE('10-APR-07', '%d-%b-%y'), 'ST_CLERK', 2100.00, NULL, 121, 50),
(133, 'Jason', 'Mallin', 'JMALLIN@example.com', '650-127-1934', STR_TO_DATE('14-JUN-04', '%d-%b-%y'), 'ST_CLERK', 3300.00, NULL, 122, 50),
(134, 'Michael', 'Rogers', 'MROGERS@example.com', '650-127-1834', STR_TO_DATE('26-AUG-06', '%d-%b-%y'), 'ST_CLERK', 2900.00, NULL, 122, 50),
(135, 'Ki', 'Gee', 'KGEE@example.com', '650-127-1734', STR_TO_DATE('12-DEC-07', '%d-%b-%y'), 'ST_CLERK', 2400.00, NULL, 122, 50),
(136, 'Hazel', 'Philtanker', 'HPHILTAN@example.com', '650-127-1634', STR_TO_DATE('06-FEB-08', '%d-%b-%y'), 'ST_CLERK', 2200.00, NULL, 122, 50),
(137, 'Renske', 'Ladwig', 'RLADWIG@example.com', '650-121-1234', STR_TO_DATE('14-JUL-03', '%d-%b-%y'), 'ST_CLERK', 3600.00, NULL, 123, 50),
(138, 'Stephen', 'Stiles', 'SSTILES@example.com', '650-121-2034', STR_TO_DATE('26-OCT-05', '%d-%b-%y'), 'ST_CLERK', 3200.00, NULL, 123, 50),
(139, 'John', 'Seo', 'JSEO@example.com', '650-121-2019', STR_TO_DATE('12-FEB-06', '%d-%b-%y'), 'ST_CLERK', 2700.00, NULL, 123, 50),
(140, 'Joshua', 'Patel', 'JPATEL@example.com', '650-121-1834', STR_TO_DATE('06-APR-06', '%d-%b-%y'), 'ST_CLERK', 2500.00, NULL, 123, 50);
데이터가 잘 저장되었는지 확인해 봅니다.
SELECT * FROM employee;

MySQL 설정이 끝났습니다.
로그스태시 구성
이제 로그스태시의 jdbc input plug-in을 사용해서 MySQL의 인사정보를 읽어 Elasticsearch에 저장하도록 하겠습니다.
Logstash에서 RDBMS 데이터를 Elasticsearch로 전송하기 위해 JDBC 플러그인을 사용하려면 먼저 플러그인을 설치해야 합니다.
# logstash-input-jdbc 설치
sudo bin/logstash-plugin install logstash-input-jdbc
# 플러그인 설치 확인
sudo bin/logstash-plugin list --verbose logstash-integration-jdbc
# 추가 - 플러그인 삭제
sudo bin/logstash-plugin uninstall logstash-integration-jdbc
JDBC 커넥터 라이브러리 설치
사용하는 RDBMS에 맞는 커넥터 jar 라이브러리를 준비합니다. 테스트를 위해 설치한 MySQL의 버전이 9.2.0이므로, Connector/J 9.2.0 라이브러리를 받아서 압축을 풀어 jar파일을 얻었습니다.
연결하고자 하는 데이터베이스의 종류와 버전을 확인하기
select version();
Logstash 구성 파일 작성
input {
jdbc {
# JDBC 커넥터 파일 경로
jdbc_driver_library => "/usr/share/logstash/mysql-connector-j-9.2.0.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
# 데이터베이스 연결 정보
jdbc_connection_string => "jdbc:mysql://172.16.4.201:3306/my_database?allowPublicKeyRetrieval=true&useSSL=false"
jdbc_user => "root"
jdbc_password => "pass123"
# 실행할 SQL 쿼리
statement => "SELECT * FROM employee"
# 데이터를 매번 가져올 수 있도록 설정
schedule => "*/5 * * * *" # 5분마다 실행
}
}
filter {
}
output {
stdout { codec => rubydebug }
#elasticsearch {
# hosts => ["https://172.16.4.127:9200"]
# user => "elastic"
# password => "dpffktmxlr"
# ca_trusted_fingerprint => "df1c613348556fd66c8a7211eb9f517195a6ac6da83d0bca54aba12c4d207baf"
# #data_stream => true
# #data_stream_type => "logs"
# data_stream_dataset => "mytest"
# data_stream_namespace => "default"
#}
}
로그스태시를 실행합니다.
sudo bin/logstash -f jdbc.conf
2. MariaDB
설치
테스트를 위한 MySQL을 Ubunut에 도커로 설치하고, employee라는 테이블을 만듭니다.
# MariaDB 도커 이미지 다운로드(10.2 버전을 지정하지 않으면 최신 버전을 다운로드함)
sudo docker pull mariadb:10.2
# 다운로드 image 이미지 확인
sudo docker images
# MariaDB 컨테이너 실행
sudo docker run --name mariadb -p 3600:3600 -v mariadb_volume:/var/lib/mysql/ \
-d -e "MYSQL_ROOT_PASSWORD=pass123" mariadb
# --name mariadb: MariaDB 컨테이너 이름
# -v mysql_volume:/var/lib/mysql/ : mysql_volume 이라는 볼륨을 마운트하여 데이터 유지
# -p 3600:3600: 로컬 시스템의 3306을 MariaDB 컨테이너의 3306을 맵핑
# -e "MYSQL_ROOT_PASSWORD=pass123": root 암호 설정
# MySQL 컨테이너가 실행 중인지 확인
sudo docker ps
볼륨을 확인합니다.
# volume 나열
sudo docker volume ls
테이블 생성
MariaDB 설치를 성공적으로 완료했다면, MariaDB 컨테이너 안에 있는 bash shell로 접속해서 MariaDB에 로그인합니다.
sudo docker exec -it mariadb bash
mariadb --version
mariadb -u root -p
SELECT VERSION();
위의 MySQL의 테이블 생성에 기술된 내용을 따라 MariaDB에 table을 생성합니다.
데이터가 잘 저장되었는지 확인해 봅니다.
SELECT * FROM employee;

테스트를 위한 MariaDB 설정이 끝났습니다. ^^
'제품 > ELK' 카테고리의 다른 글
| 로그스태시로 데이터베이스에서 레코드 가져오기 (0) | 2025.02.13 |
|---|---|
| ES|QL 쿼리 (0) | 2025.02.09 |
| Logstash에서 민감한 설정 보호하기: Keystore사용법 (0) | 2025.01.19 |
| 타임스탬프 (0) | 2024.10.15 |
| 인제스트 파이프라인 (0) | 2024.10.01 |