MySQL 8 설치하기

MySQL 8 은 그동안의 버저닝을 버린 최초의 메이저 버전 업데이트라고 할 수 있다. 그만큼 기념할 만큼 큰 변화를 예고했던 버전이며 실제로 많은 변화가 있었다.

MySQL 8 의 설치는 5.7 과 크게 차이가 없다.

컴파일 옵션

컴파일러 옵션중에 스토리지 엔진관련해서 변경사항이 있었다. InnoDB, MyISAM, MERGE, MEMORY, CSV 엔진은 이제 기본이 됐다. 명시적으로 지정할 필요가 없다. 엔진 옵션으로 ARCHIVE, BLACKHOLE, EXAMPLE, FEDERATED 등을 선택할 수 있다.

-DMUTEX_TYPE 옵션으로 InnoDB 에 대한 뮤텍스 타입을 지정하는 건데, 기본값으로 event 다. 이를 위해서 libevent 가 필요하며 이를 지정하기 위해서 -WITH_LIBEVENT 를 해주면 된다.

MySQL 8 에서는 대부분의 라이브러리들이 bundle, system 으로 선택을 할 수있다. 안정성을 위해서 bundle 을 이용하는 걸 권장하는 듯 하지만 system 이나 별도 컴파일 한 라이브러리 사용을 위해서 지정해 줄수도 있다.

좀 더 많은 컴파일 옵션은 “2.9.4 MySQL Source-Configuration Options” 을 참조 하면 된다.

소스를 받아 컴파일할때 주의할 점은 바로 컴파일을 위한 하드디스크 공간이다. 이전 버전 보다 컴파일을 위한 하드디스크 공간을 많이 상용한다.

무려 6.6G 정도의 용량이 사용된다.

설치된 바이너리 용량 대략 1.3G 정도다.

 

설치 후 작업.

설치시에 SYSTEMD 옵션을 주었다면 이제 Systemd 를 사용할 수 있으며 MySQL 8 은 이를 위한 파일을 생성해 준다. 이 파일은 설치디렉토리에 lib/systemd/system 디렉토리에 파일이 존재한다.

심볼릭 링크를 생성해 준다.

 

계정 생성을 해줘야 하는데, 다음과 같이 해주면 된다.

 

필요한 디렉토리 생성해 준다. pid, sock 파일을 위한 run 디렉토리와 logs 디렉토리를 생성해준다. 사실 여기서 logs 디렉토리는 사용되지는 않는다.

 

소유권을 변경해준다. MySQL이 제대로 동작하기 위해서는 설치 디렉토리에 대한 소유권을 제대로 설정해 줘야 한다.

MySQL 라이브러리 시스템 인식.

데이터 디렉토리 초기화.

다음과 같이 데이터 디렉토리를 초기화 해준다.

DBA 직업군의 질이 떨어지고 있다.

내가 이러한 글을 쓰는 건 순전히 내 경험에 바탕을 둔 것이다. 나는 현재 SI 분야에서 프리랜서로 일하고 있다. 나의 임무는 TA이다. 인프라 담당이 주요한 업무이긴 하지만 단순하게 인프라를 담당하는 것을 넘어 설계분야까지가 나의 직업적인 업무의 영역이다.

인프라를 담당해서인지 개발자보다도 DBA와 부딪히는 일이 많았다. 별탈이 없었으면 좋았겠지만 문제가 지금도 지속되는 걸보면 내 개인적인 부분이라고 치부하기에는 뭔가 이상했다.

사람이 한번이나 두번정도는 상대방, 그러니까 나의 경우에는 DBA의 개인적인 일탈쯤으로 여길수도 있다. 하지만 프로젝트를 할때마다 DBA와 문제가 생긴다면 이거는 개인적인 일탈이 아니라 사회적인 제도와 같이 구조적인 문제로 봐야 한다.

제목이 너무 자극적인가? 이 구조적인 문제에 대한 결론이 바로 ‘DBA 직업군의 질이 떨어지고 있다’ 다. 사실이다. 그리고 DBA로서 직업을 가시는 사람들 대부분이라고 하고 싶지는 않다. 하지만 그들의 마인드가 과연 DBA로서의 직업윤리 의식이 있느냐하는 생각마져 드는게 사실이다.

인터넷을 검색하다 보면 DA와 DBA의 역할에 대한 글을 심심치 않게 보게 된다. 그리고 이 둘사이에서도 분쟁이 잦은 것을 볼수 있었다. 예를들어 다음과 같은 것이다.

SQL 튜닝은 누가 해야 하나?

이 질문이 DA, DBA 사이에 논쟁으로만 끝나면 좋은데, 이 결론으로 인해서 TA까지 피곤해지는 수가 있다는게 문제다.

