ungit은 git 사용자를 위한 유용한 GUI 브라우저이다. ungit 은 node.js 상에서 동작하므로 이참에 node.js 를 source로부터 build하고 ungit 을 설치하는 과정을 메모해 둔다.




1. tarball 소스로부터 node.js 빌드 & 설치


bryan@bryan-laptop1:~/Downloads$ wget https://nodejs.org/dist/v0.12.7/node-v0.12.7.tar.gz

bryan@bryan-laptop1:~/Downloadssudo apt-get install build-essential python-dev

bryan@bryan-laptop1:~/Downloadstar xvzf node-v0.12.7.tar.gz

bryan@bryan-laptop1:~/Downloadscd node-v0.12.7/

bryan@bryan-laptop1:~/Downloads/node-v0.12.7./configure

bryan@bryan-laptop1:~/Downloads/node-v0.12.7make

bryan@bryan-laptop1:~/Downloads/node-v0.12.7sudo make install

bryan@bryan-laptop1:~/Downloads/node-v0.12.7node --version

v0.12.7


2. ungit 설치 및 테스트


bryan@bryan-laptop1:~sudo npm install -g ungit

bryan@bryan-laptop1:~$ cd git/bumblebee-ui/

✔ ~/git/bumblebee-ui [master ↓·4|✔] 

10:36 $ ungit



<관련 글 보기>

2015/08/03 - [Git Tip] Git Branch와 상태를 보여주는 Linux Prompt(bash-git-prompt)

2015/07/31 - [Git Tip] Git 브랜치를 보여주는 Linux 프람프트(prompt) - Ubuntu 14.04, bash 기준

2015/07/24 - [Git Tip] Git에 대한 궁금증들

2015/07/23 - [Git Tip] AWS EC2 VM을 이용한 Git 서버설정과 git 기본 사용법


- Barracuda -


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들


MySQL이 Oracle 에 인수될 즈음부터 MySQL을 기반으로 하면서 보다 향상된 개념으로 각자가 이름을 떨치며 꾸준히 진행되어 온 프로젝트가 바로 Percona와 MariaDB이다. 참고로 두 프로젝트의 연관성을 비교하는 내용은 이 곳의 포스팅을 보시면 되겠고, 이번 포스팅에서는 Codership이 만든 Synchronous Multimaster 방식의 Galera cluster 를 설치해 보고, 운영에 관련해서 고려할 점들을 정리해 두려 한다.


Multimaster, Synchronous 한 특징을 가지는 이러한 MM 솔루션이 나오기 전에는(물론 완성도가 떨어지고 운영상 불편했던 MMM 같은 것도 있기는 했다), Master-Slave 구조의 비동기 Replication 방식이 많이 쓰였다. 한 편으로는 Semi-sync(Master는 변경 사항을 Slave 로 전달하는 것 까지만 책임을 진다)라는 장점을 가지기는 했지만 태생적으로 비동기식에서 벗어날 수 없기에, 만약의 상황에서 데이터 손실을 감수해야 하는 한계를 지녔었다고 볼 수 있겠다.


다뤄 나가고자 하는 내용을 간단히 요약하면 다음과 같다


* MariaDB Galera Cluster 설치 및 설정 과정

* 노드의 추가(확장)과 Maintenance를 위한 제거 등 운영 방법



1. MariaDB Galera Cluster 설치 및 설정 과정


설치 방법은 소스 빌드, 바이너리 다운로드&설치, rpm 설치 등 여러 가지가 있지만, 여기서는 mariadb.org 에서 권고하는 distro별 링크를 통해 단계를 밟아 나가는 내용을 그대로 따르면서 진행해 보자.


본 글에서 선택한 설치, 운영 환경: Ubuntu 14.04 Trusty, MariaDB 10, Kaist archive


* 설치 & 테스트를 진행할 3개의 Ubuntu 14.4 머신을 준비한다

 - ubuntu14-pv1, 10.0.10.1

 - ubuntu14-pv2, 10.0.10.2

 - ubuntu14-pv3, 10.0.10.3

* Local network이 아닌 외부 망을 통하여 노드간 원격 접속이 필요한 경우(AWS AZ 도 포함) 또는 서버 자체 방화벽(ufw 등) 이 설정되어 있을 때는, 방화벽 설정에서 TCP 3306/4568/4444 port와 TCP, UDP 4567 을 개방해야 한다(☞참조)



첫 번째 Cluster, Doner 노드의 설치와 기동


* 대다수 작업이 root 권한을 필요로 하므로 super user 로 로그인하여 진행한다

* 설치 과정에서 mysql 관리자 계정인 root 암호를 2번 입력(여기서는 편의상 maria 로 정한다)

* 첫 번째로 설정되어 기동되는 MariaDB 머신 도너(Doner) 노드라고 부르며, 다음과 같이 설정

* 여러 머신간의 데이터 동기화가 중요한 환경에서는, DB 데몬이 머신 부팅 후 자동 실행되는 방식을 피하는 것이 바람직

ubuntu@ubuntu14-pv1:~$ su -

root@ubuntu14-pv1:~# apt-get install software-properties-common

root@ubuntu14-pv1:~# apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db

root@ubuntu14-pv1:~# add-apt-repository 'deb http://ftp.kaist.ac.kr/mariadb/repo/10.0/ubuntu trusty main'

root@ubuntu14-pv1:~# apt-get update

root@ubuntu14-pv1:~# apt-get install mariadb-galera-server

root@ubuntu14-pv1:~# mysql_secure_installation

root@ubuntu14-pv1:~# mysql -uroot -pmaria

MariaDB [(none)]> grant all on *.* to 'root'@'%' identified by 'maria';

MariaDB [(none)]> grant usage on *.* to sst_user@'%' identified by 'maria';

MariaDB [(none)]> grant all privileges on *.* to sst_user@'%';

MariaDB [(none)]> flush privileges;

MariaDB [(none)]> quit

root@ubuntu14-pv1:~# service mysql stop

root@ubuntu14-pv1:~# apt-get install sysv-rc-conf <== mysqld 의 자동 실행을 중지하기 위함

root@ubuntu14-pv1:~# sysv-rc-conf <== runlevel 2~5 에 대해 space 를 눌러서 해제


