랜케이블 연결방법

2008/01/29 15:36
 
1:1연결, LAN카드와 허브 연결용 케이블 (스트레이트케이블)
UTP 케이블은 그 안에 모두 8개의 실선이 들어있지만, 실제로 사용되는 것은 4개 뿐이다. 실선은 케이블 제조사에 따라 약간 색깔이 틀릴수 있지만, 대부분 다음과 같은 구조로 되어있다. 색깔은 틀려도 무방하며, 순서만 맞추면 된다
케이 블의 순서는 색깔에 의해서 맞추는데 필자는 두 개씩 짝지어서 이를 마음대로 순서 매겨서 사용하고 있다. 두 개씩 짝지우는 방법은 각각의 색깔당 흰색이 들어간 점선이 있으므로 쉽게 가능하다. 예를들면 오렌지색의 실선과 오렌지/화이트의 실선을 각각 짝지으면 쉽게 자기 나름의 순서를 만들 수있다.
UTP 케이블은 양쪽 끝단의 순서만 일치시키면 되기 때문에 특별히 케이블의 색깔과 순서를 외우지 않아도 되기 때문이다. 참고로 순서를 결정해보면 다음과 같다.(저는 무지개 색순으로 외우면 쉽더군요...빨(x),주,노(x),초,파,남(x),보.
1. 백색/주황
2. 주황색
3. 백색/녹색
4. 청색
5. 백색/청색
6. 녹색
7. 백색/갈색
8. 갈색
 
 
1. 백색/주황
2. 주황색
3. 백색/녹색
4. 청색
5. 백색/청색
6. 녹색
7. 백색/갈색
8. 갈색
 
허브를 이용한 네트웍크 구축시 허브포트와 랜카드 연결시 사용하는 케이블
랜카드쪽 RJ-45와 허브쪽 RJ-45의 배선순서가 동일함.
10/100Mbps 스위칭 허브 이용시 위의 색상규정을 받드시 따를것.
앞서 말했듯이 UTP 케이블에 따라서 색깔은 틀릴 수 있다. 순서는 케이블 제작자 맘대로 결정해도 된다.
* 참고:UTP 케이블 상에서 실제 사용되는 시그널 선은 1,2,3,4 번 뿐이다. 따라서 다른 선들은 순서가 틀려도 상관이 없다.

이렇게 만들어진 UTP 케이블은 컴퓨터와 허브(가정에서는 IP공유기)간에 네트워크를 연결할 때 사용된다. 각 시그널 선의 양쪽이 1:1로 똑같이 대칭되므로 이를 1 : 1 연결이라고 부르기도 한다.

컴퓨터와 컴퓨터/LAN카드와 LAN카드 / 허브와 허브 연결용 케이블 (크로스케이블)
크로스 연결이란 1 : 1 연결과는 달리 TX-RX, RX-TX 간의 연결을 의미한다. 따라서 서로간의 시그널 선이 크로스되어있다. 이 경우는 컴퓨터와 컴퓨터를 직접 네트워크로 연결하거나 스위치나 허브를 서로간에 연결할 때 사용한다. 그러나 스위치나 허브에 업링크(Uplink; Upstream이라고도 부른다.) 포트가 있을 경우 1:1 연결 케이블을 사용해서 연결 할 수 있다. 앞서 말했듯이 8개의 시그널선중에서 의미있는 것은 1,2,3,6번 뿐이다. 따라서 1-3, 2-6을 연결해주면 크로스 케이블이 만들어진다.
1. 백색/주황
2. 주황색
3. 백색/녹색
4. 청색
5. 백색/청색
6. 녹색
7. 백색/갈색
8. 갈색
1. 백색/녹색
2. 녹색
3. 백색/주황색4. 청색
5. 백색/청색
6. 주황색
7. 백색/갈색
8. 갈색
 
1번->3번, 2번->6번으로 결선하며
10BASE-T 에서는 1,2,3,6번 4선만을 사용하나 결선시에는 8선 모두를 결선함.


나머지 선은 의미가 없으므로 아무렇게나 연결해도 된다. 또한 케이블 제조사에 따라 색깔이 틀릴수 있으므로 제작자의 임의대로 결정해도 무방하다.
크 로스 케이블은 가정이나 일반 사무 환경에서 네트워크 카드를 장착한 컴퓨터간에 연결시 허브나 스위치를 거치지 않고 직접 연결이 가능하다. 하지만 이 경우는 단지 두 시스템간의 연결뿐이다. 이 보다는 주로 스위치나 허브를 여러대 설치하여 포트수를 늘리기 위해 크로스 케이블을 활용한다. 업링크 포트가 없는 제품들이 많기 때문이다.

자세한 것은 http://sql.uniadnet.com/network/movie.htm를 참고하세요.
2008/01/29 15:36 2008/01/29 15:36
Posted by 비온뒤하늘
정말 한글에 관련한 문제가 많이 생긴다..

이번에 mysql에서 발생한 문제는 콘솔에서는 한글이 정상적으로 보이나.

이상하게도 웹에서는 한글이 모두 ??? 물음표로 보이는 문제 였다..

완전 환장하는 시츄에이션...

결국 해결을 하게 되었는데..

/etc/my.cnf에 다음과 같이 설정을 해주었더니 해결이 되었다..(빨간 부분이다.)

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
default-character-set = euckr
#language = /usr/local/mysql/share/mysql/korean/
character-set-client-handshake = FALSE


아래의 문서를 보고 확인했습니다.


세상에나..mysql 5.0은 설정방법이 변경되었더군요..

그래서 한글이 계속 웹에서 깨졌었습니다.

 

프로그래밍

페이지 최상단에 항상 아래 코드 입력

<%@ page contentType="text/html; charset=euc-kr" %>

<% request.setCharacterEncoding("euc-kr"); %>

JDBC 연결방법 수정

Connection conn = null;

String jdbcDriver = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=euc-kr";

String dbUser = "test";
String dbPass = "test1234";
conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass);