사회생활을 하다보면 종종 듣게되는 소리가 있다.

가만이 있다고 해서 너에게 문제가 없다는 건 아니다. 뭔가 내게 부당한게 발생하지 않도록 끊임없이 주위를 살펴야 한다.

하지만 뒤집어서 생각해봐야 한다. 가만이 있는데, 누군가 자꾸 나를 걸고 넘어진다면  그건 그 사람만의 문제가 아니 구조적인 문제라는 걸 말이다.

DBA는 애시당초 TA 였다. IT가 크게 발달되지 않았던 과거에는 TA가 그야말로 인프라를 모두 관리했다. OS 부터해서 Web 서버, WAS 서버, Database 서버까지… 초창기 IT에서는 그져 개발자와 인프라만 구분이 되어 있었을 뿐이다.

하지만 IT산업이 크게 발전하면서 TA 라는 직업군에도 분화가 발생하게 된다. 특히나 Database 의 경우에는 그 중요성으로 인해서 분리 작업이 먼저 이루어진다. 예를들어, Web이나 WAS 는 최악의 상황이라고 하더라도 문제될거는 없다. 하지만 Database 의 경우 최악의 상황일 경우, 데이터가 삭제 된다거나 시스템 저장장치가 고장이 난다거나, 할 경우에는 사업을 접어야 한다.

또, 데이터를 다루는 분야이다보니까 개인정보와 같은 법적인 문제도 생겨났다. 아무나 시스템을 만지게 되면 그만큼 개인정보 보호가 되질 않는다.

그래서 Database 를 전담으로 할 엔지니어가 필요해졌고 TA에 분리해 DBA 가 생겨난다. 결국 DBA도 TA다.

Database 를 잘 운영하기 위한 지식은 아주 방대하다. 아무리 좋은 하드웨어를 가지고 있다고 하더라도 이 시스템을 어떻게 구성하느냐에 따라서 성능을 천차만별이다. 과거도 그렇고 현재도 그렇듯이 전체 애플리케이션의 병목구간을 체크해보면 Database 이 대부분이다.

성능.. 아주 중요한 지표다. TA의 경우에도 시스템을 설계할때에 성능부분을 고려한다. IT라는 것이 적은비용으로 많은 일을 처리하도록 하는게 목표이기 때문에 DBA도 마찬가지다. 문제는 이러한 성능을 보장하기 위한 노력에 어떤것들이 필요할까?

시스템 설계는 어려운 분야다. 뭐든 설계치고 쉬운게 있겠냐만은 시스템을 대상으로 할때에 어떤 것이 과연 좋은 설계인지에 대한 지표가 있을까? 이것도 사람마다, 그리고 어떤 시스템이냐에 따라서 다르다고 하는 원론적인 답변이 대부분일거다. 하지만 나의 오랜경험상.. 그리고 TA로서 일을 해온 경험을 비춰보면 다음과 같다고 할 수 있다.

유연하면서도 성능을 보장할 수 있는 설계

성능을 보장하기 위한 설계로 무엇이 필요할까? 이러한 고민을 끊임없이 하는 사람이 진정으로 IT를 하는 사람이다. 성능을 보장하기 위해서 라는 명제는 개발자, 엔지니어 모두에게 해당되는 명제다.

DBA의 질이 떨어진다고 진단하는 기준이기도 하다. 혹자는 ‘성능보장’ 이 기타 다른 것과 맞지 않는다고 할지도 모른다. 하지만 일을 해보면 알겠지만 한두가지만 가지고는 되질 않는다.

DBA에게 성능을 보장하기 위해서는 어떠한 것들을 알아야 하나?

  1. OS(Storage 포함)
  2. Database System
  3. SQL

하지만 내가 경험한 그리고 수많은 사람들과 이야기한 결과 DBA들은 3번만 하려고 한다. 이렇게 말하면 ‘적어도 2번은 해야지’ 할지도 모른다. 하지만 그것마져도 안할려고 하는 추세에 있다. 왜냐하면 Cloud 시스템이 나왔다는 이유로 2번을 제대로 하려하지 않는다.

성능보장을 위해서는 ‘융합적 사고체계’가 필요하다. 그래서 앞에서 1,2,3 세가지를 필수로 뽑은 것이다. TA의 경우에는 다음과 같다.

  1. OS
  2. WAS, WEB 서버
  3. Cloud Platform
  4. Java programming (한국의 SI 는 대부분 Java다)

예를들어 DBA 가 Database 시스템을 새로이 구축한다고 해보자. 이럴경우에 현장에서 어떤 일이 벌어지는가?

대부분 DBA는 TA 들에게 ‘업무협조’를 요청한다. 자신들은 OS를 전문으로 한 사람들이 아니니 TA에게 업무협조를 하는 것이다.

