环境说明:
1台master
2台node
挂载采用hostpath.挂载到本机/opt/mysql目录(主,从正好分在在两台机的对应目录)
也可采用:
配置文件共三个:configmap.yaml services.yaml statefulset.yaml
image源:twoeo/gcr.io-google-samples-xtrabackup:latest (国外源网速慢)
configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql
labels:
app: mysql
data:
master.cnf: |

Apply this config only on the master.

[mysqld]
log-bin  # 主mysql激活二进制日志
#设置时区和字符集
default-time-zone='+8:00'
character-set-client-handshake=FALSE
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci'

slave.cnf: |

Apply this config only on slaves.

[mysqld]
super-read-only  # 从mysql上面设置为只读
#设置时区和字符集
default-time-zone='+8:00'
character-set-client-handshake=FALSE
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci'

###########

Headless service for stable DNS entries of StatefulSet members.

apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql
spec:
ports:

  • name: mysql
    port: 3306
    clusterIP: None
    selector:
    app: mysql

    Client service for connecting to any MySQL instance for reads.

    For writes, you must instead connect to the master: mysql-0.mysql.

    apiVersion: v1
    kind: Service
    metadata:
    name: mysql-read
    labels:
    app: mysql
    spec:
    ports:

  • name: mysql
    port: 3306
    selector:
    app: mysql
    ###########
    statefulset.yaml
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
    name: mysql
    spec:
    selector:
    matchLabels:
    app: mysql
    serviceName: mysql
    replicas: 2
    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: twoeo/gcr.io-google-samples-xtrabackup:latest
      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_ALLOW_EMPTY_PASSWORD
        value: "1"
        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", "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", "-e", "SELECT 1"]
        initialDelaySeconds: 5
        periodSeconds: 2
        timeoutSeconds: 1

    • name: xtrabackup
      image: twoeo/gcr.io-google-samples-xtrabackup:latest
      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 && "x$(<xtrabackup_slave_info)" != "x" ]]; then

        XtraBackup already generated a partial "CHANGE MASTER TO" query

        because we're cloning from an existing slave. (Need to remove the tailing semicolon!)

        cat xtrabackup_slave_info | sed -E 's/;$//g' > change_master_to.sql.in

        Ignore xtrabackup_binlog_info in this case (it's useless).

        rm -f xtrabackup_slave_info 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 -f xtrabackup_binlog_info xtrabackup_slave_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 -e "SELECT 1"; do sleep 1; done

        echo "Initializing replication from clone position"
        mysql -h 127.0.0.1 \
        -e "$(<change_master_to.sql.in), \
        MASTER_HOST='mysql-0.mysql', \
        MASTER_USER='root', \
        MASTER_PASSWORD='', \
        MASTER_CONNECT_RETRY=10; \
        START SLAVE;" || exit 1

        In case of container restart, attempt this at-most-once.

        mv change_master_to.sql.in change_master_to.sql.orig
        fi

        Start a server to send backups when requested by peers.

        exec ncat --listen --keep-open --send-only --max-conns=1 3307 -c \
        "xtrabackup --backup --slave-info --stream=xbstream --host=127.0.0.1 --user=root"
        volumeMounts:

      • name: data
        mountPath: /var/lib/mysql
        subPath: mysql
      • name: conf
        mountPath: /etc/mysql/conf.d
        resources:
        requests:
        cpu: 200m
        memory: 256Mi
        volumes:
    • name: conf
      emptyDir: {}
    • name: config-map
      configMap:
      name: mysql
    • name: data
      hostPath:
      path: /opt/mysql

volumeClaimTemplates:

- metadata:

name: data

spec:

accessModes: ["ReadWriteOnce"]

resources:

requests:

storage: 20Gi

最后修改日期: 2021年3月17日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。