M-HA MySQL 설정

MySQL 은 인기있는 오픈소스 데이터베이스 시스템이다. 언제나 데이터베이스 시스템이라면 항상 따라오는 것이 Master-Slave 리플리케이션 환경이고 거기에 덧붙여 자동 페일오버(Auto FailOver) 를 어떻게 할 것이라는 골머리 앓는 주제가 따라서 나온다.

MySQL 의 경우에 자체 적인 FailOver 솔루션이 있다. Fabric 이 그것인데, 아직은 많이 쓰이지는 않는 모양이다. 대신에 AutoFailOver 를 지원하는 제3의 툴들이 존재하는데 M-HA 가 바로 이러한 솔루션이다.

M-HA 는 일본인이 Perl 을 이용해서 작성한 솔루션이다. github 저장소에 소스코드는 공개되어 있으며 저장소이름은 mha4mysql-manager 이다.

구조

M-HA 는 Manager 와 Node  로 이루어진다. Node 는 MySQL 이 설치된 서버에 모두 설치해줘야 한다. Mater/Slave 구조라면 Node 를 모두 설치해줘야 한다.

Manager 는 이들 Node 를 감시하고 이들 전체를 컨트롤하는 역활을 한다.

M-HA 특징

M-HA 를 AutoFailover 로 사용할만한 이유는 다음과 같다.

  • Short downtime
  • MySQL-Replication consistency
  • Easy Installation
  • No chagne to existing deployments

M-HA  를 고려할때에 중요한 부분이 짧은 다운타임이다.  Master/Slave 구조에서 장애시에  Slave 를 Master 로 빠르게 승격을 시켜주어야 한다. 그래야만 두 서버간에 데이터가 달라지는 데이터 무결성이 깨지지 않게 된다. M-HA 는 비교적 이러한 데이터 무결성을 보장하기 위해서 많은 노력을 기울인 솔루션이라고 보면 된다.

M-HA 구성도

최소한의 환경에서 M-HA 를 구성도는 대략 다음과 같다.

M-HA Architecture
M-HA Architecture

M-HA Node 는  MySQL 이 설치된 서버라면 전부 설치해주어야 한다. M-HA Manager 는 외부서버에 설치해된다.

Node 설치

설치는 M-HA 구글 저장소에 가면 각 배포판별로 바이너리로 배포하고 있어 쉽게 설치가능하다. 여기서는 소스를 가지고 컴파일 설치하도록 하겠다.

git 저장소에 소스를 다운받거나 Clone 해서 가지고 와도 된다.

의존성 패키지를 다음과 같이 설치해준다.

Perl 을 이용해서 소스를 코드를 컴파일 하고 설치해주면 된다.

위와 같은 설치를 Master/Slave 모든 MySQL 서버에 설치해 준다.

그리고 각 서버에 M-HA 가 접속하기 위한 MySQL 계정을 생성해 준다.

MySQL 각 서버에 /var/log/masterha 디렉토리를 만들어 준다.

Manager 설치

한가지 주의해야 할 것은 Manager 를 설치하기 전에 Node 도 같이 설치해줘야 한다는 것이다. Manager 설치도 소스코드를 다운받아 설치한다. 그 전에 다음과 같이 의존성 패키지를 설치해준다.

소스코드를 다운받는다.

컴파일 설치해 준다.

Manager 에 mha.cnf 파일 작성

Manager 의 mha.cnf 파일을 다음과 같이 작성한다.

SSH 접속 설정

M-HA 는 내부적으로 SSH를 이용해서  M-HA Node 의 릴레이 로그들을 전송하도록 한다. 그런데 자동으로 이게 되게 할라면 M-HA Manager 와 Node 들간 모두 SSH 를 무인증으로 접속이 가능해야 한다.

SSH RSA 를 생성하는데, 패스워드를 입력하지 않는다. 그러면 무인증 접속이 가능해진다.

각각에 생성한 키들은 ~/.ssh/authorized_keys  파일에 추가해준다. 중요한 것은 각각 서버들은 서로서로 모두 무인증 SSH 접속이 가능해야 한다는 것이다.

SSH 무인증 테스트를 다음과 같이 할 수 있다.