그리곤, Database 시스템을 설치할때즘 되면 자신들을 도와달라고 한다. OS 명령어에 익숙치않아서 설치할때만 도와달라는 거다. 하지만 도와줄게 있나… 이렇게 되면 DBA는 어디론가 전화를 건다. Database 시스템을 관리해주는 업체에 설치를 의뢰하는 것이다.

Database 설치가 어찌 잘되었다 하면 그때부터 이것저것 일을 하기 시작하는데, 과연 이 사람이 Database 성능을 보장할 수 있는 일을 한 것인가?

외부 업체에 Database 설치를 의뢰할 수는 있다. 하지만 그 의뢰할때에 요구사항들을 세밀히 작성해 건네주는 것을 단 한번도 본적이 없다. Disk I/O 는 어느정도이다, Memory 는 어느정도가 적당하다, Storage 크기는 어느정도 필요하고, 설치 Directory 구조는 이러했으면 좋겠다.. 하는 요구사항들이 너무나 많지만 절대로 그들은 그러한 요구사항을 요청하지 않는다.

대부분이 다 이러했다. 나 같은 경우에는 Database 설치조차도 TA가 해야했다. TA 의 경우에 Database 설치할 줄 모른다고, 설사 안다고 해서 TA 경력에 아무런 도움이 안된다. DBA라는 전문적인 직업을 가진 사람들이 존재하는데 TA가 그러한 경력을 가지고 있어봤자다.

하지만 DBA는 SQL 만 작성하는게 아주 중요한 일이고 그게 전부인냥 했다. SQL 작성이 중요하지 않다는게 아니다. 하지만 Database 시스템을 알려고도 하지 않았다. 어짜피 SQL 을 실행할때에 Index 를 잘 타는지 Join이 잘되고 있는지 정도만 따지면 되었지 Database 시스템이 그러한 SQL 문을 어떻게 처리하는지에는 아무런 관심이 없었다.

대표적인것이 Oracle 을 다뤘던 사람이 MySQL 을 다룰때다. Oracle 을 다뤘다고 해서 자존심을 치켜 세우지만 MySQL 을 다루라고 하면 그런 중소형 DB를 왜 만져야하는지 불만부터 나타낸다. 더 중요한 것은 MySQL 시스템에 대해서 절대로 공부를 하지 않는다. Oracle 을 다룰때부터가 외부 인력들에게 시스템 관리를 위임해온터라 MySQL 시스템에 문제가 발생하면 TA를 찾는다.

Oracle이던 MySQL 이든 OS 설치에서부터 튜닝이 필요하다. Kernel 파라메터 수정은 기본이고 Disk Raid 를 무엇으로 할건지, 백업과 복원을 고려한 디렉토리 구성등등이 전부 설치단계에서 결정된다.

그리고 운영을하게될 경우에는 Database 버전에 맞는 SQL을 작성해야 한다. MySQL 이나 Oracle 이나 독자적인 기능과 함수들을 제공한다. 거기다 Index 를 어떻게 구성하고 어떻게 동작하는지에 대해 모두 다르다.

하지만 대부분의 DBA 들은 시스템을 다뤄본 경험이 없다. 특히나 설치를 해본 사람을 찾기도 힘들지경이다. 최근에 Cloud 가 활성화되면서 OS가 필요없어지는 시대다. 그러다보니 SQL 만 작성할려고 든다.

SQL 를 작성하면 뭐하나… 그게 시스템에서 제대로 동작하는지 모르는데… 아아.. 결과물을 잘 뽑아내면 그게 잘 동작하는거다? 이런 DBA들이 넘쳐난다. MySQL 을 다루면서 InnoDB 에 대한 특징이 뭔지도 모르는 사람들이 SQL문을 작성하고 앉았고… MySQL 버전 패치작업을 TA와 공동으로 추진한다. 왜 TA를 걸고 넘어지나?

DBA도 TA다. Database 를 다룰려면 당연히 시스템을 알아야 한다. 단순하게 Database System 이라고 하면 Oracle, MySQL만을 지칭하는게 아니라 그것을 운영하기 위한 제반사항 전체를 말한다. 하지만 심지여 Oracle, MySQL 과 같은 Database 자체조차도 안 다루려고 한다.

구조적인 문제가 있다고 했다. 이러한 현상이 개개인의 생각만으로 끝나면 문제가 안될거지만 DBA들도 인간이다. 모든 인간은 이기심, 물욕이 있다. 될수 있으면 일을 적게하면서도 월급 받기를 원한다. 많은 일을 하게되면 여러사람과 또 인간관계도 형성해야하고 관리를 해줘야한다.

