3.2.6. MySQL レプリケーションの使用
データベースイメージのクラスターリングを有効にする設定はサンプルとして提供され、実稼働環境での使用を目的としていません。
Red Hat は、MySQL のマスター/スレーブのレプリケーション (クラスターリング) 用に概念実証 テンプレート を提供します。GitHub からサンプルテンプレート を取得できます。
現在のプロジェクトのテンプレートライブラリーにテンプレートのサンプルをアップロードするには、以下を実行します。
$ oc create -f \
https://raw.githubusercontent.com/sclorg/mysql-container/master/examples/replica/mysql_replica.json
以下のセクションでは、サンプルテンプレートで定義されているオブジェクトの詳細と、それらがどのように連携してマスター/スレーブのレプリケーションを実装する MySQL サーバーのクラスターを開始するかについて説明します。これは、MySQL 向けに推奨されるレプリケーションストラテジーです。
3.2.6.1. MySQL マスターのデプロイメント設定の作成 リンクのコピーリンクがクリップボードにコピーされました!
MySQL レプリケーションを設定するには、レプリケーションコントローラー を定義するサンプルテンプレートで デプロイメント設定 を定義します。MySQL のマスター/スレーブレプリケーションには、デプロイメント設定が 2 つ必要です。1 つ目のデプロイメント設定では、MySQL マスター サーバーを定義し、2 つ目は MySQL スレーブ サーバーを定義します。
MySQL サーバーに対してマスターとして機能するように指示するには、デプロイメント設定のコンテナー定義にある command フィールドを run-mysqld-master に設定する必要があります。このスクリプトは、MySQL イメージの別のエントリーポイントとして機能し、MySQL サーバーがレプリケーションのマスターとして実行するように設定します。
MySQL レプリケーションには、マスターとスレーブ間のデータをリレーする特別ユーザーが必要です。この目的のために、次の環境変数がテンプレートで定義されています。
| 変数名 | 説明 | デフォルト |
|---|---|---|
|
| レプリケーションユーザーのユーザー名 | master |
|
| レプリケーションユーザーのパスワード | generated |
例3.1 サンプルテンプレートでの MySQL マスターデプロイメント設定のオブジェクト定義
kind: "DeploymentConfig"
apiVersion: "v1"
metadata:
name: "mysql-master"
spec:
strategy:
type: "Recreate"
triggers:
- type: "ConfigChange"
replicas: 1
selector:
name: "mysql-master"
template:
metadata:
labels:
name: "mysql-master"
spec:
volumes:
- name: "mysql-master-data"
persistentVolumeClaim:
claimName: "mysql-master"
containers:
- name: "server"
image: "openshift/mysql-56-centos7"
command:
- "run-mysqld-master"
ports:
- containerPort: 3306
protocol: "TCP"
env:
- name: "MYSQL_MASTER_USER"
value: "${MYSQL_MASTER_USER}"
- name: "MYSQL_MASTER_PASSWORD"
value: "${MYSQL_MASTER_PASSWORD}"
- name: "MYSQL_USER"
value: "${MYSQL_USER}"
- name: "MYSQL_PASSWORD"
value: "${MYSQL_PASSWORD}"
- name: "MYSQL_DATABASE"
value: "${MYSQL_DATABASE}"
- name: "MYSQL_ROOT_PASSWORD"
value: "${MYSQL_ROOT_PASSWORD}"
volumeMounts:
- name: "mysql-master-data"
mountPath: "/var/lib/mysql/data"
resources: {}
terminationMessagePath: "/dev/termination-log"
imagePullPolicy: "IfNotPresent"
securityContext:
capabilities: {}
privileged: false
restartPolicy: "Always"
dnsPolicy: "ClusterFirst"
このデプロイメント設定で永続ボリュームを要求し、MySQL マスターサーバー用にすべてのデータを永続化したため、ストレージを要求できる永続ボリュームを作成するようにクラスター管理者に依頼する必要があります。
デプロイメント設定を作成し、MySQL マスターサーバーが指定された Pod を起動した後に、MYSQL_DATABASE で定義されたデータベースが作成され、このデータベースをスレーブに複製するようにサーバーが設定されます。
提供されているサンプルでは、MySQL マスターサーバーのレプリカ 1 つのみが定義されています。これにより、OpenShift Container Platform はサーバーの 1 つのインスタンスのみを起動します。複数のインスタンス (multi-master) はサポートされていないため、このレプリケーションコントローラーをスケーリングできません。
MySQL マスター で作成されたデータベースを複製するには、デプロイメント設定がテンプレートで定義されます。このデプロイメント設定は、command フィールドが run-mysqld-slave に設定されている、MySQL イメージを起動するレプリケーションコントローラーを作成します。このもう 1 つのエントリーポイントでは、データベースの初期化を省略し、MySQL サーバーが mysql-master サービスに接続するように設定します。このサービスも、サンプルテンプレートで定義されます。
例3.2 サンプルテンプレートでの MySQL スレーブデプロイメント設定のオブジェクト定義
kind: "DeploymentConfig"
apiVersion: "v1"
metadata:
name: "mysql-slave"
spec:
strategy:
type: "Recreate"
triggers:
- type: "ConfigChange"
replicas: 1
selector:
name: "mysql-slave"
template:
metadata:
labels:
name: "mysql-slave"
spec:
containers:
- name: "server"
image: "openshift/mysql-56-centos7"
command:
- "run-mysqld-slave"
ports:
- containerPort: 3306
protocol: "TCP"
env:
- name: "MYSQL_MASTER_USER"
value: "${MYSQL_MASTER_USER}"
- name: "MYSQL_MASTER_PASSWORD"
value: "${MYSQL_MASTER_PASSWORD}"
- name: "MYSQL_DATABASE"
value: "${MYSQL_DATABASE}"
resources: {}
terminationMessagePath: "/dev/termination-log"
imagePullPolicy: "IfNotPresent"
securityContext:
capabilities: {}
privileged: false
restartPolicy: "Always"
dnsPolicy: "ClusterFirst"
このデプロイメント設定のサンプルでは、最初のレプリカ数を 1 に設定して、レプリケーションコントローラーを開始します。このレプリケーションコントローラー は、アカウントのリソース容量まで、両方向にスケーリングできます。