생계/MySQL2017. 11. 25. 11:00


앞서 centos 에서 슈퍼유저인 root 유저로 yum install 방식으로 

MariaDB galera cluster 를 설치했다. 

인터넷의 설치예제는 root 로 설치하는 방법이 많지만, 실제 운영환경에서

root 로 설치하는 것은 보안상 바람직하지 않다.


설정을 내가 원하는대로 바꿔가며 설치하기에는 binary 파일로 설치하는 편이

가장 좋다. 이번 포스팅은 root가 아닌 os 상의 일반유저인 mysql 유저로 

binary install 로 해서 3 node galera cluster 를 설치하는 내용을 다룰것이다.

 


Galera package 는 mariadb 10.1 이상 버전에는 default 로 포함되어있다. 

5.5나 10.0 버전에서는 따로 패키지를 추가로 설치해야하지만, 10.1 과 그 이상 

버전에서는 따로 galera package 를 설치할 필요가 없다는 뜻이다. 

설치 후, 설정파일에 설정만 추가 하는 것으로써 해당 기능이 활성화 된다. 




Step1. MariaDB binary 설치 ( node 1,2,3 동일) 


     각 노드를 설치하는 과정은 galera 나 싱글이나 차이가 없다.

    이전 포스팅에 single node 에 binary install 한 내용이 있다. 

   => http://riorio.tistory.com/7

  ** mariadb 는 이름만 mariadb 라고 부를뿐 내부 소스에서는 여전히 mysql 을 

    사용하는것 같다. single 설치 때, mysql 이 아니고 mariadb 임을 상기하려고

    basedir 을 /usr/local/mariadb 로 링크를 걸어줬는데, 이대로 설치하는 것은

    single instance 때는 문제가 없었는데, galera cluster 를 쓰려면 에러나는 부분이

    많다.  그래서 왠만하면 /usr/local/mysql 로 바꿔줘야 덜 수정하게 되고,

    여러모로 정신건강에 이로울 것이다. 


Step2. configuration , db install

    

 ●   vi /etc/init.d/mysqld 

    basedir=/usr/local/mysql

    datadir=/DATA/mysql


[mysql@node1~]# service mysqld start

[mysql@node1~]# mysql_secure_installation

[mysql@node1~]# service mysqld stop



 ●  vi /etc/my.cnf 


[galera]


wsrep_on=ON

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

wsrep_cluster_address = "gcomm://"      node1 에서 최초 bootstrap 시

#wsrep_new_cluster

#wsrep_cluster_address = "gcomm://10.10.10.11,10.10.10.12,10.10.10.13"

  --> node2,3 은 모든 ip 를 적어준다.

binlog_format = row

default_storage_engine = InnoDB

innodb_autoinc_lock_mode = 2


wsrep_cluster_name='galera'

wsrep_node_address = 10.10.10.11

wsrep_node_name = 'node1'

wsrep_sst_method = rsync


bind-address=0.0.0.0


Step3. bootstrap


  - node1 최초 boot 시

   mysqld  --wsrep-new-cluster --datadir=/DATA/mysql 

  

[ERROR] WSREP: wsrep_load(): dlopen(): libssl.so.6: cannot open shared object file: No such file or directory


만약 위의 에러가 난다면.. 


[root@galera1 ~]# cd /usr/lib64

[root@galera1 lib64]# ls -l libcrypt*

-rwxr-xr-x. 1 root root   41080 Aug  2 06:09 libcrypt-2.17.so

lrwxrwxrwx. 1 root root      19 Jun 17 22:53 libcrypto.so.10 -> libcrypto.so.1.0.1e

-rwxr-xr-x. 1 root root 2012880 Jun 29  2015 libcrypto.so.1.0.1e

lrwxrwxrwx. 1 root root      22 Jun 17 22:53 libcryptsetup.so.4 -> libcryptsetup.so.4.7.0

-rwxr-xr-x. 1 root root  166640 Nov 21  2015 libcryptsetup.so.4.7.0

lrwxrwxrwx. 1 root root      25 Nov 21 15:09 libcrypt.so -> ../../lib64/libcrypt.so.1

