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 に設定して、レプリケーションコントローラーを開始します。このレプリケーションコントローラー は、アカウントのリソース容量まで、両方向にスケーリングできます。