normal development

  • Home

  • Archives

  • Categories

  • Tags

  • Admire

  • About

docker mysql galera clustering

Posted on 2019-06-29 | Edited on 2020-07-17 | In docker

mysql galera clustering

  • galera 공식 사이트 : http://galeracluster.com/2015/05/getting-started-galera-with-docker-part-1/
  • marriadb 설명 : https://mariadb.com/kb/en/library/getting-started-with-mariadb-galera-cluster/

docker hub에 있는 image 이용하기

  1. image pull
1
sudo docker pull erkules/galera
  1. container 실행
1
sudo docker run -d -p 3306:3306 -p 4567:4567 -p 4444:4444 -p 4568:4568 --name nodea erkules/galera --wsrep-cluster-address=gcomm://

image 만들어서 사용하기

  1. 필요한 파일 만들기
  • Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
FROM ubuntu:16.04
ENV VERSION 20180305
ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update

RUN apt-get install -y software-properties-common
RUN apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA
RUN add-apt-repository 'deb http://releases.galeracluster.com/mysql-wsrep-5.7/ubuntu/ xenial main'
RUN add-apt-repository 'deb http://releases.galeracluster.com/galera-3/ubuntu/ xenial main'

COPY galera.pref /etc/apt/preferences.d/galera.pref

RUN apt-get update

RUN apt-get -y install galera-3 galera-arbitrator-3 mysql-wsrep-5.7 rsync lsof

RUN rm -r /var/lib/mysql

COPY my.cnf /etc/mysql/my.cnf
COPY entrypoint.sh /entrypoint.sh
RUN chmod 700 /entrypoint.sh
EXPOSE 3306/tcp
ENTRYPOINT ["/entrypoint.sh"]

LABEL mysql_verion=5.7
  • docker.cnf
1
2
3
4
5
6
[mysqld]
bind-address = 0.0.0.0
user = mysql
log_bin
[mysql]
prompt = "\h\> "
  • my.cnf
1
2
3
4
5
6
7
8
9
10
11
12
[mysqld]
user = mysql
bind-address = 0.0.0.0
wsrep_provider = /usr/lib/galera/libgalera_smm.so
wsrep_sst_method = rsync
default_storage_engine = innodb
binlog_format = row
innodb_autoinc_lock_mode = 2
innodb_flush_log_at_trx_commit = 0
query_cache_size = 0
query_cache_type = 0
skip_name_resolve
  • entrypoint.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/bin/bash
# Taken from the official mysql-repo
# And changed for simplification of course :)
# I.e. DATADIR is always /var/lib/mysql
# We don't force the usage of MYSQL_ALLOW_EMPTY_PASSWORD
# erkan.yanar@linsenraum.de
set -e
set -x
# Check ENV (MYSQL_) and stop if they are not known variables
# TODO

tempSqlFile='/tmp/mysql-first-time.sql'

mysqld --initialize --datadir=/var/lib/mysql

cat > "$tempSqlFile" <<-EOSQL
-- What's done in this file shouldn't be replicated
-- or products like mysql-fabric won't work
SET @@SESSION.SQL_LOG_BIN=0;

DELETE FROM mysql.user ;
CREATE USER 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}' ;
GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION ;
DROP DATABASE IF EXISTS test ;
EOSQL