mysql 에서 테이블 속성 변경

mysql 5.0 버전이상에서는 각 테이블마다의 charset 을 지정할 수 있게 되었습니다.

속성을 euckr 로 변경을 하시면 됩니다.

 

다른 방법으로는 테이블을 생성할 때 다음을 추가하시면 됩니다.

create table 'member' (

~~

~~

)ENGINE=MyISAM DEFAULT CHARSET="euckr";

윈도우

mysql 설치디렉토리를 보시면 my.ini 파일이 있습니다. 요넘 수정들어갑니다.

[mysql] 부분

#default-character-set=latin1
default-character-set=euckr

[mysqld] 부분

# The default character set that will be used when a new schema or table is
# created and no character set is defined

default-character-set=euckr
language = "C:/MySQL/MySQL Server 5.0/share/korean"
character-set-client-handshake = FALSE

linux

윈도우 방법하고 별반차이 없습니다. my.conf 파일 수정들어갑니다.

my.cnf 는 /etc/my.conf 에 있습니다.

설마 여기 없다고요?? 그렇다면 #cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf 해주세요

[mysqld] 부분

default-character-set=euckr
language = /usr/local/mysql/share/mysql/korean/
character-set-client-handshake = FALSE

이렇게 해주시고 mysql 다시 시작해주시면 됩니다.
2007/11/26 20:31 2007/11/26 20:31
Posted by 비온뒤하늘
MySQL 데이터 베이스를 다른 머신으로 복사하기

여러분은 MyISAM 테이블용 .frm, .MYI, .MYD 파일을 동일한 부동 소수점 포맷을 지원하는 서로 다른 머신 사이에서 이동 시킬 수 있다. Section 14.1, “MyISAM 스토리지 엔진을 참조 할 것.

서로 다른 머신간에 데이터 베이스를 전달할 필요가 있을 경우에는, mysqldump를 사용해서 SQL명령문을 갖는 파일을 만든다. 그 다음에는 다른 머신에 전달하고 mysql 클라이언트의 입력 값으로 사용한다.

mysqldump --help옵션을 사용해서 사용 가능한 옵션을 알아 본다. 데이터를 새로운 버전의 MySQL로 전달한다면, mysqldump --opt 를 사용해서 최대한 최적화를 시켜서 덤프를 함으로서 크기를 작게 할 수 있다.

두 머신간의 데이터 이동(빠르지는 않더라도) 방법 중에 가장 간단한 것은 데이터 베이스가 있는 머신에서 아래의 명령어들을 실행하는 것이다:

shell> mysqladmin -h 'other_hostname' create db_name
shell> mysqldump --opt db_name | mysql -h 'other_hostname' db_name

속도가 느린 네트워크상에 있는 리모트 머신에서 데이터를 복사하고자 한다면, 다음의 명령어를 사용하면 된다:

shell> mysqladmin create db_name
shell> mysqldump -h 'other_hostname' --opt --compress db_name | mysql db_name

여러분은 파일안에 덤프로 저장하고, 타겟 머신에 파일을 전송하고, 그 다음에 그곳에 있는 데이터 베이스로 파일을 로드할 수도 있다. 예를 들면, 아래와 같이 소스 머신에서 데이터 베이스를 압축 파일로 덤프할 수 있다:

shell> mysqldump --quick db_name | gzip > db_name.gz

데이터 베이스를 갖고 있는 파일을 타겟 머신으로 전송한 다음에 아래의 명령어를 그곳에서 실행한다:

shell> mysqladmin create db_name
shell> gunzip &lt; db_name.gz | mysql db_name