Replication 체크

다음과 같에 Replication 체크를 해본다.

여기서 버그가 있다. /usr/local/share/perl5/MHA/DBHelper.pm 파일 198 라인에 $host 변수에 문제가 있다.

위와같이 수정한 후에 다시 한번 해보면 오류를 해결할 수 있다.

이러한 문제는 호스트 이름에 ‘[‘, ‘]’ 를 붙임으로 나타는 현상이다. 이러한 문제는 다음의 파일에도 있다.

Manager 실행 시키기.

반드시 위에 버그를 제거한 후에 다음과 같이 실행을 한다.

위와같이 실행을 한 후 로그를 보면 다음과 같이 나와야 정상이다.

내용을 보면 192.168.96.32 서버가 현재 Master 고 30번 서버가 Slave 로 인식하고 있다.

FailOver 테스트.

간단한 FailOver 테스트를 해보자. 시나리오는 간단하다. 현재 Master 서버를 정지 시켜 보는 것이다. 그러면 다음과 같이 Manager 로그가 올라온다.

위와같이 로그가 온다면 FailOver 가 정상적으로 된 것이다. 또, 로그 디렉토리 /var/log/masterha 디렉토리에 mha.failover.complete 파일이 생성되어 있을 것이다. 또한, manager 가 죽어 있다. 그러니까 FailOver 가 발생되면 다음과 같이 실행이 된다.

  1. Slave 를 Master 로 승격시킨다.
  2. Manager 에 지정한 로그 디렉토리에 mha.failover.complete 파일을 생성한다.
  3. Manager 가 죽는다.

FailOver 가 발생할때마다 Manager 는 정해진 동작을 수행하고 자동으로 죽게 된다.

승격된 Master 서버에서는 다음을 체크해봐야 한다.

  1. show slave status 명령을 입력했을때 아무것도 나오지 말아야 한다.
  2. show variables like ‘%read%’ 명령어를 입력했을때에 read_only 값이 OFF 여야 한다.

위 두가지가 정상적으로 나온다면 M-HA 가 정상적으로 동작한 것이다.

pom.xml Plugin execution not covered by lifecycle configuration 오류

앞에서 mave timestamp 의 TimeZone 변경을 위해서 build-helper-maven-plugin 를 사용했는데 Eclipse 에서 다음과 같이 오류가 난다.

build-helper-maven-plugin Eclipse 오류
build-helper-maven-plugin Eclipse 오류

위 오류내용은 다음과 같다.

Plugin execution not covered by lifecycle configuration: org.codehaus.mojo:build-helper-maven-plugin: 1.11:timestamp-property (execution: timestamp-property, phase: validate)

Eclipse 는 오류를 표시했지만 maven 은 정상적으로 동작한다. 이는 Ecliplse 의 m2e 커넥터의 lifecycle mapping 정보를 명확하게 해야하는데 이것이 없어서 오류로 표시하는 것이다. 다음 URL 에 관련 내용이 있다.

내용을 보면 <pluginManagement> 를 이용해서 lifecycle-mapping 을 설정해주어야 한다. 위 내용을 기반으로  build-helper-maven-plugin 의 execution 에 대해서 mapping 을 지정해주면 해결된다.

위와 같이 설정을하면 Eclipse 의 오류가 사라진다.

 

Maven timestamp 에 timezone 변경하기

maven 은 build timestamp 를 변수로 지원한다. 하지만 자세히 보면 이 timestamp 는 UTC timezone 에 맞춰져 있다. maven 에서 timestamp 는 기본적으로 UTC timezone 을 기반으로 한다. 그런데 이것을 다른 timezone 으로 변경할려면 어떻게 해야할까?

build-helper-maven-plugin

maven 에선 많은 plugin 을 지원한다. build-helper-maven-plugin 은 우리가 필요하는 기능인 timestamp 에 timezone 변경을 지원한다. 변경된 timezone 의 시간을 표시할 변수와 timestamp format, timezone 등을 지정하면 여기서 지정한 변수를 사용할 수 있게 된다.

위와같이 current.time 변수에 한국시간의 timezone 으로 지정한 timestamp 값을 할당해주고 maven-war-plugin 에서 warName 태그에서 current.time 변수를 사용해주면 된다.

