2012년 12월 10일 월요일

[My Sql] MYsql 리플리케이션(Mysql 동기화)


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




0. 서버 설정


1번서버 - master 서버  : 1차네임서버 : 192.168.1.111
2번서버 - slave 서버     : 2차네임서버 : 192.168.1.222
 
mysql 버전은 모두 mysql 5.X 이다.
두 서버 모두 mysql 데이터는 /free/mysql_data 에 위치해 있다고 가정한다.
 
 
 
1. Master 서버 설정
 
# vi /etc/my.cnf
 
(1) my.cnf 파일에서 #log-bin=mysql-bin 부분의 주석을 반드시 해제해준다
슬레이브 서버에서 저 바이너리 로그를 기준으로 데이터 리플리케이션을 실행 하기 때문에 저 로그파일이 꼭 필요하다!
 
(2) server-id = 1 로 설정한다. 마스터서버와 슬레이브서버의 번호가 서로 다르기만 하면 되기 때문에 원하는 번호를 지정한다.
 
# Replication Master Server (default)
# binary logging is required for replication

log-bin=mysql-bin

# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id       = 1
 
 
(3) slave 서버 에서 접속 할 수 있는 Mysql 계정을 생성해준다
# mysql -u root -p 로 디비 접속
mysql > GRANT REPLICATION SLAVE ON *.*  TO 유저명@접속허용할IP IDENTIFIED BY '패스워드';
 
접속허용할 IP에 특정 IP만을 부여 할 수도 있고 '%' 를 적어주면 모든 외부의 접속을 허용한다는 의미이다.
mysql > use mysql
mysql > select * from user \G;
명령로 설정이 되어 있는지 확인 할 수 있다.
 
아래 셋팅은 실제 마스터 서버인 1차네임서버 서버의 설정 내용이다.
 
접속을 허용한 유저 이름은    : nayana
nayana의 접속을 허용한 IP : 192.168.1.222 (2차 네임서버)
 
슬레이브 서버(192.168.1.222) 에서 nayana 라는 계정의 Replication 접속을 허용한 것을 볼 수 있다.
*************************** 10. row ***************************
                 Host: 192.168.1.222
                 User: nayana
             Password: *7CC252065609E6F96DD42A08D09D6C0DDBFBB0B1
          Select_priv: N
          Insert_priv: N
        Update_priv: N
         Delete_priv: N
         Create_priv: N
            Drop_priv: N
         Reload_priv: N
    Shutdown_priv: N
        Process_priv: N
               File_priv: N
            Grant_priv: N
   References_priv: N
            Index_priv: N
              Alter_priv: N
      Show_db_priv: N
           Super_priv: N
Create_tmp_table_priv: N
  Lock_tables_priv: N
         Execute_priv: N
     Repl_slave_priv: Y      <- 요 부분이 Y로 되어있으면 된다!!
     Repl_client_priv: N
  Create_view_priv: N
    Show_view_priv: N
Create_routine_priv: N
  Alter_routine_priv: N
   Create_user_priv: N
             ssl_type:
           ssl_cipher:
          x509_issuer:
         x509_subject:
        max_questions: 0
          max_updates: 0
      max_connections: 0
 max_user_connections: 0
10 rows in set (0.00 sec)
 
 
(4) mysql을 재시작 하고 마스터 서버의 동작을 확인한다.
"mysql-bin.000022" 라는 바이너리 로그 파일을 생성한 것을 볼 수 있다.
mysql> show master status;

+------------------------+-----------+-------------------+------------------------+
| File                         | Position | Binlog_Do_DB  | Binlog_Ignore_DB  |
+------------------------+-----------+-------------------+------------------------+
| mysql-bin.000022   |     8385 |                         |                               |
+------------------------+-----------+-------------------+------------------------+
1 row in set (0.00 sec)

mysql>
 
 
 