현재 DBA 라는 직업의 영역이 좁아지고 있다. 이것은 DBA들에게는 더 없이 좋은 일이다. 최근에 Database 설치조차 이제는 DBA가 할일 아니라고 말한다. 문제는 그러한 주장이 현장에서 그대로 반영이 되고 있다는 거다.

SQL을 잘 작성해서 원하는 결과를 뽑아주면 그만인 직업이 DBA 인 것으로 구조가 바뀌고 있다.

Docker 실행하기

Docker 를 설치하고 나면 이제 실행을 해야 한다. 우선, 원래 실행 방법은 다음과 같은 순서를 따른다.

  1. Docker 이미지 다운로드
  2. 다운로드 된 Docker 이미지를 가지고 Container 생성
  3. Container 실행

Docker 이미지 다운로드는 pull 명령어를 이용하면 된다.

Docker ps -a

Docker 에서 실행중이거나 중지된 Container 의 목록을 보여 준다.

Docker create -t -i imageId /bin/bash [ –name naming ]

Docker Container 를 생성한다. -t 는 tty 를 할당하고 하게 -i 는 Interactive 를 말한다.  보통 -t, -i 옵션을 붙여서 -it 로 붙여서 쓴다. -i 옵션으로 인해서 STDIN 을 받을 수 있는데 이는 /bin/bash 를 통해서 받도록 한다.

Docker 를 생성하면 Container 는 Stopped 된 상태가 된다.

Docker start containerId

정지한 Container 를 start 한다.

Docker start containerId

실행중인 Container 를 stop 한다.

Docker attach containerId

현재 사용하고 있는 Terminal 에 STDIN, STDOUT, STDERROR 를 실행중인 Container 에 붙인다.

앞에서 생성한 Container 에 붙었다. 여기서 다음과 같이 한가지 재미있는 사실을 발견하게 된다.

Container 내에서 top 을 실행해 보면 bash 와 top 두개만 보인다. 원래 리눅스 머신이라면 커널 프로세스들이 모두 보여야 하지만 Container 는 그렇게 실행이 안된다는 사실을 보여준다.

정확하게 Container 가 어떻게 동작하는지를 보여준다.

Container 는 프로세스 격리 모두라는 사실을 보여주는 것이다. bash 를 기반으로 리눅스를 실행하고 Container 안에서 리눅스에서 실행된 명령어만 프로세스로 보인다.

exit 를 하면 Container 에서의 bash 가 종료 된다. 이렇게되면 Container 내에 프로세스가 동작하는게 하나도 없게되서 결국 Container 는 정지가 된다.

Dettach는 없다. 대신에 daemon mode 로 실행을 시켜주거나 잠시 Interactive 모드로 전환할 수는 있다. attach 된 상태에서 Ctrl + P + Q 를 하면 컨테이너를 빠져나오게 된다.

docker run [Options] imageId [Command]

Container 에 명령어를 실행하도록 한다. 만일 Image 가 없다면 Pull 하고 Container 를 Create 하고 Start 한 후에 명령어를 실행해 준다.

그래서 OS 같은 것을 실행하고 싶다면 다음과 같이 많이 사용한다.

 

서비스로 실행 시키기

서비스만 올릴 수 있다. 프로세스 격리모드로 동작하는 docker 에서는 OS를 구동할 필요가 없다. 그냥 서비스만 올릴 수 있다. Apache Httpd, Nginx, Redis, MySQL 등과 같이 외부와 통신을 하는 서비스들만 올리는게 가능하다.

서비스만 올리기에서 핵심은 외부와의 통신을 위한 방법을 제시해야 한다는 것이다. Redis 를 예를들어 보자.

위와같이 Redis 가 구동 되었다.

핵심이 두가지다. 서비스로 실행 시킬시에는 Bash 와같은 Interactive 를 할 수 없다. 따라서 Daemon 모드로 실해하기 위해서 -d 옵션을 준다. -p 로 포트 매핑을 해준다.

포트 매핑은 Docker Container 에서의 포트와 외부 노출되는 포트를 매핑해 주는 것으로 이는 브릿지 네트워크 모드를 이용할때 사용한다.

따라서 외부에서 접속을 하기위해서는 1234 포트를 이용해야 한다.

문제는 이러한 방법으로는 Redis 서비스를 설정할 수 없다. 각종 서비스를 운영할때에 그 서비스에서 사용가능한 옵션들을 설정할 수 있는 위 방법으로는 이게 불가능하다. 위 방법을 이용할 경우에는 기본 설정 값이 적용된다.

또, Redis 의 경우 데이터 저장소도 별도로 지정할 수가 없다. 그냥 모든게 기본 값이다.  Daemon 모드로 동작중이기 때문에 Container 를 중지하면 모든 데이터가 사라진다.

MySQL 올리기

MySQL 은 실행시에 Bash 쉘 환경변수를 인지해 값을 지정할 수 있다.

