‡๐Ÿ‘ฉ‍๐Ÿ’ป ‡/ºDatabase

[SQL] A-A / Master-Slave, Slave-Master Replication ์„œ๋ฒ„ ๊ตฌ์ถ• ์‹ค์Šต

Trudy | ์†ก์—ฐ 2023. 11. 8. 15:33

ํ•˜๋‚˜๋Š” master, ๋‚˜๋จธ์ง€ ํ•˜๋‚˜๋Š” slave์˜ ์„œ๋ฒ„์ž„์— ๋™์‹œ์—

master์ด์ž slave, slave์ด์ž master์ธ replication ์„œ๋ฒ„ ๊ตฌ์ถ•์„ ๊ตฌํ˜„ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค. 

์ „์— ํ–ˆ๋˜ Master-Slave ์‹ค์Šต์€ Master์—์„œ๋งŒ CAUD๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์—ˆ๊ณ , Slave์—์„œ๋Š” Select๋กœ ์กฐํšŒ๋งŒ ๊ฐ€๋Šฅํ•ด์„œ DB์˜ ์—…๋ฌด๋ฅผ ๋ถ„๋‹ด์‹œ์ผœ์คฌ๋Š”๋ฐ, ์ด๋Š” Master DB๊ฐ€ ๊ณ ์žฅ๋‚ฌ์„ ๋•Œ์˜ ๊ฒฝ์šฐ ๋ณต๊ตฌ (DR, Disaster Recovery ์žฌ๋‚œ ๋ณต๊ตฌ) ๊ฐ€ ์–ด๋ ต๋‹ค. 

๋‘ ์„œ๋ฒ„๊ฐ€ ๋‘˜๋‹ค ์„œ๋กœ์˜ master์ด์ž slave๊ฐ€ ๋˜๋ฉด, ์–‘์ชฝ์—์„œ ๋ชจ๋“  ์—…๋ฌด๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ •์„ฑ์ด ๋ณด์žฅ๋œ๋‹ค. 


VMware๋กœ ๋ฆฌ๋ˆ…์Šค ์ปดํ“จํ„ฐ 3๋Œ€ ์„ค์น˜(Master DB, Slave DB)

 

๋ฆฌ๋ˆ…์Šค ์ปดํ“จํ„ฐ 3๋Œ€๋ฅผ ์ค€๋น„ํ•˜๊ณ  ๊ฐ ์ปดํ“จํ„ฐ๋งˆ๋‹ค ์„ค์ •ํ•ด์ค„ ๊ฒƒ์€

 

1. IP ์„ค์ • (master์€ 10.10.10.5, slave๋Š” 10.10.10.6์œผ๋กœ IP์ฃผ์†Œ๋ฅผ ์„ธํŒ…)

1-1. ๋„คํŠธ์›Œํฌ ์„ค์ • ํŒŒ์ผ ํŽธ์ง‘ 
vi /etc/sysconfig/network-scripts/ifcfg-ens160

//VI ํŽธ์ง‘๊ธฐ์— ๋“ค์–ด์™€์„œ ๋ฌธ์„œ ์ˆ˜์ •
ONBOOT=yes    : ๋ถ€ํŒ…ํ•  ๋•Œ ์ด ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•ด์„œ ๋„คํŠธ์›Œํฌ๋ฅผ ์„ธํŒ…ํ•˜๊ฒ ๋‹ค
IPADDR=10.10.10.3      :์›ํ•˜๋Š” IP๋กœ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•ด์คŒ
NETMASK=255.255.255.0      :์„œ๋ธŒ๋„ท ๋งˆ์Šคํฌ ์„ค์ •
GATEWAY=10.10.10.2
DNS1=8.8.8.8

1-2. ์žฌ๋ถ€ํŒ…
init 6   

1-3. IP ์ฃผ์†Œ๊ฐ€ ์ž˜ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š” ์ง€ ํ™•์ธ
ip addr    

1-4. ์ธํ„ฐ๋„ท์ด ์ž˜ ๋˜๋Š” ์ง€ ํ™•์ธ
ping 8.8.8.8


2. mysql-server ์„ค์น˜

 

2-1. DB ์„œ๋ฒ„ ์„ค์น˜
yum install -y mysql-server

2-2. DB ์„œ๋ฒ„ ์‹คํ–‰
systemctl start mysqld