2. Slave 서버 설정
(1) 마스터 서버의 DB를 슬레이브 서버의 DB에 복사한다!(= 최초1회는 직접 복사해서 동기화해준다!)
이유는?
 
mysql 리플리케이션은 rsync와 다르게 동기화로 엮여진 시점부터의 DB변화를 동기화 시킨다.
 
[ 동기화 전 DB 구조]
마스터               슬레이브        
1                        1
2                        2
3
 
########## 동기화 후 마스터 서버에 4 라는 DB를 추가하면? #########
 
[ 동기화 후 DB 구조]
마스터               슬레이브        
1                        1
2                        2
3                        4
4
 
이렇게 4 라는 DB만 추가되고 3이라는 DB는 추가되지 않는다. 애초에 처음부터 DB내용이 달랐기 때문!
rsync 였다면 양쪽에 모두 똑같아 졌을 것이다.
 
 
[ 마스터 서버 ]
# cd /free
# tar zcvf mysql.tar.gz mysql_data
# sz mysql.tar.gz
 
압축한 파일을 다운받아 슬레이브 서버의 /free/mysql_data 디렉토리에 플어준다. 이로서 최초 동기화를 완료했다.
 
(2) /etc/my.cnf 파일을 수정한다!
57 , 62 번 라인은 주석처리해주고 98번 라인부터는 아래와 같이 주석을 풀고 마스터 서버에 접속할 정보를 적는다.
 
       # Replication Master Server (default)
       # binary logging is required for replication
57   # log-bin=mysql-bin

       # required unique id between 1 and 2^32 - 1
       # defaults to 1 if master-host is not set
       # but will not function as a master if omitted
62   # server-id       = 1

98   # but will not function as a slave if omitted
       server-id       = 2
       # The replication master for this slave - required
       master-host     = 192.168.1.111
       # The username the slave will use for authentication when connecting
       # to the master - required
       
master-user     = nayana
       # The password the slave will authenticate with when connecting to
       # the master - required
       master-password = 패스워드      
       # The port the master is listening on.
       # optional - defaults to 3306
       master-port     = 3306
       # binary logging - not required for slaves, but recommended
       
log-bin=mysql-bin
 
 
(3) mysql 을 재시작 한후 mysql에 접속하여 동기화가 되었는지 확인한다.
동기화가 정상적으로 되었다면 아래와 같이 "Waiting for master to send event" 라는 구문이 출력된다!
 
mysql> show slave status;
+----------------------------------+----------------+-------------+-------------+---------------+------------------+---------------------+-------------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
| Slave_IO_State                   | Master_Host    | Master_User | Master_Port | Connect_Retry | Master_Log_File  | Read_Master_Log_Pos | Relay_Log_File          | Relay_Log_Pos | Relay_Master_Log_File | Slave_IO_Running | Slave_SQL_Running | Replicate_Do_DB | Replicate_Ignore_DB | Replicate_Do_Table | Replicate_Ignore_Table | Replicate_Wild_Do_Table | Replicate_Wild_Ignore_Table | Last_Errno | Last_Error | Skip_Counter | Exec_Master_Log_Pos | Relay_Log_Space | Until_Condition | Until_Log_File | Until_Log_Pos | Master_SSL_Allowed | Master_SSL_CA_File | Master_SSL_CA_Path | Master_SSL_Cert | Master_SSL_Cipher | Master_SSL_Key | Seconds_Behind_Master |
+----------------------------------+----------------+-------------+-------------+---------------+------------------+---------------------+-------------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
| Waiting for master to send event | 192.168.1.111 | nayana      |        3306 |            60 | mysql-bin.000022 |                8385 | mysqld-relay-bin.000015 |           235 | mysql-bin.000022      | Yes              | Yes               |                 |                     |                    |                        |                         |                             |          0 |            |            0 |                8385 |             235 | None            |                |             0 | No                 |                    |                    |                 |                   |                |                     0 |
+----------------------------------+----------------+-------------+-------------+---------------+------------------+---------------------+-------------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+
1 row in set (0.00 sec)