현시점에서 MySQL  의 최신버전은 5.7 이다. MySQL 5.7 은 처음 설치할때에 root 를 위한 임시패스워드를 생성하는데, Docker MySQL 을 생성할경우에 root 를 위한 임시패스워드를 생성하지 않도록 해야 한다.

MySQL 이 초기화가 어떻게 이루어졌는지를 보고 싶다면 docker logs containerId 를 해보면 된다.

 

참고: 초보를 위한 도커 안내서

Docker Hub

Docker Hub

Docker 는 컨테이너기반 애플리케이션 격리모드로 동작하도록 해준다. 기존의 Hypervisor 를 사용하는 가상화가 아닌 Docker Engine 이 각 애플리케이션을 격리해준다. 애플리케이션이라는 말은 운영체제를 포함한다.

이 컨테이너에서 운영할 각종 애플리케이션들이 있어야 하는데, 이런 것을 개개인이 만들어서 사용해야한다면 비용이 많이 들것이다. 예를들어 Ubuntu 16.04 를 Docker 에서 동작하기 위해서 Docker 컨테이너 환경에서 설치부터 해야한다면 가상화 시스템과 다를바가 없을 것이다.

그래서 많은 사람들이 사용할 애플리케이션을 미리 이미지로 구워서 필요한 애플리케이션이미지를 다운받아 각종 설정들과 함께 실행만 시키면 될 것이다. 이는 마치 리눅스 시스템에서 각종 애플리케이션을 컴파일 설치해야하는 대신에 미리 컴파일된 패키지를 이용하면 편리하다.

미리 컴파일된 패키지와 같은 것이 Docker Image 다. 미리 Docker 컨테이너 환경에서 동작할 수 있도록 미리 설치, 설정되어진 각종 애플리케이션을 말한다.

운영체제에서 미리 컴파일된 패키지를 제공하기 위해서 Redhat 에서는 Yum, Debian 에서는 apt 라는 공용 저장소를 제공한다. 내가 필요로하는 애플리케이션을 설치하고 싶다면  소스코드를 다운받아서 컴파일 설치할 필요없이 공용 저장소에 미리 컴파일된 패키지를 다운받아 설치만 하면 되는 것이다.

Docker Hub가 바로 위와 같다. Doker Hub 를 풀어서 말한다면 Docker Image 저장소쯤 될것이다. 필요로하는 애플리케이션들이 Docker Hub 에서  Image 를 다운받아서 구동만 해주면 바로 사용할 수 있게되는 것이다.

Docker Hub
Docker Hub

Docker Registry 라고 있는데, Docker 내부 컴포넌트중에 하나 인데 Docker Hub 에서 다운받아 가지고 있는 저장소라고 보면된다. 저장소이다보니까 공개된 Docker Hub 대신에 Private Hub 를 구축할때에 Docker Registry 를 사용기도 한다.

말을 잘해야 한다

여기서 컨테이너에서 동작하는 Image 라는 말은 잘못된 말이다. 거꾸로다. Image 를 가지고 컨테이너를 생성한다고 해야 맞는 말이다. 컨테이너는 가상환경이 아니다. 소프트웨어 격리 공간인데, 이 공간은 소프트웨어가 있어야만 가능하다. 따라서 Image 를 가지고 컨테이너를 생성한다고 해야 맞다.

docker search 이미지

이미지를 찾고 싶을때 사용한다. mariadb 로 검색을 하면 여러개가 나오는데 공식적으로 배포하는 이미지 말고는 전부다 커스텀 이미지라고 보면 된다.

docker pull 이미지:태그

이 명령어는 Docker Hub 에서 이미지를 다운받을 때 사용한다. 이미지를 Docker 서버에 다운로드 한다. 그런데, 이미지라도 버전이 있을 수 있다. 예를들어 mariadb 의 경우에도 다양한 버전이 존재한다. 이때 태그에 가능한 버전을 기입하면 그 버전을 다운받게 된다. 항상 최신의 버전을 다운받고 싶다면 latest 로 해주면 된다.

보통 태그는 그 소프트웨어의 버전인 경우가 많다.

doker images

Docker 서버에 다운받은 Image 리스트를 보여준다.

docker rmi 이미지ID

다운받은 Image 를 삭제한다. 인자로 이미지ID를 줘야 하는데, docker images 로 확인 가능하다.

 

MySQL 5.7 소스 설치

이 문서는 MySQL 5.7 소스 설치 문서 입니다.

Boost 라이브러리

MySQL 5.7 로 넘어오면서 GIS관련해 기능과 InnoDB Engine 에서 R-tree indexes 가 포함되었다. geometry compute 위한 많은 native code 들로 작성이 되었는데 이를 위해서 Boost.Geometry 를 이용했다. 따라서 소스 설치시에 이 라이브러리를 필요로한다.

