MySQL レプリケーショントポロジー管理ツール orchestrator

# 概要
[github/orchestrator](https://github.com/github/orchestrator)(MySQL replication topology management and HA ) を少し触ってみたのでメモ。

主な機能としては以下の通り。

 - `Discovery` orchestrator actively crawls through your topologies and maps them. It reads basic MySQL info such as replication status and configuration.
 - `Refactoring` orchestrator understands replication rules. It knows about binlog file:position, GTID, Pseudo GTID, Binlog Servers.
 - `Recovery` orchestrator uses a holistic approach to detect master and intermediate master failures. Based on information gained from the topology itself, it recognizes a variety of failure scenarios.
 - `The interface` orchestrator supports:
     - Command line interface
     - Web API
     - Web interface

# 環境
GCE 上に 3台の MySQL 環境を構築
(MySQLMaster: db-01 / MySQLSlave: db-02, db-03)

- OS : CentOS Linux release 7.2.1511 (Core)
- orchestrator version : 2.0.1-1

# 環境構築
GCE ということで DeploymentManager で環境構築してみる

```yaml:config.yaml
imports:
- path: templates/network.jinja
- path: templates/instance.jinja
- path: templates/firewall.jinja

resources:
- name: mysql-network
  type: templates/network.jinja
  properties:
    region: asia-northeast1
    range: 10.255.0.0/24

- name: mysql-instance
  type: templates/instance.jinja
  properties:
    instances:
     - name: db-01
     - name: db-02
     - name: db-03
    machineType: f1-micro
    region: asia-northeast1
    zone: asia-northeast1-a

- name: mysql-firewall
  type: templates/firewall.jinja
```

```yaml:templates/network.yaml
resources:
- type: compute.v1.network
  name: {{ env["name"] }}
  properties:
    autoCreateSubnetworks: false

- type: compute.v1.subnetwork
  name: {{ env["name"] }}-subnet
  properties:
    network: $(ref.mysql-network.selfLink)
    ipCidrRange: {{ properties["range"] }}
    region: {{ properties["region"] }}
```

```yaml:templates/instance.yaml
resources:
{% for instance in properties["instances"] %}
  {%set name = instance["name"] %}

- type: compute.v1.instance
  name: {{ name }}
  properties:
    zone: {{ properties["zone"] }}
    machineType: https://www.googleapis.com/compute/v1/projects/{{ env["project"] }}/zones/{{ properties["zone"] }}/machineTypes/{{ properties["machineType"] }}

    tags:
      items:
        - mysql

    disks:
    - type: PERSISTENT
      deviceName: {{ name }}-disk
      boot: true
      mode: READ_WRITE
      autoDelete: true
      initializeParams:
        sourceImage: https://www.googleapis.com/compute/v1/projects/centos-cloud/global/images/centos-7-v20161129
        diskType: projects/{{ env["project"] }}/zones/{{ properties["zone"] }}/diskTypes/pd-standard
        diskSizeGb: 10

    canIpForward: true

    networkInterfaces:
    - network: $(ref.mysql-network.selfLink)
      subnetwork: $(ref.mysql-network-subnet.selfLink)
      accessConfigs:
      - name: External NAT
        type: ONE_TO_ONE_NAT

    metadata:
      items:
      - key: startup-script
        value: |
          #!/bin/bash
          timedatectl set-timezone Asia/Tokyo

    scheduling:
      preemptible: false
      onHostMaintenance: MIGRATE
      automaticRestart: true

    serviceAccounts:
    - email: default
      scopes:
        - https://www.googleapis.com/auth/logging.write
        - https://www.googleapis.com/auth/monitoring.write
{% endfor %}
```

```yaml:templates/firewall.yaml
resources:
- name: {{ env["name"] }}-ssh
  type: compute.v1.firewall
  properties:
    network: $(ref.mysql-network.selfLink)
    sourceRanges: ["0.0.0.0/0"]
    allowed:
    - IPProtocol: TCP
      ports: ["22"]

- name: {{ env["name"] }}-internal
  type: compute.v1.firewall
  properties:
    network: $(ref.condor-network.selfLink)
    sourceRanges: ["10.255.0.0/24"]
    allowed:
    - IPProtocol: TCP
      ports: ["0-65535"]
    - IPProtocol: UDP
      ports: ["0-65535"]
    - IPProtocol: ICMP
```

プレビュー実行

```
$ gcloud deployment-manager deployments create mysql-cluster --config=config.yaml --preview

NAME                       TYPE                   STATE      ERRORS  INTENT
db-01                      compute.v1.instance    COMPLETED  []
db-02                      compute.v1.instance    COMPLETED  []
db-03                      compute.v1.instance    COMPLETED  []
mysql-firewall-management  compute.v1.firewall    COMPLETED  []
mysql-network              compute.v1.network     COMPLETED  []
mysql-network-subnet       compute.v1.subnetwork  COMPLETED  []
```

WEBからデプロイ実行
![01.png](https://qiita-image-store.s3.amazonaws.com/0/105824/72803985-641c-5d18-7eee-bea197ab7ec3.png)


# orchestrator インストール

MySQL Replication 環境の構築は割愛

orchestrator インストールは以下の通り

```
$ curl -s https://packagecloud.io/install/repositories/github/orchestrator/script.rpm.sh | sudo bash
$ sudo yum install orchestrator orchestrator-cli
```

orchestrator 設定

以下を参照
https://github.com/github/orchestrator/blob/master/docs/install.md
https://github.com/github/orchestrator/blob/master/docs/executing-via-command-line.md


# UI から確認してみる

http://｛サーバIPアドレス｝:3000/ にアクセス

Discover より構築した3台のインスタンスを登録
![03.png](https://qiita-image-store.s3.amazonaws.com/0/105824/bfdd2069-7ab9-9ae3-46ce-bf5e126dc751.png)

Cluster の確認
![02.png](https://qiita-image-store.s3.amazonaws.com/0/105824/67a8b41d-858a-1410-033e-197202ad4803.png)

Slave 障害時
![04.png](https://qiita-image-store.s3.amazonaws.com/0/105824/e983b7dd-2e86-26f6-0ca2-3c684371a9b5.png)


とりあえず動作したので、詳細は別途。。。