Kubernetes 中实现 MySQL 的读写分离

在 Kubernetes 中实现 MySQL 的读写分离,可以通过主从复制架构来实现。在这种架构中,MySQL 主节点(Master)负责处理所有写操作,而 MySQL 从节点(Slave)负责处理所有读操作。下面是一个详细的步骤指南:

步骤 1:创建 Kubernetes 集群

确保你有一个运行良好的 Kubernetes 集群,建议有3个以上的节点,以便更好地分配资源并实现高可用性。

步骤 2:创建 MySQL 主从复制 Docker 镜像

  1. 首先,需要构建一个支持主从复制的 MySQL 镜像,或直接使用现有支持主从复制的 MySQL 镜像。

  2. 如果要自己配置,可以从 MySQL 官方镜像开始,通过设置 my.cnf 文件来支持主从复制。

  3. 主要的配置如下:

    • 主节点配置(Master):设置 server-id,并启用二进制日志(log-bin)。

    • 从节点配置(Slave):设置不同的 server-id,并配置为从属节点。

步骤 3:创建 Kubernetes Secret 存储 MySQL 密码

为了安全性,我们可以使用 Kubernetes Secret 来存储 MySQL 密码。

apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
mysql-root-password: <base64编码的root密码>
mysql-replication-user: <base64编码的replication用户名>
mysql-replication-password: <base64编码的replication密码>

步骤 4:部署 MySQL 主节点

  1. 创建主节点的配置文件 mysql-master-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-master
spec:
replicas: 1
selector:
  matchLabels:
    app: mysql
    role: master
template:
  metadata:
    labels:
      app: mysql
      role: master
  spec:
    containers:
    - name: mysql
      image: mysql:5.7
      env:
      - name: MYSQL_ROOT_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysql-secret
            key: mysql-root-password
      - name: MYSQL_REPLICATION_USER
        valueFrom:
          secretKeyRef:
            name: mysql-secret
            key: mysql-replication-user
      - name: MYSQL_REPLICATION_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysql-secret
            key: mysql-replication-password
      ports:
      - containerPort: 3306
      volumeMounts:
      - name: mysql-persistent-storage
        mountPath: /var/lib/mysql
    volumes:
    - name: mysql-persistent-storage
      persistentVolumeClaim:
        claimName: mysql-pv-claim
  1. 创建 MySQL 主节点的 Service:

apiVersion: v1
kind: Service
metadata:
name: mysql-master
spec:
ports:
- port: 3306
  targetPort: 3306
selector:
  app: mysql
  role: master

步骤 5:部署 MySQL 从节点

  1. 创建从节点的配置文件 mysql-slave-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-slave
spec:
replicas: 2
selector:
  matchLabels:
    app: mysql
    role: slave
template:
  metadata:
    labels:
      app: mysql
      role: slave
  spec:
    containers:
    - name: mysql
      image: mysql:5.7
      env:
      - name: MYSQL_ROOT_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysql-secret
            key: mysql-root-password
      - name: MYSQL_REPLICATION_USER
        valueFrom:
          secretKeyRef:
            name: mysql-secret
            key: mysql-replication-user
      - name: MYSQL_REPLICATION_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysql-secret
            key: mysql-replication-password
      - name: MYSQL_MASTER_HOST
        value: "mysql-master"
      ports:
      - containerPort: 3306
      volumeMounts:
      - name: mysql-persistent-storage
        mountPath: /var/lib/mysql
    volumes:
    - name: mysql-persistent-storage
      persistentVolumeClaim:
        claimName: mysql-pv-claim
  1. 创建 MySQL 从节点的 Service:

apiVersion: v1
kind: Service
metadata:
name: mysql-slave
spec:
ports:
- port: 3306
  targetPort: 3306
selector:
  app: mysql
  role: slave

步骤 6:设置主从复制

