Percona Server for MySQL

Percona Server for MySQL에 대한 한글 소개는 아래 웹페이지에 간략하게 있습니다.

http://www.osskorea.co.kr/database.php#percona

 

MySQL의 InnoDB 엔진을 Percona에서 XtraDB 엔진으로 성능을 향상시켜서 오픈소스로 배포하고 있습니다. MariaDB가 10.0 이후에 MySQL 5.6과 기술 방향이 달라지면서 호환성이 차이가 나기 시작 했습니다. Percona 서버는 MySQL을 기반으로 성능을 향상시키고 있어서 호환성 측면에서는 MariaDB보다 Percona 서버가 더 좋습니다.

Percona에서 제공하는 MySQL 관련 제품들을 보면 아래와 같습니다.

  • XtraDB : InnoDB 엔진 성능 향상
  • TokuDB : Fractal-Tree Index / InnoDB 대비 최대 10배 데이터 압축 / hot schema, hot index
  • XtraBackup : XtraDB, InnoDB hot backup
  • Percona Tookit : pt-query-digest, pt-online-schema-change, pt-table-checkum 등의 다양한 MySQL 관련 tookit
  • Perona Monitoring Plugins : Nagios, Zabbix, Cacti 모니터링용 plugin

 

MySQL이나 MariaDB보다 다양한 global variables로 세밀한 설정을 할 수 있습니다. 긴급 보안 패치나 기술지원, hot fix 등에 대해서도 빠르게 대응을 해주고 있습니다.

MySQL, MariaDB, Percona Server 들의 전체적인 버전은 아래 이미지를 참고하시면 됩니다.

mysql percona mariadb history에 대한 이미지 검색결과

최신 정보들은 Percona 홈페이지를 참고하시면 됩니다.

https://www.percona.com/software/mysql-database/percona-server

 

Advertisements

Percona 서버 (MySQL / MongoDB)

MySQL 오픈소스 데이터베이스의 생태계에서 많이 알려진 것중에 Percona 서버가 있습니다. MySQL은 Oracle에 인수된 이후에 핵심 개발자인 monty가 오픈소스로 MariaDB를 만들어서 경쟁을 하고 있고요.

Percona 서버는 MySQL 5.1부터 자체적으로 튜닝을 통해서 더 좋은 성능으로 사용할 수 있습니다. Percona 서버도 오픈소스를 지향합니다.

MySQL이 Oracle로 인수된이후에 Enterprise 버전은 상업 라이센스로 배포를 하고 있고요. MariaDB는 MaxScale에 BSL 상업 라이센스를 적용하고 있습니다. Percona는 전체 제품을 오픈소스로 지향을 하고 있습니다.

 

주요 제품들은 아래와 같습니다.

– Percona Server for Mysql : XtraDB cluster / XtraBackup / TokuDB

– Percona Server for MongoDB / TokuMX

– Percona Monitoring and Management (PMM)

– Percona Toolkit

– Percona Monitoring Plugins

 

MySQL 튜닝을 한 Percona Server 이외에 최근에는 MongoDB도 튜닝을 한 Percona Server를 배포하고 있습니다. XtraDB는 InnoDB를 튜닝한 엔진이고요. TokuDB 엔진을 인수한 이후에 MongoDB 엔진으로도 배포를 하고 있습니다. XtraBackup은 MySQL Enterprise Backup 처럼 Hot Backup을 할 수 있는 오픈소스 입니다.

 

MySQL을 검토하면서 좀 더 안정적이고 적극적인 기술지원을 받고 싶다면 Percona 서버를 검토해 보면 좋습니다. 기술지원 측면에서 MySQL이나 MariaDB보다 적극적일때가 많다고 생각됩니다.

자세한 내용은 http://percona.com/을 참고하시고요. 국내 기술지원은 오뉴이노베이션( http://ohnew.co.kr/ )에서 하고 있습니다.

 

 

 

Percona Data Recovery Tool for InnoDB 복구

InnoDB 데이터 파일을 복구하는 중에 아래와 같이 incorrect key 문제로 복구가 안되는 경우에 percona data recovery tool 을 이용해서 데이터를 복원할 수 있습니다.

