ssh 터널링을 이용한 mysql replication 구축

출처 => http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=55304
작성자의 요청이 있을경우 자삭 합니다.


[보안] ssh 터널링을 이용한 mysql replication 구축       
글쓴이       전진하는아르고     날 짜     07-07-20 13:22     조 회     54
Mysql 서버의 데이터를 미러링 할 목적으로 replication 을 셋팅하던 도중에...
갑자기 생각이 나서 한번 해봤습니다.
딴거는 다 포트가 막혀있거나 또는 SSH 터널링을 이용하는데 replication 을 위해..
mysql 포트를 열어야 하는것과 mysql 권한에 원격 로그인을 허용한다는게 좀 맘에 안들어서... ^^

replication 을 구축하기 위해 최소 2개의 mysql 서버가 필요하겠죠.
master 서버 : insert, update, delete 등이 일어나는서버..
slave 서버 : select 를 주로 하는 서버...
우선 두 서버가 리눅스라는 가정하에 설명하겠습니다.
한쪽이 윈도우거나 두쪽다 윈도우인 경우는 별도의 툴들이 필요하니...
대체적으로 replication 을 사용하시는 분들은 둘다 리눅스를 많이 사용할듯 싶으니...

설치 환경
master : fedora4 mysql.4.1.16
slave : centos5 mysql.5.0.41

SSH 터널링
우선 ssh 터널링을 만들어야 합니다.
ssh 터널링은 slave 서버쪽에 셋팅합니다.
# ssh -CNf -L3307:127.0.0.1:3306 ssh계정@master서버IP
패스워드를 입력하자.
이제 slave 서버와 master 서버간에 터널링이 되었다.

# netstats -an | grep LISTEN
하면 3307 포트가 열려있는것을 확인할수 있다.

잠깐 ssh 터널링을 설명하자면 slave 서버에서 로컬(-L)의 3307번 포트로 접속하면 slave의 ssh를 통해..
master 의 ssh 에 접속하여 127.0.0.1의 3306번 포트로 접속한다는것이다.

주의 : 여기서 127.0.0.1 은 slave의 client ssh로 master 서버의 ssh 서버에 접속한 다음에 IP를
의미하는것이므로 127.0.0.1 은 master 서버 자신을 의미한다.
mysql 계정들의 host 권한을 모두 localhost 로 만들어둔 상태라..
127.0.0.1 이 아닌 master 서버의 도메인으로 셋팅한 경우에 접속이 되질 않았다.
이것때문에 삽질을 좀했다.

-f 는 백그라운드로 돌린다는 말이고..
-C는 압축한다는 의미이다.
-N 은 명령어 실해없이 시작한다는 ...

그럼.. 실제로 접속을 해보자.
/usr/local/mysql/bin/mysql -u root -p -P 3307 -h 127.0.0.1
db 리스트 및 내용을 확인해보면 master 로 접속된걸 확인할수 있을것이다.

Tip
위에서 언급한 ssh 터널링은 재부팅되면 초기화 되므로 재부팅시 자동으로활성화 되도록 만들어보자
/root/sshlogin 이란 화일을 만든다음
===========================================================================================
#!/usr/bin/expect
spawn bash -c "ssh -CNf -L3307:127.0.0.1:3306 ssh계정@master서버IP"
expect -re "Password:"
sleep 0.2
send "master서버의ssh계정패스워드\r"
interact
===========================================================================================
위와 같이 입력해준다.
만약 expect 가 없다면 expect 를 yum install expect 해서 설치하거나..
http://rpmseek.com 또는 http://rpmfind.net 에서 찾아서 설치하시길....

이제 해당화일에 chmod 700 권한을 주고... ==> chmod 700 /root/sshlogin
/etc/rc.local 에
/root/sshlogin <== 이부분을 추가..
그럼 리눅스 시스템이 부팅하면서 해당 화일을 실행하고 ssh 터널링이 열린다.



Replication
이제 replication 이 남았다.
일반적인 replication 과 설정이 다른것은 하나밖에 없을것이다.
Slave Server 에서...

