제가 블랙홀을 만져봤어요.

4838 단어 MySQL

블랙홀


ブラックホール(black hole)とは、極めて高密度かつ大質量で、強い重力のために物質だけでなく光さえ脱出することができない天体である @ 위키백과에서 왔어요.
진정한 블랙홀은 상관없다. 이번에는 MySQL 스토리지 엔진 블랙호다.
일이 이제 와서 정말 지금 LE를 만지고 싶어요.
이 메모리 엔진은 insert를 흐르더라도 실제 기록을 하지 않지만, binlog 파일이 데이터를 토하기 때문에
슬레이브 측에서 수신하여 부하 분산을 진행합니다.
그럼 실제로 만져볼게요.

로컬 복제 환경 구축


나는 현지에서 Docker를 사용하여 MySQL을 이동하고 싶다.
docker-compose.yml
version: '3'
services:
    db-master:
        image: mysql:5.7.22
        ports:
            - 3306:3306
        volumes:
            - ./master.cnf:/etc/mysql/my.cnf
        environment:
            MYSQL_ROOT_PASSWORD: root
            MYSQL_USER: test
            MYSQL_PASSWORD: test
            MYSQL_DATABASE: test
    db-slave:
        image: mysql:5.7.22
        ports:
            - 3307:3306
        volumes:
            - ./slave.cnf:/etc/mysql/my.cnf
        environment:
            MYSQL_ROOT_PASSWORD: root
            MYSQL_USER: test
            MYSQL_PASSWORD: test
            MYSQL_DATABASE: test
master.cnf의 내용(slave.cnf는server-id=1002
[mysqld]

log-bin=binlog

server-id=1001
부팅docker-compose up

마스터 사이드


master status 확인
mysql> show master status \G
*************************** 1. row ***************************
             File: binlog.000003
         Position: 154
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 

슬레이브 사이드


아까 마스터status 정보에 적응하기 (사용자가 루트를 직접...
change master to
    master_host='db-master',      
    master_user='root',               
    master_password='root', 
    master_log_file='binlog.000003',
    master_log_pos=154;                 
복제 시작 및 확인
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show slave status\G
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

데이터베이스 및 테이블 생성


마스터에서 다음 sql 실행
CREATE DATABASE Christmas;

use Christmas;

create table present
(
    name varchar(255) not null,
    address varchar(255) not null,
    create_at timestamp default current_timestamp not null,
    update_at timestamp default current_timestamp not null
) ENGINE=BLACKHOLE CHARSET=utf8mb4;

데이터를 넣어서 봐요.


복제 환경이 이미 완성되었기 때문에, 나는 마스터 방면에 실제적으로 데이터를 넣고 싶다.
mysql> INSERT INTO `Christmas`.`present` (`name`, `address`, `create_at`, `update_at`) VALUES ("PS4 Pro", "自宅", DEFAULT, DEFAULT);
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO `Christmas`.`present` (`name`, `address`, `create_at`, `update_at`) VALUES ("SSD 512GB", "自宅", DEFAULT, DEFAULT);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `Christmas`.`present` (`name`, `address`, `create_at`, `update_at`) VALUES ("iPad Pro", "自宅", DEFAULT, DEFAULT);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `Christmas`.`present` (`name`, `address`, `create_at`, `update_at`) VALUES ("Apple Pencil", "自宅", DEFAULT, DEFAULT);
Query OK, 1 row affected (0.01 sec)

mysql> select * from present;
Empty set (0.00 sec)
텅.. 블랙홀에 빨려 들어간 것 같아.
슬레이브에서 이걸 구하기 위해 책상 엔진을 고쳐 보세요.alter table present ENGINE=innodb;마스터 측에서 insert 문장을 다시 재생하고slave 측에서 확인합니다.
mysql> select * from present;
+--------------+---------+---------------------+---------------------+
| name         | address | create_at           | update_at           |
+--------------+---------+---------------------+---------------------+
| PS4 Pro      | 自宅    | 2018-12-22 14:46:55 | 2018-12-22 14:46:55 |
| SSD 512GB    | 自宅    | 2018-12-22 14:47:10 | 2018-12-22 14:47:10 |
| iPad Pro     | 自宅    | 2018-12-22 14:47:10 | 2018-12-22 14:47:10 |
| Apple Pencil | 自宅    | 2018-12-22 14:47:10 | 2018-12-22 14:47:10 |
+--------------+---------+---------------------+---------------------+
4 rows in set (0.00 sec)
순조롭게 데이터에 들어갔습니다!
참고로 마스터 사이드 id, auto_increment를 더하면 다음과 같은 Duplicate entry 욕을 먹을 수 있으니 주의하세요.Could not execute Write_rows event on table Christmas.present; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY;

총결산


사용자의 로그를 자신의 서버에 놓고 GA 등을 사용하지 않거나 메인 마스터 DB에 쓰기 부하를 주지 않는 로그를 남기려면 편리할 수 있습니다.
이번에는 증량 주위를 완전히 접하지 못했기 때문에 검증을 해야 할 것 같은데...!
지금까지 블랙홀을 만져보았습니다.
좋은 밤 되세요.

좋은 웹페이지 즐겨찾기