k8s中实现mysql主备

文章目录

  • 一、k8s中实现mysql主备
    • 1.1 环境信息
    • 1.2 部署nfs-provisioner
      • 1.2.1 安装nfs
      • 1.2.2 部署nfs-provisioner
    • 1.3 安装mysql
    • 1.4 备库上查看是否同步

一、k8s中实现mysql主备

1.1 环境信息

机器操作系统ipmysql版本k8s版本storageClass
master1CentOS7.8192.168.0.20mysql5.7.421.27.1nfs
node1CentOS7.8192.168.0.21mysql5.7.421.27.1nfs

1.2 部署nfs-provisioner

说明:
  使用statefulSet部署双机MySQL,所以需要提供storageClass,这里使用nfs-provisioner。

1.2.1 安装nfs

这里nfs安装在node1节点上
mkdir /mnt/nfs && sh nfs_install.sh /mnt/nfs 192.168.0.0/24

nfs_install.sh

#!/bin/bash### How to install it? ###
### 安装nfs-server,需要两个参数:1、挂载点  2、允许访问nfs-server的网段 ###### How to use it? ###
### Client节点`yum -y install nfs-utils rpcbind`,然后挂载nfs-server目录到本地 ###
### 如:echo "192.168.0.20:/mnt/data01  /mnt/data01  nfs  defaults  0 0" >> /etc/fstab && mount -a ###mount_point=$1
subnet=$2function nfs_server() {systemctl stop firewalldsystemctl disable firewalldsetenforce 0sed -i 's/^SELINUX.*/SELINUX\=disabled/' /etc/selinux/configyum -y install nfs-utils rpcbindmkdir -p $mount_pointecho "$mount_point ${subnet}(rw,sync,no_root_squash)" >> /etc/exportssystemctl start rpcbind && systemctl enable rpcbindsystemctl restart nfs-server && systemctl enable nfs-serverchown -R nfsnobody:nfsnobody $mount_point
}function usage() {
echo "Require 2 argument: [mount_point] [subnet]
eg: sh $0 /mnt/data01 192.168.10.0/24"
}declare -i arg_nums
arg_nums=$#
if [ $arg_nums -eq 2 ];thennfs_server
elseusageexit 1
fi

1.2.2 部署nfs-provisioner

master1节点上执行 kubectl create namespace devops && kubectl apply -f nfs-provisioner.yaml

nfs-provisioner.yaml

apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-provisionernamespace: devops
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: nfs-provisioner-runner
rules:
- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]
- apiGroups: [""]resources: ["events"]verbs: ["create", "update", "patch"]
- apiGroups: [""]resources: ["services", "endpoints"]verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: run-nfs-provisioner
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: nfs-provisioner-runner
subjects:
- kind: ServiceAccountname: nfs-provisionernamespace: devops
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: leader-locking-nfs-provisionernamespace: devops
rules:
- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: leader-locking-nfs-provisionernamespace: devops
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: leader-locking-nfs-provisioner
subjects:
- kind: ServiceAccountname: nfs-provisionernamespace: devops
---
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-provisionernamespace: devops
spec:selector:matchLabels:app: nfs-provisionerreplicas: 1strategy:type: Recreatetemplate:metadata:labels:app: nfs-provisionerspec:serviceAccountName: nfs-provisionercontainers:- name: nfs-provisionerimage: docker.io/gmoney23/nfs-client-provisioner:latestvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: example.com/nfs- name: NFS_SERVERvalue: 192.168.0.21- name: NFS_PATHvalue: /mnt/nfsvolumes:- name: nfs-client-rootnfs:server: 192.168.0.21path: /mnt/nfs
---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:name: nfs
provisioner: example.com/nfs
#reclaimPolicy: Retain

1.3 安装mysql

kubectl apply -f deploy.yaml

deploy.yaml