* 복제 방법으로 Percona 의 xtrabackup 을 사용하기 위함(rsync 를 선택할 경우 설치하지 않아도 됨)

* 이 경우 데이터스트림 전송을 위한 다용도 relay 솔루션인 socat은 꼭 설치해야 함

root@ubuntu14-pv1:~# apt-get install xtrabackup socat


* 중요 설정, 고유 입력 항목은 붉은 글씨로 표시

* wsrep_node_address 에는 머신 자체 ip 를 등록

* 초기 설정시에는 wsrep_cluster_address에 머신 자체 ip 만 등록

* wsrep_sst_receive_address 에는 자체 ip:4569 를 등록

root@ubuntu14-pv1:~# vi /etc/mysql/conf.d/mariadb.cnf

# MariaDB-specific config file.

# Read by /etc/mysql/my.cnf


[client]

default-character-set = utf8

 

[mysqld]

character-set-server = utf8

collation-server = utf8_general_ci

character_set_server = utf8

collation_server = utf8_general_ci

 

autocommit = 0


# Load Galera Cluster

wsrep_provider = /usr/lib/galera/libgalera_smm.so

wsrep_cluster_name='galera_cluster'

wsrep_retry_autocommit = 0

wsrep_sst_auth=sst_user:maria

#wsrep_sst_method = rsync

wsrep_sst_method = xtrabackup

wsrep_provider_options = "evs.keepalive_period = PT3S; evs.suspect_timeout = PT30S; evs.inactive_timeout = PT1M; evs.install_timeout = PT1M"

 

# Galera Node Option

wsrep_node_name='galera1'

wsrep_node_address='10.0.10.1'

wsrep_cluster_address = 'gcomm://10.0.10.1'

wsrep_sst_receive_address=10.0.10.1:4569

 

# Other mysqld options

default-storage-engine=innodb

binlog_format = ROW

innodb_autoinc_lock_mode = 2

innodb_flush_log_at_trx_commit = 2

innodb_locks_unsafe_for_binlog = 1

innodb_log_file_size=100M

innodb_file_per_table

query_cache_size=0

query_cache_type=0

bind-address=0.0.0.0

datadir=/var/lib/mysql

tmpdir=/tmp

user=mysql

log-error=/var/log/mysql/mysql.err


* Cluster 내에서 최초로 기동되는 MariaDB doner 노드이기에 --wsrep-new-cluster 옵션으로 시작

* [주의] Checking for corrupt, not cleanly closed... 메시지는 DB가 정상 기동 되었음을 의미함

root@ubuntu14-pv1:~# service mysql start --wsrep-new_cluster

 * Starting MariaDB database server mysqld                               [ OK ] 

 * Checking for corrupt, not cleanly closed and upgrade needing tables.


여기까지가 Doner 노드 설정 과정이다.


* 데이터베이스가 정상 작동하는지 간단히 테스트해 보고, 다음 Cluster 확장 단계로 넘어가자

root@ubuntu14-pv1:~# mysql -uroot -pmaria

MariaDB [(none)]> create database cluster_test;

MariaDB [(none)]> use cluster_test;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A


Database changed

MariaDB [cluster_test]> create table tbl1 (id varchar(20));

Query OK, 0 rows affected (0.25 sec)

MariaDB [cluster_test]> insert into tbl1 values ('abcdefg');

Query OK, 1 row affected (0.00 sec)

MariaDB [cluster_test]> commit;

Query OK, 0 rows affected (0.00 sec)



2. 운영 요령: 노드의 추가(확장)과 머신 점검을 위한 제거 등


앞의 단계는 Cluster 에 1개의 머신만 등록한 상태이다. 이번에는 Cluster 내에 2개의 머신을 더 추가하여, Galera Cluster 에서 권장하는 최소 홀수 개인 3개를 완성하는 과정과 Failover 및 자동 복구, Cluster 내에서 노드의 제거(머신 점검 등의 상황일 때)와 재투입 과정에 대해서 정리해 보자.


Cluster 의 두 번째 노드, 첫 Joiner 노드의 추가


* 앞의 Doner 노드 설정 과정과 거의 동일하며, config(maria.cnf) 의 일부 내용과 기동 방법이 다르다


* wsrep_node_address 에는 머신 자체의 ip 를 등록

* wsrep_cluster_address 에 기존의 Doner 노드와 Joiner 노드 ip 를 등록

* wsrep_sst_receive_address 에는 자체 ip:4569 를 등록

root@ubuntu14-pv2:~# scp root@10.0.10.1:/etc/mysql/conf.d/mariadb.cnf /etc/mysql/conf.d/

root@ubuntu14-pv2:~# vi /etc/mysql/conf.d/mariadb.cnf

# MariaDB-specific config file.

...

# Galera Node Option

wsrep_node_name='galera2'

wsrep_node_address='10.0.10.2'

wsrep_cluster_address = 'gcomm://10.0.10.1,10.0.10.2'

wsrep_sst_receive_address=10.0.10.2:4569

...


* Debian, Ubuntu 계열의 경우 특별히 신경 써서 작업해 주어야 하는 부분(debian-sys-maint 계정을 동일하게)

* Doner 노드의 /etc/mysql/debian.cnf 를 복사(password 만 Doner 노드의 것을 가져와도 됨)

root@ubuntu14-pv2:~# scp root@10.0.10.1:/etc/mysql/debian.cnf /etc/mysql/


* Cluster 내에 추가 되는 Joiner 노드는 별도 옵션 없이 시작

root@ubuntu14-pv1:~# service mysql start

 * Starting MariaDB database server mysqld                                [ OK ] 

 * Checking for corrupt, not cleanly closed and upgrade needing tables.


* Doner 노드의 config 를 새로이 추가된 Joiner 를 반영하여 수정해 둔다.

root@ubuntu14-pv1:~# vi /etc/mysql/conf.d/mariadb.cnf

 # MariaDB-specific config file.

...

# Galera Node Option

wsrep_node_name='galera1'

wsrep_node_address='10.0.10.1'

wsrep_cluster_address = 'gcomm://10.0.10.1,10.0.10.2'

