MySQL Replication

MASTER CONFIGURATION (127.0.0.1)

my.cnf 파일에 설정을 추가합니다.
[code]# inodb configurations
log-bin                         = mysql-bin
server-id                       = 1
innodb_data_home_dir            = /theeye/db
innodb_data_file_path           = ibdata1:1000M;ibdata2:1000M:autoextend
innodb_buffer_pool_size         = 1G
innodb_additional_mem_pool_size = 40M
innodb_log_file_size            = 250M
innodb_log_buffer_size          = 8M
innodb_flush_log_at_trx_commit  = 0
innodb_lock_wait_timeout        = 5
relay-log                       = /theeye/db/master-relay-bin


# for master
innodb_flush_log_at_trx_commit  = 1
sync_binlog                     = 1
binlog_ignore_db                = mysql
binlog_ignore_db                = test
binlog_do_db                    = theeye[/code]

슬레이브가 리플리케이션을 위해 접근할 계정을 추가합니다. 원격지에서 접근 가능하도록 합니다.
[code]mysql> GRANT REPLICATION SLAVE ON *.* TO replicator@’%’ IDENTIFIED BY ‘password’;[/code]

마스터의 데이터를 백업하기 위해 쓰기를 금지합니다., innodb의 경우 COMMIT까지 방지됩니다.
[code]mysql> FLUSH TABLES WITH READ LOCK;[/code]

현재 쓰고 있는 마스터 log-bin 파일을 확인합니다.
[code]
mysql > SHOW MASTER STATUS;
+—————+———-+————–+——————+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+—————+———-+————–+——————+
| mysql-bin.003 | 73       | theeye       | test,mysql       |
+—————+———-+————–+——————+[/code]

마스터 디비를 백업합니다.
[code]# mysqldump –add-drop-table –routines  –triggers –default-character-set=utf8 –master-data theeye > theeye.sql[/code]

디비 락 걸었던것을 해제 합니다. 실제로는 슬레이브로의 이관작업이 끝날때 합니다.
[code]mysql> UNLOCK TABLES;[/code]

SLAVE CONFIGURATION (127.0.0.2)

my.cnf 파일에 설정을 추가합니다.
[code]# inodb configurations
server-id                       = 2
master-host                     = 127.0.0.1
master-user                     = replicator
master-password                 = ‘password’
master-port                     = 3306
innodb_data_file_path           = ibdata1:1000M;ibdata2:1000M:autoextend
innodb_buffer_pool_size         = 1G
innodb_additional_mem_pool_size = 40M
innodb_log_file_size            = 250M
innodb_log_buffer_size          = 8M
innodb_flush_log_at_trx_commit  = 0
innodb_lock_wait_timeout        = 5
relay-log                       = /theeye/db/slave-relay-bin


# for slave
read-only
master-connect-retry            = 60
replicate-do-db                 = theeye[/code]

마스터에서 백업해온 파일로 복원합니다.
[code]shell> mysql theeye < theeye.sql[/code]

연결할 마스터를 정의합니다. 아까 봐둔 마스터 log-bin파일명을 넣어줍니다.
[code]mysql> slave stop;
mysql> CHANGE MASTER TO MASTER_HOST=’127.0.0.1′, MASTER_USER=’replicator’, MASTER_LOG_FILE=’mysql-bin.003′, MASTER_PASSWORD=’password’;
mysql> slave start;[/code]

Slave_IO_Running, Slave_SQL_Running가 둘다 Yes이고 Read_Master_Log_Pos가 마스터의 변화에 따라 올라간다면 정상적으로 작동중인것입니다.
[code]mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 127.0.0.1
                Master_User: replicator
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000004
        Read_Master_Log_Pos: 2288979
             Relay_Log_File: slave-relay-bin.000002
              Relay_Log_Pos: 1267487
      Relay_Master_Log_File: mysql-bin.000004
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB: theeye
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 0
                 Last_Error:
               Skip_Counter: 0
        Exec_Master_Log_Pos: 2288979
            Relay_Log_Space: 1267487
            Until_Condition: None
             Until_Log_File:
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File:
         Master_SSL_CA_Path:
            Master_SSL_Cert:
          Master_SSL_Cipher:
             Master_SSL_Key:
      Seconds_Behind_Master: 0
1 row in set (0.00 sec)[/code]

기타 슬레이브가 다수가 될 경우에는 위와 같은 방법으로 my.cnf의 server-id값만 다르게 하면 됩니다.
LOAD DATA FROM MASTER등의 명령은 deprecated되었으므로 사용을 자제 합시다.

Spring 2.5 어노테이션 기반 개발을 위한 Blank 프로젝트 생성

스프링 개발을 위한 준비를 해봅시다. 이 자료는 개인적인 학습 용도로 사용하시고, 회사에서의 사용은 회사의 정해진 설정 방법에 따라 사용하시기 바랍니다

사용자 삽입 이미지이클립스를 실행했을때의 모습입니다. 우측과 하단의 메뉴는 자리가 부족하여 일단 숨겨놨습니다.

사용자 삽입 이미지File – New – Project 를 선택합니다. Wizards에 dy까지만 쳐보시면 Dynamic Web Project라고 있습니다.

사용자 삽입 이미지프로젝트를 생성합니다. Project name에 적절한 이름을 정해주고 Target Runtime에는 Apache Tomcat 6를 선택합니다. 없다면 오른쪽의 New를 선택하여 Tomcat을 추가해 줍시다. 이후 Finish를 누릅니다. 세부 설정을 하실려면 Next를 누르시면 됩니다.

사용자 삽입 이미지보시는것과 같이 프로젝트가 생성되었습니다. Dynamic Web Project의 경우 웹 개발을 위한 대부분의 요소가 자동 생성됩니다.