2-3. mysql ์ดˆ๊ธฐํ™”
mysql_secure_installation 
		-> No -> ๋น„๋ฐ€๋ฒˆํ˜ธ์ž…๋ ฅ -> Y -> Y -> Y ... -> Y
        
3. ๋ฐฉํ™”๋ฒฝ ๋„๊ธฐ
setenforce 0
systemctl stop firewalld

์ด์ œ ์ปดํ“จํ„ฐ 3๋Œ€๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์œผ๋‹ˆ 3๋Œ€ ์ค‘ 2๋Œ€๋ฅผ  Master DB, Slave DB๋กœ ์„ค์ •ํ•ด๋ณด์ž!  

 

Master DB ์„ค์ •

    1) /etc/my.cnf.d/mysql-server.cnf ์„ค์ • ํŒŒ์ผ ์ˆ˜์ •
  		 vi /etc/my.cnf.d/mysql-server.cnf 
    
		[mysqld] ๋ฐ‘์— ๋‹ค์Œ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
    
   		 //1์ด ํŠน๋ณ„ํ•œ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ , ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ ๋Œ€์ด๋‹ค ๋ณด๋‹ˆ๊นŒ ๊ตฌ๋ณ„ํ•ด์ฃผ๊ธฐ ์œ„ํ•œ id๋ฅผ ์„ค์ •ํ•จ
		 server-id = 1  
   		 //๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•จ
		 log-bin = mysql-bin
 
 	2) ์„ค์ • ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด restart์„ ํ•ด์ค˜์•ผ ํ•จ
    	systemctl restart mysqld

    3) Master ์ƒํƒœ ํ™•์ธ
		mysql -u root -p ๋กœ๊ทธ์ธ ํ›„
		show master status;

    4) Replicationํ•  ๋•Œ ์‚ฌ์šฉํ•  ๊ณ„์ • ์ƒ์„ฑ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ
    	//Master DB์— ์ ‘๊ทผํ•ด์„œ ์‚ฌ์šฉํ•  Slave๋ฅผ ์œ„ํ•œ master์˜ user๋ฅผ ๋งŒ๋“ฆ
		CREATE USER '[์ด๋‹ˆ์…œ]'@'[Slave์˜ IP์ฃผ์†Œ]' IDENTIFIED BY '[ํŒจ์Šค์›Œ๋“œ]';
	
		GRANT REPLICATION SLAVE ON *.*  TO '[์ด๋‹ˆ์…œ]'@'[Slave์˜ IP์ฃผ์†Œ]';
	
    
 	5) Repl_slave_priv ์†์„ฑ์ด Y๋กœ ๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธ
		SELECT * FROM mysql.user where user='[์ด๋‹ˆ์…œ]'\G

 

Slave DB ์„ค์ •

    // Master์˜ log ๋ฒˆํ˜ธ, ํฌ์ง€์…˜ ๋ฒˆํ˜ธ๋Š” Master์—์„œ ํ™•์ธ ํ›„ Slave์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ! 

    1) /etc/my.cnf.d/mysql-server.cnf ํŒŒ์ผ ์ˆ˜์ •
    vi /etc/my.cnf.d/mysql-server.cnf
    
	[mysqld]๋ฐ‘์— ๋‹ค์Œ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
	
	server-id = 2
	
    1-1) ์„ค์ • ํŒŒ์ผ์„ ์ˆ˜์ •ํ–ˆ์œผ๋‹ˆ ์žฌ์‹œ์ž‘
	systemctl restart mysqld

    2) Master ์ง€์ •
	mysql -u root -p
	change master to
    master_host='[๋งˆ์Šคํ„ฐ์˜ IP์ฃผ์†Œ]',
	master_user='[๋งˆ์Šคํ„ฐ์—์„œ ๋งŒ๋“  slave์šฉ ๊ณ„์ • ์ด๋ฆ„]',
	master_password='[๋งˆ์Šคํ„ฐ์—์„œ ๋งŒ๋“  slave์šฉ ๊ณ„์ •์˜ PW]',
	master_log_file='mysql-bin.[๋งˆ์Šคํ„ฐ์˜ ๋กœ๊ทธ ๋ฒˆํ˜ธ]',
	master_log_pos=[๋งˆ์Šคํ„ฐ์˜ ํฌ์ง€์…˜ ๋ฒˆํ˜ธ];

    3) ๋™๊ธฐํ™” ์‹œ์ž‘
	start slave;

    4) Slave ์ƒํƒœ ํ™•์ธ
	show slave status;

		๋˜๋Š”

	show slave status\G

 

 