在从节点启动后,执行以下命令来配置主从复制:

  1. 登录主节点,创建用于复制的用户:

    CREATE USER 'replication'@'%' IDENTIFIED BY 'replication_password';
    GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';
    FLUSH PRIVILEGES;
  2. 获取主节点状态:

    SHOW MASTER STATUS;
  3. 登录到从节点,将其配置为主节点的从属节点:

    CHANGE MASTER TO
      MASTER_HOST='mysql-master',
      MASTER_USER='replication',
      MASTER_PASSWORD='replication_password',
      MASTER_LOG_FILE='<上一步中获取的 File>',
      MASTER_LOG_POS=<上一步中获取的 Position>;
    START SLAVE;
  4. 检查从节点状态以确认同步是否成功:

    SHOW SLAVE STATUS\G

步骤 7:配置读写分离

在 Kubernetes 中,可以使用一个自定义的 Service 来实现读写分离:

  1. 创建 MySQL 读写分离的 Service:

    apiVersion: v1
    kind: Service
    metadata:
    name: mysql-read-write
    spec:
    ports:
    - port: 3306
      targetPort: 3306
    selector:
      app: mysql
      role: master
    ---
    apiVersion: v1
    kind: Service
    metadata:
    name: mysql-read-only
    spec:
    ports:
    - port: 3306
      targetPort: 3306
    selector:
      app: mysql
      role: slave
  2. 通过应用层(例如应用代码)选择访问不同的 Service 来实现读写分离:

    • 写操作:通过 mysql-read-write Service 连接。

    • 读操作:通过 mysql-read-only Service 连接。

步骤 8:测试读写分离

  1. 将写操作请求发送到 mysql-read-write 服务,验证数据是否被正确写入。

  2. 将读操作请求发送到 mysql-read-only 服务,确保从节点上能够读到主节点写入的数据。

步骤 9:监控与维护

可以通过 Prometheus 和 Grafana 对 MySQL 集群进行监控,关注主从复制的延迟和节点的健康状态,以便及时处理故障。

总结

主节点负责处理写操作,从节点负责处理读操作,应用可以根据需求连接到不同的 Service 来实现高效的数据库读写分离。

Kubernetes 中实现 MySQL 的读写分离的更多相关文章

  1. Kubernetes 中部署 MySQL 集群

    文章转载自:https://www.cnblogs.com/ludongguoa/p/15319861.html 一般情况下 Kubernetes 可以通过 ReplicaSet 以一个 Pod 模板 ...

  2. MyCAT实现MySQL的读写分离

    在MySQL中间件出现之前,对于MySQL主从集群,如果要实现其读写分离,一般是在程序端实现,这样就带来一个问题,即数据库和程序的耦合度太高,如果我数据库的地址发生改变了,那么我程序端也要进行相应的修 ...

  3. Amoeba搞定mysql主从读写分离

    前言:一直想找一个工具,能很好的实现mysql主从的读写分离架构,曾经试用过mysql-proxy发现lua用起来很不爽,尤其是不懂lua脚本,突然发现了Amoeba这个项目,试用了下,感觉还不错,写 ...

  4. Centos7源码安装mysql及读写分离,互为主从

       Linux服务器 -源码安装mysql 及读写分离,互为主从   一.环境介绍: Linux版本: CentOS 7 64位 mysq版本: mysql-5.6.26 这是我安装时所使用的版本, ...

  5. Amoeba实现mysql主从读写分离

    Amoeba实现mysql主从读写分离 这段在网上看了下关于amoeba的文章,总体感觉好像要比mysql-proxy好的多,也参考了不少的资料,此文章可能与其他文章作者会有雷同的地方,请谅解,但是此 ...

  6. python实现mysql的读写分离及负载均衡

    Oracle数据库有其公司开发的配套rac来实现负载均衡,目前已知的最大节点数能到128个,但是其带来的维护成本无疑是很高的,并且rac的稳定性也并不是特别理想,尤其是节点很多的时候. 但是,相对my ...

  7. MySQL ProxySQL读写分离实践

    目的 在上一篇文章MySQL ProxySQL读写分离使用初探里初步介绍了ProxySQL的使用,本文继续介绍它的一些特点和DBProxy的性能差异.深入一些去了解ProxySQL,通过测试来说明Pr ...

  8. 应用集成mycat,实现mycat的高可用与mysql的读写分离

    前言 开心一刻 一个女人自朋友圈写道:我家老公昨天和别人家的老婆出去旅游,迄今未归,我则被别人家的老公折腾了一天,好累哦! 圈子下面,评论无数,老公在下面评论到:能不能好好说话,我只不过陪女儿去毕业旅 ...

  9. 通过mycat实现mysql的读写分离

    mysql的主从配置沿用上一篇博客的配置:https://www.cnblogs.com/MasterSword/p/9434169.html mycat下载地址:http://www.mycat.i ...

  10. MySQL Router实现MySQL的读写分离

    1.简介 MySQL Router是MySQL官方提供的一个轻量级MySQL中间件,用于取代以前老版本的SQL proxy. 既然MySQL Router是一个数据库的中间件,那么MySQL Rout ...

