May 27, 2019 - Redis Sentinel : Docker

Comments

Docker 환경에서 Redis Sentinel replication 구성하기

Redis Sentinel 구성을 위해서 4개의 container를 사용합니다.

  • redis-snt-1 : redis master
  • redis-snt-2,3,4 : redis slave, sentinel

sentinel 구성을 위해서 아래 파일들을 사용합니다.

  • redis.conf : redis 환경 설정 파일
  • sentinel.conf : sentinel 환경 설정 파일
  • redis-start.sh : docker 실행 스크립트

redis.conf

일반적인 redis.conf 파일을 사용합니다.

# port 7901

dir "/data"
logfile "redis.log"

maxclients 1128
maxmemory 1000000000
maxmemory-policy volatile-lru

appendonly yes
appendfsync everysec
repl-backlog-size 50mb

sentinel.conf

port 8179
sentinel monitor rsmaster redis-snt-1 6379 1
sentinel down-after-milliseconds rsmaster 3000

bind 0.0.0.0
protected-mode yes
dir "/data/sentinel"
logfile "sentinel.log"
daemonize yes

redis-start.sh

#!/bin/sh
set -e

[ -d /data/sentinel ] || mkdir -p /data/sentinel && chown -R redis:redis /data

gosu redis redis-sentinel /usr/local/etc/redis/sentinel.conf
gosu redis redis-server /usr/local/etc/redis/redis.conf --slaveof redis-snt-1 6379

redis sentinel 구성

현재 디렉토리 밑으로 docker 별로 사용할 conf, sh 파일을 복사합니다.
redis master로 사용할 서버에 대한 설정을 변경합니다.
docker run을 실행하면서 sentinel을 같이 실행하기 위해서 start.sh 실행으로 시작합니다.

for ind in `seq 1 4`; do \
 mkdir -p $PWD/data/conf/node$ind
 cp redis-master.conf data/conf/node$ind/redis.conf
 cp sentinel.conf data/conf/node$ind/sentinel.conf
 cp redis-start.sh data/conf/node$ind/start.sh
done

# chown 999:999 data/conf/node*/*.conf
# sed -e 's/gosu redis redis-sentinel/#gosu redis redis-sentinel/' redis-start.sh > data/conf/node1/start.sh
# sed -e 's/--slaveof redis-snt-1 6379//' redis-start.sh > data/conf/node1/start.sh

### docker run
for ind in `seq 1 4`; do \
 docker run -d \
 -v $PWD/data/conf/node$ind:/usr/local/etc/redis \
 -v $PWD/data/node$ind:/data \
 --name redis-snt-$ind --net redis-cluster \
 redis /usr/local/etc/redis/start.sh
done

docker에서 redis cluster 이용하는게 좋겠으나 특정 서비스에서 sentinel 사용을 요구할때 최소의 container로 sentinel 구성을 어떻게 하면 좋을까 고민하다가 하나의 container에 redis 서버와 sentinel을 같이 실행할 수 있겠다 싶었습니다.

May 27, 2019 - MariaDB replication : Docker

Comments

Docker 환경에서 MariaDB replication 구성하기

MariaDB(MySQL) replication 구성을 하려면 my.cnf 설정을 서버별로 맞춰줘야 합니다.
성능이나 관리를 위해서 데이터 디렉토리, 로그 디렉토리들을 기본 설정이 아닌 원하는 디렉토리로 해야 할 필요도 있습니다.
docker 환경에서 MariaDB Replication 구성을 좀 더 쉽게 하기 위한 my.cnf와 shell 스크립트를 만들어 봤습니다.

my.cnf

데이터는 /MariaDB/data 디렉토리를 사용하고 로그는 /MariaDB/log 디렉토리를 사용합니다.
replication을 위해서 binlog와 relaylog 디렉토리들은 /MariaDB/log 디렉토리 하위로 사용합니다.

####
#### Ohnew Innovation
#### MariaDB my.cnf
####

[client]
port		= 3306
socket		= /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket		= /var/run/mysqld/mysqld.sock
nice		= 0
# syslog
#skip_log_error
#syslog

[mysqld]
# basic setting
#user		= mysql
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
port		= 3306
basedir		= /usr
datadir		= /MariaDB/data
tmpdir		= /tmp
lc_messages_dir	= /usr/share/mysql
lc_messages	= en_US
skip-external-locking
bind-address=0.0.0.0