Boost 라이브러리를 컴파일 단계에서 다음의 옵션으로 알려줄 수 있다.

-DWITH_BOOST: Cmake 컴파일러에게 Boost 지점를 알려준다. Boost 지점은 다음의 셋중에 하나여야 한다.

  • tarball/zip 파일
  • tarball/zip 파일을 포함하는 디렉토리
  • tarball/zip 파일을 압축해제한 디렉토리

-DDOWNLOAD_BOOST: boolean 값으로 Boost tarball/zip 파일을 자동으로 다운로드 받게 할지 말지를 결정한다.

두 옵션을 조합해서 사용하기도 한다. 우선순위는 DWITH_BOOST 이며 여기서 찾지 못할 경우에 DDOWNLOAD_BOOST 를 체크해 다운로드를 할지 말지를 결정한다.

하지만 최근의 MySQL 5.7 소스에는 boost 를 포함해서 배포한다. 따라서 DWITH_BOOST 옵션을 사용해서 포함된 boost 디렉토리를 지정해주면 된다.

준비

CentOS 가 최소설치되었다고 가정하고 시작했기 때문에 컴파일 환경을 구축해줘야 한다.

Ubuntu

Download and Unpack

Configure and Compile

cmake 를 사용하기 때문에 일반적인 configure 와는 다르다. cmake 대로 옵션을 제공한다. 다음과 같다. 보시면 무엇을 의미하는지 알수 있을 것이다.

  1. -CMAKE_INSTALL_PREFIX:PATH=/opt/mysql5.7.21
  2. DWITH_engine_STORAGE_ENGINE nor -WITHOUT_engine_STORAGE_ENGINE 사용하고자 하는 스토리지 엔진을 지정하는 옵션입니다. engine 에는 모두 대문자로 쓰며, MySQL에서 지원하는 엔진들을 적어주면 됩니다.  ex) -WITH_INNOBASE_STORAGE_ENGINE:BOOL=ON -WITHOUT_PARTITION_STORAGE_ENGINE:BOOL=ON
  3. -ENABLED_LOCAL_INFILE:BOOL=boolean SQL파일을 로드하게 해주는 기능을 켭니다.  -ENABLED_LOCAL_INFILE:BOOL=ON
  4. -WITH_EXTRA_CHARSETS:STRING=all 추가로 지원할 언어를 지정합니다. 기본값은 all 입니다. -WITH_EXTRA_CHARSETS:STRING=all
  5. -WITH_SSL:STRING=(no, yes, bundled, system) SSL 지원여부 입니다. system으로 할경우에 시스템에 설치된 SSL library를 이용하게 됩니다. SSL 관련 library가 설치되어 있어야 겠죠. -WITH_SSL:STRING=system
  6. -WITH_ZLIB:STRING=(bundled, system) system으로 할 경우에 시스템에 설치된 Library를 이용합니다. -WITH_ZLIB:STRING=system
  7. -WITH_READLINE:BOOL=boolean readline 지원여부입니다. -WITH_READLINE:BOOL=ON

이러한 옵션들은 다음과 같이 확인이 가능하다.

이제 필요한 옵션들을 다음과 같이 해준다. 그리고 컴파일하고 설치해준다.

설치후 작업

설치가 끝난 후에는 수동으로 옮겨주어야할 파일들이 존재 한다. 그래서 설치 후 작업을 다음과 같이 진행 하면 된다.

계정을 추가

심볼릭 링크를 다음과 같이 생성해 줍니다.

디렉토리 설정과 관련된 my.cnf 내용은 다음과 같다.

다음과 같이 필요한 디렉토리를 생성하고 소유권을 바꿔 준다.

MySQL 라이브러리 시스템 인식.

시스템 데이터베이스 생성.

정상적으로 끝났다면, /opt/dbstorage/mysql/logs/mysqld_error.log 파일에 임시 루트 패스워드가 기록된다. 이를 참조해서 초기 접속시에 활용해야 한다.

Systemd 스크립트 등록

Systemd 를 사용하기 위해서는 컴파일 옵션을 -DWITH_SYSTEMD=1 를 반드시 해줘야 한다. 그리고 다음과 같이 mysqld.service 파일을 작성한다.

이것을 /usr/lib/systemd/system/mysqld.service 로 저장하고 systemd 에 등록해주고 시작해 준다.

이렇게하고 제대로 구동되었는지를 살펴보면 된다.

패스워드 초기화.

MySQL 5.7 은 설치할때에 root 에 대한 임시패스워드를 발급한다. 하지만 이것은 오직 root 접속을 위한 것으로 임시패스워드 대신 다른 패스워드로 변경하기 전에는 다음과 같이 명령어가 듣질 않는다.