wsrep_sst_receive_address=10.0.10.1:4569

...


* Doner 노드의 Mariadb 를 재시작할 필요는 없다(일단 맞추어 놓기만 하고, 다음에 재시작할 때 읽어 들이면 될 것이다). Joiner 가 추가되면서 이미 내부적으로 서로의 존재가 인식되었기 때문인데, Doner 노드에서 아래의 방법으로 확인할 수 있다. 즉, wsrep_cluster_address 변수는 config 에서 읽어들인 값을 가지고 있지만, Cluster 의 현재 상태 값을 가진 wsrep_incoming_addresses 는 2개 노드 접속 주소를 모두 가지고 있다.

root@ubuntu14-pv1:~# mysql -uroot -pmaria

MariaDB [(none)]> show variables like 'wsrep_cluster_address';

+-----------------------+-------------------+

| Variable_name         | Value             |

+-----------------------+-------------------+

| wsrep_cluster_address | gcomm://10.0.10.1 |

+-----------------------+-------------------+

1 row in set (0.00 sec)


MariaDB [(none)]> show status like 'wsrep_incoming_addresses';

+--------------------------+-------------------------------+

| Variable_name            | Value                         |

+--------------------------+-------------------------------+

| wsrep_incoming_addresses | 10.0.10.2:3306,10.0.10.1:3306 |

+--------------------------+-------------------------------+

1 row in set (0.00 sec)



Cluster 의 세 번째 노드, 새로운 Joiner 노드의 추가


* wsrep_node_address 에는 머신 자체의 ip 를 등록

* wsrep_cluster_address 에 기존의 노드에 추가하여 새로운 Joiner 노드 ip 를 등록

* wsrep_sst_receive_address 에는 자체 ip:4569 를 등록

root@ubuntu14-pv3:~# scp root@10.0.10.2:/etc/mysql/conf.d/mariadb.cnf /etc/mysql/conf.d/

root@ubuntu14-pv3:~# vi /etc/mysql/conf.d/mariadb.cnf

# MariaDB-specific config file.

...

# Galera Node Option

wsrep_node_name='galera3'

wsrep_node_address='10.0.10.3'

wsrep_cluster_address = 'gcomm://10.0.10.1,10.0.10.2,10.0.10.3'

wsrep_sst_receive_address=10.0.10.3:4569

...


* Doner 노드의 /etc/mysql/debian.cnf 를 복사

root@ubuntu14-pv3:~# scp root@10.0.10.1:/etc/mysql/debian.cnf /etc/mysql/


* Cluster 내에 추가 되는 Joiner 노드이므로 별도 옵션 없이 시작

root@ubuntu14-pv3:~# service mysql start

 * Starting MariaDB database server mysqld                               [ OK ] 

 * Checking for corrupt, not cleanly closed and upgrade needing tables.


* 기존의 Doner 노드와 Joiner 노드의 config 를 새로이 추가된 Joiner 를 반영하여 수정해 둔다. 앞 선 과정과 같은 요령

* 위와 마찬가지로 기존 MaraiDB들을 재시작할 필요는 없다

root@ubuntu14-pv1:~# vi /etc/mysql/conf.d/mariadb.cnf

 # MariaDB-specific config file.

...

# Galera Node Option

wsrep_node_name='galera1'

wsrep_node_address='10.0.10.1'

wsrep_cluster_address = 'gcomm://10.0.10.1,10.0.10.2,10.0.10.3'

wsrep_sst_receive_address=10.0.10.1:4569

...

root@ubuntu14-pv2:~# vi /etc/mysql/conf.d/mariadb.cnf

 # MariaDB-specific config file.

...

# Galera Node Option

wsrep_node_name='galera2'

wsrep_node_address='10.0.10.2'

wsrep_cluster_address = 'gcomm://10.0.10.1,10.0.10.2,10.0.10.3'

wsrep_sst_receive_address=10.0.10.2:4569

...


여기까지가  두 번째 Joiner 노드 추가 과정이며, 목표로 했던 3대로 이루어진 Galera cluster 가 완성되었다.


* 3대로 구성된 Galera Cluster 가 정상 작동하는지 간단한 테스트를 해 보자

root@ubuntu14-pv1:~# mysql -uroot -pmaria

MariaDB [(none)]> show variables like 'wsrep_cluster_address';

+--------------------------+----------------------------------------------+

| Variable_name            | Value                                        |

+--------------------------+----------------------------------------------+

| wsrep_incoming_addresses | 10.0.10.3:3306,10.0.10.2:3306,10.0.10.1:3306 |

+--------------------------+----------------------------------------------+

1 row in set (0.01 sec)

MariaDB [(none)]> insert into cluster_test.tbl1 values ('xyz123');

1 row in set (0.01 sec)

MariaDB [(none)]> commit;

0 row in set (0.00 sec)


* 최초에 Doner 에서 insert 했던 데이터와 직전에 insert 했던 데이터가 모두 조회된다

root@ubuntu14-pv3:~# mysql -uroot -pmaria -e "select * from cluster_test.tbl1;"

+--------+

| id     |

+--------+

| abcdefg   |

| xyz123   |

+--------+


<여기서 퀴즈1> node1(doner), node2, node3 구성일 때, node1의 MySQL이 shutdown 되었다면 node2, node3 중 하나가 doner 가 될 것이다. 잠시 후 node1이 다시 Cluster에 참여하면 node은 원래대로 doner가 될까?정답은 아래로 Drag!
정답: node1은 원래의 Doner 지위를 자동으로 되찾게 됨


Cluster 내의 노드를 제거/복원(재투입)하려면?


서버 머신 점검을 위해 Doner 노드(ubuntu14-pv1)를 Cluster 에서 제거해야 하는 상황이다. 아래의 과정으로 밟도록 하자.


* config 에서 wsrep_cluster_address 설정을 gcomm:// 로 클리어하고 DB를 재시작하면 Cluster 에서 제거됨

root@ubuntu14-pv1:~# vi /etc/mysql/conf.d/mariadb.cnf

...

# Galera Node Option

wsrep_node_name='galera1'

wsrep_node_address='10.0.10.1'