Master Server
my.cnf
========================================================================================================
[mysqld]
log-bin = mysql-bin
server-id   = 1
binlog-do-db = db_name1
#binlog-do-db = db_name2
========================================================================================================

Slave Server
my.cnf
========================================================================================================
[mysqld]
server-id       = 2
master-host     = 127.0.0.1
master-user     = 리플리케이션아이디
master-password = 패스워드
master-port     = 3307
# DB 별
replicate-do-db = db_name1
#replicate-do-db = db_name2
# 테이블 별
# replicate-do-table=db_name.tbl_name
========================================================================================================
이제 mysql 서버를 각각 실행시키면 ssh 터널링을 이용해 replication 이 된다.
이문서는 mysql 설치 초기에 replication 환경을 만들기 위한것이다..
mysql 이 서비스 되는 상태에서 replication을 셋팅하는것은 인터넷에 자료가 많으니...
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 삐꾸강아쥐

2007/08/09 15:00 2007/08/09 15:00
, ,
Response
0 Trackbacks , 0 Comments
RSS :
http://blog.blog.n-nuri.com/rss/response/451

Trackback URL : http://blog.blog.n-nuri.com/trackback/451

Leave a comment
[로그인][오픈아이디란?]
Mysql 에서 사용자를 생성 할경우

use mysql;

insert into user values ();
insert into db values ();

형식으로 스키마에 맞게 값을 추가 해주는 경우도 있지만

한번에 user 및 DB를 추가 해주는 방법도 있다.

grant all on db_name.* to id@localhost 
# 까지만 하면 기존 유저에 DB 권한을 추가 해주는 것이고

grant all on db_name.* to id@localhost identified by 'password';
# 사용자 및 DB 권한 그리고 패스워드까지 설정하는 명령어 이다.

뽀너스로 mysql 의 root 비밀 번호를 잊어 벼렸을때 대처법

기존 mysqld 데몬을 killall mysqld 해서 disabled 시킨다음

./mysqld_safe --skip-grant-table & # 옵션을 주고 데몬을 띄우면
root 계정이 패스워드 없이 로긴이 된다.

로긴 후 root 패스워드를 바꿔주고 mysqld 데몬을 다시 정상적으로 띄워주면 작업 끝.


크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 삐꾸강아쥐

2007/04/24 11:59 2007/04/24 11:59
,
Response
0 Trackbacks , 0 Comments
RSS :
http://blog.blog.n-nuri.com/rss/response/315

Trackback URL : http://blog.blog.n-nuri.com/trackback/315

Leave a comment
[로그인][오픈아이디란?]

MySQL 에서 Replication 이용하기


MySQL 실시간 복제 [Replication]

1. MASTER MYSQL

 1) C:\WINDOWS\my.ini)설정파일

#This File was made using the WinMySQLAdmin 1.4 Tool

#2005-08-09 오후 9:23:02

#Uncomment or Add only the keys that you know how works.

#Read the MySQL Manual for instructions

[mysqld]

basedir=C:/mysql

#bind-address=111.111.1.111

datadir=C:/mysql/data

server-id =1

log-bin = C:/mysql/data/replication.log <--바이너리 로그파일

binlog-do-db = gpsdb

binlog-do-db = test

#language=C:/mysql/share/your language directory

language=C:/mysql/share/korean

#slow query log#=

#tmpdir#=

#port=3306

#set-variable=key_buffer=16M

[WinMySQLadmin]

Server=C:/mysql/bin/mysqld-nt.exe

user=root

password=*******

 2) 수정사항 설명

- log-bin : 이것은 바이너리 로그 file이 생성될 경로를 기록해 준다.

- binlog-do-db : 복제할 db이름을 지정해 준다. (위와 같이 원하는 db를 복수 선택 할 수 있다.)

- server-id : 서버 id는 (1 ~ 2^23-1)의 수중에 하나를 선택 할 수 있다.


2. SLAVE MYSQL

 1) C:\WINDOWS\my.ini)설정파일

#This File was made using the WinMySQLAdmin 1.4 Tool

#2005-10-26 오전 11:31:02

#Uncomment or Add only the keys that you know how works.

#Read the MySQL Manual for instructions