war 파일이름에 TimeStamp 찍기

Maven 을 이용하면 자동으로 컴파일을 해주고 war 파일로 만들어 준다. 그런데, 이때에 war 파일에 TimeStamp 를 찍을 수 있다. war  파일명이 project.name-timestamp.war 형식으로 파일을 작성하도록 할수 있다. 방법도 대략 두가지 방법이 있다.

maven 자체 기능

maven 3.0 이상이라면 자체 기능을 이용할 수 있다. properties 에 timestamp 와 maven.build.timestamp.format 을 지정하고 build 영역에서 파일명을 지정해주면 된다. 예를들면 다음과 같다.

위와같이 설정하고 maven build 를 하면 다음과 같이 출력되는 것을 볼수가 있다.

maven-war-plugin 으로 war 파일명 지정

이것은 사실 위 방법을 쓴다면 사용할 일이 별로 없다. 하지만 war 파일을 생성할때에 많은 옵션을 주고 싶다면 이 플러그인을 사용하는게 좋다. 이를 사용하면 build 영역에서 finalName 을 지정하지 않고 이 플러그인에서 지정해주면 된다.

결과는 처음과 같다.

책임회피를 위해서 상용소프트웨어를 쓴다

시스템을 다루는 사람으로써 SI를 하면서 느끼점을 적어보고자 한다. 사실 지금도 SI 를 하고 있고 나는 시스템을 설계하는 일을 하고 있다.

처음에 프로젝트를 시작할때에 개발자들 위한 개발환경을 구축해줘야 한다. 여기서 대략적인 운영서버에서 사용할 소프트웨어에 대해서 정하게 된다. 나 같은 경우엔 오픈소스를 주로 다루었고 상용서버는 거의 다루지 않았었다. 그러다보니 상용서버에 대해서 그렇게 안전성이 좋다거나 성능이 좋다고 생각하지 않는 경향이 있다. 오히려 오픈소스들이 상용서버에 비해서 다루기가 더 쉬운 편이다.

각설하고 WAS 서버를 무엇으로 할지에 대해서 대기업PM들과 이야기를 하게되었다. JAVA 프로젝트였기 때문에 WAS 서버를 써야할 상황이였는데, 대기업PM 들이 다짜고짜…

JBOSS EAP 를 쓰기로 했습니다.

그래서 내가 궁금해서 물었다.

JEE 프로그램을 돌릴 건가요?

여기서부터 문제였다. JEE 프로그램 스팩을 몰랐다. 대기업 PM들이…

여기서 진행되는 프로젝트는 스프링 프레임워크(Spring Framework)를 기반으로 하고 있다.  일반적인 애플리케이션을 제작하는 것도 아니고 HTTP 프로토콜을 기반을 서비스를 할 예정이다. 그런데 왠 JBOSS EAP 라는 말인가? 그것도 상용으로다가…

나는 Tomcat 을 주장했다. 그정도 프로젝트면 Tomcat 만으로도 충분하기 때문이다. 고작 Web Container 스펙만 구현하고 앉았는데 무거은 JBOSS 를 그것도 돈주고 사야하는 EAP 를 쓸 이유가 없었다.

그런데 그들이 내게한 말은 충격에 가까웠다.

장애가 발생하면 누가 책임집니까? Tomcat 을 쓰다가 문제가 생기면 누구에게 물어봐요?

JBOSS EAP 를 사용하면 문제가 발생하면 업체에 문의도 할 수 있고 그쪽으로 넘기면 되는 겁니다.

이게 우리나라에서 제일 크다고 하는 대기업에서 하고 있는 프로젝트를 이끈다는 PM이 한 소리다.

이뿐만이 아니다. 요즘 클라우드가 대세이다 보니 많은 시스템 구축을 AWS 를 사용한다. AWS 는 알다시피 단순한 가상서버 뿐만 아니라 Database, 통계등도 제공한다. 그중에 AWS RDS 는 데이터베이스를 제공하는 것으로 가상서버를 없애고 마치 원격 데이터베이스를 이용하도록 되어 있다. OS 는 없고 AWS콘솔에서 RDS 의 파라메터를 수정하고 적용하는 방식이다.

