博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
kubernetes搭建mysql集群服务
阅读量:6969 次
发布时间:2019-06-27

本文共 7730 字,大约阅读时间需要 25 分钟。

参考链接:

一、创建ConfigMap

apiVersion: v1kind: ConfigMapmetadata:  name: mysql  labels:    app: mysqldata:  master.cnf: |    # Apply this config only on the master.    [mysqld]    log-bin  slave.cnf: |    # Apply this config only on slaves.    [mysqld]    super-read-only

在pod初始化时, pod会根据自身标识(master或slave)从configmap中应用指定配置. 被应用配置将覆盖my.cnf中的配置. 目的是使master向slave提供复制日志服务,并设置slave拒绝非复制写入.

二、创建headless service

# Headless service for stable DNS entries of StatefulSet members.apiVersion: v1kind: Servicemetadata:  name: mysql  labels:    app: mysqlspec:  ports:  - name: mysql    port: 3306  clusterIP: None  selector:    app: mysql

三、创建StatefulSet

apiVersion: apps/v1beta1apiVersion: apps/v1kind: StatefulSetmetadata:  name: mysqlspec:  selector:    matchLabels:      app: mysql  serviceName: mysql  replicas: 3  template:    metadata:      labels:        app: mysql    spec:      initContainers:      - name: init-mysql        image: mysql:5.7        command:        - bash        - "-c"        - |          set -ex          # Generate mysql server-id from pod ordinal index.          [[ `hostname` =~ -([0-9]+)$ ]] || exit 1          ordinal=${BASH_REMATCH[1]}          echo [mysqld] > /mnt/conf.d/server-id.cnf          # Add an offset to avoid reserved server-id=0 value.          echo server-id=$((100 + $ordinal)) >> /mnt/conf.d/server-id.cnf          # Copy appropriate conf.d files from config-map to emptyDir.          if [[ $ordinal -eq 0 ]]; then            cp /mnt/config-map/master.cnf /mnt/conf.d/          else            cp /mnt/config-map/slave.cnf /mnt/conf.d/          fi        volumeMounts:        - name: conf          mountPath: /mnt/conf.d        - name: config-map          mountPath: /mnt/config-map      - name: clone-mysql        image: gcr.io/google-samples/xtrabackup:1.0        command:        - bash        - "-c"        - |          set -ex          # Skip the clone if data already exists.          [[ -d /var/lib/mysql/mysql ]] && exit 0          # Skip the clone on master (ordinal index 0).          [[ `hostname` =~ -([0-9]+)$ ]] || exit 1          ordinal=${BASH_REMATCH[1]}          [[ $ordinal -eq 0 ]] && exit 0          # Clone data from previous peer.          ncat --recv-only mysql-$(($ordinal-1)).mysql 3307 | xbstream -x -C /var/lib/mysql          # Prepare the backup.          xtrabackup --prepare --target-dir=/var/lib/mysql        volumeMounts:        - name: data          mountPath: /var/lib/mysql          subPath: mysql        - name: conf          mountPath: /etc/mysql/conf.d      containers:      - name: mysql        image: mysql:5.7        env:        - name: MYSQL_ROOT_PASSWORD          value: "123",        - name: MYSQL_REPLICATION_USER          value: "sync",        - name: MYSQL_REPLICATION_PASSWORD          value: "sync",        ports:        - name: mysql          containerPort: 3306        volumeMounts:        - name: data          mountPath: /var/lib/mysql          subPath: mysql        - name: conf          mountPath: /etc/mysql/conf.d        resources:          requests:            cpu: 500m            memory: 1Gi        livenessProbe:          exec:            command: ["mysqladmin", "-uroot", "-p123", "ping"]          initialDelaySeconds: 30          periodSeconds: 10          timeoutSeconds: 5        readinessProbe:          exec:            # Check we can execute queries over TCP (skip-networking is off).            command: ["mysql", "-h", "127.0.0.1", "-uroot", "-p123", "-e", "SELECT 1"]          initialDelaySeconds: 5          periodSeconds: 2          timeoutSeconds: 1      - name: xtrabackup        image: gcr.io/google-samples/xtrabackup:1.0        ports:        - name: xtrabackup          containerPort: 3307        command:        - bash        - "-c"        - |          set -ex          cd /var/lib/mysql          # Determine binlog position of cloned data, if any.          if [[ -f xtrabackup_slave_info ]]; then            # XtraBackup already generated a partial "CHANGE MASTER TO" query            # because we're cloning from an existing slave.            mv xtrabackup_slave_info change_master_to.sql.in            # Ignore xtrabackup_binlog_info in this case (it's useless).            rm -f xtrabackup_binlog_info          elif [[ -f xtrabackup_binlog_info ]]; then            # We're cloning directly from master. Parse binlog position.            [[ `cat xtrabackup_binlog_info` =~ ^(.*?)[[:space:]]+(.*?)$ ]] || exit 1            rm xtrabackup_binlog_info            echo "CHANGE MASTER TO MASTER_LOG_FILE='${BASH_REMATCH[1]}',\                  MASTER_LOG_POS=${BASH_REMATCH[2]}" > change_master_to.sql.in          fi          # Check if we need to complete a clone by starting replication.          if [[ -f change_master_to.sql.in ]]; then            echo "Waiting for mysqld to be ready (accepting connections)"            until mysql -h 127.0.0.1 -uroot -p123 -e "SELECT 1"; do sleep 1; done            echo "Initializing replication from clone position"            # In case of container restart, attempt this at-most-once.            mv change_master_to.sql.in change_master_to.sql.orig            mysql -h 127.0.0.1 -uroot -p123  <