lrwxrwxrwx. 1 root root      16 Nov 21 15:08 libcrypt.so.1 -> libcrypt-2.17.so

[root@galera1 lib64]# ls -l libssl*

-rwxr-xr-x. 1 root root 272536 Nov 20  2015 libssl3.so

lrwxrwxrwx. 1 root root     16 Jun 17 22:53 libssl.so.10 -> libssl.so.1.0.1e

-rwxr-xr-x. 1 root root 449864 Jun 29  2015 libssl.so.1.0.1e


ln -s libcrypto.so.1.0.1e libcrypto.so.6

ln -s libssl.so.1.0.1e libssl.so.6


링크를 걸어준다. 


 - node2,3 boot 

   mysqld  --datadir=/DATA/mysql



Step4. Service check


[mysql@node1~]$ mysql -u root -proot123

Welcome to the MariaDB monitor.  Commands end with ; or \g.

Your MariaDB connection id is 12

Server version: 10.2.7-MariaDB-log MariaDB Server


Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


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

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

| Variable_name                | Value                                                 |

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

| wsrep_apply_oooe             | 0.000000                                              |

| wsrep_apply_oool             | 0.000000                                              |

| wsrep_apply_window           | 1.000000                                              |

| wsrep_causal_reads           | 0                                                     |

| wsrep_cert_deps_distance     | 1.714286                                              |

| wsrep_cert_index_size        | 5                                                     |

| wsrep_cert_interval          | 0.000000                                              |

| wsrep_cluster_conf_id        | 5                                                     |

| wsrep_cluster_size           | 3                                                     |

| wsrep_cluster_state_uuid     | e9a1c20a-d01b-11e7-bac6-bb102b575a1a                  |

| wsrep_cluster_status         | Primary                                               |

| wsrep_commit_oooe            | 0.000000                                              |

| wsrep_commit_oool            | 0.000000                                              |

| wsrep_commit_window          | 1.000000                                              |

| wsrep_connected              | ON                                








반응형
Posted by 돌고래트레이너
생계/MySQL2017. 11. 24. 15:45

MariaDB galera cluster 설치 centos


MariaDB 로 Replication 을 구축하는 것은 그다지 어렵지않다. 

쉽고 무로료 Active-standby 구조의 아키텍쳐를 사용할수 있는 것은 큰 장점이다. 

그렇지만, 완전 무중단일 수 없고, 부하 분산의 효과가 그닥 크지 않은 것은 

단점이다. 

MariaDB 는 galera package 를 통해서 cluster 를 구축할수 있다. 

이것은 Actvie-Active 구조의 아키텍쳐이며 (mysql 식으로 말하자면 Master-Master)

역시 무료이다. 


오라클의 RAC 와 비슷한 개념이지만 차이가 있다면, 오라클은 shared storage 이지만 mariadb cluster 는 서버가 각자 storage 를 가진다. 

복제가 모든 노드에서 가능하다고 생각하면 된다. 


MaraiDB 홈페이지에 가면 galera cluster 설치에 대한 내용이 있다.

하지만 내용이 상세하지 않아 내가 원하는 요건과 맞지 않으면 설치에 어려움이 있을수 있다.

 

이번 포스팅은 비교적 간단한 방식인 root 로 yum 으로 설치하는 방법이다.



CentOS, RedHat, Fedora 에서는 yum install 을 추천


1. MariaDB YUM repository ( 3개 노드 동일)

    vi /etc/yum.repos.d/MariaDB.repo


[mariadb]

name = MariaDB

baseurl = http://yum.mariadb.org/10.1/centos7-amd64

gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

gpgcheck=1


## 만약, 특정 버전의 mariadb 를 설치하고자 한다면 MariaDB.repo 를 

원하는 버전으로 수정하자. MariaDB-5.5.39 버전을 설치한다면 아래처럼.


[mariadb]

name = MariaDB-5.5.39

baseurl=https://downloads.mariadb.com/files/MariaDB/mariadb-5.5.39/yum/rhel6-amd64/

gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

gpgcheck=1



