복제 Replication

mysql 2018.12.19 17:24


Slave IO Thread

- 마스터 DBMS에 로그인해서 바이너리로그를 읽어 릴레이로그에 쓰는 쓰레드


Slave SQL Thread

- 릴레이로그에서 실제 슬레이브 DBMS에 반영하는 쓰레드


docker run -d -e MYSQL_ROOT_PASSWORD=sample --name=master mariadb:10.1

docker run -d -e MYSQL_ROOT_PASSWORD=sample --name slave mariadb:10.1


docker inspect master | grep "IPAddress"

docker inspect slave | grep "IPAddress"


docker exec -it master bash


cd /etc/mysql


my.cnf/my.ini


master

[mysqld]

pid-file = /var/run/mysqlid/mysqlid.pid

socket = /var/run/mysql/mysqlid.sock

datadir = /var/lib/mysql

log-error = /var/log/mysql/error.log 

symbolic-links = 0

bind-address = 0.0.0.0

server-id = 1

log_bin = /var/log/mysql/mysql-bin.log

expire_logs_days = 10

max_binlog_size = 100M 



docker exec -it slave bash


cd /etc/mysql


my.cnf/my.ini


slave

[mysqld]

pid-file = /var/log/mysqld/mysqld.pid

socket = /var/run/mysqld/mysqld.dock

datadir = /var/lib/mysql

log-error = /var/log/mysql/error.log 

symbloic-links = 0

bind-address = 0.0.0.0

server-id = 2

relay-log = /var/log/mysql/relay.log

relay_log_purge = TRUE

read_only



sudo service mysql restart


$ docker commit -m "xxx" -a "aaa" master master_new

$ docker commit -m "xxx" -a "aaa" slave slave_new


$ docker images


$ docker run -d -e MYSQL_ROOT_PASSWORD=sample --name=master_new master_new

$ docker run -d -e MYSQL_ROOT_PASSWORD=sample --name=slave_new slave_new


$ docker rm -f master

$ docker rm -f slave


$ docker ps -a


$ docker inspect master_new | grep "IPAddress"

$ docker inspect slave_new | grep "IPAddress"


$ docker exec -it master_new bash


create user 'replicationuser1'@'%' identified by 'sample';


grant replication slave, replication client on *.* to 'replicationuser1'@'%' identified by 'slavepass';


flush privileges;


master 상태 확인

show master status;


master db 덤프 후 slave로 복사


# docker exec -it master_new bash

mysqldump -lock-all-tables -all-databases -master-data=1 -uroot -p > dump.sql


# docker cp master_new:/dump.sql . 

# docker cp dump.sql slave_new:/


slave


# docker exec -it slave_new bash


mysql-uroot -p < dump.sql


change master to master_log='mariadb-bin.001482' master_log_pos=4415249, master_host='172.17.0.x', master_port=3306, master_user='replicationuser1', master_password='slavepass';


show slave status;

-> Slave_IO_Running

-> Slave_SQL_Running


start slave;


show slave status;

-> Slave_IO_Running

-> Slave_SQL_Running



'mysql' 카테고리의 다른 글

복제 Replication  (0) 2018.12.19
show processlist 에 where 조건 사용하기  (0) 2018.12.19
샤딩 sharding  (0) 2018.12.19
트랜잭션 Transcation, 락 Lock, 격리수준 IsolationLevel  (0) 2018.12.18
파티셔닝 Partitioning  (0) 2018.12.17
Azure Linux VM에서 MySQL 성능 최적화  (0) 2016.06.16
Trackbacks 0 : Comments 0

Write a comment


show processlist 에 where 조건 사용하기

mysql 2018.12.19 13:05


SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST where time > 10 and info is not null;


how to customize `show processlist` in mysql? 2009.05.30

http://stackoverflow.com/questions/929612/how-to-customize-show-processlist-in-mysql


Chapter 23 The INFORMATION_SCHEMA PROCESSLIST Table

https://dev.mysql.com/doc/mysql-infoschema-excerpt/5.1/en/processlist-table.html


'mysql' 카테고리의 다른 글

복제 Replication  (0) 2018.12.19
show processlist 에 where 조건 사용하기  (0) 2018.12.19
샤딩 sharding  (0) 2018.12.19
트랜잭션 Transcation, 락 Lock, 격리수준 IsolationLevel  (0) 2018.12.18
파티셔닝 Partitioning  (0) 2018.12.17
Azure Linux VM에서 MySQL 성능 최적화  (0) 2016.06.16
Trackbacks 0 : Comments 0

Write a comment


샤딩 sharding