#wsrep_cluster_address = 'gcomm://10.0.10.1,10.0.10.2,10.0.10.3' <== Comment out

wsrep_cluster_address = 'gcomm://' <== 추가

wsrep_sst_receive_address=10.0.10.1:4569

...

root@ubuntu14-pv1:~# service mysql restart

 * Stopping MariaDB database server mysqld                               [ OK ] 

 * Starting MariaDB database server mysqld                               [ OK ] 

 * Checking for corrupt, not cleanly closed and upgrade needing tables.


root@ubuntu14-pv2:~# mysql -uroot -pmaria -e "show status like  'wsrep_incoming_addresses';"

+--------------------------+-------------------------------+

| Variable_name            | Value                         |

+--------------------------+-------------------------------+

| wsrep_incoming_addresses | 10.0.10.3:3306,10.0.10.2:3306 |

+--------------------------+-------------------------------+

root@ubuntu14-pv3:~# mysql -uroot -pmaria -e "show status like  'wsrep_incoming_addresses';"

+--------------------------+-------------------------------+

| Variable_name            | Value                         |

+--------------------------+-------------------------------+

| wsrep_incoming_addresses | 10.0.10.3:3306,10.0.10.2:3306 |

+--------------------------+-------------------------------+



ubuntu14-pv1 머신의 점검/수리가 끝났다. 원래 대로 재투입하려면 다음 과정을 밟으면 된다.


* config 를 이전 상태로 되돌리고 단순히 restart 하면 끝(이미 Galera Cluster 내에 노드가 1개 이상 작동중일 때에는 --wsrep-new-cluster 옵션을 쓰지 않음)

root@ubuntu14-pv1:~# vi /etc/mysql/conf.d/mariadb.cnf

...

# Galera Node Option

wsrep_node_name='galera1'

wsrep_node_address='10.0.10.1'

wsrep_cluster_address = 'gcomm://10.0.10.1,10.0.10.2,10.0.10.3' <== Uncomment

# wsrep_cluster_address = 'gcomm://' <== Comment out

wsrep_sst_receive_address=10.0.10.1:4569

...

root@ubuntu14-pv1:~# service mysql restart

 * Stopping MariaDB database server mysqld                               [ OK ] 

 * Starting MariaDB database server mysqld                               [ OK ] 

 * Checking for corrupt, not cleanly closed and upgrade needing tables.


root@ubuntu14-pv2:~# mysql -uroot -pmaria -e "show status like  'wsrep_incoming_addresses';"

+--------------------------+----------------------------------------------+

| Variable_name            | Value                                        |

+--------------------------+----------------------------------------------+

| wsrep_incoming_addresses | 10.0.10.3:3306,10.0.10.2:3306,10.0.10.1:3306 |

+--------------------------+----------------------------------------------+

root@ubuntu14-pv3:~# mysql -uroot -pmaria -e "show status like  'wsrep_incoming_addresses';"

+--------------------------+----------------------------------------------+

| Variable_name            | Value                                        |

+--------------------------+----------------------------------------------+

| wsrep_incoming_addresses | 10.0.10.3:3306,10.0.10.2:3306,10.0.10.1:3306 |

+--------------------------+----------------------------------------------+




3. 노드간 데이터 복제가 잘 되지 않는 것 같다. 확인/조치 방법은?


Cluster 내의 모든 노드들은 자신이 Primary 노드라고 인식한다(참고). 그러나 특정한 상황, 즉 네트워크 일시적 단절(network glitch), 과반수 이상의 노드가 장애를 겪거나 또는 split-brain 상태에 빠질 수도 있다. 이렇게 되면 데이터의 동기화에 문제가 발생할 가능성이 커지게 된다.


[여기서 잠깐] split-brain 에 대해 정리해 둘 필요가 있다. 일반적인 split-brain 이란 Master-Slave 상황에서 각자가 Master(또는 primary) 라고 인식하게 되는 상황을 말한다. Galera Cluster 와 같은 Multimaster 의 경우에도 Doner와 Joiner 관계가 있는 것과 같이 Master라 하더라도 '급' 이 다른 구분이 필요하다(즉, "데이터의 오리지널 소스가 누구지?"에 대한 답이 필요하다). 잠시 후 2-node 구성일 때의 네트워크 단절 상황에 대해 테스트 해보기로 하자.


첫 번째 장애: 3-node 구성일 때 1대의 머신에 네트워크 장애 발생


* node2의 네트워크 단절(머신 자체는 동작하지만 node1, node3 과 네트워킹이 안되도록 iptables 로 장애를 흉내 냄)

* 일정 시간이 지나면 node2 는 '쓰기 불가' 상태에 빠지며 wsrep_local_index가 0으로 떨어짐

root@ubuntu14-pv2:~# iptables -A INPUT -d 10.0.10.2 -s 10.0.10.1 -j REJECT

root@ubuntu14-pv2:~# iptables -A INPUT -d 10.0.10.2 -s 10.0.10.3 -j REJECT

root@ubuntu14-pv2:~# mysql -uroot -pmaria

MariaDB [(none)]> show status like 'wsrep_local_index';

+-------------------+-------+

| Variable_name     | Value |

+-------------------+-------+

| wsrep_local_index | 1     |

+-------------------+-------+


MariaDB [(none)]> show status like 'wsrep_local_index';

+-------------------+-------+

| Variable_name     | Value |

+-------------------+-------+

| wsrep_local_index | 0     |   <== 값이 0인 노드는 Doner 또는 Standalone 노드

+-------------------+-------+


MariaDB [(none)]> show status like 'wsrep_incoming_addresses';

+--------------------------+----------------+

| Variable_name            | Value          |

+--------------------------+----------------+

| wsrep_incoming_addresses | 10.0.10.2:3306 |

+--------------------------+----------------+


MariaDB [(none)]> show status like 'wsrep_cluster_size';

+--------------------+-------+

| Variable_name      | Value |

+--------------------+-------+

| wsrep_cluster_size | 1     |

+--------------------+-------+


MariaDB [(none)]>  show status like 'wsrep_cluster_status';

+----------------------+-------------+

| Variable_name        | Value       |

+----------------------+-------------+

| wsrep_cluster_status | non-Primary |