skip-host-cache
skip-name-resolve

#server-id=2179

#query_cache setting
query_cache_type    = 0
query_cache_size    = 0
query_cache_limit   = 0

# Log file setting
log-error           = /MariaDB/log/mariadb.err
slow_query_log      = 1
slow_query_log_file = /MariaDB/log/slow-query.log
long_query_time     = 3
#log-queries-not-using-indexes
#log_slow_admin_statements

log-bin             = /MariaDB/log/binary/mariadb-bin
binlog_cache_size   = 2M
max_binlog_size     = 100M
expire_logs_days    = 10
sync_binlog		    = 1
binlog_format       =row

# slaves
relay_log           = /MariaDB/log/binary/relay-bin
#log_slave_updates
#read_only

# Time-out setting
wait_timeout         = 600
interactive_timeout  = 3600
connect_timeout		 = 5

# transaction isolation setting
transaction_isolation = READ-COMMITTED

# etc setting
back_log            = 1024
max_connections     = 1024
max_connect_errors  = 1024
table_open_cache    = 2048
max_allowed_packet  = 1024M
max_heap_table_size = 1024M
sort_buffer_size    = 8M
join_buffer_size    = 8M
thread_cache_size   = 128
#thread_concurrency = 36
tmp_table_size      = 1024M

# character set setting
#init_connect = "SET collation_connection = utf8_general_ci"
#init_connect = "SET NAMES utf8"
character-set-server = utf8mb4
#collation-server     = utf8mb4_general_ci 
#character_set_server = utf8mb4 
#collation_server     = utf8mb4_general_ci

# innodb setting
innodb_file_per_table          = 1
innodb_buffer_pool_size        = 512M
innodb_log_buffer_size         = 16M
innodb_lock_wait_timeout       = 50
innodb_thread_sleep_delay      = 0
innodb_commit_concurrency      = 36
innodb_doublewrite             = 0
innodb_flush_log_at_trx_commit = 2
innodb_thread_concurrency      = 36
#innodb_log_files_in_group      = 3
innodb_flush_method	           = O_DIRECT
innodb_log_file_size           = 256M
#innodb_data_file_path    = ibdata1:1024M;ibdata2:1024M;ibdata3:10M:autoextend

# use MyISAM
key_buffer_size          = 128M
read_buffer_size         = 2M
read_rnd_buffer_size     = 16M
bulk_insert_buffer_size  = 64M
myisam_sort_buffer_size  = 512M
myisam_max_sort_file_size= 512M
myisam_repair_threads    = 1
myisam_recover

# Galera
#wsrep_on=ON
#wsrep_provider=
#wsrep_cluster_address=
#default_storage_engine=InnoDB
#innodb_autoinc_lock_mode=2
#wsrep_slave_threads=1

[mysqldump]
max_allowed_packet	= 1024M
quick
#quote-names

[mysqld_safe]
open_files_limit = 8192

maria-create.sh

각 container 들의 cnt, data, log 디렉토리를 생성하고 my.cnf에서 server-id 설정을 변경합니다.
4개의 docker container를 생성합니다. (maria1 ~ maria4)
maria3 서버를 replication master 서버로 사용합니다.
master 서버에 slave 서버들이 replication slave로 사용할 repl 계정을 만듭니다.
GTID 사용해서 replication 연결을 하기 위한 master position을 GTIDpos 변수에 설정합니다.
master 서버 이외의 container들을 change master 명령으로 slave 서버 설정을 합니다.

#!/bin/bash
####
#### Ohnew Innovation
#### MariaDB Replication : Docker
####


Nodes=4 
NodeMaster=3
MyPass="ohnew21&("

for i in `seq 1 $Nodes`; do 
    mkdir -p $PWD/conf/node$i $PWD/data/node$i $PWD/log/node$i/binary
    cp my.cnf $PWD/conf/node$i
    sed -i "s/#server-id=2179/server-id=$i/g" conf/node$i/my.cnf
done