mysql 2018.12.19 08:20


데이터베이스 샤딩 sharding


- 파티셔닝과 달리 별도의 샤드를 구축, 샤딩 플랫폼(스파이더)를 통해 구현

- 쓰기 성능이 지속적으로 향상됨

- Spider 기반 샤딩 구축


수직(Verical) 샤딩

- 샤드를 만들어 저장할 때 구분 기준을 연령/성별과 같은 기준으로 나눠 구성

- 테이블 단위로 분할


수평(Horizontal) 샤딩

- 동일한 시스템을 지역/국가별로 나눠서 구성하는 경우

- 동일한 테이블을 여러 개로 분할


범위(range) a-m /n-r / s-z

해시(hash) 해시함수 파티션별로 크기를 비슷하게 나눔

리스트(list) 특정한 컬럼을 기준

컴포지트(composite) range-hash/range-list


mariadb 다운로드

docker pull mariadb:10.1


스파이더 인스턴스 실행

docker run -d -e MYSQL_ROOT_PASSWORD=sample --name=spider mariadb:10.1


접속

docker exec -it spider bash


테스트인스턴스 실행

docker run -d -e MYSQL_ROOT_PASSWORD=sample --name=sample1 mariadb:10.1

docker run -d -e MYSQL_ROOT_PASSWORD=sample --name-sample2 mariadb:10.1


실행 인스턴스 확인

docker ps -a


테스트인스턴스 접속

docker exec -it sample1 bash

docker exec -it sample2 bash


IP주소 확인

docker inspect spider | grep "IPAddress"

docker inspect sample1 | grep "IPAddress"

docker inspect sample2 | grep "IPAddress"


docker exec -it spider bash

docker exec -it sample1 bash

docker exec -it sample2 bash


cd /user/share/mysql


스파이더 설치

mysql -u root < /usr/share/mysql/install_spider.sql


스파이더 엔진 설치확인

show engines;


https://mariadb.com/kb/en/mariadb/spider-storage-engine-overview/

http://yakolla.tistory.com/69


spider sample1,2 에 사용자추가 및 권한 할당

use mysql;

create user 'spider-test'@'%' identified by 'sample';

grant all on *.* to 'spider-test'@'%' with grant option;

flush privileges;


샤딩 플렛폼에 서버정보 등록하기

create server sample1

 foreign data wrapper mysql

options(

 host '172.17.0.x',

 database 'sampleDB',

 user 'spider-test',

 password 'sample',

 port 3306

);


create server sample2

 foreign data wrapper mysql

options(

 host '172.17.0.x',

 database 'sampleDB',

 user 'spider-test',

 password 'sample',

 port 3306

);


서버정보 확인하기

select * from mysql.servers;


spider 에 table 생성

create database sampleDB;

user sampleDB;

create table shardingTest(id int not null auto_increment, name varchar(255) not null, address varchar(255) not null, primary key(id) engine=spider comment='wrapper "mysql", talbe "shardingTest"' partition by key(id) (partition sample1 comment = 'srv "sample1"', partition sample2 comment = 'srv "sample2"' );


sample1,2 에 talbe 생성

create database sampleDB;

user sampleDB;

create table shardingTest

(

 id int not null auto_increment,

 name varchar(255) not null, 

 address varchar(255) not null,

 primary key(id)

);


spider 접속 후 

user sampleDB;

insert into shardingTest(name, address) values ('kim', 'seoul');

insert into shardingTest(name, address) values ('lee', 'seoul');

insert into shardingTest(name, address) values ('park', 'seoul');

insert into shardingTest(name, address) values ('kim', 'busan');

insert into shardingTest(name, address) values ('lee', 'daegu');

insert into shardingTest(name, address) values ('park', 'jeju');


select * from shardingTest;


sample1,2에서도 각각 확인


select * from shardingTest;



VLDB Very Large DBMS


Sharding

- DBMS 내용 분할 (DB/테이블)

- Write 성능 향상


Replication

- 동일한 DBMS를 여러 개 유지(마스터/슬레이브)

- Read 성능 향상


'mysql' 카테고리의 다른 글

복제 Replication  (0) 2018.12.19
show processlist 에 where 조건 사용하기  (0) 2018.12.19
샤딩 sharding  (0) 2018.12.19
트랜잭션 Transcation, 락 Lock, 격리수준 IsolationLevel  (0) 2018.12.18
파티셔닝 Partitioning  (0) 2018.12.17
Azure Linux VM에서 MySQL 성능 최적화  (0) 2016.06.16
Trackbacks 0 : Comments 0

Write a comment