关于k8s环境部署mysql主从的问题


Posted in MySQL onMarch 13, 2022

k8s环境部署mysql主从

一、通过yaml部署mysql

1、mysql-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  namespace: 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

2、mysql-service.yaml

# Headless service for stable DNS entries of StatefulSet members.
apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: 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
  namespace: mysql
  labels:
    app: mysql
spec:
  ports:
  - name: mysql
    port: 3306
  selector:
    app: mysql

3、mysql-statefulset.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
  namespace: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: mysql
  replicas: 3
  template:
    metadata:
      labels:
        app: mysql
    spec:
      tolerations:
      - effect: NoSchedule
        operator: Exists
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms: # 调度指定标签节点
              - matchExpressions:
                  - key: node-role.kubernetes.io/compute
                    operator: In
                    values:
                    - dedicated-middleware
      initContainers:
      - name: init-mysql
        image: mysql:5.7.35
        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: registry.cn-shanghai.aliyuncs.com/soulchild/xtrabackup:2.4
        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.35
        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: registry.cn-shanghai.aliyuncs.com/soulchild/xtrabackup:2.4
        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: 100m
            memory: 100Mi
      volumes:
      - name: conf
        emptyDir: {}
      - name: config-map
        configMap:
          name: mysql
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 30Gi

到此这篇关于k8s环境部署mysql主从的文章就介绍到这了,更多相关k8s部署mysql主从内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
详解MySQL主从复制及读写分离
May 07 MySQL
解读MySQL的客户端和服务端协议
May 10 MySQL
mysql 8.0.24 安装配置方法图文教程
May 12 MySQL
MySQL 十大常用字符串函数详解
Jun 30 MySQL
MySQL深度分页(千万级数据量如何快速分页)
Jul 25 MySQL
详细聊聊MySQL中慢SQL优化的方向
Aug 30 MySQL
Mysql分析设计表主键为何不用uuid
Mar 31 MySQL
一文了解MYSQL三大范式和表约束
Apr 03 MySQL
MySQL8.0 Undo Tablespace管理详解
Jun 16 MySQL
mysql数据库隔离级别详解
Jun 16 MySQL
MySQL事务的隔离级别详情
Jul 15 MySQL
MYSQL如何查看进程和kill进程
Mar 13 #MySQL
一次SQL如何查重及去重的实战记录
Mar 13 #MySQL
面试提问mysql一张表到底能存多少数据
MySQL的索引你了解吗
面试中老生常谈的MySQL问答集锦夯实基础
浅谈如何保证Mysql主从一致
MySQL数据库如何给表设置约束详解
Mar 13 #MySQL
You might like
php根据用户语言跳转相应网页
2015/11/04 PHP
PHP7扩展开发之基于函数方式使用lib库的方法详解
2018/01/15 PHP
Prototype 学习 Prototype对象
2009/07/12 Javascript
一个简单的js动画效果代码
2010/07/20 Javascript
表单元素与非表单元素刷新区别详细解析
2013/11/06 Javascript
js中回调函数的学习笔记
2014/07/31 Javascript
jQuery实现带渐显效果的人物多级关系图代码
2015/10/16 Javascript
js面向对象实现canvas制作彩虹球喷枪效果
2016/09/24 Javascript
JS模拟超市简易收银台小程序代码解析
2017/08/18 Javascript
node.js 用socket实现聊天的示例代码
2017/10/17 Javascript
Vue实现table上下移动功能示例
2019/02/21 Javascript
JS实现checkbox互斥(单选)功能示例
2019/05/04 Javascript
Vue实现可移动水平时间轴
2020/06/29 Javascript
Python配置文件解析模块ConfigParser使用实例
2015/04/13 Python
Pyhthon中使用compileall模块编译源文件为pyc文件
2015/04/28 Python
Python中多个数组行合并及列合并的方法总结
2018/04/12 Python
Python使用pylab库实现绘制直方图功能示例
2018/06/01 Python
PyCharm代码整体缩进,反向缩进的方法
2018/06/25 Python
基于python的socket实现单机五子棋到双人对战
2020/03/24 Python
实例详解Python模块decimal
2019/06/26 Python
python 计算平均平方误差(MSE)的实例
2019/06/29 Python
python tkinter基本属性详解
2019/09/16 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
2019/11/19 Python
python中文分词库jieba使用方法详解
2020/02/11 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
2020/03/23 Python
Django自定义列表 models字段显示方式
2020/04/03 Python
在pycharm中关掉ipython console/PyDev操作
2020/06/09 Python
Keras预训练的ImageNet模型实现分类操作
2020/07/07 Python
Python 保存加载mat格式文件的示例代码
2020/08/04 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
2020/08/17 Python
python日志通过不同的等级打印不同的颜色(示例代码)
2021/01/13 Python
建筑节能汇报材料
2014/08/22 职场文书
镇副书记专题民主生活会对照检查材料思想汇报
2014/10/02 职场文书
安全生产培训心得体会
2016/01/18 职场文书
2019个人工作总结
2019/06/21 职场文书
CSS控制继承中的height能变为可继承吗
2022/06/10 HTML / CSS