사용자 삽입 이미지프로젝트에 오른쪽 클릭 후 Spring Tools – Add Spring Project Nature를 선택하여 Spring IDE설정을 추가합니다.

WEB-INF 파일 밑에 다음의 디렉토리들을 생성합시다.


  • conf : 스프링의 컨텍스트 설정 파일을 분리하여 모아두기 위한 디렉토리

  • jsp : MVC 프로그래밍에서 중요한 View인 JSP를 모아두기 위한 디렉토리, 다른 View를 사용한다면 다른 이름을 추천

  • log : log4j 설정 파일을 넣어두기 위한 디렉토리

WE-INF/lib 디렉토리에 필요한 라이브러리들을 추가해 봅시다. 지금 적는 모든 파일은 spring-dependencies 패키지에 포함되어있습니다.
[code]antlr-2.7.6.jar
asm-2.2.3.jar
asm-commons-2.2.3.jar
asm-util-2.2.3.jar
aspectjrt.jar
aspectjweaver.jar
cglib-nodep-2.1_3.jar
commons-beanutils.jar
commons-codec.jar
commons-collections.jar
commons-dbcp.jar
commons-digester.jar
commons-discovery.jar
commons-fileupload.jar
commons-httpclient.jar
commons-io.jar
commons-lang.jar
commons-logging.jar
commons-pool.jar
commons-validator.jar
jstl.jar
junit-4.4.jar
log4j-1.2.15.jar
spring.jar
spring-agent.jar
spring-aspects.jar
spring-test.jar
spring-web.jar
spring-webmvc.jar
standard.jar[/code]
더 필요하신것을 추가하시거나 빼셔도 됩니다. 다음으로는 중요한 설정 파일들을 설정해 봅시다.

/WEB-INF/web.xml
[code]<?xml version=”1.0″ encoding=”UTF-8″?>
<web-app xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns=”http://java.sun.com/xml/ns/javaee” xmlns:web=”http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd” xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd” id=”WebApp_ID” version=”2.5″>


 <!–
  GENERAL CONFIGURATIONS
  –>
 <display-name>SpringBlank</display-name>
 
 <!–
  REQUEST CHARSET ENCODING CONFIGURATIONS
  –>
 <filter>
  <filter-name>Request Encoding</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
   <param-name>encoding</param-name>
   <param-value>UTF-8</param-value>
  </init-param>
 </filter>


 <filter-mapping>
  <filter-name>Request Encoding</filter-name>
  <servlet-name>spring</servlet-name>
 </filter-mapping>
 
 <!–
  SPRING FRAMEWORK DISPATCHER SERVLET CONFIGURATIONS
  –>
 <servlet>
  <servlet-name>spring</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>2</load-on-startup>
 </servlet>


 <servlet-mapping>
  <servlet-name>spring</servlet-name>
  <url-pattern>*.do</url-pattern>
 </servlet-mapping>


 <!–
  CONTEXT LOADER CONFIGURATIONS
  –>
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/conf/**-context.xml</param-value>
 </context-param>


 <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>


 <!–
  LOG4J LOGGER CONFIGURATIONS
  –>
 <context-param>
  <param-name>log4jConfigLocation</param-name>
  <param-value>/WEB-INF/log/log4j.properties</param-value>
 </context-param>


 <listener>
  <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
 </listener>
 
</web-app>[/code]

/WEB-INF/spring-servlet.xml
[code]<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=”http://www.springframework.org/schema/beans
 xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance
 xmlns:aop=”http://www.springframework.org/schema/aop
 xmlns:context=”http://www.springframework.org/schema/context
 xmlns:tx=”http://www.springframework.org/schema/tx
 xmlns:util=”http://www.springframework.org/schema/util
 xsi:schemaLocation=”http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
  http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
  http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd“>


 <!–
  ANNOTATION CONTEXT DEFINITION
  –>
 <context:component-scan base-package=”*”/>
 <context:annotation-config/>
 <context:spring-configured/>
 
 <!–
  ASPECT ORIENTED PROGRAMMING(ASPECT-J) DEFINITION
  –>
 <aop:aspectj-autoproxy/>
 
 <!–
  VIEW RESOLVER CONFIGURATIONS
  –>
 <bean id=”viewResolver” class=”org.springframework.web.servlet.view.InternalResourceViewResolver”>
  <property name=”viewClass” value=”org.springframework.web.servlet.view.JstlView”/>
  <property name=”prefix” value=”/WEB-INF/jsp/”/>
  <property name=”suffix” value=”.jsp”/>
 </bean>
 
</beans>[/code]

/WEB-INF/log/log4j.properties
[code]# LOG LEVEL : FATAL > ERROR > WARN > INFO > DEBUG


##################################################################################################
#                                         ROOT LOGGER CONFIGURATION                              #
##################################################################################################
log4j.rootLogger=INFO,ROOT


log4j.appender.ROOT=org.apache.log4j.ConsoleAppender
log4j.appender.ROOT.layout=org.apache.log4j.PatternLayout
log4j.appender.ROOT.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}]\t%p\t[%F.%M():%L]\t%m%n


##################################################################################################
#                                   SPRING FRAMEWORK LOGGER CONFIGURATION                        #
##################################################################################################
log4j.logger.org.springframework=INFO, SPRING
log4j.additivity.org.springframework=false
log4j.appender.SPRING=org.apache.log4j.ConsoleAppender
log4j.appender.SPRING.layout=org.apache.log4j.PatternLayout
log4j.appender.SPRING.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}]\t%p\t[%F.%M():%L]\t%m%n[/code]

이로써 무언가를 개발해보기 위핸 블랭크 프로젝트가 생성되었습니다. 어노테이션 기반의 MVC 프로젝트 및 AOP적용이 가능합니다.