mysql>
 
이제 마스터 서버에서 DB를 생성하거나 삭제하면 슬레이브 서버에서도 똑같이 동기화가 될 것이다!! 올레~!

[Linux] Linux Virtual Server(LVS)


Linux Virtual Server(LVS)



ㅇ 제작 리눅스포털(www.superuser.co.kr) 수퍼유저코리아 서버

ㅇ SULINUX 홈페이지 : www.sulinux.net
ㅇ 리눅스포털 홈페이지 www.superuser.co.kr


The Linux Virtual Server is a highly scalable and highly available server built on a cluster of real servers, with the load balancer running on the Linux operating system.
March 31, 2007 SUPERUSER.CO.KR 이창목

1. Linux Virtual Server(LVS)?

리눅스 가상 서버란한대의 서버로 증가하는 인터넷 사용자를 처리하기가 힘들어 지면서 고가용성 서버를 구축하기 위해 리눅스 머신을 로드 발랜스 하도록 해주는 운영시스템이다.
만약 하나의 노드에서 처리량이 너무 많아서 서비스가 불가능할 경우 간단히 하나의 노드를 병렬 구성으로 추가 함으로써 부하분산을 하도록 하는 것을 말한다공개소스로서 이러한 기능을 담당하고 있는 것이다.

2. Linux Virtual Server 스케쥴링

    1)라운드-로빈(round-robin)
    라운드-로빈 방식은 로드밸런서에 들어오는 요청 패킷들을 차례대로 실제 서버에 할당하는 방식이 다이 방식에서 실제 서버의 현재 부하 상황 등은 고려되지 않는다단지 차례대로 할당할 뿐이다하지만이렇게 하더라도 로드밸런싱을 위해 이전에 사용되던 라운드-로빈 DNS 방식에 의해 서버를 할당하는 방식에 비해서는 우수한데, DNS의 경우는 한번 서버가 지정되면 해당 서버에 수많은 요청 패킷이 몰릴 수 있기 때문이다.
    2)가중 라운드-로빈(weighted round-robin)
    가중 라운드-로빈 방식은 기본적으로 라운드-로빈 방식인데각 서버에 서로 다른 가중치를 주어서 할당하는 방식이다이 방식을 사용해야 하는 경우는 실제 서버들이 CPU의 수와 성능메모리 용량 등 서로 다른 성능을 가지고 있어서각 서버를 동등하게 취급할 수 없는 경우이다.
    3)최소 연결(least connection)
    최소 연결 방식은 실제 서버들 중에서 현재 가장 적은 수의 요청을 처리하고 있는 서버를 선택하여 요청 패킷을 할당하는 방식이다이 방식은 실제 서버의 현재 부하 상황을 동적으로 판단하여 요청을 처리하기 때문에앞의 두 방식에 비해서 동적으로 우수한 부하 분산 효과를 얻을 수 있다.
    4)가중 최소 연결(weighted least connection)
    가중 최소 연결 방식은 기본적으로 최소 연결 방식인데가중 라운드-로빈 방식과 마찬가지로 각 서버에 서로 다른 가중치를 주어서 할당하는 방식이다.

3. 시스템 구성 및 ipvsadm 설치

1)Load Balancer Server
운영체제 : SULinux1.5
커널 : kernel-2.6.9-42.0.2.ELsmp
IP : 210.224.223.1
가상IP : 210.224.223.10
2)Real Server1(RS1)
운영체제 : Sulinux1.5
커널 : kernel-2.6.9-12.0.2.ELsmp
IP : 210.224.223.11
IP : 192.168.0.11 [NAT 설정시 부여할 사설 ip]

3)Real Server1(RS2)
운영체제 : CentOS4
커널 : kernel-2.6.9-42.0.2.ELsmp
IP : 210.224.223.12
IP : 192.168.0.12 [NAT 설정시 부여할 사설 ip]