+----------------------+-------------+


MariaDB [(none)]> insert into cluster_test.tbl1 values ('data1234');

ERROR 1047 (08S01): WSREP has not yet prepared node for application use


[주의사항] Cluster에서 제외된 노드(여기서는 node2)에서는 정상적인 쿼리가 수행되지 않는다

* 이 때 wsrep_provider_options 변수에 pc.bootstrap=1(YES) 값을 설정하면 자체가 Standalone 모드로 작동하게 할 수 있다. 단, 네트워크를 정상화한 이후에 다시 Cluster 내에 투입하려면 반드시 MySQL을 재시작해야 한다

* Cluster 내에서 하나의 노드에서만 수행해야 한다(galera Cluster 에서는 Automatic Bootstrap 이라고 함)

root@ubuntu14-pv2:~# mysql -uroot -pmaria

MariaDB [(none)]> SET GLOBAL wsrep_provider_options='pc.bootstrap=1';


* [주의사항] 또 다른 장애 발생 가능성: 이 상황에서 node2의 특정 테이블에 insert 후 PK 변경 DDL 수행시,  Cluster에 재투입하면 node1, node3 에서는 Deadlock 발생 가능성이 있음

* 따라서, Cluster 에서 제외된 노드에서는 더 이상의 DDL이나 insert/update 쿼리가 돌지 않도록 특별히 유의해야 함

root@ubuntu14-pv1:~# 

MariaDB [cluster_test]> select * from tbl1;

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

root@ubuntu14-pv3:~# 

MariaDB [cluster_test]> select * from tbl1;

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction


* [원상복귀] node1, node3 은 정상 작동 중인 상황, node2를 되살린다

* node2 의 네트워크를 되살리면 일정 시간이 지나 node1, node2가 있는 Cluster 로 자동 복귀

root@ubuntu14-pv2:~# iptables -F <== 네트워크 장애가 해결되었음을 시뮬레이션



[특정 노드의 전체 데이터 수동 동기화]

* node2 가 Cluster에서 분리된 이후에 Update되어 데이터가 node1, node3 에 비해 지나치게 상이한 경우의 조치(초기화)

* 아래 과정대로 하면 node1, node3로부터 전체 데이터에 대해 동기화(mysqldump, xtrabackup, rsync 등 방법도 있음)

root@ubuntu14-pv2:~# rm -rf /var/lib/mysql/*

root@ubuntu14-pv2:~# rm -rf /var/log/mysql/*

root@ubuntu14-pv2:~# mysql_install_db

root@ubuntu14-pv2:~# service mysql start --wsrep_cluster_address='gcomm://'

root@ubuntu14-pv2:~# mysql_secure_installation

root@ubuntu14-pv2:~# mysql -uroot -pmaria

MariaDB [(none)]> grant all on *.* to 'root'@'%' identified by 'maria';

MariaDB [(none)]> grant usage on *.* to sst_user@'%' identified by 'maria';

MariaDB [(none)]> grant all privileges on *.* to sst_user@'%';

MariaDB [(none)]> flush privileges;

MariaDB [(none)]> quit

root@ubuntu14-pv2:~# service mysql stop

root@ubuntu14-pv2:~# vi /etc/mysql/conf.d/mariadb.cnf

...

# Galera Node Option

wsrep_node_name='galera2'

wsrep_node_address='10.0.10.2'

wsrep_cluster_address = 'gcomm://10.0.10.1,10.0.10.2,10.0.10.3' <== Uncomment

# wsrep_cluster_address = 'gcomm://' <== Comment out

wsrep_sst_receive_address=10.0.10.2:4569

...

root@ubuntu14-pv1:~# service mysql start

 * Stopping MariaDB database server mysqld                               [ OK ] 

 * Starting MariaDB database server mysqld                               [ OK ] 

 * Checking for corrupt, not cleanly closed and upgrade needing tables.


두 번째 장애: 2-node 구성일 때 1대의 머신에 네트워크 장애 발생(split-brain)


* Cluster내에 2개의 노드(node1, node2) 만 남아 있는 상황

* node2 에 네트워크 장애 발생, 2개의 노드에서 동일하게 데이터베이스가 정상작동하지 않음

* Cluster 내의 Master 노드 정족수가 부족(과반수를 초과해야 하나, quorom=1/2)하게 되기 때문(이러한 한계를 무시하는 설정도 있고, 노드를 흉내내 주는 대안적 방법으로 garbd(Galera Arbiter로 2개 노드일 때 quorom 값을 +1 증가시켜 줌, ☞참고) 를 쓰는 방법도 있으나, 썩 바람직하지 않으므로 Skip)

root@ubuntu14-pv2:~# iptables -A INPUT -d 10.0.10.2 -s 10.0.10.1 -j REJECT


root@ubuntu14-pv1:~# mysql -uroot -pmaria

MariaDB [(none)]> select * from cluster_test.tbl1;

ERROR 1047 (08S01): WSREP has not yet prepared node for application use


root@ubuntu14-pv2:~# mysql -uroot -pmaria

MariaDB [(none)]> use cluster_test;

ERROR 1047 (08S01): WSREP has not yet prepared node for application use


* [원상복귀] node2 의 네트워크를 되살리면 일정 시간이 지나 node1이 있는 Cluster 로 자동 복귀

root@ubuntu14-pv2:~# iptables -F


root@ubuntu14-pv1:~# mysql -uroot -pmaria
MariaDB [(none)]> show status like 'wsrep_local_index';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| wsrep_local_index | 0     |
+-------------------+-------+


root@ubuntu14-pv2:~# mysql -uroot -pmaria

MariaDB [(none)]> show status like 'wsrep_local_index';

+-------------------+-------+

| Variable_name     | Value |

+-------------------+-------+

| wsrep_local_index | 1     |

+-------------------+-------+



- Barracuda -


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들


지난 포스팅에서 windows(hvm) guest 를 Ubuntu 14.4 dom0 에 설치하고 설정하는 과정을 다루어 보았다. 이번에는 동일한 host 환경에 pv(반가상화) guest 를 설치하는 과정을 정리해 보고, 주의할 사항이나 문제 해결 방법 등에 대해 기록하고자 한다.