mysql> alter table innovation import tablespace;
ERROR 1034 (HY000): Incorrect key file for table 'innovation'; tr
mysql> repair table innovation;

 

아래 percona data recovery tool for innodb 웹페이지를 참고하시기 바랍니다.

https://www.percona.com/docs/wiki/innodb-data-recovery-tool_start.html

 

간략하게 절차는 아래와 같습니다.

  • percona data recovery tool for innodb 설치
  • create_defs.pl 실행 : table schema 정의
  • make : 소스 컴파일
  • constraint__parser 실행 : data 추출

 

[root@ohnew percona]# ./create_defs.pl --host=127.0.0.1 --port=13306 --user=root --db=ohnew --table=innovation > include/table_defs.h
[root@ohnew percona]# cat include/table_defs.h
#ifndef table_defs_h
#define table_defs_h

// Table definitions
table_def_t table_definitions[] = {
 {
 name: "innovation",
 {
 { /* varchar(255) */
 name: "series",
 type: FT_CHAR,
 min_length: 0,
 max_length: 765,

has_limits: FALSE,
 limits: {
 can_be_null: FALSE,
 char_min_len: 0,
 char_max_len: 765,
 char_ascii_only: TRUE
 },

can_be_null: FALSE
 },
 { /* */
 name: "DB_TRX_ID",
 type: FT_INTERNAL,
 fixed_length: 6,

can_be_null: FALSE
 },
 { /* */
 name: "DB_ROLL_PTR",
 type: FT_INTERNAL,
 fixed_length: 7,

can_be_null: FALSE
 },
 { /* bigint(20) */
 name: "user_id",
 type: FT_INT,
 fixed_length: 8,

has_limits: FALSE,
 limits: {
 can_be_null: TRUE,
 int_min_val: -9223372036854775806LL,
 int_max_val: 9223372036854775807LL
 },

can_be_null: TRUE
 },
 { type: FT_NONE }
 }
 },
};

#endif
[root@ohnew percona]# make
gcc -DHAVE_OFFSET64_T -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -D_LARGEFILE_SOURCE=1 -Wall -O3 -g -I include -I mysql-source/include -I mysql-source/innobase/include -c tables_dict.c -o lib/tables_dict.o
gcc -DHAVE_OFFSET64_T -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -D_LARGEFILE_SOURCE=1 -Wall -O3 -g -I include -I mysql-source/include -I mysql-source/innobase/include -c check_data.c -o lib/check_data.o
gcc -DHAVE_OFFSET64_T -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -D_LARGEFILE_SOURCE=1 -Wall -O3 -g -I include -I mysql-source/include -I mysql-source/innobase/include -o constraints_parser constraints_parser.c lib/tables_dict.o lib/print_data.o lib/check_data.o lib/libut.a lib/libmystrings.a
gcc -DHAVE_OFFSET64_T -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -D_LARGEFILE_SOURCE=1 -Wall -O3 -g -I include -I mysql-source/include -I mysql-source/innobase/include -static -lrt -o page_parser page_parser.c lib/tables_dict.o lib/libut.a
[root@ohnew percona]# ./constraints_parser -5 -f innovation.ibd > ./innovation.tsv &
[1] 4604
[root@ohnew percona]# LOAD DATA INFILE '/home/percona/innovation.tsv' REPLACE INTO TABLE `innovation` FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES STARTING BY 'innovation\t' (series, user_id);

[1]+ Done ./constraints_parser -5 -f innovation.ibd > ./innovation.tsv

 

 

 

 

MariaDB(MySQL) ibdata 파일 손상시에 innodb 테이블 복구 방법

InnoDB 사용을 하다가 ibdata 파일 손상시에 테이블을 복구할 수 있는 방법이 있습니다.

