美文网首页
k8s中使用xtrabackup来实现mysql高可用

k8s中使用xtrabackup来实现mysql高可用

作者: 凤非飞 | 来源:发表于2019-04-29 22:49 被阅读0次

    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
      slave.cnf: |
        # Apply this config only on slaves.
        [mysqld]
        super-read-only
    

    headless-svc.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: mysql
      labels:
        app: mysql
    spec:
      ports:
      - name: mysql
        port: 3306
      clusterIP: None
      selector:
        app: mysql
    

    statefulSet.yaml

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: mysql
    spec:
      selector:
        matchLabels:
          app: mysql
      serviceName: mysql
      replicas: 3
      template:
        metadata:
          labels:
            app: mysql
        spec:
          initContainers:
          - name: init-mysql
            image: mysql:5.7
            imagePullPolicy: IfNotPresent
            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
            imagePullPolicy: IfNotPresent
            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
            imagePullPolicy: IfNotPresent
            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: 50m
                memory: 50Mi
            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
            imagePullPolicy: IfNotPresent
            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 -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 <<EOF
              $(<change_master_to.sql.orig),
                MASTER_HOST='mysql-0.mysql',
                MASTER_USER='root',
                MASTER_PASSWORD='',
                MASTER_CONNECT_RETRY=10;
              START SLAVE;
              EOF
              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: 10m
                memory: 10Mi
          volumes:
          - name: conf
            emptyDir: {}
          - name: config-map
            configMap:
              name: mysql
      volumeClaimTemplates:
      - metadata:
          name: data
          annotations:
            volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
        spec:
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 0.1Gi
    

    查看

    [root@K8S-M1 xtrabackup]# kubectl get all | grep mysql
    pod/mysql-0                                  2/2     Running     5          10h
    pod/mysql-1                                  2/2     Running     3          10h
    pod/mysql-2                                  2/2     Running     5          9h
    service/mysql      ClusterIP       None      <none>         3306/TCP        6h31m
    statefulset.apps/mysql                   3             3               10h
    


    测试

    (master: mysql-0)
    [root@K8S-M1 xtrabackup]# kubectl exec -it mysql-0 bash
    root@mysql-0:/# mysql
    mysql> show databases;
    +------------------------+
    | Database               |
    +------------------------+
    | information_schema     |
    | mysql                  |
    | performance_schema     |
    | sys                    |
    | xtrabackup_backupfiles |
    +------------------------+
    5 rows in set (0.12 sec)
    
    
    
    (salve:mysql-1)
    [root@K8S-M1 xtrabackup]# kubectl exec -it mysql-1 bash
    root@mysql-0:/# mysql
    mysql> show databases;
    +------------------------+
    | Database               |
    +------------------------+
    | information_schema     |
    | mysql                  |
    | performance_schema     |
    | sys                    |
    | xtrabackup_backupfiles |
    +------------------------+
    5 rows in set (0.12 sec)
    
    
    
    (salve:mysql-2)
    [root@K8S-M1 xtrabackup]# kubectl exec -it mysql-2 bash
    root@mysql-0:/# mysql
    mysql> show databases;
    +------------------------+
    | Database               |
    +------------------------+
    | information_schema     |
    | mysql                  |
    | performance_schema     |
    | sys                    |
    | xtrabackup_backupfiles |
    +------------------------+
    5 rows in set (0.12 sec)
    
    只有master(mysql-0)才有一切操作(读写删....)权限,而salve(mysql-1,mysql-2)只有读的权限
    在salve(mysql-1或mysql-2)上操作
    mysql> CREATE DATABASE demo; 
    ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement
    
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    
    同步操作测试
    在master(mysql-0)上操作(创建database,表,插值)
    
    mysql> CREATE DATABASE demo; 
    Query OK, 1 row affected (0.04 sec)
    
    mysql> CREATE TABLE demo.messages (message VARCHAR(250)); 
    Query OK, 0 rows affected (0.05 sec)
    
    mysql> INSERT INTO demo.messages VALUES ('hello');
    Query OK, 1 row affected (0.01 sec)
    
    
    
    在salve(mysql-1,mysql-2上操作)
    mysql> show databases;
    +------------------------+
    | Database               |
    +------------------------+
    | information_schema     |
    | demo                   |
    | mysql                  |
    | performance_schema     |
    | sys                    |
    | xtrabackup_backupfiles |
    +------------------------+
    6 rows in set (0.15 sec)
    
    mysql> use demo;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> select * from messages;
    +---------+
    | message |
    +---------+
    | hello   |
    +---------+
    1 row in set (0.00 sec)
    
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    
    ok,可以发现同步实现成功。
    

    再创建一个svc来提供对外服务
    svc.yaml

    # 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
    

    相关文章

      网友评论

          本文标题:k8s中使用xtrabackup来实现mysql高可用

          本文链接:https://www.haomeiwen.com/subject/hezunqtx.html