Host 의 xen 환경에 대해서는 지닌 시간에 충분히 다루었으므로, 이번에는 pv guest 를 설치하고 다루는 중요한 체크포인트들에 대해 집중적으로 기록한다.


지난 포스팅의 HVM guest 설치 과정과 이번 포스팅에서 다룰 pv guest 설치의 차이점들을 짚어 보도록 하자(참고/지난 포스팅: [Xen 가상화 1] Windows 7 hvm guest on Ubuntu 14.4 LTS, Xen 4.4.1 - 설치 및 설정 가이드)


* HVM guest는 Host 의 각종 장치를 에뮬레이션하는 기능(가상화된 장치)를 직접 사용하기 때문에 설치 CD/DVD-rom 이나, 네트워크 설치 등 다양한 방법을 자연스럽게 써서, 설치 과정이 직관적이고 쉬울 뿐 아니라 VNC 를 통해서 그래피컬한 방식으로 진행 가능하다

* PV(paravirt) guest OS는 주로 linux 계열의 OS 들을 사용하며, HVM guesu OS로 사용되는 Windows / Open Solaris / FreeBSD  등은 pv guest 로는 사용이 곤란하다

* PV guest 설치 방법은 크게 두 가지로 나뉜다

 1. config 파일 설정 방식으로, image 파일을 loop device 로 마운트하여 완전 수작업으로 시스템 파일 복사/설치(guest install 과정이 없음)하고 vm을 구동

 2. virt-install 로 text 방식 또는 virt-manager 로 GUI 방식으로 설치(guest install 과정이 있음)

* PV guest 설치시에는 Host 의 ISO 파일이나 CD/DVD-rom 을 사용할 수 없다

virt-manager 에서 새로운 vm 추가시에 "로컬 CDROM/ISO" 를 통한 설치 진행 시 paravirt 는 선택이 불가



위의 마지막 줄의 제약사항은 config 파일 설정 방식이나 virt-install 을 통한 명령어 방식에서도 동일하므로, 지난 포스팅에서와 같이 iso 파일을 마운트해서 PV guest 를 설치해 보려는 시도는 의미가 없음에 주의하자.


1. 어떤 방법을 쓸 것인가? ... GUI로 쉽게 가자


위에서 언급한 config 파일 설정을 통한 완전 수작업 방식은, Host OS 나 guest OS의 종류에 따라 방법이 달라질 뿐 아니라, image 파일 내의 파티션 설정, vmlinuz/initrd 등의 부트로더/OS파일 복사, 패키지의 수작업/선별적 설치(SUSE는 zypper, Ubuntu 는 apt-get...이런 식. 각각의 옵션도 상이함) 등의 복잡한 과정을 밟아야 하므로 다소 난이도가 있는 까다로운 작업이 될 수 있다. 따라서 이번 포스팅에서는 virt-manager 를 통한 쉬운 GUI 방식을 선택해서 진행해 보려 한다.


* 지난 포스팅에서 virt-manager 설치는 이미 해 두었으므로 별도 준비 과정은 없다

* 우선 xen의 config 파일을 수정하고 restart 한다

$ su -

# vi /etc/xen/xend-config.sxp -> 아래 2개 항목을 찾아서 uncomment 하고 내용을 수정한다

(xend-http-server yes)

(xend-port            8000)

service xen restart


* (옵션 사항) visrh 명령으로 storage poo 을 미리 설정해 두면 설치 iso, guest image 저장 위치를 따로 지정할 수 있다

(/home/vmimage는 guest OS의 설치 이미지 파일이 생성될 위치, /home/vmos_images 는 iso 파일이 저장된 위치)

# virsh

virsh # pool-destroy default

virsh # pool-undefine default

virsh # pool-define-as --name default --type dir --target /home/vmimage

virsh # pool-autostart default

virsh # pool-build default

virsh # pool-start default

virsh # pool-destroy local

virsh # pool-undefine local

virsh # pool-define-as --name local-iso --type dir --target /home/vmos_images 

virsh # pool-autostart local-iso

virsh # pool-build local-iso

virsh # pool-start local-iso

virsh # quit


* virt-manager 를 실행하고 VM 생성을 위한 과정을 진행한다

# virt-manager


127.0.0.1(xen) 항목을 더블클릭하여 root 암호를 입력하여 로그인


툴바의 '새 가상머신 생성' 버튼을 클릭하고 머신 이름 지정 후 '네트워크 설치'를 선택하고 '앞으로' 클릭


URL 입력 부분에 네트워크 설치 URL을 입력하고 OS종류, 버전을 선택하고 '앞으로'


* Ubuntu 14.4(trusty) 를 위한 네트워크설치 URL은 다음 3개 중 하나를 선택하여 입력

http://kr.archive.ubuntu.com/ubuntu/dists/trusty/main/installer-amd64/

http://us.archive.ubuntu.com/ubuntu/dists/trusty/main/installer-amd64/

http://mirrors.kernel.org/ubuntu/dists/trusty/main/installer-amd64/


디스크 이미지의 크기를 기가바이트 단위로 지정하고 '앞으로'


'추가옵션' 클릭, Virt 종류는 xen(paravirt) 로 선택


항목별 변경 사항이 있으면 각각 수정한 후 '적용', 상단의 '설치시작' 을 선택하면 다음 단계로 진행


프로그레스 바가 있는 작은 팝업창이 뜬 후, 약간의 시간이 지나면 가상머신관리자 창에 새로운 vm 이 나타난다. 이 때 접속이 되지 않는 시커먼 그래픽 콘솔 창이 같이 뜨는데, 당황하지 않고 창을 닫아 버리자(paravirt guest이므로 지금은 그래픽 화면을 볼 수 없고, base system 설치가 완료된 이후에는 가상콘솔 화면으로 접속할 수 있다).


다다

virt-manager 구동 후 시간이 지났을 경우 root 로그인 창이 뜨기도 한다



* xl list 를 해 보면 방금 생성한 vm 이 기동되고 정상 작동중인 것을 확인 수 있다

* 이제부터는 터미널을 열어서 텍스트 방식으로 진행한다. console 로 접속하면 셋업 단계의 화면을 접하게 된다