그런데, 때로는 AWS 의  EC2 인스턴스에 데이터베이스를 컴파일 설치해서 운영하는 경우도 가끔 있다. 이번 프로젝트가 바로 그러했다. AWS RDS 를 이용하면 자동장애 복구와 백업등 아주 편리한 기능이 있어서 시스템을 다루는 사람에게는 그야말로 훌륭한 선택지다. 하지만 EC2 를 이용해서 직접 데이터베이스를 구축할 경우에는 시스템 엔지니어나 혹은 DBA가 이 데이터베이스에 대해 직접적인 제어가 가능하고 미세조정도 가능한 장점이 있다.

위와같은 장점들을 놓고 선택을 했다면 좋아겠지만 우리나라에서 제일 크다는 대기업이 선택하는 방법은…

운영을 책임지는 입장에서 EC2 위에서 데이터베이스를 설치하고 운영하다 장애나면 그걸 누가 책임집니까? 책임을 우리보고 지라할거고 또 장애나면 조사도 다해야하고 하는데 그럴바에는 AWS RDS 를 쓰는게 나아요..

RDS 에서 장애나면 AWS 로 넘길수 있기 때문이지요.

대기업에서 승진을 위해서는 내가 책임을 지는 일은 결단코 없어야 한다는 것쯤으로 읽힌다.

처음에 나는 왜 이렇게 오픈소스에 대해서 불신이 많은지, 그 이유가 오픈소스를 사용한 경험이 적기 때문이라고 생각했다. 하지만 그건 아주 순진한 생각이였다.

오픈소스를 사용하고 운영중에 장애 발생하면 그것을 책임을 져야 한다는 것이다. 그런데 상용을 사용하면 적어도 그 책임을 타인에게 돌릴 수 있다는 것이다. 그래서 상용소프트웨어를 사용하는 것이다. 그게 전부다. 전문성이 있다거나 그런게 아니다.

국회의원들을 욕할때가 아니다. 사회를 구성하는 사람들의 사고방식 자체가 ‘책임을 지기 싫다’ 라는 생각밖에 없다. 각자 역활분담을 할때에도 되도록이면 책임을 적게 지는 것을 가지고 가기위해서 로비, 뇌물, 친분등을 모두 동원한다. 사회전체가 이런데 국회의원을 욕할 자격이 있나…

나이를 먹어감에 따라 한가지 분명해지는게 있다. 대한민국 국민들이 단체로 정신병에 걸렸다라는 거…. 책임문제와 더블어서 소시오패스적인 성향을 보이는 인간들이 너무나 많다. 자신이 하는 말에 대해서 절대로 책임을 질려고하지 않으면서 나는 세상을 비판할수 있어도 타인이 나를 비판하면 안된다는 사고방식으로 무장한 정신병자들…

안타까운 일이다. 안타까운 일…..

 

JBOSS EAP 6 Standalone 환경 구성하기

JBOSS EAP 6 설치를 끝내고 나면 Standalone 이나 Domain 모드로 운영하기 위한 환경 구성을 해야 한다. JBOSS EAP 6 Standalone 환경 구성은 설치한 JBOSS 에서 Standalone 디렉토리를 복사해서 구성하게 된다.

JBOSS 를 설치는 JBOSS_HOME 을 설치하는 것이다. 이것 자체로 서버를 운영할수 있지만 이것을 GLOBAL 로 하고 각각의 운영위한 서버는 JBOSS_HOME 에 Standalone, Domain 디렉토리를 복사하고 Localize 해서 만들어진다. 이는 마치 Tomcat 의 Multi Instance 구성하기와 유사하다.

기본환경

먼저 기본적인 환경을 체크하고 넘어가자. 다음과 같다.

  • Linux: CentOS 6, 7
  • JAVA_HOME: /opt/jdk1.8.0_91
  • JBOSS_HOME: /opt/EAP-6.4.0

기본적으로 위와 같은 환경이 기본으로 갖추고 있어야 한다. 이를 기반으로 서비스를 위한 Local 서버를 구성할 수 있게 된다.

Command Line Parameter