2. Installing MariaDB with YUM ( 3개 노드 동일)


yum 으로 인스톨하는 것은 간단하다.

yum install MariaDB-server MariaDB-client


** mariadb 10.1 버전 부터는 Galera Cluster 가 MariaDB packages 에 기본 포함되어있다. 

configuration 을 했을때 기능이 활성화되고 그러기 전까지는 비활성화된 상태임. 

만약 MariaDB 10.0,  MariaDB 5.5. 버전이라면 위에 처럼 하지말고 아래처럼 하면 된다. 

yum install MariaDB-Galera-server MariaDB-client galera


내용 출처 : https://mariadb.com/kb/en/library/yum/


3. 데이터베이스 설치 ( 3개 노드 동일)


service mariadb start

mysql_secure_installation




4. Galera configuration


vi /etc/hosts

10.10.10.11 node1

10.10.10.12 node2

10.10.10.13 node3



[galera]

# Mandatory settings


wsrep_on=ON

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

wsrep_cluster_address = "gcomm://"

binlog_format = row

default_storage_engine = InnoDB

innodb_autoinc_lock_mode = 2


** 공식 홈페이지에서는 초기 기동시 wsrep_cluster_address ="gcomm://"

이 아닌 wsrep_new_cluster 를 쓰라고 나와있다. 

그러나 내가 테스트 했을 때는 wsrep_new_cluster 로 올리면

cluster_size 가 0 이 되고 나머지 노드들이 클러스터링이 잘 안된다. 

 

#optional

wsrep_cluster_name='galera'

wsrep_node_address = 10.10.10.11

wsrep_node_name = 'node1'

wsrep_sst_method = rsync

# wsrep_sst_auth='galera:galera'

bind-address=0.0.0.0


** wsrep_sst_method=rsync 로 세팅된 경우는 wsrep_sst_auth 를 사용하지 않는다. 


** Mandatory 에서는 초기에 node1 의 wsrep_cluster_address 를 비우고 

나머지 node2,3 은 

wsrep_cluster_address = "gcomm://10.10.10.11,10.10.10.12,10.10.10.13"

모두 적어준다. 

** optional 은 각 node 에 맞게 수정한다. 

ex) 

[node2]

wsrep_node_address=x.x.x.12

wsrep_node_name='node2'

[node3]

wsrep_node_address=x.x.x.13

wsrep_node_name='node3'



5. Bootstrap


- node1,2,3 공통


service mysql stop

Stopping mysql (via systemctl):                            [  OK  ]


- node1 로 처음 boot 할때만 아래처럼 올린다. 

  나머지 node2,3 은 service start 로 올린다. 


[root@localhost ~]# /etc/init.d/mysql start --wsrep-new-cluster


Starting mysql (via systemctl):                            [  OK  ]


[root@localhost ~]# mysql -u root -p -e "show status like 'wsrep%'"



** 나의 경우 node 1 은 정상적으로 올라오고, node2 가 start 과정중에 failed 되었다

이거 해결하느라 고생좀 했다. 이런것들이 오픈소스의 단점이 아닐까 싶다.

무료이지만 상용으로 쓰려면 맨땅에 헤딩을 많이 해야된다.....


부팅 중에 error 나면 systemctl stats 나 journalctl 로 메세지를 확인할수 있다. 

나의 경우엔 원인이 뭔질 모르겠으나 wsrep_sst_method=skip 으로 변경해서

정상적으로 open 시킬수 있었다. 






반응형
Posted by 돌고래트레이너
생계/MySQL2017. 9. 8. 23:36


1. 복제 설정

1.1 GRANT REPLICATION SLAVE

 

@all

 

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.*

TO replicant@'%'

IDENTIFIED BY 'replicant';

 

 

1.2 my.cnf 편집

 @Master

 

 cd /var/log

 mkdir /var/log/mysql

 

 chown R mysql.mysql ./mysql

 

 service mysqld stop

 

  vi /etc/my.cnf






 

log_bin = /var/log/mysql/mariadb-bin

 

[mysqld]

server_id = 101

relay_log = db01-relay-binlog







@Slave

 