if [ "$MYSQL_DATABASE" ]; then
echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` ;" >> "$tempSqlFile"
fi

if [ "$MYSQL_USER" -a "$MYSQL_PASSWORD" ]; then
echo "CREATE USER '$MYSQL_USER'@'%' IDENTIFIED BY '$MYSQL_PASSWORD' ;" >> "$tempSqlFile"
echo "CREATE USER '$MYSQL_USER'@'localhost' IDENTIFIED BY '$MYSQL_PASSWORD' ;" >> "$tempSqlFile"
fi
if [ "$MYSQL_USER" -a ! "$MYSQL_PASSWORD" ]; then
echo "CREATE USER '$MYSQL_USER'@'%' ;" >> "$tempSqlFile"
echo "CREATE USER '$MYSQL_USER'@'localhost' ;" >> "$tempSqlFile"
fi

if [ "$MYSQL_USER" -a "$MYSQL_DATABASE" ]; then
echo "GRANT ALL ON \`$MYSQL_DATABASE\`.* TO '$MYSQL_USER'@'%' ;" >> "$tempSqlFile"
echo "GRANT ALL ON \`$MYSQL_DATABASE\`.* TO '$MYSQL_USER'@'localhost' ;" >> "$tempSqlFile"
fi

echo 'FLUSH PRIVILEGES ;' >> "$tempSqlFile"

set -- "$@" --init-file="$tempSqlFile"

echo @a
set -- mysqld "$@"
chown -R mysql:mysql /var/lib/mysql
mkdir -p /var/run/mysqld
chown -R mysql:mysql /var/run/mysqld
echo "Checking to upgrade the schema"
echo "A failed upgrade is ok when there was no upgrade"
# mysql_upgrade || true
exec "$@"
  • galera.pref
1
2
3
4
# Prefer Codership repository
Package: *
Pin: origin releases.galeracluster.com
Pin-Priority: 1001
  1. 빌드하기
1
2
#sudo docker build -t 이름:버전 docker_file_path
sudo docker build -t galera:1.0 /vagrant/galera
  1. container 실행하기
1
sudo docker run -d -p 3306:3306 -p 4567:4567 -p 4444:4444 -p 4568:4568 galera:1.0 --wsrep-cluster-address=gcomm://

docker redis clustering

Posted on 2019-06-29 | Edited on 2020-07-17 | In docker

docker를 이용한 redis sentinel clustering을 구성

redis clustering

  • tutorial : https://redis.io/topics/cluster-tutorial
  • spec : https://redis.io/topics/cluster-spec
  • redis sentinel : https://redis.io/topics/sentinel
  • zookeeper를 이용한 clustering : http://d2.naver.com/helloworld/294797

Redis는 여러가지 방법으로 HA를 구성할 수 있다.

멀티 마스터를 위한 Redis Cluster 방식

  • Redis Cluster는 샤딩 방식으로 데이터가 나뉘어 저장된다.
  • Redis Cluster Node 는 2개 포트가 필요하다.
    • client를 위한 포트와 data를 위한 포트(client 포트 + 10000)
    • data 포트가 node 사이의 채널 역할을 한다.
  • docker에서 redis cluster를 사용하려면 host 네트워크를 사용해야 한다.

sentinel 을 이용하는 방법

  • 3 + 2n 의 sentinel instance를 추천
  • 기본 포트는 26379
  • client에서 바라보는 end point는 sentinel instance이며, sentinel이 master 접속정보를 client에 전달한다. client는 해당 정보로 다시 master로 요청을 보냄.

docker 에서 1master + 1slave + 3sentinel 사용 예제 :

  • docker : https://github.com/mdevilliers/docker-rediscluster
  • docker-compose : https://github.com/AliyunContainerService/redis-cluster
    1
    2
    sudo apt-get install redis-server
    sudo apt-get purge --auto-remove redis-server

sentinel 실행 command : redis-server /path/to/sentinel.conf --sentinel

docker swarm 에서 sentinel 사용

  • https://github.com/thomasjpfan/redis-cluster-docker-swarm

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
version: '3.1'

services:

redis-sentinel:
image: thomasjpfan/redis-sentinel:${TAG:-latest}
environment:
- REDIS_IP=redis-zero
- REDIS_MASTER_NAME=redismaster
deploy:
replicas: 3
networks:
- redis

redis:
image: thomasjpfan/redis-look:${TAG:-latest}
environment:
- REDIS_SENTINEL_IP=redis-sentinel
- REDIS_MASTER_NAME=redismaster
- REDIS_SENTINEL_PORT=26379
deploy:
replicas: 3
networks:
- redis

networks:
redis:
external: tru

같은 네트워크에 접속해서 테스트해보기 : 같은 네트워크에서 ip주소 대신 docker service 이름으로 접속할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
#네트워크 접속
sudo docker run -it --network redis redis /bin/bash

#redis ip 정보 얻기
docker ps inspect continerID

#네트워크에 속한 redis에 요청보내기
redis-cli -h 10.0.0.7 -p 6379 set foo bb

#redis-sentinel
redis-cli -h redis-sentinel -p 26379 sentinel master redismaster

삭제할 때 stack 도 지워야 함

1
docker stack rm stachID

서버종료 대비 / manager node가 2개이상 이어야 함, 2대 중 1대 서버에서 장애가 나면 복구할 수 없음

  • manager node 는 static ip를 갖어야 함
  • 2개 노드만 사용하는 경우 둘다 manager로 사용하기 : leader 서버가 재시작하는 경우 자동 복구가 가능해짐
    • https://docs.docker.com/engine/swarm/admin_guide/
12…8

j2yes

15 posts
7 categories
24 tags
GitHub E-Mail
© 2020 j2yes