JBOSS EAP 6 는 독자적인 서비스 노드를 구성하기위해서 Command Line Parameter 를 제공한다. 이를 이용하면 JBOSS EAP 6 에게 값을 전달할 수 있고 JBOSS EAP 6 행동을 제어할 수 있게 된다. 유용한 Command Line Parameter 는 다음과 같다.

Standalone

속성 이름사용법기본값
java.ext.dirsJDK 확장 디렉토리 경로null
jboss.home.dirJBOSS EAP 6 설치된 ROOT 디렉토리$JBOSS_HOME 환경변수로 standalone.sh 파일에 지정되 있음
jboss.server.base.dir서버 컨텐츠를 위한 기본 디렉토리jboss.home.dir/standalone
jboss.server.config.dir기본 설정 디렉토리jboss.server.base.dir/configuration
jboss.server.data.dirpersistent 데이터 파일 스토리지를 위해 사용되는 디렉토리jboss.server.base.dir/data
jboss.server.log.dirserver.log 파일을 가지는 디렉토리jboss.server.base.dir/log
jboss.server.temp.dir임시파일 스토리지를 위한 디렉토리jboss.server.base.dir/tmp
jboss.server.deploy.dir배포된 컨텐츠를 저장하하는데 사용되는 디렉토리jboss.server.base.dir/deployments

위 파라메터는 standanlone.sh 스크립트를 시작할때에 명령행 인자로 줄수 있다. 다시 바꿔 말하면 쉘 환경변수로 저장해 놓고 사용할 수 있다는 걸 의미한다.

이제 본격적으로 독자적인 서비스 노드를 구성해 보자.

독자적인 서비스 노드 구성

독자적인 서비스 노드를 구성하기 위해서 시스템 계정을 하나 만들고 JBOSS_BASE_DIR 로 쓰일 nodes 디렉토리를 생성한다.

그리고 JBOSS_HOME 디렉토리에 standalone 디렉토리를 /home/jboss/nodes/node1 으로 복사한다.

WAS 서비스를 위해서 JBOSS_HOME 을 이용하는게 아니라 node1 을 이용하게 하는게 목적이다. 모든 서비스는 node1 을 통해서 이루어진다. WAS 의 설정, 컨텐츠 배포, 또 다른 WAS 와 연동등도 모두 node1 을 통해서 이루어지게 된다. 결국에는 JBOSS_HOME 은 일종의 라이브러리와 같은 역활을 담당하게 된다.

그렇다면 node1 을 구동시키기 위한 스크립트가 필요하다. 그리고 이러한 스크립트는 앞에서 설명한 Command Line Parameter 를 이용해서 구동환경을 조성하게 된다.

구동 스크립트

구동스크립트를 만들때에는 다음과 같은 세가지 영역을 포함한다.

  • JBOSS 를 위한 변수
  • JVM  옵션 변수
  • 시작 스크립트

각각의 영역은 파일로 작성되어지고 시작스크립트에서 호출되어서 사용되어지게 될 것이다. 앞으로 작성하게될 파일들의 목록은 다음과 같다.

  • jboss-env.conf
  • jboss-env.sh
  • jboss.properties
  • jvm-env.conf
  • jboss-run.sh
  • jboss-cli.sh

한가지 덧붙이자면, 꼭 이렇게 파일들을 조각낼 필요는 없다. 조각난 파일들로 인해서 오히려 효율이 떨어지고 실수가능성이 높아지는 경우도 많다. 하나의 파일에서 모두 다 처리해도 상관이 없다.

jboss-env.conf

이 파일은 JBOSS EAP 6 를 위한 환경 변수들을 정의한다. 그 내용은 다음과 같다.

이 파일은 시스템 환경변수를 지정하는데 있다. 이러한 시스템 환경변수는 나머지 환경파일이나 실행스크립트에서 활용하게 된다.

내용을 간단하게 보면 JBOSS_HOME 과 JBOSS_NODE_BASE_DIR 를 정의해주고 있다. 그리고 JBOSS EAP 6에서 이용할 각종 포트와 주소들도 함께 정의해주고 있다.

jboss-env.sh

