HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
✍🏻
Learnary (learn - diary)
/
Replication - innoDb, MyIsam 같이 사용하기

Replication - innoDb, MyIsam 같이 사용하기

progress
Done
Tags
DevOps
What - InnoDB, MyISAMWhy - 왜 버젼별 차이를 알아야 하는가?How - MyISAM, InnoDB Replication 구성하고 테스트 해보기 REFER

What - InnoDB, MyISAM


모두 mysql 에서 지원하는 엔진 구조입니다.
 
차이점
  1. 트랜잭션 지원 유무의 차이(데이터 일관성과 연관있음)
      • 5.5 버전 이후 자동으로 InnoDB 엔진으로 구성됩니다.
  1. 파일 관리
      • MyISAM은 인덱스와 테이블을 각각 분리된 파일로 관리합니다.
      • 이에반해 InnoDB는 인덱스와 테이블 모두 테이블 스페이스에 저장하고 테이블 스페이스의 몇개는 서버파일이나 디스크 파티션으로 구성하고 있습니다.
 
사용시점 및 적합도
  • InnoDB - 데이터 일관성을 보장하기 위한 서비스
  • MyISAM - 조회가 많이 일어나는 서비스
 
InnoDB
  • 트랜잭션 세이프 구조입니다.
  • 2단계 격리 레벨에서도 유령 레코드 사입의 문제가 발생하지 않습니다.
    • 일정 부분의 영역에 Record Lock 거는 GAP LOCK을 지원하기 때문입니다.
 
MyISAM
  • 비 트랜잭션 세이프 구조입니다.
  • 풀텍스트 인덱스를 지원하기 때문에 조회가 많이 일어나는 서비스에 성능향상을 기대할 수 있습니다.
  • 테이블에 ROW_COUNT를 가지고 있기 때문에 select count(*) 명령시 빠릅니다.

Why - 왜 버젼별 차이를 알아야 하는가?


  • 각각 파일 관리나 트랜잭션 유무의 차이를 갖는 특성을 알아야 어떤 서비스에 적합한지 기술을 선택할 수 있는 척도가 될 수 있습니다.
  • 지극히 개인적으로 master-slave 구조로 master → InnoDB로, slave → MyISAM을 통해 혼용해서 사용하면 읽기 연산 요청에 좀더 성능향상을 기대해볼 수 있을 것 같다고 생각합니다.
  • 그래서 밑에 예제를 통해 한번 실험해보려고 합니다.

How - MyISAM, InnoDB Replication 구성하고 테스트 해보기


  1. docker를 활용한 인프라 셋팅 (replication)
  1. 내부로 들어가 엔진 구조 확인해보기
 
 
파일 트리 구조
notion image
 
compose 파일
version: '3.8' networks: default: name: test-database volumes: data: driver: local config: driver: local services: mysql-master: image: mysql:8.0 container_name: mysql-master environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: testdb TZ: Asia/Seoul volumes: - ./master/my.cnf:/etc/mysql/my.cnf - ./master/data:/var/lib/mysql - ./master/init.sql:/docker-entrypoint-initdb.d/init.sql ports: - "3306:3306" mysql-slave-1: image: mysql:8.0 container_name: mysql-slave-1 environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: testdb TZ: Asia/Seoul volumes: - ./slave/my.cnf:/etc/mysql/my.cnf - ./slave/init.sql:/docker-entrypoint-initdb.d/init.sql ports: - "3307:3306" depends_on: - mysql-master
maseter 패키지 파일
init.sql
create user 'slave_user'@'%' identified by 'password'; grant replication slave on *.* to 'slave_user'@'%' with grant option; flush privileges;
conf 파일
[mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql secure-file-priv= NULL symbolic-links=0 default_authentication_plugin=mysql_native_password bind-address = 0.0.0.0 server-id = 1 log_bin = /var/run/mysqld/mysql-bin.log binlog_do_db = testdb gtid_mode = on enforce_gtid_consistency = on log_slave_updates = on
 
slave 패키지 파일
init.sql
CHANGE MASTER TO MASTER_HOST='mysql-master',MASTER_USER='slave_user',MASTER_PASSWORD='password',MASTER_AUTO_POSITION=1; START SLAVE;
conf 파일
[mysqld] default-storage-engine = MYISAM pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql secure-file-priv= NULL symbolic-links=0 default_authentication_plugin=mysql_native_password bind-address = 0.0.0.0 server-id = 2 relay-log = /var/run/mysqld/mysql-relay-bin.log log_bin = /var/run/mysqld/mysql-bin.log binlog_do_db = testdb read_only = on gtid_mode = on enforce_gtid_consistency = on log_slave_updates = on
 
엔진구조 확인해보기 (docker 내부로 들어가서 확인)
docker exec -it ${master pid} /bin/bash mysql -u root -p password: ${password 입력} ---- mysql 진입완료!! --- SHOW VARIABLES LIKE 'default_storage_engine';
notion image
 
성능테스트 해보기 (InnoDB READ 일 경우, MyISAM READ 일 경우)
ready…
 
 

 REFER


[MySQL]InnoDB VS MyISAM
MySQL의 스토리지 엔진으로 가장 많이 사용하는 엔진으로는 InnoDB와 MyISAM이 있다. InnoDB 엔진은 트랜잭션 처리가 필요하고 대용량의 데이터를 다루는 부분에서 효율적이고, MyISAM 엔진은 트랜잭션 처리가 필요 없고, Read only 기능이 많은
[MySQL]InnoDB VS MyISAM
https://velog.io/@gillog/DBInnoDB-VS-MyISAM
[MySQL]InnoDB VS MyISAM