# xl li

Name                                        ID   Mem VCPUs State Time(s)

Domain-0                                     0 10714     4     r-----    4124.2

ubuntu14-pv3                                 3  1024     1     -b----       2.2

# xl console 3


엔터를 입력하여 다음 단계로...


other>Asia> ... 국가를 선택하고 엔터


default locale 선택하고 엔터


hostname 입력하고 엔터



* 이후부터는 일반적인 ubuntu OS 설치 과정과 거의 유사하므로 중간 과정 생략


모든 설치 과정이 완료되면 vm은 자동으로 reboot 된다


virt-manager 의 툴바에서 '가상머신 콘솔' 버튼을 클릭하면 새로운 vm에 접속할 수 있다. xl console 을 통해 text 방식으로도 접속 가능(새로이 만들어진 vm의 ip는 192.168.25.29 로 자동 할당 되어 있다)


Host 의 터미널에서 vm 쪽으로 ping test 를 수행해 본다. 네트워크가 정상 작동 됨을 볼 수 있다.


2. vm 복제(vm cloning)


* 새로운 vm이 설치되고 정상 작동하는 데에 수 십분 또는 그 이상의 시간이 소요되는데, 기존의 관리 대상인 vm을 복제해서 사용하면 몇 초만에 새로운 vm을 생성하여 사용할 수 있다.


복제할 대상이 되는 vm을 종료한 후, virt-manager에서 우클릭, 복제를 수행하면 된다


복제 될 vm의 이름을 지정하면 저장소도 해당 이름으로 자동 복제된다


스토리지의 크기에 따라 수 초~수 분 내로 새로운 vm이 만들어 진다


새롭게 복제된 vm이 나타났다. 이후의 테스트 과정은 생략한다.


* 참고: (설정 파일 위치 관련)

 - virt-manager, virt-install 같은 tool이 관리하는 기본 설정 파일은 /etc/libvirt 내에 위치한다

 - 사용자 고유의 virt-manager에 대한 각종 vm 관련 설정 사항은 $USER/.gconf/apps/virt-manager 내에 위치한다(본 예시에서는 /root/.gconf/apps/virt-manager 가 될 것이다)



- Barracuda -


저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들


2015년 현재, Opensource Xen이나 Citrix XenServer+XenCenter, VMWare ESX+vSphere, Oracle VM Server 등의 많은 가상화 Solution들이 있다. 본 편에서는 현존 대다수 가상화 솔루션들의 근간이 되는, Opensource Xen을 활용한 가상화 실습 시에 가장 필수적으로 밟아 나가는 단계를 정리해 두려 한다. 염두에 두고 있는 것은 Ubuntu와 OpenSuse 를 각각 Host로 하고 Windows 7 과 CentOS Server 를 각각 Guest 로 하는 조합으로 대략 3~4가지의 시리즈를 써 나가는 것이다.


본 편에서는 그 첫 번째 Case로, Ubuntu 14.4 LTS 를 Host(Dom0)로 한 Xen 환경에서 Windows 7  VM을 사용하기 위한 방법과 과정을 정리해 나가고자 한다. 단, 가상화 솔루션이 "어떻게 작동하는지"의 이해에 도움이 되도록, 각 과정을 수동으로 직접 다루며, 최대한 GUI 관리 툴 등은 사용하지 않는 것이 본 포스팅들의 특별한 의도도 생각하면 되겠다.


전체적인 과정을 간단히 나열하면 다음과 같다.


* Ubuntu 14.4 LTS Desktop 설치 - Host OS 준비

* Host 를 Xen Dom0 로 사용할 수 있도록 하는 필수 과정들

* VM에 Guest OS(Windows 7) 을 설치하고 사용, 운영하는 방법과 과정



이제 각 단계 별로 실제 작업을 차근차근 수행해 보자.


1. Ubuntu 14.4 LTS 설치 - Host OS 준비