이 파일은 실제 JBOSS EAP 6 에 명령행 파라메터를 작성한다. 내용은 다음과 같다.

jboss-env.conf 파일에서 정의한 환경변수들을 사용하고 있다.

jvm-env.conf

이름에도 알수 있듯이 jvm 설정을 위한 내용을 담고 있다. 내용은 다음과 같다.

JVM 이 사용할 메모리양과 GC 종류를 정의해주고 있다.

jboss-run.sh

이 파일은 독자적인 서비스 노드인 node1 을 시작하고 중지시키기위한 스크립트이다. 위에서 설명한 모든 파일들을 Source 해 사용하고 JBOSS EAP 6 가 제공하는 레드햇 계열의 init 스크립트를 활용한다. JBOSS EAP 6 를 설치를 하고 나면 JBOSS_HOME/bin/init.d 디렉토리에 레드햇 계열 리눅스를 위한 서비스 시작, 중지 스크립트가 있다. jboss-run.sh 는 위에서 기술한 모든 환경변수 세팅 파일들을 읽어서 최종적으로  JBOSS EAP 6 의 init 스크립트를 실행시키게 된다. 내용은 다음과 같다.

맨 마지막이 바로 JBOSS EAP 6 에서 제공하는 init 스크립트를 호출하는 부분이다. $1 인자값은 start, stop 등으로 시작과 중지를 시킬수 있도록 했다.

jboss.properties

이 파일은 key=value 형태로 값을 지정하고 JBOSS EAP 6 실행시 값을 반영할 수 있게 해준다. 이는 명령행 인자 전달과 동일한 효과를 내지만 오로지 JBOS EAP 6 속성만을 지정해야 한다. 명령해 인자 파라메터는 정확하게 JBOSS EAP 6 에 전달하는것이 아니라 JVM 으로 전달해 JBOSS EAP 6 이 그것을 읽는 방식일 취한다.

어쨌든, jboss.properties 의 내용은 다음과 같다.

jboss-cli.sh

JBOSS EAP 6 로 넘어오면서 많은 변화가 있었지만 그중에 하나가 바로 명령행 콘솔에서 JBOSS EAP 6 을 제어할 수 있다는데 있다. 이것은 JBOSS_HOME/bin/jboss-cli.sh 파일을 통해서 실행되는데, 여기서 jboss-cli.sh 파일을 별도로 만드는 이유는 node1 에 맞추기 위해서다. 내용을 보면 이해가 될 것이다.

node1 을 위한 jboss-env.sh 를 소스하고 있다. 이렇게 함으로써 node1 을 위한 환경변수들을 사용해 node1 을 위한 명령행 콘솔로 진입하게 된다.

정리

지금까지 기술한 것을 정리하면 다음과 같다.

  • /opt/EAP-6.4.0/standalone 디렉토리를 /home/jboss/nodes/node1 으로 복사
  • node1 안에 위에서 기술한 파일들을 작성

시작, 중지

이제 모든 파일을 다 만들었다면, node1 서비스를 시작, 중지 시켜보자. 시작과 중지는 다음과 같이 한다. 참고로 이 스크립트의 실행은 반드시 슈퍼유저인 root 로 해야한다.

init 스크립트를 이용하기 때문에 자동으로 백그라운드로 전환되고 화면에는 아무것도 나오지 않는다. 구동시에 화면에 뿌려지는 내용은 로그로 기록된다.

중지는 다음과 같이 한다.

정상적으로 종료 되는 것을 볼 수 있으며 보다 자세한 내용은 로그를 보면 된다.

JBoss EAP 6.4 설치

 JBoss EAP 6.4 설치

JBoss EAP 6.4 설치에 대해 다룬다. JBoss EAP 6.4 설치는 GUI와 Text 기반 설치 두가지를 지원 한다. 여기서는 Linux 터미널에서 Text 기반 설치에 대해서 다룬다.

사전준비

JBoss EAP 6.4 를 설치하기 위해서는 JDK 1.7 이상 필요하다. JDK 1.6도 지원한다고 되어 있지만 현시점(2016. 06) 에서 1.6은 너무나 구형이라 권장하지 않는다.