chown -R 999:999 ./data/*
chown -R 999:999 ./log/*

for i in `seq 1 $Nodes`; do 
    docker run -d -it \
    --network=maria --name=maria$i --memory-swappiness=1 \
    --mount type=bind,src=$PWD/conf/node$i,dst=/etc/mysql \
    --mount type=bind,src=$PWD/data/node$i,dst=/MariaDB/data \
    --mount type=bind,src=$PWD/log/node$i,dst=/MariaDB/log \
    -e MYSQL_ROOT_PASSWORD="$MyPass" \
    mariadb
done

echo -ne "maria$NodeMaster "
while true; do
  chkPing=`docker container exec maria$NodeMaster mysqladmin -s -p"$MyPass" ping > chk.ping`
  if grep "mysqld is alive" chk.ping ; then
    break
  fi
  echo -ne "."
  sleep 1
done

docker container exec maria$NodeMaster \
    mysql -p"$MyPass" -e \
      "CREATE USER 'repl'@'%' IDENTIFIED BY '$MyPass'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';"

GTIDpos=`docker container exec maria$NodeMaster mysql -s -p"ohnew21&(" -e "select @@global.gtid_binlog_pos"`

for i in `seq 1 $Nodes`; do 
  if [ "$i" -eq "$NodeMaster" ] ; then
    echo -ne ""
  else

    echo -ne "maria$i "
    while true; do
      chkPing=`docker container exec maria$i mysqladmin -s -p"$MyPass" ping > chk.ping`
      if grep "mysqld is alive" chk.ping ; then
        break
      fi
      echo -ne "."
      sleep 1
    done

    docker container exec maria$i \
      mysql -hmaria$i -p"$MyPass" -e \
      "SET GLOBAL read_only = 1; SET GLOBAL gtid_slave_pos = '$GTIDpos'; CHANGE MASTER TO MASTER_HOST='maria$NodeMaster', MASTER_USER='repl', MASTER_PASSWORD='$MyPass', MASTER_USE_GTID = current_pos; START SLAVE;"
    
    NodeSlave=$i

  fi
done

docker container exec maria$NodeSlave mysql -s -p"ohnew21&(" -e "show slave status\G" | grep Running:

스크립트 실행

my.cnf와 maria-create.sh 파일을 동일한 디렉토리에 만들고 maria-create.sh 파일을 실행하면 4개의 container가 만들어지고, 해당 디렉토리 밑으로 conf, data, log 디렉토리들에 node1, node2, node3, node4 서버별로 관련 파일들이 생깁니다.

docker에서는 galera cluster를 사용하는게 replication 설정보다 구성하기가 좋을거 같습니다. MaxScale이나 ProxySQL같은 DB Proxy를 어떻게 사용할것인지에 따라서 장단점은 있겠습니다.

May 13, 2019 - Percona - MySQL performance : kubernetes

Comments

Percona - MySQL performance : kubernetes

Percona 블로그에 Kubernetes 환경에서 MySQL 성능 관련한 글이 올라 왔습니다. https://www.percona.com/blog/2019/05/09/measuring-mysql-performance-kubernetes/

기본적인 배포로는 CPU의 성능을 제대로 사용하지 못해서 50% 이하로 사용을 한다고 합니다.
YAML에서 아래와 같이 CPU, memory 설정을 해주면 K8S 없는 일반적인 서버의 90% 성능으로 사용을 할 수 있다고 합니다. 90% 수준의 성능은 K8S 사용을 감안하면 괜찮습니다.

resources:
    requests:
        cpu: "55500m"
        memory: "150Gi"
    limits:
        cpu: "55500m"
        memory: "150Gi"

실제 환경에서는 여러 상황들을 고려해서 성능 측정을 하고 적절한 설정값을 찾아야 겠습니다.

May 13, 2019 - MariaDB Storage Engine - AWS S3

Comments

MariaDB Storage Engine - AWS S3

MariaDB 10.5의 새로운 기능으로 AWS S3 이용할 수 있는 Storage Engine이 추가 됩니다. https://mariadb.com/kb/en/library/using-the-s3-storage-engine/

S3 스토리지 엔진은 읽기 전용이며 MariaDB 테이블을 Amazon S3에 보관하거나 S3 API를 이용해서 타사 공용 또는 사설 클라우드의 데이터를 MariaDB에서 읽을 수 있습니다.

S3 테이블을 생성하면 로컬 스토리지에 frm 파일을 저장한다고 합니다. S3에서 테이블 정의가 변경되고 로컬 캐시에 있으면 FLUSH TABLES를 실행하여 MariaDB가 변경 사항을 확인하고 .frm 파일을 업데이트 합니다.

aria_s3_copy 툴을 이용해서 S3 스토리지 엔진을 활용할 수 있다고 합니다. .aria_s3_copy는 S3에서 Aria 테이블을 복사하는 데 사용하는 도구입니다.

May 11, 2019 - MySQL 8.0 Enterprise : Docker 설치

Comments

MySQL 8.0 Enterprise : Docker 설치

Docker에서 오픈소스 MySQL community를 설치하는건 일반적으로 아래와 같이 docker pull 등의 명령으로 docker image를 다운로드 받아서 사용을 할 수 있습니다.

# docker run -p 3307:3306 -d --name mysql -e MYSQL_ROOT_PASSWORD=password mysql/mysql-server

상용라이선스인 MySQL Enterprise는 어떻게 사용할 수 있는지에 대해서 아래 웺사이트에서 알 수 있습니다. https://scriptingmysql.wordpress.com/2019/05/10/mysql-server-deployment-with-docker-basic-installation-instructions-for-both-the-community-and-enterprise-versions/

MySQL Enterprise 구매를 하면 주는 Oracle Support portal 계정으로 로그인해서 docker image를 검색하고 다운로드 받을 수 있습니다. 다운로드 받은 docker image를 아래와 같이 docker에 올려주면 됩니다.

# docker load -i mysql-enterprise-server-8.0.16.tar

May 11, 2019 - MariaDB / MySQL / Percona : Docker 이미지 비교

Comments

MariaDB / MySQL 8.0 / Percona : Docker 이미지 비교

severalnines에서 MariaDB / MySQL / Percona 서버들에 대한 Docker 이미지를 비교 한게 있어서 살펴 봤습니다.
https://severalnines.com/blog/popular-docker-images-mysql-and-mariadb-server

해당 글을 보다가 좀 더 궁금한 사항들이 있어서 버전별로 좀 더 확인을 해 봤습니다.

repositoryversion(tag)sizeOS
mariadb10.4392MBUbuntu 18.04
mariadb10.3 (latest)381MBUbuntu 18.04
mariadb10.2378MBUbuntu 18.04
mariadb10.1391MBUbuntu 18.04
mariadb10.0352MBUbuntu 16.04
mariadb5.5352MBUbuntu 14.04
mariadb/columnstore1.21.15GBCentOS 7
percona8.0727MBCentOS 7
percona5.7 (latest)583MBCentOS 7
percona5.6421MBCentOS 7
percona5.5294MBDebian 9
mysql8.0 (latest)443MBDebian 9
mysql5.7373MBDebian 9
mysql5.6256MBDebian 9
mysql5.5205MBDebian 9
mysql/mysql-server8.0289MBOracle Linux 7
bitnami/mariadb10.1 (latest)261MBDebian 9
bitnami/mysql5.7 (latest)287MBDebian 9
centos/mariadb-102-centos710.2456MBCentOS 7
centos/mariadb-101-centos710.1476MBCentOS 7
centos/mariadb-100-centos710.0439MBCentOS 7
centos/mysql-80-centos78.0569MBCentOS 7
centos/mysql-57-centos75.7452MBCentOS 7
centos/mysql-56-centos75.6407MBCentOS 7
yobasystems/alpine-mariadb10.2228MBalpine 3.8
ipburger/mysql-alpine.docker10.2154MBalpine 3.8
wangxian/alpine-mysql10.1176MB alpine 3.4
  • MariaDB 이미지들은 5.5부터 버전이 올라가면서 이미지 크기도 조금씩 커졌습니다.
  • MySQL은 5.7버전까지는 MariaDB하고 이미지 크기가 비슷하다가 8.0 버전에서 MariaDB보다 커졌습니다.
  • Percona 서버들이 이미지 크기가 제일 크긴 합니다.
  • MariaDB ColumnStore 엔진은 1GB가 넘습니다.
  • CentOS에서의 MariaDB / MySQL 이미지들이 더 크긴 하고요.
  • alpine 리눅스를 사용하면 이미지 크기를 100~200MB 정도 줄일 수 있습니다.

Apr 27, 2019 - MySQL 8.0 자동 mysql_upgrade

Comments

MySQL 8.0 자동 mysql_upgrade

https://elephantdolphin.blogspot.com/2019/04/bye-bye-to-mysqlupgrade-change-to.html

MySQL 8.0.16 release Notes에 mysql_upgrade 관련한 변경 사항이 있다고 합니다. 기존에는 version upgrade 하면 mysql_upgrade 실행을 해서 schema 변경 사항들을 최신으로 적용을 해줬습니다. MySQL 8.0.16부터는 수동으로 mysql_upgrade 하던것을 자동으로 하는것으로 변경 됐다고 합니다. 앞으로는 MySQL 업그레이드를 하고 서버 시작을 하면 자동으로 upgrade를 하게 되어서 mysql_upgrade는 deprecated 된다고 합니다.

Apr 24, 2019 - Percona PMM - PostgreSQL monitoring

Comments

Percona PMM - PostgreSQL 오픈소스 데이터베이스 모니터링

https://www.percona.com/blog/2019/04/23/adding-postgresql-queries-overview-dashboards-to-the-pmm-plugin/

PMM(Percona Monitoring and Management)에서 오픈소스 데이터베이스 PostgreSQL 모니터링이 추가 됐다고 합니다.

PMM은 오픈소스로 MySQL 데이터베이스 모니터링을 하는 툴입니다. MySQL과 MariaDB, Percona server for MySQL, Amazon RDS 데이터베이스들을 모니터링 할 수 있습니다. MySQL 모니터링 이후에 MongoDB, PostgreSQL 모니터링을 할 수 있습니다.

각 데이터베이스별로 세부 모니터링 항목들은 아래 웹페이지에서 확인 할 수 있습니다. https://www.percona.com/doc/percona-monitoring-and-management/index.metrics-monitor.dashboard.html

Apr 18, 2019 - MariaDB SQL_MODE=MSSQL 지원

Comments

MariaDB SQL_MODE=MSSQL 지원

https://mariadb.com/kb/en/library/sql_modemssql/

MariaDB 10.4.6부터 SQL_MODE=MSSQL 설정이 지원된다고 합니다. 일단 제한적으로 기본적인 syntax만 지원을 하는 수준이고 요청에 따라서 관련 지원을 늘려나갈 계획이라고 합니다.

SQL_MODE=ORACLE 지원에 이어서 MSSQL 지원을 하는것으로 보면 나중에 다른 사용 데이터베이스들도 지원을 할 수도 있지 않을까 싶습니다.

https://mariadb.org/donate/

MariaDB Foundation의 Platinum Sponsor중에 Microsoft가 있는데요. 이번 지원과 관련해서 어떤 입장인지 궁금하긴 하네요. Microsoft가 SQL_MODE=MSSQL을 적극 지원 한다면 빠르게 관련 기능이 MariaDB 주요 기능으로 사용될 수가 있을 듯 합니다.

Apr 13, 2019 - stack overflow Developer Survey Results 2019 : R / SQL / Python

Comments

stack overflow Developer Survey Results 2019 : R / SQL / Python

stack overflow Developer Survey Results 2019

https://insights.stackoverflow.com/survey/2019

Programming, Scripting, and Markup Languages

HTML/CSS 63.5%
SQL 54.4%
Python 41.7%
....
R 5.8%

HTML, SQL 사용이 많고 Python과 R의 전체적인 사용자는 많은 차이가 있습니다.

loved, dreaded, wanted에 대한 비율은 아래와 같습니다.

language   loved     dreaded     wanted  
R
51.7% 48.3% 4.9%
SQL
64.1% 35.9% 7.6%
Python
73.1% - 25.7%

What Languages Are Associated with the Highest Salaries Worldwide?

R $64k
Python $63k
SQL $57k

R과 Python 사용자들의 연봉은 비슷합니다. 데이터 분석쪽으로만 비교를 한 자료가 있으면 좋겠습니다.

아래는 관련된 직업의 연봉입니다.

Salary by Developer Type

Engineering manager $95k
Engineer, site reliability $85k
DevOps specialist $71k
Engineer, data $66k
Data scientist or machine learning specialist $61k
Data or business analyst $59k
System administrator $55k
Database administrator $54k

Salary and Experience by Language

stackoverflow 2019 salary by language