Master, Slave DB์˜ ๋™์ž‘ ํ™•์ธ

3. ๋™์ž‘ ํ™•์ธ
  (1) ๋งˆ์Šคํ„ฐ, ์Šฌ๋ ˆ์ด๋ธŒ์—์„œ DB ํ™•์ธ
	show databases;

  (2) ๋งˆ์Šคํ„ฐ์—์„œ DB ์ƒ์„ฑ
	CREATE DATABASE [DB์ด๋ฆ„];

  (3) ๋งˆ์Šคํ„ฐ, ์Šฌ๋ ˆ์ด๋ธŒ ์—์„œ DB ํ™•์ธ
	show databases;    

	์ด ๋•Œ ์–‘์ชฝ์— DB๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

Slave DB์˜ Master DB ์„ค์ •

    1) /etc/my.cnf.d/mysql-server.cnf ์„ค์ • ํŒŒ์ผ ์ˆ˜์ •
  		 vi /etc/my.cnf.d/mysql-server.cnf 
    
		[mysqld] ๋ฐ‘์— ๋‹ค์Œ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

   		 //๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•จ
		 log-bin = mysql-bin
 
 	2) ์„ค์ • ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด restart์„ ํ•ด์ค˜์•ผ ํ•จ
    	systemctl restart mysqld

    3) Master ์ƒํƒœ ํ™•์ธ
		mysql -u root -p ๋กœ๊ทธ์ธ ํ›„
		show master status;

    4) Replicationํ•  ๋•Œ ์‚ฌ์šฉํ•  ๊ณ„์ • ์ƒ์„ฑ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ
    	//Master DB์— ์ ‘๊ทผํ•ด์„œ ์‚ฌ์šฉํ•  Slave๋ฅผ ์œ„ํ•œ master์˜ user๋ฅผ ๋งŒ๋“ฆ
		CREATE USER '[์ด๋‹ˆ์…œ]'@'[Slave์˜ IP์ฃผ์†Œ]' IDENTIFIED BY '[ํŒจ์Šค์›Œ๋“œ]';
	
		GRANT REPLICATION SLAVE ON *.*  TO '[์ด๋‹ˆ์…œ]'@'[Slave์˜ IP์ฃผ์†Œ]';
	
    
 	5) Repl_slave_priv ์†์„ฑ์ด Y๋กœ ๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธ
		SELECT * FROM mysql.user where user='[์ด๋‹ˆ์…œ]'\G

Master DB์˜ Slave DB ์„ค์ •

    1) Master ์ง€์ •
	mysql -u root -p
	change master to
    master_host='[๋งˆ์Šคํ„ฐ์˜ IP์ฃผ์†Œ]',
	master_user='[๋งˆ์Šคํ„ฐ์—์„œ ๋งŒ๋“  slave์šฉ ๊ณ„์ • ์ด๋ฆ„]',
	master_password='[๋งˆ์Šคํ„ฐ์—์„œ ๋งŒ๋“  slave์šฉ ๊ณ„์ •์˜ PW]',
	master_log_file='mysql-bin.[๋งˆ์Šคํ„ฐ์˜ ๋กœ๊ทธ ๋ฒˆํ˜ธ]',
	master_log_pos=[๋งˆ์Šคํ„ฐ์˜ ํฌ์ง€์…˜ ๋ฒˆํ˜ธ];

    2) ๋™๊ธฐํ™” ์‹œ์ž‘
	start slave;

    3) Slave ์ƒํƒœ ํ™•์ธ
	show slave status;

		๋˜๋Š”

	show slave status\G

 

Master-Slave, Slave-Master DB ๋™์ž‘ ํ™•์ธ

 

์–‘ ์ชฝ์—์„œ CREATE DATABASE๋ฅผ ํ•ด๋ณด๊ณ  ์–‘ ์ชฝ์—์„œ SHOW DATABASES;๋กœ ๋™๊ธฐํ™”๊ฐ€ ์„œ๋กœ ๋˜๋Š” ์ง€ ํ™•์ธํ•œ๋‹ค.