随机推荐

  1. 【牛客刷题】HJ10 字符个数统计

    题目链接 简单的说这题就是字符串去重以后检查长度.如果用Java的话,可以遍历字符串,然后利用Set来进行去重,最后统计Set的size就可以了.但是如果是Go语言,则稍微麻烦点.基本思路就是用map ...

  2. 学习SSD—day1_20240814

    1.SSD的基本概念以及结构 SSD是一种以半导体(半导体闪存)作为存储介质吗,使用纯电子电路实现的存储设备. SSD硬件包括几大组成部分:主控.闪存.缓存芯片DRAM(可选,有些SSD上可能只有SR ...

  3. 使用FModel提取黑神话悟空的资产

    目录 前言 设置 效果展示 闲聊 可能遇到的问题 没有相应的UE引擎版本选项 前言 黑神话悟空昨天上线了,解个包looklook. 本文内容比较简洁,仅介绍解包黑神话所需的专项配置,关于FModel的 ...

  4. 短视频SDK 视频编辑SDK AE模版SDK 人体抠图SDK 绿幕抠图SDK

    优势:  快速接入免费试用名称:  短视频SDK品牌:  蓝松SDK特色:  一站式视音频解决方案 杭州蓝松科技有限公司,多年来一直专注于音视频领域核心技术的研发.核心研发团队掌握的行业领先技术,目前 ...

  5. C++11新特性(二):语言特性

    C++11新特性 nullptr空指针 nullptr空指针的使用可以规避掉以往设置为NULL的风险.NULL在编译器中常常被设置为0或者其它数字,此时判断指针是否为NULL,即判断指针类型是否能够等 ...

  6. 如何选择 Linux 发行版

    简介 要建立云服务器,首先需要安装操作系统.在现代环境中,几乎所有情况下都是指 Linux 操作系统.从历史上看,Windows 服务器和其他类型的 Unix 在特定的商业环境中都很流行,但现在几乎每 ...

  7. 【Python自动化】之特殊的自动化定位操作

    今天有时间了,想好好的把之前遇到过的自动化问题总结一下,以后有新的总结再更新 目录: 一.上传文件(4.11) 二.下拉框选择(4.11) 1.Select下拉框 2.非Select下拉框 三.下拉框 ...

  8. Prometheus 告警恢复时,怎么获取恢复时的值?

    Prometheus 告警事件中的 $value 表示当前告警触发时的值,但是在告警恢复时,Resolved 事件中的 $value 仍然是最新告警时的值,并非是恢复时的值,这是什么原因和原理?是否有 ...

  9. python get 请求接口 忽略证书验证

    import requests # 请求接口 import ssl context = ssl.create_default_context() context.check_hostname = Fa ...

  10. Serilog文档翻译系列(一) - 入门指南

    保持优质文档是 Serilog 的优先事项.如果你发现文档中有缺失或不准确的内容,或者希望通过添加主题或教程来扩展 wiki,请通过问题追踪系统告知我们. 为什么选择Serilog? 与许多其他 .N ...