service mysqld stop

 

vi /etc/my.cnf

 

[mysqld]

server_id = 102

read_only
 



@Master, Slave

service mysqld start



 

1.3 복제 설정

@Master

 

Ifconfig



 


mysql -u root -p

show master status;





@Slave

 

CHANGE MASTER TO MASTER_HOST='10.10.10.51',

MASTER_USER = 'replicant',

MASTER_PASSWORD = 'replicant',

MASTER_PORT=33060,

MASTER_LOG_FILE = 'mariadb-bin.000002',

MASTER_LOG_POS = 330;

 

START SLAVE; 




 

2. 복제 동작 확인

2.1show slave status 로 확인

 

@Slave

 

 

SHOW SLAVE STATUS;

Slave_IO_Running | Slave_SQL_Running  => yes 인가?






2.2 global_status 에서 확인

 

use mysql

 

SELECT variable_value

FROM information_schema.global_status

WHERE variable_name='SLAVE_RUNNING';






 

3. 복제 테스트

3.1 기본 설정

 

@Master

 

CREATE DATABASE IF NOT EXISTS temp;

USE temp;

 

CREATE TABLE doctors(

id int NOT NULL AUTO_INCREMENT PRIMARY KEY,

given_names varchar(255),

surname varchar(255),

birthdate date);

 

INSERT INTO doctors VALUES(1,'William','Hartnell','1908-01-08');

INSERT INTO doctors VALUES(2,'Patrick','Troughton','1920-03-25');

INSERT INTO doctors VALUES(3,'John','Pertwee','1919-07-07');

INSERT INTO doctors VALUES(4,'Tom','Baker','1934-01-20');

 

 

@Slave

 

show databases;

use temp

show tables;

select * from doctors;

 

3.2 Replicate_ignore_db

 

 

-     stop slave, 확인

 

MariaDB [(none)]> stop slave;

Query OK, 0 rows affected (0.00 sec)

 

MariaDB [(none)]> SELECT variable_value

               -> FROM information_schema.global_status

               -> WHERE variable_name='SLAVE_RUNNING';

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

| variable_value |

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

| OFF            |

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

1 row in set (0.00 sec)

 

MariaDB [(none)]> exit

Bye

 

-     my.cnf replicate_ignore_db 추가

 

[mysql@localhost ~]$ vi /etc/my.cnf

 

...

[mysqld]

replicate_ignore_db='information_schema'

replicate_ignore_db='performance_schema'

replicate_ignore_db='mysql'

...

 

 

-    mysqld 재기동, slave 재시작

 

[mysql@localhost ~]$ service mysqld restart

 

 

[mysql@localhost ~]$ sql

Welcome to the MariaDB monitor.  Commands end with ; or \g.

Your MariaDB connection id is 13

Server version: 10.2.7-MariaDB-log MariaDB Server

 

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 

MariaDB [(none)]> start slave;

Query OK, 0 rows affected, 1 warning (0.00 sec)

 

MariaDB [(none)]> stop slave;

Query OK, 0 rows affected (0.00 sec)

 

MariaDB [(none)]> start slave;

Query OK, 0 rows affected (0.00 sec)

 

MariaDB [(none)]> show slave status;

 

 

-     복제 테스트 ( ignore 확인)

 

@Master

 

MariaDB [temp]> use mysql

Database changed

MariaDB [mysql]> show tables;

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

| Tables_in_mysql           |

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

| column_stats              |

| columns_priv              |

| db                        |

| event                     |

| func                      |

| general_log               |

| gtid_slave_pos            |

| help_category             |

| help_keyword              |

| help_relation             |

| help_topic                |

| host                      |

| index_stats               |

| innodb_index_stats        |

| innodb_table_stats        |

| plugin                    |

| proc                      |

| procs_priv                |

| proxies_priv              |

| reptest                   |

| roles_mapping             |

| servers                   |

| slow_log                  |

| table_stats               |

| tables_priv               |

| time_zone                 |

| time_zone_leap_second     |

| time_zone_name            |

| time_zone_transition      |

| time_zone_transition_type |