apiVersion: v1
kind: Namespace
metadata:name: mysqllabels:app: mysql---
apiVersion: v1
kind: ConfigMap
metadata:name: mysqlnamespace: mysqllabels:app: mysql
data:master.cnf: |[client]default-character-set=utf8mb4[mysql]default-character-set=utf8mb4[mysqld]max_connections=2000default-time_zone='+8:00'character-set-server=utf8mb4collation-server=utf8mb4_unicode_ciinnodb_buffer_pool_size=536870912datadir=/var/lib/mysqlpid-file=/var/run/mysqld/mysqld.pidlog-error=/var/lib/mysql/error.loglog-bin=mysqllogskip-name-resolvelower-case-table-names=1log_bin_trust_function_creators=1slave.cnf: |[client]default-character-set=utf8mb4[mysql]default-character-set=utf8mb4[mysqld]max_connections=2000default-time_zone='+8:00'character-set-server=utf8mb4collation-server=utf8mb4_unicode_ciinnodb_buffer_pool_size=536870912datadir=/var/lib/mysqlpid-file=/var/run/mysqld/mysqld.pidlog-error=/var/lib/mysql/error.logsuper-read-onlyskip-name-resolvelog-bin=mysql-binlower-case-table-names=1log_bin_trust_function_creators=1---
apiVersion: v1
kind: Secret
metadata:name: mysql-secretnamespace: mysqllabels:app: mysql
type: Opaque
data:password: TnNiZzExMTEqQCE= # Nsbg1111*@!replicationUser: Y29weQ== #copyreplicationPassword: TnNiZzExMTEqQCE= #Nsbg1111*@!---
apiVersion: v1
kind: Service
metadata:name: mysqlnamespace: mysqllabels:app: mysql
spec:selector:app: mysqlclusterIP: Noneports:- name: mysqlport: 3306---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysqlnamespace: mysqllabels:app: mysql
spec:selector:matchLabels:app: mysqlserviceName: mysqlreplicas: 2template:metadata:labels:app: mysqlspec:initContainers:- name: init-mysqlimage: docker.io/library/mysql:5.7.42command: - bash- "-c"- |set -ex#从pod的hostname中通过正则获取序号,如果没有截取到就退出程序ordinal=`cat /etc/hostname | awk -F"-" '{print $2}'` || exit 1#将serverId输入到对应的配置文件中,路径可以随意(与之后的对应上就行),但是文件名不能换echo [mysqld] > /etc/mysql/conf.d/server-id.cnf# 由于server-id不能为0,因此给ID加100来避开它server_id=$((100 + $ordinal))echo "server-id=$server_id" >> /etc/mysql/conf.d/server-id.cnfif [[ ${ordinal} -eq 0 ]]; then# 如果Pod的序号为0,说明它是Master节点,从ConfigMap里把Master的配置文件拷贝到/mnt/conf.d目录下cp /mnt/config-map/master.cnf /etc/mysql/conf.delse# 否则,拷贝ConfigMap里的Slave的配置文件cp /mnt/config-map/slave.cnf /etc/mysql/conf.dfiecho "ending..."env:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretkey: password- name: MYSQL_REPLICATION_USERvalueFrom:secretKeyRef:name: mysql-secretkey: replicationUser- name: MYSQL_REPLICATION_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretkey: replicationPasswordvolumeMounts:- name: confmountPath: /etc/mysql/conf.d- name: config-mapmountPath: /mnt/config-mapcontainers:- name: mysqlimage: docker.io/library/mysql:5.7.42lifecycle:postStart:exec:command:- bash- "-c"- |set -excd /var/lib/mysql#查看是否存在名为mysqlInitOk的文件,我们自己生产的标识文件,防止重复初始化集群if [ ! -f mysqlInitOk ]; thenecho "Waiting for mysqld to be ready(accepting connections)"#执行一条mysql的命令,查看mysql是否初始化完毕,如果没有就反复执行直到可以运行#until mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "use mysql;SELECT 1;"; do sleep 1; donesleep 5secho "Initialize ready"#判断是master还是slavepod_seq=`cat /etc/hostname | awk -F"-" '{print $2}'`if [ $pod_seq -eq 0 ];then#创建主从账户mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "create user '${MYSQL_REPLICATION_USER}'@'%' identified by '${MYSQL_REPLICATION_PASSWORD}';"#设置权限mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "grant replication slave on *.* to '${MYSQL_REPLICATION_USER}'@'%' with grant option;"#刷新配置mysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "flush privileges;"#初始化mastermysql -uroot -p${MYSQL_ROOT_PASSWORD} -e "reset master;"else#设置slave连接的master#mysql-0.mysql.mysql的由来{pod-name}.{service-name}.{namespace}mysql -e \"change master to master_host='mysql-0.mysql.mysql',master_port=3306, \master_user='${MYSQL_REPLICATION_USER}',master_password='${MYSQL_REPLICATION_PASSWORD}', \master_log_file='mysqllog.000001',master_log_pos=154;"#重置slavemysql -e "reset slave;"#开始同步mysql -e "start slave;"#改成只读模式mysql -e "set global read_only=1;"fi#运行完毕创建标识文件,防止重复初始化集群touch mysqlInitOkfienv:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretkey: password- name: MYSQL_REPLICATION_USERvalueFrom:secretKeyRef:name: mysql-secretkey: replicationUser- name: MYSQL_REPLICATION_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretkey: replicationPasswordports:- name: mysqlcontainerPort: 3306volumeMounts:- name: datamountPath: /var/lib/mysql- name: confmountPath: /etc/mysql/conf.d- name: run-mysqlmountPath: /var/run/mysqlresources:requests:cpu: 500mmemory: 2Gi#设置存活探针livenessProbe:exec:command: ["mysqladmin", "ping", "-uroot", "-p${MYSQL_ROOT_PASSWORD}"]initialDelaySeconds: 30periodSeconds: 10timeoutSeconds: 5#设置就绪探针readinessProbe:exec:command: ["mysqladmin", "ping", "-uroot", "-p${MYSQL_ROOT_PASSWORD}"]initialDelaySeconds: 5periodSeconds: 10timeoutSeconds: 1volumes:- name: config-mapconfigMap:name: mysqlvolumeClaimTemplates:- metadata:name: dataspec:accessModes:- ReadWriteOncestorageClassName: nfsresources:requests:storage: 5Gi- metadata: name: confspec:accessModes:- ReadWriteOncestorageClassName: nfsresources:requests:storage: 100Mi- metadata: name: run-mysqlspec:accessModes:- ReadWriteOncestorageClassName: nfsresources:requests:storage: 100Mi

