3.2.6. 使用 MySQL Replication
作为示例提供了为数据库镜像启用集群的配置,它们不适用于生产环境。
红帽提供了一个 MySQL master-slave 复制(集群)概念验证 模板; 您可以 从 GitHub 获取示例模板。
将示例模板上传到当前项目的模板库中:
$ oc create -f \ https://raw.githubusercontent.com/sclorg/mysql-container/master/examples/replica/mysql_replica.json
以下小节详细介绍了示例模板中定义的对象,并描述了它们如何一起启动实施 master-slave 复制的 MySQL 服务器集群。这是推荐的 MySQL 复制策略。
3.2.6.1. 为 MySQL Master 创建部署配置
要设置 MySQL 复制,在定义 复制控制器 的示例模板中定义一个部署配置。对于 MySQL master-slave 复制,需要两个部署配置。一个部署配置定义 MySQL master 服务器,再定义 MySQL 的从 服务器。
要让 MySQL 服务器充当 master,必须将部署配置中容器定义中的 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 master 服务器保留所有数据,所以必须请集群管理员创建一个可以声明存储的持久性卷。
创建部署配置以及启动 MySQL master 服务器的 pod 后,它会创建 MYSQL_DATABASE
定义的数据库,并将服务器配置为将这个数据库复制到辅服务器。
这个示例只定义 MySQL 主服务器的一个副本。这会导致 OpenShift Container Platform 只启动一个服务器实例。不支持多个实例(multi-master),因此您无法扩展此复制控制器。
要复制由 MySQL master 创建的数据库,模板中定义了一个部署配置。这个部署配置会创建一个复制控制器,它会使用将 command
字段设置为 run-mysqld-slave 来启动 MySQL 镜像。这个替代的入口点跳过数据库初始化并将 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。您可以双向扩展此复制控制器,受帐户的资源容量的限制。