데이터 베이스를 전송하기 위해서 mysqldump mysqlimport 도 사용할 수 있다. 큰 테이블의 경우, 이것은 단순히 mysqldump를 사용하는 것보다 빠르다. 아래의 명령어에서 보면, DUMPDIR mysqldump 로부터 결과를 저장하기 위해 사용하는 디렉토리의 전체 경로 이름을 표시하는 것이다.

우선, 결과 파일을 위한 디렉토리를 만들고 데이터 베이스를 덤프한다:

shell> mkdir DUMPDIR
shell> mysqldump --tab=DUMPDIR db_name

그 다음에는 DUMPDIR 디렉토리에 있는 파일을 타겟 머신의 대응되는 디렉토리에 전송하고 그 곳에 잇는 MySQL안으로 로드를 한다:

shell> mysqladmin create db_name           # create database
shell> cat DUMPDIR/*.sql | mysql db_name   # create tables in database
shell> mysqlimport db_name DUMPDIR/*.txt   # load data into tables

mysql 데이터 베이스를 복사하는 것을 잊지 말아야 하는데, 거기에 그랜트 테이블이 저장되어 있기 때문이다. 여러분이 새로운 머신에 mysql 데이터 베이스를 갖기 전까지는 그 곳에서 root 사용자로서 명령어를 실행해야 할 것이다.

mysql 데이터 베이스를 새로운 머신으로 전송한 다음에는, mysqladmin flush-privileges를 실행해서 서버가 그랜트 테이블 정보를 다시 로드하도록 만든다.

2007/02/04 18:45 2007/02/04 18:45
Posted by 비온뒤하늘

MySQL Replication

2007/02/04 15:55
MySQL Replication

아 드디어 내 홈에서 DB 에 관한 부분을 다루게 되었다. 하지만 DB 에 관한 설치 및 튜닝에 대
해서는 논하지는 않는다. 왜냐면 필자는  DB쪽에 지식이 별로 없기 때문이다. 만약 설치 및 튜
닝쪽에 관심이 있다면 http://database.sarang.net 으로 문의하기 바란다. 필자에게 질문을 하
더라도 답변 듣기 힘들테니까..

잡설은 그만두고 그럼 여기서는 우선 MySQL 의 3.23부터 지원이 되는 Replication 기능에 대해
서 논하고자 한다. Load Ballance 등의 장비나 또는 software 적인 방법을 통해 서버를 여러대
운영하다 보면 동기화 문제가 발생하게 된다. Replication 기능은 바로 이것처럼 DB server 를
여러대로 구동을 할때 각 DB서버의 동기화를 지원하기위한 기능으로 사용을 할 수가 있다. 즉,
입력 서버와 출력 서버를 분리해서 운영을 할 수가 있는 것이다.

일단 설정을 논하기 전에 주의 할 것은 MySQL 의 Replication 기능은 3.23버젼 부터 지원을 하
며 현재 MySQL 의 Replication 기능은 테스트 버젼 정도라고 인식을 하고 도입여부를 결정해야
한다는 점이다.





Replication 에서는 Master 와 Slave 라는 말을 사용하게 된다. Master 라는 말은 즉 능동적인
작업을 수행하는 측을 의미한다.  즉 실제로 업데이트가 발생하고, 동기화를 할 서버의 기준이
되는 서버를 의미한다.

일단, Replication 기능을 사용하기 위해서는 Replication 의 기능을 수행 할 유저가 필요하며
이 유저는 모든 DB 에 대해서 file 의 권한을 가지고 있어야 한다.

GRANT file ON *.* TO $repjob_user@'$slave_host_addr' IDENTIFIED BY '$passwd'

명령을 이용하여 file 에 대해서만 모든 DB 에 권한을 가지는 유저를 추가하도록 한다. 여기서
$repjob_user 는 중복되지 않는 유일한 아무 이름의 유저로 지정하면 되며,  $salve_host.addr
은 SLAVE server 로 만들 서버의 주소를 적어 줘야 한다. 그래야 SLAVE 에서 위에서 지정한 유
저로 MASTER server 에 접속이 가능하기 때문이다. 마지막의 $passwd 는 접속할 패스워드를 지
정하는 것이다.

다음 my.cnf 에 아래와 같이 Replication 기능을 위한 MASTER 설정을 한다.

Hanterm - cat /etc/my.cnf

 [root@bbuwoo /etc]$ cat my.cnf

  [mysqld]
  ....
  ....
  log-bin
  binlog-do-db    = test
  binlog-do-db    = test1
  server-id       = 1

 [root@bbuwoo /etc]$

log-bin 은 Replication 을 위한 binary log 를 남기게 한다.  server-id 는 Replication 기능
을 사용하는 서버중 유일값을 가져야 한다. server-id 는 1 에서 2^32-1 까지 지정할 수 있다.

binlog-do-db 는 Replication 을 사용할 database 를 지정한다. binlog-do-db = test,test1 과
같이는 사용이 안된다. 이유는 모르겠지만 하나에 하나씩 적어 줘야 한다. 만약 모든 database
를 동기화 하려한다면 binlog-do-db 를 설정을 안하면 된다. 만약 mysql DB 만 Replication 기
능을 사용하고 싶지 않다면 binlog-ignore-db 를 사용하면 된다.

my.cnf 에서 사용할 수 있는 MASTER 에 관한 옵션은 다음과 같다

log-bin=filename

Replication 기능에 필요한 binary log 를 남기게 한다.  filename 을 지정하지 않을 경우에는
mysql 의 lib directory 에 $host-bin.001 과 같이 남게 된다.  RPM으로 설치했을 경우에는 보
통 /var/lib/rpm 에 남게되며, prefix 를 지정하지 않은 채 소스 컴파일을 했을 경우에는 보통
/usr/local/mysql/lib/ 에 남게 된다.

log-bin-index=filename

binary file 의 index 파일을 생성한다. 지정하지 않으면 $host-bin.index 로 남게 된다. 지정
하나 하지 않으나 별 상관은 없다.

sql-bin-update-same

If set, setting SQL_LOG_BIN to a value will automatically set SQL_LOG_UPDATE to the same
value and vice versa. 

binlog-do-db=database_name

MASTER 의 여러 DB 중 Replication 기능으로 동기화를 할 Database를 선택한다. 이것이 지정이
되어 있으면 지정되지 않은 Database 들은 동기화에서 빠진다.

binlog-ignore-db=database_name

MASTER 의 여러 DB 중 Replication 기능으로 동기화를 하지 않을  Database 를 선택한다. 이것
이 지정이 되어 있으면 지정되지 않은 Database 들만 동기화를 한다. 만약 binlog-do-db 가 설
정이 되어 있을 경우 에는 binlog-do-db 를 먼저 적용하고나서 binlog-ignore-db 를 적용한다.

좀 더 자세한것을 알고 싶다면 http://www.mysql.com/doc/R/e/Replication_Options.html 를 참
고 하도록 한다.




SLAVE 측의 설정에서는 별다른 유저 추가가 필요 없으며 MASTER 측의 추가한 유저 정보를 이용
하여 my.cnf 에서 SLAVE 설정만 해 주는 것으로 설정이 끝난다.

Hanterm - cat /etc/my.cnf

 [root@bbuwoo /etc]$ cat my.cnf

  [mysqld]
  ....
  ....
  server-id       = 2
  master-host     = mater_ipaddres
  master-user     = $repjob_user
  master-password = $passwd
  replicate-do-db = test
  master-port     = 3306

 [root@bbuwoo /etc]$

server-id 는 역시 유일값 이어야 한다. MASTER 에서 1 을 사용했으니 SLAVE 에서는 2 를 사용
한다.

master-host 는 MASTER server 의 ip address 를 지정해 준다. master-user 는 Replication 작
업을 할 유저를 지정한다. 위의 MASTER 에서 등록해 준 유저를 적도록 한다.

master-passwd 는 Replication 작업을 할 유저의 패스워드를 지정한다.

master-port 는 MASTER server 가 사용하는 포트를 지정한다. 기본값으로 3306 이다.

만약 MASTER server 의 특정 DB만 Replication 기능을 사용하고 싶다면 replicate-do-db 를 이
용한다.  하지만 이 기능은 MASTER 에서 binlog-ignore-db 로 제한을 하고 있다면 적용이 되지
않는다. 즉 SLAVE level 에서는 MASTER 가 허락 하는 database 중에서 선택을 할 수 있을 뿐이
다. SLAVE 에서 사용할 수 있는 옵션들은

http://www.mysql.com/doc/R/e/Replication_Options.html

를 참고 하도록 한다.

위의 작업을 간단히 설명을 하자면 MASTER 에서는 Replication 을 위한 유저에게 file 에 대해
서는 모든 권한을 준 상태로 추가 했으며, test, test1 database 에 대해서 Replication 을 하
도록 설정을 한 것이다.  SLAVE 에서는 replicate-do-db 가 설정이 되어 있으므로 test1 DB 만
동기화를 하게 설정한 것이다.




MASTER 와 SLAVE 의 설정을 마쳤으면 Replication 기능을 사용하기 전에 두대간의 동기화 작업
을 먼저 해 놓아야 한다. 먼저 동기화 할 database 를 SLAVE 로 옮긴다. (만약 MASTER 에서 아
무것도 없는 상태에서 시작한다면 이 작업은 필요없다. MASTER에서 운영중인 것을 Replication
기능을 이용하여 동기화 하기 위해 필요한 작업이다.)  위에서는 test1 DB 만 동기화를 하도록
설정을 했으니 MASTER 의 test1 DB를 압축해서 SLAVE 로 옮긴다 (mysql 의 경우에는 data file
만 옮겨도 그냥 적용을 할 수 있다.)

master) cd /var/lib/mysql
master) tar cvfpz test1.tgz test1
master) chmod 777 test1.tgz

slave) cd /var/lib/mysql
slave) ncftp -u user master_server
slave) (Afer login) cd /var/lib/mysql
slave) get test1.tgz
slave) delete test1.tgz (ftp 상의 파일을 삭제)
slave) quit (ftp logout)
slave) tar xvfpz test1.tgz
slave) chown -R mysql.mysql test1




여기 까지의 작업이 완료 되었다면 이제 MASTER 와 SLAVE 의 mysql 을 구동하고 다음을 확인한
다. 여기서의 결과값은 3.23.42 를 기준으로 한다. 버젼 마다 결과값이 다른 형태로 나올 수가
있다.


MASTER Server
Hanterm - mysql -e "show process"

 [root@bbuwoo /etc]$ /etc/rc.d/init.d/mysql restart

  Shutting down MySQL:                                       [  OK  ]
  Starting MySQL:                                            [  OK  ]

 [root@bbuwoo /etc]$ mysql -uroot -p -e "show processlist"

  +----+-------+--------+------+-------------+------+
  | Id | User  | Host   | db   | Command     | Time |
  +----+-------+--------+------+-------------+------+
  |  7 | $user | $slave | NULL | Binlog Dump | 2865 |
  +----+-------+--------+------+-------------+------+
  +---------------------------------------------+------+ 
  | State                                       | Info | 
  +---------------------------------------------+------+ 
  | Slave connection: waiting for binlog update | NULL | 
  +---------------------------------------------+------+ 

 [root@bbuwoo /etc]$ mysql -uroot -p -e "show master status"

  +---------------+----------+------------------+------------------+
  | File          | Position | Binlog_do_db     | Binlog_ignore_db |
  +---------------+----------+------------------+------------------+
  | $host-bin.001 | 729      | test,test1       |                  |
  +---------------+----------+------------------+------------------+

 [root@bbuwoo /etc]$

SLAVE Server
Hanterm - mysql -e "show process"

 [root@bbuwoo /etc]$ /etc/rc.d/init.d/mysql restart

  Shutting down MySQL:                                       [  OK  ]
  Starting MySQL:                                            [  OK  ]

 [root@bbuwoo /etc]$ mysql -uroot -p -e "show processlist"

  +----+-------------+------+------+---------+------+-----------------------+------+
  | Id | User        | Host | db   | Command | Time | State                 | Info |
  +----+-------------+------+------+---------+------+-----------------------+------+
  |  1 | system user | none | NULL | Connect | 2847 | Reading master update | NULL |
  +----+-------------+------+------+---------+------+-----------------------+------+

 [root@bbuwoo /etc]$ mysql -uroot -p -e "show slave status"

  +-------------+-------------+-------------+---------------+---------------+-----+
  | Master_Host | Master_User | Master_Port | Connect_retry | Log_File      | Pos |
  +-------------+-------------+-------------+---------------+---------------+-----+
  | $master_ip  | $rejob_user | 3306        | 60            | $host-bin.001 | 729 |
  +-------------+-------------+-------------+---------------+---------------+-----+
  +---------------+-----------------+---------------------+------------+
  | Slave_Running | Replicate_do_db | Replicate_ignore_db | Last_errno |
  +---------------+-----------------+---------------------+------------+
  | Yes           | test            |                     | 0          |
  +---------------+-----------------+---------------------+------------+
  +------------+--------------+
  | Last_error | Skip_counter |
  +------------+--------------+
  |            | 0            |
  +------------+--------------+

 [root@bbuwoo /etc]$

와 같이 나와 있음을 확인하면 된다.




Replication 이 잘 되다가 갑자기 slave 에서 master 가 반영이 되어 있지 않을 경우 slave 의
error log 를 보도록 한다. error log 를 보고 문제점을 fix 한 다음

shell> mysqladmin -uroot -p slave-start

명령을 실행하면 반영되지 않았던 master 의 자료가 하나씩 반영되는 것을 볼 수 있을 것이다.

또 한가지 주의할 점은 replication 을 구현할때 master 에서 

mysql> create database DB명;

명령은 slave 에 반영이 되지를 않는다. 그러므로 slave 의 설정에

replicate-do-db = DB명

을 명확하게 밝혀 놓아야지 에러가 발생하는 것을 막을 수 있다. 그럼 Master 에서 DB 를 추가
할 때는 귀찮더라도 slave 에서 수동으로 create database 를 한 다음 추가된 db 를 my.cnf 에
서 replicate-do-db 를 설정한 다음 slave 를 재시작 하는 것을 권장한다.

database 추가가 반영이 되지 않는 것은 필자가 그 방법을 찾지 못한 것인지 아니면 원래 구현
이 안되어 있는 것인지를 모르겠다. 혹시 아는 사람이 있으면 필자에게 포스팅을 해 주면 감사
하겠다.




  mysql> show processlist;

  +----+-------------+------+------+---------+------+-----------------------+------+
  | Id | User        | Host | db   | Command | Time | State                 | Info |
  +----+-------------+------+------+---------+------+-----------------------+------+
  |  1 | system user | none | NULL | Connect | 2847 | Waiting to reconnect  | NULL |
  |    |             |      |      |         |      | after a failed read   |      |
  +----+-------------+------+------+---------+------+-----------------------+------+
  2 rows in set (0.00 sec)

  mysql> show slave status;
  +-------------+-------------+-------------+---------------+---------------+-----+
  | Master_Host | Master_User | Master_Port | Connect_retry | Log_File      | Pos |
  +-------------+-------------+-------------+---------------+---------------+-----+
  | $master_ip  | $rejob_user | 3306        | 60            | $host-bin.101 | 729 |
  +-------------+-------------+-------------+---------------+---------------+-----+
  +---------------+-----------------+---------------------+------------+
  | Slave_Running | Replicate_do_db | Replicate_ignore_db | Last_errno |
  +---------------+-----------------+---------------------+------------+
  | Yes           | test            |                     | 0          |
  +---------------+-----------------+---------------------+------------+
  +------------+--------------+
  | Last_error | Skip_counter |
  +------------+--------------+
  |            | 0            |
  +------------+--------------+

이 경우를 보도록 하자.  processlist 에서는 읽기 실패후에 재접속을 기다리고 있다고 상황을
출력하고 있고, slave status 에서는 host-bin.101 에서 멈춰있다. 그리고 master 에서는 로그
파일이 host-bin.130 번을 생성하고 있을 경우이다. 즉 로그 101 에서 slave 는 멈춰진 상태이
다. 그리고 slave 의 에러로그 파일에는 다음과 같은 내용이 있다.

020312 17:52:37  Error reading packet from server: Could not open log file
                 (read_errno 0,server_errno=13)
020312 17:53:37  Slave: Failed reading log event, reconnecting to retry, log
                        '$host-bin.101' position 729
020312 17:53:37  Slave: reconnected to master '$rejob_user@$master_ip:3306',
                        replication resumed in log '$host-bin.101' at position 729

이런 경우에는, master 의 바이너리 로그 파일의 소유권을 잘 살펴보기 바란다. 보통 mysql 은
mysql 유저로서 구동을 하는 경우가 많은데 이때 로그파일이 간혹 root 의 권한으로 생성이 되
는 경우가 있다. 이 경우 읽기 권한이 없어 위와 같은 에러가 발생하는 경우가 존재한다.
2007/02/04 15:55 2007/02/04 15:55
Posted by 비온뒤하늘

mysql Replication

2007/02/04 15:44

1.1 Replication 이란?

Replication은 3.23.15부터 지원되기 시작한 기능으로 ‘복제’라는 사전적 의미에 맞게 마스터의 MySQL 서버의 데이터를 여러 대의 슬레이브 MySQL 서버의 데이터와 동기화 시켜주는 기능이다. 주로, MySQL의 데이터를 실시간으로 백업하거나, 데이터 서버의 부하분산을 하고자 할 때 많이 사용된다.

Dual-Master Replication을 구축하기 위해, 먼저 Master-Slave로 구성된 Replication 상태를 만들어야 한다.


1.2 How to Set Up Replication


1.2.1 MASTER 와 SLAVE 설치

MySQL을 master 와 slave 서버에 설치한다. 안정성을 위해 두 서버의 버전을 맞춰주는 것이 좋다. Replication 기능은 3.23.15부터 지원되기 시작하였으나 3.23.32부터 안정화되었다고 알려져 있으므로, 그 이상 혹은 최신 버전의 MySQL 을 설치하길 권장한다.

1.2.2 MASTER 계정생성

slave 서버에서 master 서버에 접속할 수 있도록, master 서버에 계정을 만든다. 사용자를 추가해 주어야 한다는 말이다. 이 계정에 REPLICATION SLAVE 권한을 주어야 한다. replication에만 사용할 계정이라면 추가적인 권한은 주지 않아도 된다. slave 서버에서master 서버에 접속할 계정과 패스워드에 권한을 부여하는 명령은 다음과 같다.
master mysql > GRANT REPLICATION SLAVE ON *.*
            -> TO 'user_name'@'user_host' IDENTIFIED BY 'user_password';

여기서 user_name은 중복되지 않는 이름이면 되며, user_host 는 slave로 만들 서버의 주소 혹은 도메인 네임을 적어준다. 이 주소의 slave 유저만 master 서버로 접속할 수 있다. 4.0.2 이전 버전의 MySQL에서는, REPLICATION SLAVE 권한이 없으므로, 다음과 같이 FILE 권한으로 대신한다.
master mysql > GRANT FILE ON *.*
            -> TO 'user_name'@'user_host' IDENTIFIED BY 'user_password';

1.2.3 MASTER 데이터 SLAVE 에 복사

master 서버의 기본 데이터를 백업 받아, slave 서버의 데이터베이스에 복사한 후, 데이터 디렉토리에서 압축을 푼다.

HOT 백업
master mysql > FLUSH TABLES WITH READ LOCK;
master shell > tar -cvf /tmp/mysql-snapshot.tar .
slave   shell > tar -xvf /tmp/mysql-snapshot.tar
master mysql > UNLOCK TABLES;

mysqldump 이용 백업
master Shell > mysqldump -u root -p ‘password’ -B db_name > dump_file.sql


1.2.4 MASTER 환경설정

Master 와 Slave 의 데이터 베이스 환경을 설정한다. 우선 master 서버를 설정하도록 한다.
master shell> vi /etc/my.cnf

master 서버는 디폴트로 구성이 되어 있을 것이므로, mysqld 섹션에 log-bin이 있는 지 확인한다.
[mysqld]
log-bin
server-id  = 1

1.2.5 SLAVE 환경설정

다음은 slave 서버의 환경설정이다.
slave shell> vi /etc/my.cnf

mysqld 섹션으로 가서 server-id를 master 서버의 server-id와 다르게 설정한다. 본 문서에서는 2로 설정하도록 하겠다. slave 서버를 여러 대로 구축하고자 할 때에 각 slave 서버의 server-id는 각각 달라야 한다는 것에 주의하자. 2^32-1까지 가능하다.
[mysqld]
server-id  = 2
master-host	= xxx.xxx.xxx.xxx(user_host)
master-port	= 3306
master-user	= user_name
master-password	= user_password

master 서버의 데이터를 백업 받았다면, slave 서버를 시작하기 전에 slave 서버의 데이터 디렉토리에 master 서버의 데이터를 복사해 둔다. mysqldump를 사용했다면, 다음으로 가서 먼저, slave 서버를 스타트한다.

1.2.6 SLAVE 서버 스타트

slave 서버를 스타트한다.
slave shell > /etc/init.d/mysqld start

1.2.7 SLAVE 덤프파일 LOAD

mysqldump를 사용해 백업 파일을 만들었다면, slave 서버에 덤프 파일을 로드시킨다.
slave shell > mysql -u root -p < dump_file.sql

1.2.8 MASTER 계정 설정

slave 서버에서 master-host, master-user, master-password 등의 설정을 다음과 같이 바꿀 수도 있다. 물론 /etc/my.cnf에서 설정하지 않았을 경우에도 쓸 수 있다.
slave mysql >  CHANGE MASTER TO 
           ->	MASTER_HOST='master_host_name',
           ->	MASTER_USER='replication_user_name',
           ->	MASTER_PASSWORD='replication_password',
           ->	MASTER_LOG_FILE='recorded_log_file_name',
           ->	MASTER_LOG_POS=recorded_log_position; 

각 옵션의 최대 길이는 다음과 같다.
MASTER_HOST	60
MASTER_USER	16
MASTER_PASSWORD	32
MASTER_LOG_FILE	255

1.2.9 SLAVE 쓰레드 스타트

slave 쓰레드를 스타트한다.
slave mysql > START SLAVE;

1.2.10 SUCCESS CERTIFICATION

mysql/data/slave.err을 확인하여 다음과 같은 메시지가 있으면 성공적으로 설정된 것이다.
Slave I/O thread: connected to master 'user_name@user_host:3306',  replication started in log 'FIRST' at position 4
 

1.3 How to Set Up Dual-Master Replication


우선 이후에서는 지금까지 master 라고 칭했던 서버를 mysql1 서버라고 하고, slave라 칭했던 서버를 mysql2 서버라 하겠다. 듀얼 마스터 리플리케이션을 구축할 두 대의 서버에는 동일 버전의 최신 MySQL이 설치되어 있으며, Master-Slave 리플리케이션이 구축된 상태에 있다고 간주한다.

이미 앞에서 리플리케이션 구축에 대해 자세히 설명하였으므로, 과정에 대해서만 기술하기로 하겠다.

1.3.1 SLAVE STOP

mysql2 서버로 이동한 후, mysql2 서버의 mysql 구동을 멈춘다.
mysql2 shell > /etc/init.d/mysqld stop

1.3.2 SLAVE LOG DELETE

mysql2 서버의 -bin log를 삭제한다.

1.3.3 SLAVE RESTER

mysql2 서버의 mysql을 구동시킨다.
mysql2 shell > /etc/init.d/mysqld start

1.3.4 GRANT REPLICATION SLAVE

d. mysql2 서버에서 GRANT REPLICATION SLAVE명령을 실행한다. Dual-Master란 것이 서로가 서로의 master이자 slave가 되는 것이므로, 이전의 설치에서 slave였던 mysql2가 mysql1 서버의 유저를 slave 유저로 갖게 된다.
mysql2 mysql > GRANT REPLICATION SLAVE ON *.*
            -> TO 'users_name'@'users_host' IDENTIFIED BY 'users_password';

1.3.5 MASTER SETUP

이제 mysql1 서버로 이동하여, 설정을 계속한다. 우선, mysql1 서버의 mysql 구동을 멈춘다.
mysql1 shell > /etc/init.d/mysqld stop

1.3.6 MASTER CONFIGURATION

mysql1 서버의 /etc/my.cnf 파일을 수정한다. mysqld 섹션으로 가서 mysql2 서버를 마스터로 간주하도록 정보를 추가한다.
[mysqld]
server-id  = 1		<= 그대로 두고, 아래 내용을 추가한다.
master-host	= users_host
master-port	= 3306
master-user	= users_name
master-password	= users_password

1.3.7 MASTER START

mysql1 서버의 mysql을 구동시킨다.
mysql1 shell > /etc/init.d/mysqld start

1.3.8 SUCCESS CERTIFICATION

mysql/data/mysql1.err을 확인하여 다음과 같은 메시지가 있으면 성공적으로 설정된 것이다.
Slave I/O thread: connected to master 'ccotti@222.112.137.172:3306',  replication started in log 'FIRST' at position 4

지금까지 별다른 문제없이 설치를 진행하였다면, 각 서버의 mysql 모니터에서 데이터를 입력하고, 두 서버가 서로 연동이 되는 것을 확인할 수 있을 것이다.


1.4 장애복구


위의 설정에서 두 대의 서버 중 한 대가 장애를 일으키는 경우 한 서버를 리부팅한다고 가정할 때, 별도의 설정이 없다면 기존의 MySQL 리플리케이션 구성에서는 두 서버 간의 동기화가 원활히 일어나지 않았다. 그런 경우 다음을 순서대로 진행하며, 장애를 복구할 수 있다. 우선 mysql1 서버를 재시작해야 한다고 가정하자.

1. mysql1의 mysql/data/ 의 mysql1-bin.*를 지운다.

2. mysql1의 mysqld를 시작한다.
mysql1 shell > /etc/init.d/mysqld start

3. mysql2의 mysql 모니터에서 다음 명령어를 실행한다.
mysql2 mysql > slave stop;
mysql2 mysql > slave reset;
mysql2 mysql > slave start;

1.5 참고

● master와 slave 데이터 일치 방법
- master mysql을 정지시키고 대상 파일들을 백업(복사) - master mysql을 구동
-> 이 후 변경사항들이 bin-log에 기록됨
- slave에 백업한 DB 파일들을 복사 후 구동
-> master의 bin-log를 참고하여 데이터 일치됨 ※ 이 때, 복사한 파일의 소유자(mysql인지?) 확인 철저 ※ my.cnf 설정에서 특정 DB를 선택한 경우 master와 slave 모두 동일하게 설정해야 함
(한 쪽은 설정하지 않고 한 쪽은 설정한 경우 오동작)
※ my.cnf 주의사항 : mysql_safe 실행 시 DB_DIR 옵션에 따라 불러오는 위치 달라짐
● slave에서 'LOAD TABLE FROM MASTER' 나 'LOAD DATA FROM MASTER' 명령을
사용하기 위해서는 replication 계정에 다음은 권한 추가 필요
- SUPER, RELOAD, SELECT 권한을 replication 계정에 부여 ● 다음 명령을 통해 mysql의 내부cache를 clear시키고 쓰기 방지 가능
※ mysql 기본 테이블인 MyISAM 테이블을 사용할 경우 - mysql> FLUSH TABLES WITH READ LOCK;
● 쓰기 방지 해제 명령
- mysql> UNLOCK TABLES;
● slave의 mysql을 replication 미적용하고 구동 방법
- /usr/local/bin/mysqld_safe --skip-slave-start ● slave 동작 구동 방법 - mysql> start slave;
※ slave 설정 미인식 등의 문제 발생 시
mysql> change master to 명령을 사용하여 설정
● replication 정상동작 확인

- mysql> show processlist;
또는 mysql> show processlist\G ; 상세한 내용 확인
- mysql> show slave status;
또는 mysql> show slave status\G ; 상세한 내용 확인 또는 mysql> show master status;
- error 로그 확인
2007/02/04 15:44 2007/02/04 15:44
Posted by 비온뒤하늘

BLOG main image
마음을 열고 나의 생각을 넣고 나의 미래를 넣고 나의 하루를 넣는다. by 비온뒤하늘

공지사항

카테고리

전체 (29)
태중 세상 보기 (7)
apple (3)
내가 읽은 책들 (0)
리눅스 (9)
나의성공 (6)
태양광 (2)

최근에 받은 트랙백

태그목록

글 보관함

달력

«   2012/02   »
      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      
Total : 20496
Today : 19 Yesterday : 18