ibd 파일이 손상됐을때는 force recovery ( https://dev.mysql.com/doc/refman/5.7/en/forcing-innodb-recovery.html ) 방법으로 복구를 하는데요. ibdata 파일이 깨졌을때는 force recovery로 복구가 안될 수 있습니다.

이럴때 아래 방법으로 복구를 할 수 있습니다.

* mysqlfrm 유틸리티 설치
# wget https://repo.mysql.com//mysql57-community-release-el6-11.noarch.rpm
# rpm -ivh mysql57-community-release-el6-11.noarch.rpm
# yum install mysql-utilities

* mysqlfrm 유틸리티로 schema 확인
# mysqlfrm –basedir=/usr/local/mysql –user=root –port=13307 /data/ohnew/innovation.frm –verbose
# mysqlfrm –basedir=/usr/local/mysql –user=root –port=13307 /data/ohnew/osskorea.frm –verbose

* schema 복구하기
> create table restore.innovation …..;
> ALTER TABLE innovation DISCARD TABLESPACE;
# cp /data/ohnew/innovation.ibd /data/restore/
> ALTER TABLE innovation IMPORT TABLESPACE;
> select count(*) from restore.innovation;

 

schema 복구할때 복구할 테이터베이스에 mysqlfrm 유틸리티로 확인한 create table 이용해서 테이블 schema를 먼저 복원합니다.

생성된 table의 ibd 파일을 discard 시키고 기존에 사용하던 ibd 파일을 복사해서 덮어씁니다.

테이블 데이터 복원을 위해서 import tablespace를 하고, 테이터를 확인합니다.

MariaDB AX – OLAP / data warehousing

MariaDB에서 OLTP와 OLAP를 지원하기 위해서 제품을 TX / AX 이름으로 제품군을 분리했습니다.

MariaDB AX는 ColumnStore 엔진을 기반으로 OLAP / data warehousing 관련 서비스에서 사용을 위한 데이터베이스입니다.

 

ColumnStore엔진은 MariaDB에서 InfiniDB를 인수해서 개선한 엔진입니다.

 

MariaDB ColumnStore 엔진은 2016년말에 1.0.6 GA 버전이 나왔습니다.

http://mariadb.com/ 홈페이지에서의 아키텍처 구성은 아래와 같습니다.

MariaDB-columnStore_v1_final.png

 

데이터 파일 사이즈로 볼때 1TB 이하는 MariaDB innodb 엔진을 사용해서 OLTP 관련 서비스에 사용하는게 좋고, ColumnStore 엔진은 1TB 이상의 OLAP 관련 서비스에 좋다고 합니다.

국내에서도 데이터 분석을 위해서 적용하는 사례가 있습니다.

Columnar storage 이기에 데이터 분산으로 대용량 처리에 적합합니다. 기존 MariaDB와 성능적으로 같이 큰 차이라고 하면 massively parallel processing (MPP)이라고 합니다.

기존 opensource 데이터베이스들에 비해서 failover 관련한 기능도 괜찮아 보입니다.

 

데이터분석이나 통계 처리를 위한 opensource database로 사용하기에 좋겠습니다.

 

MariaDB TX 2.0

MariaDB의 제품군이 TX와 AX로 나뉘었습니다.

TX는 OLTP를 처리를 위한 제품군들로 구성이 되어 있습니다.

 

http://mariadb.com/ 웹사이트의 주요 사항은 아래와 같습니다.

Completeness and compatibility
– Common Table Expressions
– Window functions
– JSON & GeoJSON functions
– EXECUTE IMMEDIATE
– CHECK (constraints)
– DEFAULT (BLOB/TEXT)
– DECIMAL (38 places)

Performance and scalability
– MyRocks storage engine
– InnoDB enhancements
– Binary Log read throttling
– Binary Log compression
– Virtual Column indexes
– Query cache
– Streaming inserts

Security and recovery
– Per user resource limits
– Enforced TLS connections
– Data masking
– Prepared Statement filtering
– Result Set limiting
– Delayed replication
– Binary Log based rollback

개인적으로 관심이 가는 사항들은 MyRocks 엔진을 지원하면서 소개를 적극적으로 하는것 같습니다.

데이터 파일 사이즈에 대한 압축 성능이 좋아서 IO 성능에서도 좋을 것으로 기대됩니다.

CTE와 Window functions 지원을 통해서 oracle connectby 등의 대안으로 사용하고 다양한 함수 활용으로 쿼리 튜닝에 폭이 넓어 질것입니다.

JSON 지원 관련해서 MySQL 하고 얼마나 호환성을 유지하는지도 확인해 볼 필요가 있겠습니다.

보안/복구 관련해서도 기능이 추가 됐는데요. MaxScale하고 잘 응용해서 사용하면 좋을듯 합니다.

 

현재 MariaDB Server 최신 버전은 10.2.6 GA  입니다.

2017년 5월 23일에 배포 됐습니다. 아직 마이너버전이 낮아서 안정성이 중요한 서비스에는 적용하기에는 좀 더 기다리는것이 좋을 듯 합니다.

내년초에 10.2.15 정도까지 개선이 되면 실제 서비스에 적용하기에 좋을것으로 예상됩니다.

mariabackup – MariaDB backup

MariaDB에서 Xtrabackup을 이용해서 mariabackup 툴을 배포했습니다.

https://mariadb.com/resources/blog/mariadb-backup-released-mariadb-server-10123

 

기본적인 사용법은 Xtrabackup 하고 동일합니다.

MairaDB 10.1.23을 설치하면 bin 디렉토리에 mariabackup 실행파일이 있습니다.

  • windows 버전에서도 지원이 됩니다.

MariaDB에서 제공하는 암호화를 이용했을때 backup 하기 위한 기능이 추가 되어 있습니다.

encryption 관련 옵션은 아래와 같은것들이 있습니다.

–plugin-dir=name : Server plugin directory
–plugin-load=name : encryption plugin to load
–innodb-encrypt-log : encryption plugin to load

 

Xtrabackup에 있는 ssl 관련 옵션은 빠져 있습니다.

–ssl : Enable SSL for connection (automatically enabled with
other flags).
–ssl-ca=name : CA file in PEM format (check OpenSSL docs, implies
–ssl).
–ssl-capath=name : CA directory (check OpenSSL docs, implies –ssl).
–ssl-cert=name : X509 cert in PEM format (implies –ssl).
–ssl-cipher=name : SSL cipher to use (implies –ssl).
–ssl-key=name : X509 key in PEM format (implies –ssl).
–ssl-crl=name : Certificate revocation list (implies –ssl).
–ssl-crlpath=name : Certificate revocation list path (implies –ssl).
–ssl-verify-server-cert : Verify server’s “Common Name” in its cert against
hostname used when connecting. This option is disabled by

MariaDB (MySQL) 성능 측정 툴

MariaDB, MySQL 서버의 성능을 측정할 수 있는 툴들로 아래와 같은 것들이 있습니다.

  • Percona TPCC
  • sysbench
  • Apache JMeter
  • KaKao MRTE

 

sysbench를 이용하는 방법이 가장 많이 찾을 수 있을건데요.

개인적으로는 Percona TPCC 툴을 사용하는게 더 좋은거 같습니다.

https://www.percona.com/blog/2013/07/01/tpcc-mysql-simple-usage-steps-and-how-to-build-graphs-with-gnuplot/

 

다양한 상황에 대한 테스트를 하려면 JMeter를 이용하면 좋습니다.

 

실제 운영중인 서비스와 동일한 환경으로 테스트를 하려면 KaKao MRTE를 사용할 수 있습니다.

http://tech.kakao.com/2016/02/16/opensource-2-mtre/

 

mariadb(mysql) open_files_limit 설정값

https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_open_files_limit

 

open_files_limit 값은 my.cnf에 설정을 하거나 –open-files-limit 지정을 해도 global variables 값이 다를 수 있습니다.

해당 값은 아래 3가지 조건중에 큰값으로 된다고 합니다.

1) 10 + max_connections + (table_open_cache * 2)
2) max_connections * 5
3) open_files_limit value specified at startup, 5000 if none

 

mariadb는 아래와 같이 설명되어 있습니다.

If set to 0, then mysqld will reserve max_connections*5 or max_connections + table_open_cache*2 (whichever is larger) number of files.

https://mariadb.com/kb/en/mariadb/server-system-variables/#open_files_limit