Percona Toolkit : MariaDB / MySQL / MongoDB

Percona에서 MariaDB / MySQL / MongoDB를 위한 toolkit을 제공하고 있습니다.

https://www.percona.com/doc/percona-toolkit/LATEST/index.html

 

제공하는 툴들은 아래와 같습니다.

 

서버 운영을 하면서 아쉬운 기능들이 있을때 찾아보면 좋습니다. 일일이 sql 작성을 하거나 script를 만들기 보다는 tookit을 이용하는게 편할때가 있습니다.

MariaDB / MySQL 운영을 하면서 자주 사용할만한 툴로는 pt-query-digest / pt-table-checksum / pt-table-sync / pt-online-schema-change 들이 있습니다.

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

Pt-query-digest

  • 쿼리 분석
  • 슬로우 쿼리 로그, 쿼리 로그. 조회
  • tcpdump를 작동

Pt-table-checksum

  • MySQL의 복제 무결성을 확인.
  • percona 사에서 제공하는 percona tools 중 하나
  • 원래는 maatkit tools 의 부분인 mk-table-checksum
  • 마스터와 리플리케이션이 일치하는지를 파악하기 위한 도구
    1. 마스터 서버에 checksums 테이블 생성
    2. 마스터 서버의 각 테이블의 checksum을 확인해 checksums테이블에 기록.
    3. 리플리케이션을 통해서 테이블 checksums이 전파되면 pt-table-checksum은 각 슬레이브로 접근해서 슬레이브의 데이터와 리플리케이션을 통해서 만들어진 슬레이브의 checksums 테이블 간의 checksum을 비교.
    4. 결과 출력.

Pt-table-sync

서로 다른 서버간에 MySQL 테이블 데이터를 동기화

Pt-online-schema-change

Write 잠금 기능을 제거하고 그 기능을 trigger로 풀어서 원본 테이블의 R/W를 가능하게 했고 trigger를 통해 데이터 동기화를 이루었다.

  1. 새로운 임시테이블 생성
  2. 새로운 임시테이블 alter
  3. Trigger 생성
  4. 데이터 복사
  5. 테이블 리네임 (swap)
  6. Foreign key 업데이트 (존재할 경우)
  7. Old 테이블 drop.

 

Advertisements

Percona Monitoring Plugins

percona에서 MariaDB / MySQL / MongoDB 서버 모니터링을 Nagios / ZABBIX / Cacti 들로 할 수 있도록 plugin을 제공합니다.

https://www.percona.com/doc/percona-monitoring-plugins/LATEST/index.html

 

서버 상태에 따라 장애 상태 진단과 성능과 상태에 대한 각종 지표들을 수집하고 그래프로 보여줄 수 있도록 해 줍니다. Nagios와 ZABBIX 플러그인은 동일한 지표들을 제공하고요. Cacti는 MySQL, MongoDB 이외에 Apache / JMX / Nginx 들의 지표도 같이 제공을 합니다.

 

Nagios / ZABBIX

 

Cacti

 

Percona 기술지원 : MySQL, MariaDB

Percona의 기술지원을 받으면 Percona Server이외에 MySQL, MariaDB에 대한 기술지원을 같이 받을 수 있습니다. MySQL이나 MariaDB enterprise의 기술지원은 각자 자신들의 제품만을 지원하지만 Percona에서는 관련 생태계 제품들을 전부 기술지원 해 줍니다.

https://www.percona.com/services/support/support-tiers-mysql-mariadb

 

Percona의 기술지원을 받으면 MySQL Enterprise는 해당이 안됩니다. 오픈소스에 대한 기술지원을 하는것이기에 오픈소스가 아닌제품은 기술지원이 안된다고 보시면 됩니다.

 

세부 기술지원 사항에서 Cluster 지원으로 Galera와 ProxySQL, HAProxy도 포함이 됩니다.

MySQL community, MariaDB, Percona Server 들의 bug fix들도 전부 제공이 됩니다.

 

Percona를 통해서 MongoDB 기술지원을 받을수도 있습니다.

자세한 사항은 아래 웹페이지를 참고하시면 됩니다.

https://www.percona.com/services/support/support-tiers-mongodb

 

Percona XtraDB Cluster

Percona에서 제공하는 Cluster 제품으로 Percona XtraDB Cluster가 있습니다.

https://www.percona.com/software/mysql-database/percona-xtradb-cluster

 

해당 Cluster는 MariaDB galera cluster를 기반으로 제공하는 cluster입니다.

서비스로 제공하는 세부 기능들은 아래와 같습니다.

  • ProxySQL load balancer
  • Multi-master replication
  • Synchronous replication
  • Data at rest encryption
  • Improved SST Security through simplified configuration
  • Easy to setup encrypted between-nodes communication
  • Increased read/write scalability
  • Zero Data Loss
  • ProxySQL-assisted Percona XtraDB Cluster maintenance mode
  • Automatic node provisioning
  • Percona XtraDB Cluster “strict-mode”
  • Percona Monitoring and Management compatibility

 

오픈소스로 제공하는 ProxySQL에 대한 기술지원을 공식적으로 받을 수 있습니다. galera cluster 이외에 multi-master replication으로 구성을 할 수 있기도 하고요. replication이 기본적으로 async 방식인데요. sync 방식의 replication에 대한 기술지원도 해준다고 합니다. PMM(Percona Monitoring and Management)을 이용한 서버 모니터링과 관리도 기술지원을 해준다고 하네요.

 

기존에 MySQL 기반의 HA(High Availability)는 MHA, MMM 등을 이용한 경우가 많았습니다. 관련 내용은 다음 웹페이지를 참고 하시고요. http://www.osskorea.co.kr/databaseHA.php

 

최근의 MySQL 기반의 HA들은 Database proxy를 이용한 방법으로 많이 검토를 하기 시작하고 있습니다. 대표적인 것들이 MariaDB MaxScale과 오픈소스 ProxySQL인데요. ProxySQL을 이용한 HA구성에 대한 기술지원을 하는곳으로 Percona와 애기를 해 볼 수 있습니다.

 

 

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

 

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 정도까지 개선이 되면 실제 서비스에 적용하기에 좋을것으로 예상됩니다.