| user                      |

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

31 rows in set (0.00 sec)

 

MariaDB [mysql]> create table aaaa(a int);

Query OK, 0 rows affected (0.02 sec)

 

 

 

MariaDB [(none)]> use mysql

Database changed

MariaDB [mysql]> show tables;

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

| Tables_in_mysql           |

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

| column_stats              |

| columns_priv              |

| db                        |

| event                     |

| func                      |

| general_log               |

| gtid_slave_pos            |

| help_category             |

| help_keyword              |

| help_relation             |

| help_topic                |

| host                      |

| index_stats               |

| innodb_index_stats        |

| innodb_table_stats        |

| plugin                    |

| proc                      |

| procs_priv                |

| proxies_priv              |

| reptest                   |

| roles_mapping             |

| servers                   |

| slow_log                  |

| table_stats               |

| tables_priv               |

| time_zone                 |

| time_zone_leap_second     |

| time_zone_name            |

| time_zone_transition      |

| time_zone_transition_type |

| user                      |

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

31 rows in set (0.00 sec)

 

 

-    복제 테스트 ( 나머지는 되는가 확인)

 

MariaDB [mysql]> use temp

Database changed

MariaDB [temp]> show tables;

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

| Tables_in_temp |

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

| a              |

| doctors        |

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

2 rows in set (0.00 sec)

 

MariaDB [temp]> create table aaa(a int);

Query OK, 0 rows affected (0.02 sec)

 

 

 

MariaDB [mysql]> use temp;

Database changed

MariaDB [temp]> show tables;

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

| Tables_in_temp |

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

| a              |

| aaa            |

| doctors        |

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

3 rows in set (0.00 sec)

 

반응형
Posted by 돌고래트레이너
생계/MySQL2017. 9. 8. 23:35

- 1. mysql client 접속 


mysql -u root -p

use mysql
select host, user, password from user;

 

 - 2.1 create user 구문으로 유저생성

 

create user 'test'@'%' identified by 'test';

CREATE USER 'test'@'10.10.10.10' IDENTIFIED WITH 'mysql_native_password' AS
  #authentication_string# REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK;
=> IP추가 시 비밀번호 직접 넣지 않고 동일하게 생성

 - 2.2 insert 구문으로 유저생성

 

insert into user (Host, User, Password, ssl_cipher, x509_issuer, x509_subject, authentication_string)
values ('localhost','test', password('test'),'','','','');

 

insert into user (Host, User, Password, ssl_cipher, x509_issuer, x509_subject, authentication_string)
values ('%','test', password('test'),'','','','');

 

flush privileges;     -- * insert 구문으로 유저생성시엔 반드시 flush 해줘야 적용됨.

 

 - 3. 권한 grant

 

grant all privileges on temp.* to test@'localhost';
grant all privileges on temp.* to test@'%';

grant all privileges on *.* to test@'%';

 

  - 4. 권한 확인

 

show grants for test@'%';

 

 

반응형
Posted by 돌고래트레이너
생계/MySQL2017. 9. 8. 23:33

mariadb 설치하는 방법은 여러가지가 있고, 장단점이 있다. 


- source 설치 : 소스를 다운받아 컴파일하는 방식. 홈페이지에서 소스를 다운받았는데 컴파일오류가 나면 당황스럽다. 
- binary 설치 : 이미 컴파일된 바이너리를 다운받아 설치. 설정도 바꿀수 있고, 컴파일 에러도 피해갈수 있다. 
- yum 설치 : 가장쉽고 실패할 일이 거의 없다. 단점은 설정을 맘대로 바꾸기 힘들다는것 (ex, 설치계정, datadir..)


 binary 설치가 나의 경우엔 가장 적합했다. 




1.설치 준비


- 라이브러리

yum -y install gcc gcc-c++ libtermcap-devel gdbm-devel zlib* libxml* freetype* libpng* libjpeg* iconv flex gmp ncurses-devel cmake.x86_64 libaio

cd /usr/local/
wget -N https://downloads.mariadb.org/interstitial/mariadb-10.2.7/bintar-linux-x86_64/mariadb-10.2.7-linux-x86_64.tar.gz
tar zxvf mariadb-10.2.7-linux-x86_64.tar.gz