4)Load Balancer Server ipvsadm 설치
Load Balancer Server에서 ipvsadm을 다운로드 후 설치를 한다.
커널 2.4.x 이하 버젼에서는 커널 컴파일 및 hidden 패치를 해야 했으나 커널 2.6.x에서는
Virtual Server 기능들이 기본 포함되어 있으므로 아주 간단하다.
shell>wget http://mirror.centos.org/centos/4/extras/i386/RPMS/ipvsadm-1.24-6.i386.rpm

shell>rpm -ivh ipvsadm-1.24-6.i386.rpm

shell>ipvsadm
IP Virtual Server version 1.2.0 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn

설치가 정상적으로 되었다면 위와같이 나타날 것이다.여기서부터 ipvsadm을 이용하여 아래 방식 으로 설정하여 테스트 해보도록 하겠다.

  • Direct Routing
  • NAT 방식
A.Direct Routing 방식
실제 서버와 부하분산 서버에서 가상 IP 주소를 부여하여 서로 공유한다부하분산 서버에도
마찬가지로 가상 IP 주소를 설정한 인터페이스가 있어야하며 이 인터페이스를 이용요청
패킷을 받아들이고 선택한 서버에 직접 라우팅할 수 있게 된다.
모든 실제 서버는 가상 IP주소로 설정한 non-arp alias 인터페이스가 있거나 가상 IP 주소로
향하는 패킷을 지역 소켓으로 재지향한다그래서 실제 서버 에서 패킷을 지역적으로 처리할
수 있는 구조를 가지게 된다.

Direct Routing 방식의 구조도는 아래와 같다.







A-1.Load Balancer Server 설정법
/etc/sysctl.conf에 net.ipv4.ip_forward = 0 부분을 1로 변경후
shell>sysctl -p
커널파라미터 적용

shell>ifconfig eth0:0 210.224.223.10 up
가상아이피 등록

shell>ipvsadm -A -t 210.224.223.10:80 -s rr
라운드-로빈방식으로 설정

shell>ipvsadm -a -t 210.224.223.10:80 -r 210.224.223.11:80 -g
RS1 서버로 다이렉트 라우팅 설정

shell>ipvsadm -a -t 210.224.223.10:80 -r 210.224.223.12:80 -g
RS2 서버로 다이렉트 라우팅 설정


A-2.Real Server(RS1) 설정법
/etc/sysctl.conf에 net.ipv4.ip_forward = 0 부분을 1로 변경하여야 하며
#for ipvs
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
#end of ipvs
#for ipvs ~ #end of ipvs 부분을 추가한후
shell>sysctl -p
커널파라미터 적용
shell>ifconfig eth0:0 210.224.223.10 up
가상아이피 등록

A-3.Real Server(RS2) 설정법
/etc/sysctl.conf에 net.ipv4.ip_forward = 0 부분을 1로 변경하여야 하며
#for ipvs
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
#end of ipvs
#for ipvs ~ #end of ipvs 부분을 추가한후
shell>sysctl -p
커널파라미터 적용
shell>ifconfig eth0:0 210.224.223.10 up
가상아이피 등록

클라이언트에서 가상아이피 210.224.223.10으로 접속하면 우리는 느끼지 못하지만
rr(라운드-로빈)방식을 이용해서 RV1,RV2 서버에 접속하게 된다.
RV1 서버에 장애가 있다면 RV2 서버로 접속하게 된다.

B.NAT 방식
NAT는 특정한 IP 주소를 한 그룹에서 다른 그룹으로 매핑하는 기능이다.
클라이언트가 가상 아이피로 접근시 사설 아이피로 구성된 부하분산 서버 RS1,RS2로 패킷이 향 하게 된다사설 아이피로 구성된 부하분산 서버는 패킷의 목적지와 포트 번호를 검사한다.
NAT 방식의 구조도는 아래와 같다


