---
title: "Docker 上で MariaDB Server を Primary / Replica 構成でデプロイ"
publish_date: 2019-12-17
updated_date: 2023-10-12
author: "MariaDB"
tags:
  - name: "Docker"
    url: "/ja/resources/blog/tag/docker-ja.md"
  - name: "MariaDB Community Server"
    url: "/ja/resources/blog/tag/mariadb-community-server.md"
  - name: "MaxScale"
    url: "/ja/resources/blog/tag/maxscale-ja.md"
---

# Docker 上で MariaDB Server を Primary / Replica 構成でデプロイ

### はじめに

MariaDB Community Server の公式 Docker イメージは以下のURLで Docker Hub 上で公開されています。

<https://hub.docker.com/r/mariadb/server>

今回は Docker 上で Primary / Replica 構成で MariaDB Community Server をデプロイしてみます。

### テスト環境

- Docker 18.06.3-ce, build d7080c1
- MariaDB Community Server 10.4.11
- MariaDB MaxScale 2.4.4

### docker-compose.yml

[GitHub の maxscale-docker レポジトリにある docker-compose.yml](https://github.com/mariadb-corporation/maxscale-docker/blob/master/maxscale/docker-compose.yml) を元に以下の docker-compose.yml を作成しました。

```
version: '3.1'
services:
  primary:
    image: mariadb/server:latest
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'Y'
    volumes:
      - ./sql/primary:/docker-entrypoint-initdb.d
    command: mysqld --log-bin=mariadb-bin --binlog-format=ROW --server-id=1 --character-set-server=utf8mb4
    ports:
      - "4001:3306"

  replica1:
    image: mariadb/server:latest
    depends_on:
      - primary
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'Y'
    volumes:
      - ./sql/replica:/docker-entrypoint-initdb.d
    command: mysqld --log-bin=mariadb-bin --binlog-format=ROW --server-id=2 --log-slave-updates --character-set-server=utf8mb4
    ports:
      - "4002:3306"

  replica2:
    image: mariadb/server:latest
    depends_on:
      - primary
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'Y'
    volumes:
      - ./sql/replica:/docker-entrypoint-initdb.d
    command: mysqld --log-bin=mariadb-bin --binlog-format=ROW --server-id=3 --log-slave-updates --character-set-server=utf8mb4
    ports:
      - "4003:3306"

  maxscale:
    image: mariadb/maxscale:latest
    depends_on:
      - primary
      - replica1
      - replica2
    volumes:
      - ./maxscale.cnf.d:/etc/maxscale.cnf.d
    ports:
      - "3306:3306" # read/write split
      - "8989:8989" # REST API

```

docker-compose.yml 等のファイル一式は [こちらの GitHub レポジトリ](https://github.com/goto-satoru/docker-maxscale-primary-replica)で公開しております。

### MariaDB Server / MaxScale コンテナのデプロイ

Docker 実行環境で以下のコマンドを実行し，各コンテナをデプロイします。

```
git clone https://github.com/goto-satoru/docker-maxscale-primary-replica mxs
cd mxs
docker swarm init
docker stack deploy -c docker-compose.yml mxs

```

`docker service ls` で各サービスの稼働状態が確認できます。

```
$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                     PORTS
rdxax843b6gm        mxs_maxscale        replicated          1/1                 mariadb/maxscale:latest   *:3306->3306/tcp, *:8989->8989/tcp
y73vwfw9vz64        mxs_primary         replicated          1/1                 mariadb/server:latest     *:4001->3306/tcp
e6e9wupkhcdm        mxs_replica1        replicated          1/1                 mariadb/server:latest     *:4002->3306/tcp
wamcyncj0dcj        mxs_replica2        replicated          1/1                 mariadb/server:latest     *:4003->3306/tcp

```

`docker ps` で各コンテナのIDを確認します。

```
$ docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS               NAMES
eaad50c4c802        mariadb/server:latest     "docker-entrypoint.s…"   4 minutes ago       Up 4 minutes        3306/tcp            mxs_replica2.1.2gwib5pixpwa1sdj9hpg5n6qu
d26f95267a5c        mariadb/server:latest     "docker-entrypoint.s…"   4 minutes ago       Up 4 minutes        3306/tcp            mxs_replica1.1.up0deb6xdwdg7xhkfhya5yv2j
13d70cdbaaad        mariadb/server:latest     "docker-entrypoint.s…"   4 minutes ago       Up 4 minutes        3306/tcp            mxs_primary.1.wszclbhqiroiy6bomqyvix6gh
cd22453c8005        mariadb/maxscale:latest   "docker-entrypoint.s…"   4 minutes ago       Up 4 minutes                            mxs_maxscale.1.o0zq4b58x49y5h9kxh29cbllh

```

MaxScale コンテナ上で maxctrl list servers を実行，各 MariaDB Server インスタンスの状態を確認します。  
(docker service ls で表示される サービスID/サービス名は docker exec で利用できません)

```
$ docker exec cd22453c8005 maxctrl list servers
┌─────────┬──────────┬──────┬─────────────┬─────────────────┬───────┐
│ Server  │ Address  │ Port │ Connections │ State           │ GTID  │
├─────────┼──────────┼──────┼─────────────┼─────────────────┼───────┤
│ server1 │ primary  │ 3306 │ 0           │ Master, Running │ 0-1-5 │
├─────────┼──────────┼──────┼─────────────┼─────────────────┼───────┤
│ server2 │ replica1 │ 3306 │ 0           │ Slave, Running  │ 0-1-5 │
├─────────┼──────────┼──────┼─────────────┼─────────────────┼───────┤
│ server3 │ replica2 │ 3306 │ 0           │ Slave, Running  │ 0-1-5 │
└─────────┴──────────┴──────┴─────────────┴─────────────────┴───────┘

```

正常に primary の status が “`Master, running“` となっています。

### 自動フェイルオーバのテスト

Master(Primary)となっている server1 を 稼働停止し，自動フェイルオーバするか確認してみます。

```
docker stop 13d70cdbaaad

```

このときの MaxScale のログは以下のようになりました。

```
$ docker logs -f (MaxScale_container_id)
2019-12-07 12:42:47   error  : Monitor was unable to connect to server server1[primary:3306] : 'Can't connect to MySQL server on 'primary' (115)'
2019-12-07 12:42:47   notice : Server changed state: server1[primary:3306]: master_down. [Master, Running] -> [Down]
2019-12-07 12:42:47   warning: [mariadbmon] Master has failed. If master status does not change in 4 monitor passes, failover begins.
2019-12-07 12:42:48   notice : [mariadbmon] Selecting a server to promote and replace 'server1'. Candidates are: 'server2', 'server3'.
2019-12-07 12:42:48   warning: [mariadbmon] Slave 'server2' has gtid_strict_mode disabled. Enabling this setting is recommended. For more information, see https://staging-mdb.com/kb/en/library/gtid/#gtid_strict_mode
2019-12-07 12:42:48   warning: [mariadbmon] Slave 'server3' has gtid_strict_mode disabled. Enabling this setting is recommended. For more information, see https://staging-mdb.com/kb/en/library/gtid/#gtid_strict_mode
2019-12-07 12:42:48   notice : [mariadbmon] Selected 'server2'.
2019-12-07 12:42:48   notice : [mariadbmon] Performing automatic failover to replace failed master 'server1'.
2019-12-07 12:42:48   notice : [mariadbmon] Redirecting 'server3' to replicate from 'server2' instead of 'server1'.
2019-12-07 12:42:48   notice : [mariadbmon] All redirects successful.
2019-12-07 12:42:49   notice : [mariadbmon] All redirected slaves successfully started replication from 'server2'.
2019-12-07 12:42:49   notice : [mariadbmon] Failover 'server1' -> 'server2' performed.
2019-12-07 12:42:49   notice : Server changed state: server2[replica1:3306]: new_master. [Slave, Running] -> [Master, Running]

```

今回テストのために MariaDB Monitor の monitor\_interval をデフォルトの 2000 ms ではなく，200 ms に変更していますので，2 秒ほどで server2 (replica1) が 新たな Master(Primary) に昇格しています。

```
2019-12-07 12:43:07   notice : Server changed state: server1[primary:3306]: server_up. [Down] -> [Running]
2019-12-07 12:43:07   notice : [mariadbmon] Directing standalone server 'server1' to replicate from 'server2'.
2019-12-07 12:43:07   notice : [mariadbmon] Slave connection from server1 to [replica1]:3306 created and started.
2019-12-07 12:43:07   notice : [mariadbmon] 1 server(s) redirected or rejoined the cluster.
2019-12-07 12:43:07   notice : Server changed state: server1[primary:3306]: new_slave. [Running] -> [Slave, Running]

```

しばらくして server1 のコンテナが自動再起動し，`Slave Running` というステータスになりました。

ここで，`maxctrl list servers` を実行すると，

```
┌─────────┬──────────┬──────┬─────────────┬─────────────────┬──────────┐
│ Server  │ Address  │ Port │ Connections │ State           │ GTID     │
├─────────┼──────────┼──────┼─────────────┼─────────────────┼──────────┤
│ server1 │ primary  │ 3306 │ 0           │ Slave, Running  │ 0-1-7244 │
├─────────┼──────────┼──────┼─────────────┼─────────────────┼──────────┤
│ server2 │ replica1 │ 3306 │ 0           │ Master, Running │ 0-1-7244 │
├─────────┼──────────┼──────┼─────────────┼─────────────────┼──────────┤
│ server3 │ replica2 │ 3306 │ 0           │ Slave, Running  │ 0-1-7244 │
└─────────┴──────────┴──────┴─────────────┴─────────────────┴──────────┘

```

のようになりました。server2 が Primary(Master) となり，その他のコンテナが Replica(Slave)となっていることが確認できます。

### まとめ

今回は Docker 上で MariaDB Communty Server を Primary / Replica 構成でデプロイしてみました。非常に簡単に MariaDB Server のテスト環境が構築可能なことが確認頂けたかと存じます。  
なお，MaxScale の最新版 2.4 は 2023-10-29 に GPL v2 に移行する [BSL](https://staging-mdb.com/ja/resources/blog/mariadb-bsl/) で[ライセンス](https://github.com/mariadb-corporation/MaxScale/blob/2.4/LICENSE24.TXT)されています。  
テスト環境ではライセンス購入は必要ありませんが，プロダクション環境で MariaDB Server インスタンスが 3 以上であると有償となりますので留意願います。

また，以下の URL で公開されているイメージは Docker, Inc. でビルドしているものですので留意願います。

[https://hub.docker.com/\_/mariadb](https://hub.docker.com/_/mariadb)