1.4 备库上查看是否同步

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/133457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 代码实例:多项式除法简单计算工具

文章目录 前言代码仓库代码说明核心片段 结果总结参考资料作者的话 前言 C 代码实例:多项式除法简单计算工具。 代码仓库 yezhening/Programming-examples: 编程实例 (github.com)Programming-examples: 编程实例 (gitee.com) 代码 说明 由于代码篇幅较多&#…

【蓝桥杯省赛真题41】Scratch电脑开关机 蓝桥杯少儿编程scratch图形化编程 蓝桥杯省赛真题讲解

目录 scratch电脑开关机 一、题目要求 编程实现 二、案例分析 1、角色分析

【数据开发】大数据平台架构,Hive / THive介绍

1、大数据引擎 大数据引擎是用于处理大规模数据的软件系统, 常用的大数据引擎包括Hadoop、Spark、Hive、Pig、Flink、Storm等。 其中,Hive是一种基于Hadoop的数据仓库工具,可以将结构化的数据映射到Hadoop的分布式文件系统上,并提…

家用电脑做服务器,本地服务器搭建,公网IP申请,路由器改桥接模式,拨号上网

先浇一盆冷水! 我不知道其他运营商是什么情况。联通的运营商公网IP端口 80、8080、443 都会被屏蔽掉,想要开放必须企业备案(个人不行)才可以。也就是说,只能通过其他端口进行showtime了。 需要哪些东西? 申…

MySQL中的刷脏机制详解