[mysqld]

basedir=C:/mysql

#bind-address=111.111.1.112

datadir=C:/mysql/data

language=C:/mysql/share/korean

server-id = 2

master-host = 111.111.1.111

master-port = 3306

master-user = root

master-password = ********

master-connect-retry =60

replicate-do-db = gpsdb

replicate-ignore-table=gpsdb.ttt

log-bin-index = C:/mysql/data/log-bin.index

log-bin = C:/mysql/data/bin.log

log-error = C:/mysql/data/error.log

relay-log = C:/mysql/data/relay.log

relay-log-info-file = C:/mysql/data/relay-log.info

relay-log-index = C:/mysql/data/relay-log.index

#language=C:/mysql/share/your language directory

#slow query log#=

#tmpdir#=

#port=3306

#set-variable=key_buffer=16M

[WinMySQLadmin]

Server=C:/mysql/bin/mysqld-nt.exe

user=root

password=*******

 2) 수정사항 설명

- master-host : master호스트를 기록한다.

- master-user : master유저

- master-password : master유저 비밀번호

- master-port : master디비 포트

- master-connect-retry : master에 재 접속할 횟수

- replicate-do-db : replication할 디비명

- replicate-ignore-table : 특정 테이블은 replication을 하지 않게 지정하는데 사용된다.

- server-id : slave 아이디로 master이외의 unique한 다른 번호를 지정한다.

☞ 더 많은 옵션이 있지만 여기에서는 replication을 하기 위한 옵션만을 다루었다.


3. replication의 시작

 1) mater db를 재시작 한다.

 2) slave db를 재시작한다.

 3) mater db에 업데이트를 실시한다.

 4) slave db에 갱신이 반영되었는지 확인한다.


4. daisy-chain 식의 구성

MySQL은 고급 DBMS가 아닌 관계로 원하시는 기능들에 대해서 간단하게 세팅으로 구현되지는 않습니다. (MS-SQL 같은 경우는 Clustering을 구현하기 위해서 돈이 어마어마하게 듭니다)


Clustering의 핵심은 heartbeat 후의 상태 변화일 건데 그 부분을 스스로 처리해 주신다면 Active/Standby는 쉽게 구현될 수 있을 것이라고 생각합니다. 그걸 위의 daisy-chain 구성과 함께 한다면 Active/Active도 가능하겠지요.


일단 하나의 서버에 heart-beat를 체크하는 스크립트를 작성하고, 그 스크립트가 에러를 감지했을때 일련의 과정을 수행하게 하면 될 것 같습니다. ( 하지만, 그것이 에러가 났을 때 100% 정확하게 동작한다고 볼 수는 없을 것 같습니다. DB단 / OS단이 완전히 분리되어 있는 상황이니까요)


메뉴얼의 --log-slave-updates 설명부분을 올립니당.


--log-slave-updates

보통, 슬레이브에 마스터 서버로부터 받아진 업데이트들은 그것의 이진 로그에 기록되지 않습니다. 이 옵션은 슬레이브 자신의 이진 로그에 그것의 SQL 쓰레드에 의해 수행하였던 업데이트를 기록하는 것을 말합니다. 어떠한 영향을 가지고 있는 이 옵션에 대하여, 그 슬레이브도 또한 이진 로깅을 가능하게 하는 log-bin 옵션과 함께 시작되어야 합니다. --log-slave-updates는 당신이 replication 서버들을 사슬로 묶기를 원할 때 사용됩니다. 예를 들면, 당신은 다음처럼 설치를 원할 수 있습니다 :

A->B->C

저것은 A 서버가 슬레이브 B를 위해 마스터로 쓰이고, B 서버가 슬레이브 C를 위해 마스터로 쓰입니다. 이 작업을 위해 B는 마스터와 슬레이브 모두가 되야 합니다. 당신은 A와 B 둘 다 이진 로깅이 가능하게 하는 log-bin 옵션과 함께, 그리고 B를 log-slave-updates옵션과 함께 시작해야합니다.



출처 : http://database.sarang.net/?inc=read&aid=12749&criteria=mysql&subcrit=&id=&limit=20&keyword=replication&page=5