ln -s /usr/local/mariadb-10.2.7-linux-x86_64 /usr/local/mysql


# mariadb 사용자 및 그룹 추가
groupadd mysql
useradd -g mysql mysql
passwd mysql


# 권한설정
chown mysql.mysql -R mariadb-10.2.7-linux-x86_64
chmod 750 -R /usr/local/mariadb-10.2.7-linux-x86_64
chown mysql.mysql -R ./mariadb
chown mysql.mysql -R ./mariadb-10.2.7-linux-x86_64



2. 설치 및 설정값 편집 


# my.cnf 복사,편집  (아래 내용은 인터넷에서 가져온거라 잘은 모르겠음)
cp /usr/local/mysql/support-files/my-huge.cnf /etc/my.cnf

- 시스템 메모리가 4G이상일 때 : my-innodb-heavy-4G.cnf
- 시스템 메모리가 1G~2G일 때 : my-huge.cnf
- 시스템 메모리가 512MB정도 일 때 : my-large.cnf
- 시스템 메모리가 32MB~64MB정도 일 때 : my-medium.cnf
- 시스템 메모리가 64MB이하일 때 : my-small.cnf


vi /etc/my.cnf  ( default port 를 변경하고자 한다면.. default = 3306 ) 
[client]
port = 33060
[mysqld]
port = 33060



# mysql(mariadb) 실행데몬 복사

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chown mysql.mysql /etc/init.d/mysqld
chown mysql.mysql /etc/my.cnf

chmod 750 /etc/init.d/mysqld


# mysql 실행데몬 수정
vi /etc/init.d/mysqld


# DB디렉토리 지정 하고 저장 


basedir=/usr/local/mysql
datadir=/DATA01/mysql

chown mysql.mysql -R /DATA01



3. DB 작업 


# DB생성 (mysql 계정으로 로그인)

su - mysql
/usr/local/mariadb/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/DATA01/mysql


# mysql 구동 (mysql 계정으로 로그인)
service mysqld start


# PATH 설정 (mysql 계정으로 로그인)


cd
vi .bash_profile

맨 마지막 줄에
PATH=$PATH:/usr/local/mysql/bin


닫고 저장


source .bash_profile


mysqladmin -u root password 'root123!'


netstat -an |grep 3306


# drop database test

 


** mariadb basedir 경로 변경 -> mysql

반응형
Posted by 돌고래트레이너
생계/MySQL2017. 9. 8. 23:29

MariaDB 를 default 로 설치하면 문자 셋이 latin1 로 되어있다. 한글을 사용하기 부적절하므로 character set 을 변경해줘야 함.



 ** character set 변경 


1. 현재 문자셋 확인 


  show variables like 'c%'

  

2. my.cnf 편집 


  vi /etc/my.cnf


#########################################
[client]
 
default-character-set=utf8


[mysqld]

init_connect="SET collation_connection=utf8_general_ci"
init_connect="SET NAMES utf8"
character-set-server=utf8
collation-server=utf8_general_ci

skip-character-set-client-handshake


[mysql]


default-character-set=utf8

#########################################



3. 재기동


service mysqld restart


4. 문자셋 확인 


  show variables like 'c%'


 



## 여기까지 되면 보통은 거의 해결.


 추가적으로..

 1. character set 변경전에 생성된 테이블들은 따로 변경해주거나 재생성

 2. Toad 같은 tool 에서는 한글 입,출력이 되는데 terminal 에서 error 가 난다면 

      터미널 설정을 확인 


   (ex. secureCRT 경우 Session Options 에서 설정 변경)


   


  


** 오픈소스 DB 를 본격적으로 써본게 처음이라 아직까지는 불신이 있었다. 

문자셋 변경을 해도 터미널에서 한글 insert 가 안되서 오픈소스 탓을 했는데,

내가 사용한 터미널과 툴의 문제였다. 조금더 MariaDB 에 믿음을 가져보자 

반응형
Posted by 돌고래트레이너