B-1.Balancer Server 설정법

네트웍 디바이스 eth0,eth1 정보
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=210.224.223.11
NETMASK=255.255.255.0
GATEWAY=210.223.223.1
DEVICE=eth1
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.0.1
NETMASK=255.255.255.0

/etc/sysctl.conf에 net.ipv4.ip_forward = 0 부분을 1로 변경후
shell>sysctl -p
커널파라미터 적용

shell>ifconfig eth0:0 210.224.223.10 up
가상아이피 등록

shell>ipvsadm -A -t 210.224.223.10:80 -s lc
최소연결 방식으로 설정


shell>ipvsadm -a -t 210.224.223.10:80 -r 192.168.0.11:80 -m
RS1 서버로 NAT 설정

shell>ipvsadm -a -t 210.224.223.10:80 -r 192.168.0.12:80 -m
RS2 서버로 NAT 설정

B-2.Real Server(RS1,RS2) 설정법

RS1
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.0.11
NETMASK=255.255.255.0
GATEWAY=192.168.0.1

RS2
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.0.12
NETMASK=255.255.255.0
GATEWAY=192.168.0.1

클라이언트에서 가상아이피 210.224.223.10으로 접속하면 우리는 느끼지 못하지만
최소연결 방식을 이용해서 RV1,RV2 서버 중에 접속자가 작은 서버로 된다.
RV1 서버에 장애가 있다면 RV2 서버로 접속하게 된다.
NAT 방식의 경우 패킷 Load Balancer Server를 반드시 거쳐가야 하므로 20대 이상 구성해야
할때는 문제가 발생할 수 있는 단점이 있다.
C.IP Tunneling 방식
IP 터널링 (IP encapsulation)은 IP 데이터그램안에 IP 데이터그램을 넣는 기술로서어떤 IP  소를 향하는 데이터그램을 감싸 다른 IP 주소로 재지향할 수 있다. IP encapsulation은 현재 엑 스트라넷모빌-IP, IP-멀티캐스트, tunnled 호스트나 네트웍 등에 일반적으로 사용되고 있다.
IP Tunneling 방식의 구조도는 아래와 같다

C-1.Balancer Server 설정법
/etc/sysctl.conf에 net.ipv4.ip_forward = 0 부분을 1로 변경후
shell>sysctl -p
커널파라미터 적용

shell>ifconfig eth0:0 210.224.223.10 up
가상아이피 등록

shell>ipvsadm -A -t 210.224.223.10:80 -s wlc
가중치 최소연결 방식으로 설정


shell>ipvsadm -a -t 210.224.223.10:80 -r 210.224.223.11:80 -i
RS1 서버로 Tunneling

shell>ipvsadm -a -t 210.224.223.10:80 -r 210.224.223.12:80 -i
RS2 서버로 Tunneling

C-2.Real Server(RS1,RS2) 설정법

RS1
DEVICE=tunl0
ONBOOT=yes
BOOTPROTO=static
IPADDR=210.224.223.10
NETMASK=255.255.255.0

RS2
DEVICE=tunl0
ONBOOT=yes
BOOTPROTO=static
IPADDR=210.224.223.10
NETMASK=255.255.255.0

또는 각 리얼서버에서

RS1
shell>ifconfig tunl0 210.224.223.10 up
가상아이피를 IPIP Tunnel에 등록한다.
RS2
shell>ifconfig tunl0 210.224.223.10 up
가상아이피를 IPIP Tunnel에 등록한다.

클라이언트에서 가상아이피 210.224.223.10으로 접속하면 우리는 느끼지 못하지만
가중치 최소연결 방식을 이용해서 RV1,RV2 서버 중에 접속자가 작은 서버로 된다.
RV1 서버에 장애가 있다면 RV2 서버로 접속하게 된다.

4. 참고 문헌 사이트 정보