원본 출처 : http://www.apmtim.com


이글은 장성윤님 홈페이지에서 소리 소문없이 훔쳐 온 것입니다. 많은 분들께 도움이 될 것 같아서 올려 둡니다. 물론 비슷한 글이 QnA 게시판에 보시면 있습니다만 따로 정리된 것이 좋겠지요. :-)


MySQL 실시간 복제[Replication기능] V.0.1


글쓴날 : 2001년 9월 12일

글쓴이 : 장성윤

( http://www.apmtip.com http://www.techcenter.pe.kr )

최종수정 : 2001년 9월 17일

제목을 수정하였습니다.

Replication을 하기 위해서 항상 최신의 버젼을 유지할 것을 권고한다.

참고자료:

http://mysql.com/documentation/mysql/full/manual_toc.html#Replication


먼저 나의 테스트 환경은 이렇다


======================

master -- 와우 리눅스 7.1 paran

메모리 : 196

MySQL버젼 : 3.23.41


slave -- 원도2000

메모리 : 256

MySQL버젼 : 3.23.41

======================

master는 실제로 디비에 내용이 기록되는 호스트이고 , slave는 master 바이너리 로그를 사용해서

해당 디비를 갱신하게 된다.

테스트는 리눅스를 master로 하였고, 원도 mysql을 slave로 하였다.


먼저 호스트에 설치된 mysql의 디렉으로 가서 ./share/mysql방을 찾는다

======================================================================

-rw-r--r-- 1 root root 2538 Sep 11 14:47 my-huge.cnf

-rw-r--r-- 1 root root 2516 Sep 11 14:47 my-large.cnf

-rw-r--r-- 1 root root 2500 Sep 11 14:47 my-medium.cnf

-rw-r--r-- 1 root root 2215 Sep 11 14:47 my-small.cnf

======================================================================

위와 같은 파일이 있을 것이다.

해당 파일을 열어보면 맨 상단에 메모리사양이 나온다.하지만 나의 친절함으로 알아보자----(:


====================================================================

파일명 설명

my-huge.cnf 메모리가 1G-2G사이일때 사용한다.

my-large.cnf 메모리가 512M일때 사용한다.

my-medium.cnf 메모리가 64~256M사이일때 사용한다.(필자는 이것을 사용)

my-small.cnf 메모리가 64M 보다 작을때 사용한다.

====================================================================

위에서 설명은 필자의 생각인 것이다.자신의 메모리가 해당이 않되면 알아서 판단하길 바란다.


일단 my-medium.cnf를 사용하기로 판단을 하고 /etc/my.cnf파일로 복사를 한다.

현재상태는 mysql데몬이 떠있는 상태이며, master설정부분이다.


vi /etc/my.cnf해서 열어서 [mysqld]부분을 보자


==================================vi /etc/my.cnf==========================================

# Example mysql config file for medium systems.

#

# This is for a system with little memory (32M - 64M) where MySQL plays

# a important part and systems up to 128M very MySQL is used together with

# other programs (like a web server)

# The following options will be passed to all MySQL clients


중략......................


# The MySQL server

[mysqld]

port = 3306

socket = /tmp/mysql.sock

skip-locking

set-variable = key_buffer=16M

set-variable = max_allowed_packet=1M

set-variable = table_cache=64

set-variable = sort_buffer=512K

set-variable = net_buffer_length=8K

set-variable = myisam_sort_buffer_size=8M

>>>log-bin = /usr/local/mysql/logs/replication.log <--바이너리 로그파일

>>>binlog-do-db = test <---(디비명)

>>>binlog-do-db = edu <---(디비명)

>>>server-id = 1 <---Replication통신할 서버 아이디


이하 생략..................

==================================================================================

자세히 보면 자신의 my.cnf파일과 다른 부분이 >>>표시로 되어 있을 것이다.

그렇다. >>>부분의 설정으로 master부분은 끝난다.각각의 설정에 대해 알아보자

log-bin 이것은 바이너리 로그가 생성될 경로를 기록해 준다.

binlog-do-db 실시간 백업할 디비

server-id 서버 unique 한 번호(이것은 1 ~ 2^23-1까지 된다고 나와있다)


그리고 위에서 보듯이 binlog-do-db할 디비는 원하는만큼 설정이 가능하다.


그러면 slave인 원도에서 설정을 해 보자.(물론 다른 리눅스 박스를 slave로 설정하는 부분도 거의 동일하다

단지 원도와 리눅스라는 차이점이 있을 뿐이다)

mysql이 정상적으로 설치가 되었다면, WinMySQLadmin을 활성화 한다.

다음과 같이 한다.

시작 > 실행 > 찾아보기 > C:\ysql\in\inmysqladmin.exe 을 선택하고 실행하면 WinMySQLadmin이 활성화 된다.


그러면 오른쪽 아래 부분에 신호등 표시로 나타난다. 이것을 클릭해서 show me하게되면 WinMySQLadmin이 나타나는데

여러 탭이 있을 것인데 여기서 my.ini Setup 탭을 선택한다.

참고로 리눅스에선 my.cnf이지만 윈도 에서는 my.ini파일이다. 이것은 mysql을 설치하면 WINNT방에 생성된다.

그러면 아까 master설정하고 동인한 부분이 보일것이다.


===============================win my.ini설정파일================================

#This File was made using the WinMySQLAdmin 1.3 Tool

#2001-09-11 오후 12:37:06


#Uncomment or Add only the keys that you know how works.

#Read the MySQL Manual for instructions


[mysqld]

>>>master-host = 192.168.0.120

>>>master-user = mysql최상위 관리자나 그에 동등한 권한을 가진 유저

>>>master-password = 비밀번호

>>>master-port = 3306

>>>master-connect-retry = 60

>>>replicate-do-db= edu

>>>replicate-ignore-table=edu.zetyx_board_tunning

>>>replicate-do-db= test

>>>server-id = 2

basedir=C:/mysql

#bind-address=192.168.0.110

datadir=C:/mysql/data

#language=C:/mysql/share/your language directory

#slow query log#=

#tmpdir#=

#port=3306

#set-variable=key_buffer=16M

이하생략....

===============================win my.ini설정파일================================

마찬가지로 >>> 부분이 추가된 부분이다.

설명은 아래와 같다


master-host master호스트를 기록한다.

master-user master유저

master-password master유저 비밀번호

master-port master디비 포트

master-connect-retry master에 재 접속할 횟수

replicate-do-db replication할 디비명

replicate-ignore-table 이것은 하나의 디비에 여러 테이블이 있을 경우 특정 테이블은 replication을 하지 않게 지정하는데 사용된다.

server-id slave 아이디로 master이외의 unique한 다른 번호를 지정한다.


더 많은 옵션이있다. 하지만 여기서는 단지 Replication하는데 중점을 두도록 한다.

여기까지가 Replication을 하기위한 설정의 끝이다.


그러면 이제부터 실시간 백업이 되게 해보자

1.master디비를 재시동한다.

2.slave 디비를 재시동한다.(윈도에서는 관리도구에서 서비스를 선택하면 mysql데몬을 다시 올려주면된다.)

3.master디비에 입력한다.

4.slave디비에 갱신이 되는지 확인한다.


slave에 갱신이 되었다면 성공한 것이다.

물론 위의방법은 새로운 디비에서 실시간 백업이 되게 한 것이다

기존 디비도 같은 방법으로 가능하다.

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)

Posted by 삐꾸강아쥐

2006/04/25 13:57 2006/04/25 13:57
Response
0 Trackbacks , 0 Comments
RSS :
http://blog.blog.n-nuri.com/rss/response/156

Trackback URL : http://blog.blog.n-nuri.com/trackback/156

Leave a comment
[로그인][오픈아이디란?]

블로그 이미지

http://blog.n-nuri.com 이 접속이 안 될경우 http://x2x.dnip.net 으로 접속해 주세요 공유하지 않는 지식은 썩은 물과 같다~~~!!!

- 삐꾸강아쥐

Archives

Recent Trackbacks

Calendar

«   2009/01   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

Site Stats

Total hits:
227683
Today:
34
Yesterday:
279
free counters