다음과 같이 패스워드를 변경해 준다.

 

Bash 파일 존재 유무 체크하기

Bash 쉘 스크립트를 작성할때 자주 사용하는 로직인 바로 파일 존재 유무를 체크하는 것이다. 파일 하나만 체크할 수도 있고 여러파일을 체크할 수도 있다. 여러 파일을 체크할때는 다음과 같이 할 것이다.

이것을 Bash 쉘 스크립트에서는 어떻게 리턴을 받아야 하나하는 고민이 생긴다. 가장 쉬운 방법은 stdout, stderror 를 체크하는 방법이다.

Bash 에서 이를 exit code 라고 하고 $? 에 세팅이되어 다음과 같은 로직이 가능해진다.

명령어가 성공(stdout)하면 $?에 0, stderr 면 1 이다. 위를 실행하면 다음과 같다.

위 방법외에도 한줄로 다음과 같이 할 수도 있다.

AND 와 OR 연산자를 이용해서 메시지를 출력하도록 한다.

하지만 위 방법도 오류 메시지, 혹은 결과가 출력이 되는데 이를 방지하고 결과만 받고 싶다면 다음과 같이 할 수 있다.

이렇게 하면 결과 출력 없이 yes, no 만 출력이 된다.

출처: How to check if a file exists in a shell script

salt-ssh 패스워드 입력으로 동작하게 하기

salt-ssh 는 Client 와 통신 및 명령어를 전달하기 위해서 SSH를 이용하는데, 매번 패스워드를 입력하기 보다는 RSA 인증키를 교환함으로써 무인증 로그인을 가능하게 한다. 하지만 가끔은 보안문제로 인해서 무인증 RSA 인증을 사용하지 못하는 상황이 있을 수도 있다. 그래서 매번 실행할때마다 패스워드를 입력하도록 할 수 있다.

먼저 Client 에 관한 리스트는 roster 파일에 기술한다. salt-ssh 는 이 파일에 있는 목록으로 Client 를 호출하고 등록한다. 기본 roster 파일은 Salt root 디렉토리에서 etc/salt/roster 파일이다.

roster 파일의 예제는 위와 같다. 하지만 password 필드도 보안문제로 적어서는 안된다고 할 경우에 salt-ssh 를 사용할때에 패스워드를 입력하다록 하면되는데 다음과 같다.

etc/salt/roster 파일에 등록된 호스트와 계정에 대한 패스워드를 요구한다. 만일, 기본 roster 가 아닌 다른 계정정보를 가지는 roster 파일을 사용할 수도 있다.

 

MariaDB 10.2.13 소스 설치

MariadbMariaDB 는 MySQL 의 오픈소스 버전 입니다. MySQL 를 최초로 개발한 사람이 점점 폐쇄성이 짙어가는 MySQL 을 대체하기 위해 MySQL 을 복제하고 기능을 개선한 MySQL 의 또 다른 버전 입니다.

현재 MariaDB 는 10.2.13 버전 입니다. MariaDB 10 소스 설치를 해보겠습니다. 설치 환경은 다음과 같습니다.

  • CentOS 7
  • 64bit

준비

다음의 패키지가 설치되어 있어야 합니다.

 

다운로드 및 unpack

 

Configure and make and install

MariaDB 는 cmake 를 이용하기 때문에 일반 Configure 와는 다르게 이것을 이용 합니다.

 

설치후 작업

설치가 끝난 후에는 수동으로 옮겨주어야할 파일들이 존재 합니다. 그래서 설치 후 작업을 다음과 같이 진행 합니다.

계정을 추가 합니다.

디렉토리 설정과 관련된 my.cnf 내용은 다음과 같습니다.

다음과 같이 디렉토리를 생성하고 소유권을 바꿔 줍니다.

MariaDB 라이브러리 시스템 인식.

시스템 데이터베이스 생성.

Systemd 스크립트 등록.

user, group 을 mysql 에서 maria 로 바꿔 주고 등록해줍니다.

 

galera_recovery 파일에 mysql 를 maria 로 바꿔 줍니다.

 

다음과 같이 mariadb 를 시작해 줍니다.

 

Docker 기본 원리

Docker 는 Linux 의 Container 기술이다. 일단 Linux 에 해당하는 기술이라고 하는 이유와 함께 Container 를 위한 제반사항들에 대해서 알아본다.

과거에 Solaris 에 Zone 이라는 기술이 있었다. 가상화기술이 아니라 Container 기술이라고 소개가 되었던 기억이 있다. Solaris 9 에서 이전의 Solaris 8 을 Zone 이라는 기술을 이용해서 하나의 하드웨어에서 돌릴 수 있었다.