名词解释 脏页:当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。 干净页:内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。 LSN:称为日志的逻辑序列号(l…

HTB——introduction to active directory

文章目录 一、Active directory structure二、Active Directory Terminology 一、Active directory structure Active Directory (AD) 是用于 Windows 网络环境的目录服务。它是一种分布式分层结构,允许集中管理组织的资源,包括用…

MIPI-CSI-2 RAW10笔记

好文: 【精选】摄像头的MIPI接口、DVP接口和CSI接口-CSDN博客【精选】摄像头的MIPI接口、DVP接口和CSI接口-CSDN博客 (56 封私信 / 24 条消息) 显示器的 VGA、HDMI、DVI 和 DisplayPort 接口有什么区别? - 知乎 (zhihu.com) 嵌入式工程师必备&#x…

基于白鲸算法的无人机航迹规划-附代码

基于白鲸算法的无人机航迹规划 文章目录 基于白鲸算法的无人机航迹规划1.白鲸搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用白鲸算法来优化无人机航迹规划。 1.白鲸搜索算法 …

内核态内存映射

内核态的内存映射机制,主要包含以下几个部分: 内核态内存映射函数 vmalloc、kmap_atomic 是如何工作的;内核态页表是放在哪里的,如何工作的?swapper_pg_dir 是怎么回事;出现了内核态缺页异常应该怎么办&am…

什么是智慧工地?

智慧工地将更多人工智能、传感技术、虚拟现实等高科技技术植入到建筑、机械、人员穿戴设施、场地进出关口等各类物体中,并且被普遍互联,形成“物联网”,再与“互联网”整合在一起,实现工程管理干系人与工程施工现场的整合。智慧工…

火山引擎云原生存储加速实践

在火山引擎相关的业务中绝大部分的机器学习和数据湖的算力都运行在云原生 K8s 平台上。云原生架构下存算分离和弹性伸缩的计算场景,极大的推动了存储加速这个领域的发展,目前业界也衍生出了多种存储加速服务。但是面对计算和客户场景的多样性&#xff0c…

CSS 滚动捕获 Scroll Snap

CSS 滚动捕获 Scroll Snap CSS 滚动捕获允许开发者通过声明一些位置(或叫作捕获位置)来创建精准控制的滚动体验. 通常来说轮播图就是这种体验的例子, 在轮播图中, 用户只能停在图 A 或者图 B, 而不能停在 A 和 B 的中间. 比如平时用淘宝或小红书, 当你上滑到下一个推荐内容时…

wpf Grid布局详解 `Auto` 和 `*` 是两种常见的设置方式 行或列占多个单元格,有点像excel里的合并单元格。使其余的列平均分配剩余的空间

比如只有行的界面 <Window x:Class"GenerateTokenApp.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/exp…

YOLO目标检测——红绿灯检测数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;红绿灯检测数据集在自动驾驶、交通安全监控、智能交通系统、交通流量监测和驾驶员辅助系统等领域都有广泛应用的潜力数据集说明&#xff1a;红绿灯检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;含有国内红绿灯…

Zeus IoT : 基于 SpringBoot 的分布式开源物联网大数据平台

Zeus IoT 是一个集设备数据采集、存储、分析、观测为一体的开源物联网平台&#xff0c;全球首创基于 Zabbix 的物联网分布式数据采集架构&#xff0c;具备超百万级物联网设备的并发监控能力&#xff0c;真正具备工业级性能与稳定性的开源物联网大数据中台。 Zeus IoT 致力于让设…

快速实现一个企业级域名 SSL 证书有效期监控巡检系统

Why 现在对于企业来说&#xff0c;HTTPS 已经不是可选项&#xff0c;已经成为一个必选项。HTTPS 协议采用 SSL 协议&#xff0c;采用公开密钥的技术&#xff0c;提供了一套 TCP/IP 传输层数据加密的机制。SSL 证书是一种遵守 SSL 协议的服务器数字证书&#xff0c;一般是由权威…

Rust编程基础核心之所有权(下)

1.变量与数据交互方式之二: 克隆 在上一节中, 我们讨论了变量与数据交互的第一种方式: 移动, 本节将介绍第二种方式:克隆。 如果我们 确实 需要深度复制 String 中堆上的数据&#xff0c;而不仅仅是栈上的数据&#xff0c;可以使用一个叫做 clone 的通用函数。 看下面的代码…

Mac苹果电脑分辨率修改管理 安装SwitchResX 完美解决

SwitchResX for Mac是一款Mac应用程序&#xff0c;可帮助您更好地管理和控制显示器分辨率和其他显示设置。使用SwitchResX&#xff0c;您可以创建自定义分辨率、旋转屏幕、调整显示器色彩配置等。 1. 自定义分辨率&#xff1a;SwitchResX允许用户创建自定义的屏幕分辨率&#…

VSCode设置中文语言界面(VScode设置其他语言界面)

一、下载中文插件 二、修改配置 1、使用快捷键 CtrlShiftP 显示出搜索框 2、然后输入 configure display language 3、点击 (中文简体) 需要修改的语言配置 三、重启 四、可能出现的问题 1、如果configure display language已经是中文配置&#xff0c;界面仍是英文 解决&a…

css进阶知识点速览

0前言 零基础部分的博客 1选择器进阶 1.1后代选择器 作用&#xff1a;根据html标签的嵌套关系&#xff0c;选择父元素后代中满足条件的元素 选择器语法&#xff1a;选择器1 选择器2 {css} 结果&#xff1a; 在选择器1所找到标签的后代中 注意&#xff1a; 后代包括&#xf…