* 준비물: Ubuntu 14.4 LTS Desktop, 64 bit의 iso 파일을 내려 받아 구운 DVD-ROM(http://www.ubuntu.com/download/desktop 참조)


Windows계열이든 Linux 계열이든 OS를 설치하는 과정은 크게 다르지 않다. 설치 화면을 "잘 보고 따라 가면" 된다! 만약 주의 사항이 있다면 따로 Post-it 같은 메모지를 써서 기록해 두는 방법을 애용하자. 아마도 내 말이 피가 되고 살이 됨을 나중에 느끼게 될 지도 모를 일이다.


* OS 설치시 가상화 등의 추가 옵션은 따로 지정하지 않고,  Default 옵션만으로 진행한다.

* 본 글에서는 vm을 설치할 볼륨이 스파스(sparse) 파일이 될 것이므로, Host OS에 마운트 되는 볼륨의 경우 /(root) 볼륨은 20~100 GB 가량, /home 볼륨은 200GB~400GB 이상 여유 있게 잡는다. vm OS 가 설치된 볼륨 파일들을 /home 내에 하위 디렉토리를 만들고 체계적으로 관리하기 위함이다.

* 한글/영문 입력이 가능하도록 설정하고, 인터넷 접속이 가능하도록 네트워크 설정까지 완료한다.

* 추후에 linux guest vm으로 양방향 ssh 접속/운영이 가능하도록 다음과 같이 설정해 둔다

$ su -

# apt-get install ssh

# vi /etc/ssh/sshd_config -> 아래 항목을 찾아서 yes 로 변경한다.

  PermitRootLogin yes

# service ssh restart



2.Host 를 Xen Dom0 로 사용할 수 있도록 하는 필수 과정들


* 이번 단계에서는 Xen 관련 패키지 설치, VM 네트워킹을 위한 bridge 설정, 부팅 시 Xen kernel 이 로딩되도록 grub 설정 등의 작업을 수행한다.

* 과정을 단순하게 하기 위해 모든 패키지는 바이너리 형태로 설치된다. 즉 source 를 다운로드하여 빌드하는 방식으로 설정하는 경우에 꼭 써야 하는 apt-get build-dep, .configure, make && make install 등의 명령이나 스크립트의 실행 등은 사용하지 않아도 된다.


# apt-get install xen-hypervisor-4.4-amd64 xen-utils-4.4

# apt-get install qemu-kvm libvirt-bin libvirt-dev virt-manager virtinst vncviewer

# adduser $USER libvirtd


* Xen networking 에서 가장 중요한 부분. 여기서는 첫 번째 NIC(eth0)를 Xen 에서 사용할 bridge로 설정한다.

# vi /etc/network/interfaces -> 구조에 맞게 적당히 수정(dhcp 를 사용하지 않는 경우는 dhcp 대신 static 으로)

  iface eth0 inet manual
  auto xenbr0
  iface xenbr0 inet dhcp
      bridge_ports eth0

  ...


# vi /etc/xen/xend-config.sxp -> uncomment 처리

  (network-script network-bridge)

# vi /etc/default/xen -> xl 로 되어 있는지 확인(기본 툴스택이 xm 에서 보다 향상된 최근 xl 로 업그레이드 되어 있음)

  TOOLSTACK=xl


# vi /etc/default/grub

  GRUB_CMDLINE_LINUX=""  # dom0_mem=512 dom0_max_vcpus=1 dom0_vcpus_pin 와 같이 튜닝 가능

  GRUB_CMDLINE_LINUX_DEFAULT=""


# cd /etc/grub.d

# mv 10_linux 21_linux -> 부팅 순서에 20_linux_xen 이 먼저 배치되도록 변경

# sync

# reboot


* Host 의 네트웍이 정상 작동 하는지, 브리지 설정이 제대로 되어 있는지 점검한다.

# ping google.com

# brctl show

  bridge name    bridge id                    STP enabled    interfaces
  virbr0          8000.000000000000         yes       
  xenbr0        8000.d0505602a73d         no                   eth0


* 아래의 xl 실행 결과를 볼 수 있다면, 설정된 Xen 가상화 환경이 잘 작동하는 것으로 보고 다음 단계 수행

# xl info
host                   : Ubuntu-desktop
release                : 3.16.0-38-generic
version                : #52~14.04.1-Ubuntu SMP Fri May 8 09:43:57 UTC 2015
machine                : x86_64
nr_cpus                : 4
max_cpu_id             : 3
nr_nodes               : 1
cores_per_socket       : 4
threads_per_core       : 1
cpu_mhz                : 3399
hw_caps                : bfebfbff:2c100800:00000000:00007f00:77fafbff:00000000:00000021:00002fbb
virt_caps              : hvm hvm_directio
total_memory           : 12207
free_memory            : 8559
sharing_freed_memory   : 0
sharing_used_memory    : 0
outstanding_claims     : 0
free_cpus              : 0
xen_major              : 4
xen_minor              : 4
xen_extra              : .1
xen_version            : 4.4.1
xen_caps               : xen-3.0-x86_64 xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p hvm-3.0-x86_64
xen_scheduler          : credit
xen_pagesize           : 4096
platform_params        : virt_start=0xffff800000000000
xen_changeset          :
xen_commandline        : placeholder
cc_compiler            : gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
cc_compile_by          : stefan.bader
cc_compile_domain      : canonical.com
cc_compile_date        : Wed May 20 12:19:20 UTC 2015
xend_config_format     : 4



3.VM에 Guest OS(Windows 7) 을 설치하고 사용, 운영하는 방법과 과정



* 준비물: Windows 7 이 설치 가능한 CD 또는 DVD의 iso 파일, /root/vmos_images/win7.iso 로 복사해 둔다.


* 이번 단계에서는 VM을 설치하기 위한 가상 볼륨(Sparse 파일)을 준비하고, 실제로 guest os인 Windows 7을 설치, Xen을 통해 구동하고 사용하는 방법을 기술한다.


# mkdir -p /home/vmimage/win7

# cd /home/vmimage/win7

# dd if=/dev/zero of=./win7.img bs=4k count=1 seek=8M -> 30GB 가량의 빈 파일 생성


* Windows 계열 OS 는 일반적으로 전가상화(Full virtualization, HVM) 방식을 쓴다

# vi win7.cfg

# WINDOWS 7 CONFIGURATIONS for Xen
#  - Installation: Ubuntu 14.4 LTS, Xen 4.4.1 guest

builder = 'hvm'
vcpus = 2
memory = 4096

#Disks
disk = [
    'file:/home/vmimage/win7/win7.img,ioemu:hda,w',
    'file:/root/vmos_images/win7.iso,ioemu:hdc:cdrom,r'
]

#Hostname
name = 'windows7-1'

# Networking
vif = ['type=ioemu,mac=00:16:3E:*:*:*,bridge=xenbr0']

# Behavior
on_poweroff = 'destroy'
on_reboot = 'restart'
on_crash = 'restart'

on_xend_stop='shutdown'

# VNC
vnc=1           # Enable VNC
vncconsole=0  # Don’t start vncviewer after “create” the domain
vncunused=0   # Don’t automatically assign unused port based on domain id
vncdisplay=2    # VNC Port Number to be added to “5900”. e.g.:  vncdisplay=2  : port=5902
                               # So, invoke "vncviewer 127.0.0.1::5902 &" after "create" domU

# Boot: d(cdrom) - to install Windows into the image file or target volume
# After installation, change it as 'c' or 'cd'
boot='d'
#boot='cd'


# Mouse cursor sync in vncviewer

usb=1

usbdevice='tablet'


# Set video ram for HiRes

stdvga=1

videoram=16


* Xen에 의해 vm이 생성되고, 설정 파일(win7.cfg) 에서 지정된 가상볼륨 파일(win7.img)에 windows 7 이 설치되는 과정

# xl create win7.cfg

Parsing config from win7.cfg


# vncviewer 127.0.0.1::5902 &




# xl list

Name                   ID    Mem  VCPUs    State       Time(s)
Domain-0                0   3482      4         r-----     4430.5
windows7-1              14  4096     4         -b----       71.1



- Barracuda -

저작자 표시 비영리 변경 금지
신고
블로그 이미지

Barracuda

Bryan의 MemoLog. 쉽게 익혀 보는 IT 실습과 개념원리, 코딩 세계의 얕은 맛보기들, 평범한 삶 주변의 현상 그리고 進上, 眞想, 진상들