Linux 진영에서는 Jail 이라고 해서 chroot 로 파일시스템을 격리하는 기술을 이용해 마치 독립된 하나의 운영체제처럼 사용했었다. 지금도 검색을하면 Jail 환경에서 웹서버를 돌리는 기술 문서가 나온다.

그러다가 Linux 진영에서 아예 커널에서 이것을 지원하도록 만들기 시작했는데, 그것이 LXC 다. 내가 전에 직장에서 이것을 이용한 서비스를 만들던 친구녀석이 있었는데, 그때 나도 같이 봤던 기억이 있다. LXC 에서 cgroup 은 핵심이였다. 돌이켜 생각해보면 지금의 도커만큼이나 LXC 를 이용해서 구현을 할 수 있었던 것으로 기억한다. 하지만 노력과 비용이 너무 많이 들어갔다는게 문제였다.

Docker 는 정확하게 LXC 의 뼈대를 가졌다고 볼 수도 있다. 혹자는 최근의 Docker 는 LXC 를 버리고 libcontainer 를 독자적으로 사용하기 때문에 LXC 와 다르다고 하겠지만 LXC 가 사용하는 하부 구조를 Docker 도 그대로 사용한다 것을 부인할 수 없다.

  • Namespace
  • Cgroup

Docker 의 핵심은 위 두가지로 모두 Linux 커널에서 지원해야 한다. Docker 가 Linux 의 Container 기술이라고 하는 이유다. 실제로 Windows, Mac OS 에서도 설치할 수 있지만 설치할때 가상머신을 설치하고 난후에 Docker 를 설치하는걸 볼 수 있다.

Namespace

Namespace 는 마치 예전에 chroot 와 비슷하다. 다른 것이면 chroot 는 파일 시스템 격리를 우선했지만 Namespace 는 6가지를 지원한다.

  • File System
  • Process
  • Network
  • IPC
  • Hostname
  • User

Namespace 는 프로그래밍 세계에서도 사용하는 용어인데,  그곳에서 보여주는 특성과 동일하다. 6가지에 대해서 격리된 공간(isolated space)를 만들어준다. 운영체제는 분명 1개인데, 여러개의 격리된 독립적인 공간을 가질 수 있다.

물론 이를 위해서는 커널에서도 지원해야 한다.

Cgroup

Cgroup 은 Linux 시스템의 자원(Resource) 를 제어할 수 있게 해준다. 자원에 대해서 그룹을 생성한다. 그리고 그 그룹을 특정 사용자가 사용할 수 있도록 소유권을 준다. 그러면 사용자가 프로그램을 실행할때 cgroup 을 할당하면 거기에 있는 자원만큼만 사용하게 된다.

다음과 같은 자원을 제어할 수 있다.

  • Memory
  • CPU
  • I/O
  • Network
  • Device

당연히 이것도 커널에서 지원해야 한다.  커널이 지원하면 다음과 같이 /sys 에 cgroup이 나타난다.

 

애초에 Docker 도 LXC 를 이용해 구현되었다가 지금은 runC 라고 하는 걸 독자적으로 만들어서 사용하고 있다고 한다.

참고:

  1. Docker(container)의 작동 원리
  2. 초보를 위한 도커 안내서 – 도커란 무엇인가?

Amazon RDS의 Read Replica 에 Multi-AZ Deployment 지원.

2018년 1월 11일날자로 “Amazon RDS 읽기 전용 복제본은 이제 다중 AZ 배포를 지원합니다.” 를 발표했다.

한글화를 하니까 그런지 잘 와닫지 않는데, URL 주소를 보면 확실히 이해가 될 것이다. 그런데, 저 글에서 한가지 불만이 있다. 다이어그램이 없다는 거!!

하지만 놀랍게도 AWS 의 트위터에서 이것을 소개하는데 다이어그램이 있었다. 그래서 다이어그램을 첨부한다.

amazon rds read replicas now support multi az deployment
amazon rds read replicas now support multi az deployment

링크에 내용 중에 다음을 주목할 필요가 있다.

이제 프로덕션 데이터베이스에 대한 재해 복구(DR) 전략의 일부로서 다중 AZ과 함께 읽기 전용 복제본을 사용할 수 있습니다. 잘 설계 및 테스트된 DR 계획은 재해 후에도 비즈니스 지속성을 유지하는 데 필수적입니다. 소스 데이터베이스와 다른 리전에 배치된 읽기 전용 복제본은 스탠바이 데이터베이스로 사용되다가 지역 장애가 발생했을 경우 새 프로덕션 데이터베이스로 승격될 수 있습니다.

DR 구축할때 Amazon RDS 에 Read Replica Multi-AZ 기능을 이용하면 무중단 운영이 가능하다는 이야기가 되겠다.