설치를 위해서는 설치 파일이 필요한데, zip 파일과 installer 파일 형태로 제공된다. zip 파일은 그냥 압축해제하면 되지만 installer 는 인스톨 과정을 거쳐야 한다. 여기서는 installer를 이용한 설치에 대해서만 다룬다.

설치

설치 레이아웃은 다음과 같다.

  • JBOSS_HOME: /opt/EAP-6.4.0
  • JAVA_HOME: /opt/jdk1.8.0_40

JBoss EAP 6.4 의 인스톨 파일은 jboss-eap-6.4.0-installer.jar 이다. Text 기반으로 설치를 위해서는 다음과 같이 명령어를 쳐주면 시작된다.

설치 중간중간에 관리자가 선택해야할 사항들이 존재한다. 설치할 패키지들 목록과 포트 설정, 서버 설정, 로깅 설정등을 보다 디테일하게 할 수도 있다.

삭제

삭제는 설치한 디렉토리를 삭제하면 되지만 uninstaller 를 제공한다. EAP_HOME 디렉토리에 Uninstaller 디렉토리에 보면 uninstaller.jar 파일을 제공한다. 역시 Text 기반 삭제는 다음과 같이 하면 된다.

 

MongoDB 3.x 인증 알고리즘 변경

MongoDB 3.x 부터는 인증 알고리즘이 MONGODB-CR 에서 SCRAM-SHA-1 으로 변경되었다. 그런데 특정 사용자에 대해서 MONGODB-CR 방식을 적용해야할 필요가 생기기도 한다. 그래서 사용자마다 알고리즘을 달리 적용할 수 있을까?

결론부터 말하면 MongoDB 3.x 는 이를 지원하지만 지원하는 것 같지 않은 상태다. 공식적인 지원을 하지만 이를 구현하기 위해서는 서버를 중단해야하고 인증을 해제해야한 다음에 사용자 알고리즘을 고치고 다시 인증을 걸고 서버를 재시작해야 한다.

또, Replica Set 상태에서 Primary 에서 MONGODB-CR 인증을 설정한다고 하더라도 Secondary  에서는 SCRAM-SHA-1 으로 싱크가 된다. 그래서 프로그램상에서 Replica Set 에서 접속할때에 MONGODB-CR 인증방식으로 접속을 시도하면 Primary 에서는 정상으로 접속되나 Secondary 서버에서는 인증이 실패해 접속이 안된다.

이러한 한계에도 불구하고 MongoDB 3.x 인증 알고리즘 변경 은 다음과 같이하면 된다.

서버 셧다운

제일 번저 서버를 셧다운 해야한다. 이유는 인증모드를 해제하기 위해서다. 관리자로 로그인을 한 후에 다음과 같이 서버를 셧다운 한다.

 

무인증 설정

이제 MongoDB 설정 파일에서 인증 부분을 주석처리해 무인증으로 만들고 서버를 시작한다.

이렇게 한 후에 서버를 시작하면 인증없이 모든 것을 할 수 있게 된다.

 

MONGODB-CR 인증 계정 생성

MONGODB-CR  인증을 생성하기 위해서는  MongoDB  자체의 인증 방법을 먼저 변경을 해줘야 한다. 이 변경은 역시 무인증 서버상태에서만 가능하다.

authSchema 버전을 3으로 변경하는데 이게 MONGODB-CR 인증 방법을 말한다. 5번은 SCRAM-SHA-1 이다.

이제 생성하고자하는 계정의 데이터베이스로 가서 계정을 생성한다.

생성된 계정을 확인해보면 다음과 같다.

 

인증방법 복원

MONGODB-CR 을 위한 계정을 생성했다면 SCRAM-SHA-1 로 바꾸고 서버에 인증을 걸어야 한다.

그리고 설정파일에 인증을 걸어준다.

그리고 서버를 재시작해주면 된다.

문제점

문제점은 앞에서 이야기 했듯이 Replica Set 상태에서 Primary 에서 MONGODB-CR 인증으로 계정을 생성했다고 하더라도 Secodary 에서는 SCRAM-SHA-1 으로 싱크가 된다. 그래서 Secondary 서버에 MONGODB-CR로 인증할려면 오류를 낸다.