这里使用了两个初始化容器.

第一个初始化容器init-mysql作用包括根据pod名称后缀生成server_id文件, 从configmap中获取指定配置. 这里默认StatefulSet控制的第一个pod即mysql-0为master, 其余为slave.
第二个clone-mysql使用开源工具xtrabackup, 用于当前slave从前一个slave复制数据, 当有新的作为slave的pod加入集群时, 这个pod会从上一个pod(序号小1)的非master的pod复制数据, 因为新pod加入时, 我们必须假定master中的数据是不为空的, 需要进行一次复制操作, 这样在扩容时会避免数据丢失,
而从前一个pod复制数据是因为StatefulSet按顺序启动, 当前一个pod为ready时才启动后一个pod的机制而来.

当init容器执行完成后, 常规容器开始启动并运行. mysql Pods由运行mysqld服务的mysql容器和充当SideCar的xtrabackup容器组成(挎斗模式解析请见)。

四、创建用于访问Service

# Client service for connecting to any MySQL instance for reads.# For writes, you must instead connect to the master: mysql-0.mysql.apiVersion: v1kind: Servicemetadata:  name: mysql-access  labels:    app: mysqlspec:  ports:  - name: mysql    port: 3306  selector:    app: mysql

五、查看

root@node4:~# kubectl -n admin-d2069c get pvc,pv,statefulset,pod,service,configmap |grep mysqlpvc/storage-mysql-0                    Bound     pvc-bb591208-c2f4-11e8-b599-0050568eef9f   512M       RWX            managed-nfs-storage   12mpvc/storage-mysql-1                    Bound     pvc-c4ada169-c2f4-11e8-b599-0050568eef9f   512M       RWX            managed-nfs-storage   12mpvc/storage-mysql-2                    Bound     pvc-ce20ad71-c2f4-11e8-b599-0050568eef9f   512M       RWX            managed-nfs-storage   11mpv/pvc-bb591208-c2f4-11e8-b599-0050568eef9f   512M       RWX            Delete           Bound     admin-d2069c/storage-mysql-0                   managed-nfs-storage             12mpv/pvc-c4ada169-c2f4-11e8-b599-0050568eef9f   512M       RWX            Delete           Bound     admin-d2069c/storage-mysql-1                   managed-nfs-storage             12mpv/pvc-ce20ad71-c2f4-11e8-b599-0050568eef9f   512M       RWX            Delete           Bound     admin-d2069c/storage-mysql-2                   managed-nfs-storage             11mstatefulsets/mysql                      3         3         12mpo/mysql-0                                   2/2       Running    0          12mpo/mysql-1                                   2/2       Running    0          12mpo/mysql-2                                   2/2       Running    0          11msvc/mysql                       ClusterIP   None            
3306/TCP 12msvc/mysql-access ClusterIP 10.68.8.223
3306/TCP 12mcm/mysql 2 12m

六、测试集群

登录mysql-0, 执行

kubectl -n admin-d2069c exec -it mysql-0 /bin/bash

进入mysql-0后连接mysql:

mysql -p123

创建database, 并以同样方式登录mysql-1或mysql-2, 发现其下已经将新创建的database同步则为验证成功.

转载地址:http://ymbsl.baihongyu.com/

你可能感兴趣的文章
GraalVM
查看>>
zcat配合tar解压压缩包中的单独
查看>>
只为完美强大的Linux——视频通讯功能(附完整代码)
查看>>
80个Python经典资料(教程+源码+工具)汇总——下载目录 ...
查看>>
nginx安装
查看>>
Solaris 10安装vim
查看>>
Linux系统有7个运行级别(runlevel)
查看>>
Yii框架官方指南系列23——使用数据库:数据访问对象(DAO)
查看>>
数据结构基本概念 - 学习笔记
查看>>
比较有用的一个排查sshd的命令
查看>>
戏说移动互联网&O2O模式
查看>>
PHP入门经典随笔
查看>>
Cubieboard 3(cubietruck) 安装Jenkins
查看>>
java Collection中的排序问题
查看>>
[玩硬件]Arduino初级套试玩。
查看>>
Linux运维的8个小时工作时间都做什么
查看>>
Java学习日志(20-2-IO流-Properties与流合并切割)
查看>>
Andrioid 中 Service 组件的使用
查看>>
让Spring Controller 的方法基本数据类型参数支持Bean Validation
查看>>
mybatis.xml(理解的相对局限)
查看>>