k8s搭建一主三从的mysql8集群---无坑

一,环境准备

1.1 k8s集群服务器

ip角色系统主机名cpumem
192.168.40.129mastercentos7.9k8smaster48
192.168.40.130node1centos7.9k8snode148
192.168.40.131node2centos7.9k8snode248
192.168.40.132node3centos7.9k8snode348

k8s集群操作请参考《K8s安装部署(v1.28)--超详细(cri-docker作为运行时)-CSDN博客》 

1.2 nfs服务器器

ip角色系统主机名cpumem用图
192.168.40.129mastercentos7.9k8smaster48k8s主服务器

nfs服务器
192.168.40.130node1centos7.9k8snode148k8s的工作节点
需要装nfs软件
192.168.40.131node2centos7.9k8snode248k8s的工作节点
需要装nfs软件
192.168.40.132node3centos7.9k8snode348k8s的工作节点
需要装nfs软件

二,安装nfs服务

2.1  安装(所有节点)

因为需要在三个工作节点上连接nfs,所以工作节点上也要安装

yum install -y nfs-utils

2.2 暴露nfs目录(只暴露nfs主服务器)

要安装四台mysql(一主三从),所以我们要创建四个目录用于这四台服务器。

直接在nfs服务器(k8s-master:192.168.40.129)当中创建这三个目录并写入 /etc/exports 文件夹中(创建的目录可以修改):

mkdir -p /data/nfs/{mysql-master,mysql-slaver-01,mysql-slaver-02,mysql-slaver-03}
cat >> /etc/exports << EOF
/data/nfs/mysql-master *(rw,sync,no_root_squash)
/data/nfs/mysql-slaver-01 *(rw,sync,no_root_squash)
/data/nfs/mysql-slaver-02 *(rw,sync,no_root_squash)
/data/nfs/mysql-slaver-03 *(rw,sync,no_root_squash)
EOF

如果目录不为空,需要清空

rm -rf /data/nfs/mysql-master/*
rm -rf /data/nfs/mysql-slaver-01/*
rm -rf /data/nfs/mysql-slaver-02/*
rm -rf /data/nfs/mysql-slaver-03/*

 2.3 开启nfs服务器

直接在主服务器(192.168.40.129)上启动nfs服务器。

systemctl enable --now nfs-server

 2.4 测试nfs服务

我们可以通过这行命令来检查目录是否暴露成功: 注意修改为自己的nfs服务器地址

showmount -e 192.168.40.129

 

三,搭建MySql集群

3.1 创建命名空间

创建一个命名空间来部署MySQL集群,当然你也可以使用默认的Default命名空间。这里就用 mysql-cluster 命名空间来搭建集群了,首先我们将这个命名空间创建出来:

创建yaml

kubectl create namespace mysql-cluster --dry-run=client -o yaml
apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: null
  name: mysql-cluster
spec: {}
status: {}

 将上面内容 保存到mysql-ns.yaml中

 执行命令

kubectl apply -f mysql-ns.yaml

查看名称空间

kubectl get ns

3.2 创建MySQL密码的Secret

创建一个存储了MySQL密码的Secret,直接使用这行命令生成这个Secret的资源清单文件:
注意修改root的密码和命名空间,我的root密码设置为的是123456

kubectl create secret generic mysql-password --namespace=mysql-cluster --from-literal=mysql_root_password=123456 --dry-run=client -o=yaml
apiVersion: v1
data:
  mysql_root_password: MTIzNDU2
kind: Secret
metadata:
  creationTimestamp: null
  name: mysql-password
  namespace: mysql-cluster

将上述yaml内容保存到  mysql-secret.yaml 

kubectl apply -f  mysql-secret.yaml 

查看创建的密码

 kubectl get secret -n mysql-cluster

  

3.3 编写MySQL主节点yaml

3.3.1 创建pv和pvc

我们之前安装了nfs,现在我们可以给予那些目录创建pv和pvc, 注意nfs地址和路径


apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-master-nfs-pv
  namespace: mysql-cluster
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    # 注意修改IP地址和暴露的目录(如果不一样)
    server: 192.168.40.129
    path: /data/nfs/mysql-master
  storageClassName: "nfs"

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-master-nfs-pvc
  namespace: mysql-cluster
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "nfs"
  resources:
    requests:
      storage: 1Gi
  volumeName: mysql-master-nfs-pv

3.3.2 创建主节点mysql配置文件

我们需要为主节点准备一个 my.cnf 配置文件,文件内容如下: 

[mysqld]
skip-host-cache
skip-name-resolve
datadir          = /var/lib/mysql
socket           = /var/run/mysqld/mysqld.sock
secure-file-priv = /var/lib/mysql-files
pid-file         = /var/run/mysqld/mysqld.pid
user             = mysql
secure-file-priv = NULL
server-id        = 1
log-bin          = master-bin
log_bin_index    = master-bin.index
binlog_do_db     = test_db
binlog_ignore_db = information_schema
binlog_ignore_db = mysql
binlog_ignore_db = performance_schema
binlog_ignore_db = sys
binlog-format    = ROW

[client]
socket           = /var/run/mysqld/mysqld.sock

!includedir /etc/mysql/conf.d/

有那么几个配置需要注意一下那么几个配置:

  • # server id,要注意多个mysql节点唯一

server-id        = 1

  • # 生成的logbin的文件名

log-bin          = master-bin
log_bin_index    = master-bin.index

  • # 同步哪个数据库,这里我们为了测试之同步test_db这个数据库

binlog_do_db     = test_db

  • # 排除哪个数据库,可以写多行,排除的数据库不会被主从同步,这里写上mysql自带的几个数据库

binlog_ignore_db = information_schema
... # 还有几行省略

  • # binlog的格式

binlog-format    = ROW

创建一个ConfigMap来存储这个配置文件。可以使用以下配置生成yaml资源清单文件内容:

kubectl create configmap mysql-master-cm -n mysql-cluster --from-file=mysql.cnf --dry-run=client -o yaml

apiVersion: v1
data:
  my.cnf: |
    [mysqld]
    skip-host-cache
    skip-name-resolve
    datadir          = /var/lib/mysql
    socket           = /var/run/mysqld/mysqld.sock
    secure-file-priv = /var/lib/mysql-files
    pid-file         = /var/run/mysqld/mysqld.pid
    user             = mysql
    secure-file-priv = NULL
    server-id        = 1
    log-bin          = master-bin
    log_bin_index    = master-bin.index
    binlog_do_db     = test_db
    binlog_ignore_db = information_schema
    binlog_ignore_db = mysql
    binlog_ignore_db = performance_schema
    binlog_ignore_db = sys
    binlog-format    = ROW

    [client]
    socket           = /var/run/mysqld/mysqld.sock

    !includedir /etc/mysql/conf.d/
kind: ConfigMap
metadata:
  name: mysql-master-cm
  namespace: mysql-cluster

3.3.3 创建主节点服务Service


apiVersion: v1
kind: Service
metadata:
  name: mysql-master-svc
  namespace: mysql-cluster
  labels:
    app: mysql-master
spec:
  ports:
  - port: 3306
    name: mysql
    targetPort: 3306
    nodePort: 30306
  selector:
    app: mysql-master
  type: NodePort
  sessionAffinity: ClientIP

注意端口设置 

3.3.4 创建主节点的StatefulSet


apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-master
  namespace: mysql-cluster
spec:
  selector:
    matchLabels:
      app: mysql-master
  serviceName: "mysql-master-svc"
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql-master
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - args:
        - --character-set-server=utf8mb4
        - --collation-server=utf8mb4_unicode_ci
        - --lower_case_table_names=1
        - --default-time_zone=+8:00
        name: mysql
        # image: docker.io/library/mysql:8.0.34
        image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:8.0.34
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
        - name: mysql-conf
          mountPath: /etc/my.cnf
          readOnly: true
          subPath: my.cnf
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              key: mysql_root_password
              name: mysql-password
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: mysql-master-nfs-pvc
      - name: mysql-conf
        configMap:
          name: mysql-master-cm
          items:
          - key: my.cnf
            mode: 0644
            path: my.cnf

 注意mysql的镜像,可以找其他可用镜像替换。

3.3.5 完整的主节点配置yaml

一个完整的主节点yaml 包含PersistentVolume,PersistentVolumeClaim,ConfigMap,Service,StatefulSet 如下:


apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-master-nfs-pv
  namespace: mysql-cluster
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    # 注意修改IP地址和暴露的目录(如果不一样)
    server: 192.168.40.129
    path: /data/nfs/mysql-master
  storageClassName: "nfs"

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-master-nfs-pvc
  namespace: mysql-cluster
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "nfs"
  resources:
    requests:
      storage: 1Gi
  volumeName: mysql-master-nfs-pv

---
apiVersion: v1
data:
  my.cnf: |
    [mysqld]
    skip-host-cache
    skip-name-resolve
    datadir          = /var/lib/mysql
    socket           = /var/run/mysqld/mysqld.sock
    secure-file-priv = /var/lib/mysql-files
    pid-file         = /var/run/mysqld/mysqld.pid
    user             = mysql
    secure-file-priv = NULL
    server-id        = 1
    log-bin          = master-bin
    log_bin_index    = master-bin.index
    binlog_do_db     = test_db
    binlog_ignore_db = information_schema
    binlog_ignore_db = mysql
    binlog_ignore_db = performance_schema
    binlog_ignore_db = sys
    binlog-format    = ROW

    [client]
    socket           = /var/run/mysqld/mysqld.sock

    !includedir /etc/mysql/conf.d/
kind: ConfigMap
metadata:
  name: mysql-master-cm
  namespace: mysql-cluster

---

apiVersion: v1
kind: Service
metadata:
  name: mysql-master-svc
  namespace: mysql-cluster
  labels:
    app: mysql-master
spec:
  ports:
  - port: 3306
    name: mysql
    targetPort: 3306
    nodePort: 30306
  selector:
    app: mysql-master
  type: NodePort
  sessionAffinity: ClientIP

---

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-master
  namespace: mysql-cluster
spec:
  selector:
    matchLabels:
      app: mysql-master
  serviceName: "mysql-master-svc"
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql-master
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - args:
        - --character-set-server=utf8mb4
        - --collation-server=utf8mb4_unicode_ci
        - --lower_case_table_names=1
        - --default-time_zone=+8:00
        name: mysql
        # image: docker.io/library/mysql:8.0.34
        image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:8.0.34
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
        - name: mysql-conf
          mountPath: /etc/my.cnf
          readOnly: true
          subPath: my.cnf
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              key: mysql_root_password
              name: mysql-password
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: mysql-master-nfs-pvc
      - name: mysql-conf
        configMap:
          name: mysql-master-cm
          items:
          - key: my.cnf
            mode: 0644
            path: my.cnf

将上面的yaml 保存到 mysql-master.yaml 中,为后续部署准备 

3.4 编写MySQL从节点yaml

有了上面主节点的配置的yaml文件,我们可以根据它适当改下配置,作为从节点配置yaml

3.4.1 从节点共用Service配置

从节点我共用个service,保存到 mysql-slave-service.yaml ,配置如下

apiVersion: v1
kind: Service
metadata:
  name: mysql-slave-svc
  namespace: mysql-cluster
  labels:
    app: mysql-slave
spec:
  ports:
  - port: 3306
    name: mysql
    targetPort: 3306
    nodePort: 30308
  selector:
    app: mysql-slave
  type: NodePort
  sessionAffinity: ClientIP

3.4.2 从节点yaml配置

我们还是需要 PersistentVolume,PersistentVolumeClaim,ConfigMap,StatefulSet,只是已经把Service 独立成共用的了。无需在做配置

3.4.2.1 配置ConfigMap

从节点的ConfigMap稍微不一样

我们先编写my.cnf 如下

[mysqld]
skip-host-cache
skip-name-resolve
datadir          = /var/lib/mysql
socket           = /var/run/mysqld/mysqld.sock
secure-file-priv = /var/lib/mysql-files
pid-file         = /var/run/mysqld/mysqld.pid
user             = mysql
secure-file-priv = NULL
server-id        = 2
log-bin          = slave-bin
relay-log        = slave-relay-bin
relay-log-index  = slave-relay-bin.index

[client]
socket           = /var/run/mysqld/mysqld.sock

!includedir /etc/mysql/conf.d/

几个配置需要注意一下 

  • # server id,注意不同节点要不一样

server-id        = 3

  • # 从节点的logbin文件

log-bin          = slave-bin
relay-log        = slave-relay-bin
relay-log-index  = slave-relay-bin.index
 

还是用 生成yaml配置文件的方式 执行下 

kubectl create configmap mysql-slave-02-cm -n mysql-cluster --from-file=my.cnf --dry-run=client -o yaml

apiVersion: v1
data:
  my.cnf: |
    [mysqld]
    skip-host-cache
    skip-name-resolve
    datadir          = /var/lib/mysql
    socket           = /var/run/mysqld/mysqld.sock
    secure-file-priv = /var/lib/mysql-files
    pid-file         = /var/run/mysqld/mysqld.pid
    user             = mysql
    secure-file-priv = NULL
    server-id        = 2
    log-bin          = slave-bin
    relay-log        = slave-relay-bin
    relay-log-index  = slave-relay-bin.index

    [client]
    socket           = /var/run/mysqld/mysqld.sock

    !includedir /etc/mysql/conf.d/
kind: ConfigMap
metadata:
  name: mysql-slave-01-cm
  namespace: mysql-cluster
3.4.2.2 从节点的完整yaml

从节点的完整yaml配置如下 

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-slave-01-nfs-pv
  namespace: mysql-cluster
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.40.129
    path: /data/nfs/mysql-slaver-01
  storageClassName: "nfs"

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-slave-01-nfs-pvc
  namespace: mysql-cluster
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: "nfs"
  resources:
    requests:
      storage: 1Gi
  volumeName: mysql-slave-01-nfs-pv

---
apiVersion: v1
data:
  my.cnf: |
    [mysqld]
    skip-host-cache
    skip-name-resolve
    datadir          = /var/lib/mysql
    socket           = /var/run/mysqld/mysqld.sock
    secure-file-priv = /var/lib/mysql-files
    pid-file         = /var/run/mysqld/mysqld.pid
    user             = mysql
    secure-file-priv = NULL
    server-id        = 2
    log-bin          = slave-bin
    relay-log        = slave-relay-bin
    relay-log-index  = slave-relay-bin.index

    [client]
    socket           = /var/run/mysqld/mysqld.sock

    !includedir /etc/mysql/conf.d/
kind: ConfigMap
metadata:
  name: mysql-slave-01-cm
  namespace: mysql-cluster

---

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql-slave-01
  namespace: mysql-cluster
spec:
  selector:
    matchLabels:
      app: mysql-slave
  serviceName: "mysql-slave-svc"
  replicas: 1
  template:
    metadata:
      labels:
        app: mysql-slave
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - args:
        - --character-set-server=utf8mb4
        - --collation-server=utf8mb4_unicode_ci
        - --lower_case_table_names=1
        - --default-time_zone=+8:00
        name: mysql
        # image: docker.io/library/mysql:8.0.34
        image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:8.0.34
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
        - name: mysql-conf
          mountPath: /etc/my.cnf
          readOnly: true
          subPath: my.cnf
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              key: mysql_root_password
              name: mysql-password
      volumes:
      - name: mysql-data
        persistentVolumeClaim:
          claimName: mysql-slave-01-nfs-pvc
      - name: mysql-conf
        configMap:
          name: mysql-slave-01-cm
          items:
          - key: my.cnf
            mode: 0644
            path: my.cnf

 注意:

  1. PersistentVolume 中的nfs地址、路径,以及pv名称
  2. PersistentVolumeClaim 中pv的名称要对应
  3. ConfigMap 中的server-id 不能一样
  4. StatefulSet 对应名称要一致

保存在 mysql-slave-01.yaml

3.4.2.3 复制从节点的配置

复制 mysql-slave-01.yaml 两份 分别为 mysql-slave-02.yaml 和mysql-slave-03.yaml ,改上述对应的位置的配置 (基本都是改1为2、3,或者改01为02、03

cp mysql-slave-01.yaml mysql-slave-02.yaml
cp mysql-slave-01.yaml mysql-slave-03.yaml

以上是所有的yaml配置,如下图

3.5 启动集群服务 

3.5.1 启动

kubectl apply -f .

3.5.2 k8s查看所有集群信息 

kubectl get all -n mysql-cluster -o wide

3.5.3 进入主节点查看状态

 kubectl exec -itn mysql-cluster pod/mysql-master-0 -- mysql -uroot -p

输入的密码123456(根据自己的配置改) 

查看状态命令

 show master status

还需要注意  File 的名称 master-bin.000003 ,Position 157,这个我们将在从节点加入集群时用到

这里面我们先 编写加入集群的命令,如下(暂时不执行

change master to master_host='mysql-master-0.mysql-master-svc.mysql-cluster.svc.cluster.local', master_port=3306, master_user='root', master_password='123456', master_log_file='master-bin.000003', master_log_pos=157, master_connect_retry=30, get_master_public_key=1;

需要注意下面的几个参数:

  • master_host: 这个参数是master的地址,kubernetes提供的解析规则是 pod名称.service名称.命名空间.svc.cluster.local ,所以我们master的mysql地址是 deploy-mysql-master-0.deploy-mysql-master-svc.deploy-test.svc.cluster.local
  • master_port: 主节点的mysql端口,我们没改默认是3306
  • master_user: 登录到主节点的mysql用户 master_password: 登录到主节点要用到的密码
  • master_log_file: 我们之前查看mysql主节点状态时候的 File 字段
  • master_log_pos: 我们之前查看mysql主节点状态时候的
  • Position 字段 master_connect_retry: 主节点重连时间
  • get_master_public_key: 连接主mysql的公钥获取方式 根据上面参数,

如果要修改那么请按照自己的环境进行修改。 

3.5.4 进入从节点 加入集群

 kubectl exec -itn mysql-cluster pod/mysql-slave-01-0 -- mysql -uroot -p

 输入密码

输入我们上面已经备好的脚本

change master to master_host='mysql-master-0.mysql-master-svc.mysql-cluster.svc.cluster.local', master_port=3306, master_user='root', master_password='123456', master_log_file='master-bin.000003', master_log_pos=157, master_connect_retry=30, get_master_public_key=1;

启动从节点集群

 start slave; 

 

查看从节点的集群状态 

 show slave status\G

其他02,03两个节点也是一样 

kubectl exec -itn mysql-cluster pod/mysql-slave-02-0 -- mysql -uroot -p 
kubectl exec -itn mysql-cluster pod/mysql-slave-03-0 -- mysql -uroot -p

 

3.5.5 查看各个节点启动状态

 3.5.5.1 根据nfs的目录文件判定

主节点

ll /data/nfs/mysql-master/

 从节点01

从节点02

 从节点03

3.5.5.2 使用管理工具登录

 输入我们的服务器地址、端口、用户名、密码,检查各个节点是否都能登录

四,测试主从集群

4.1 进入主节点 建库、建表、插入数据

kubectl exec -itn mysql-cluster pod/mysql-master-0 -- mysql -uroot -p

 建库、建表、插入数据 脚本如下

CREATE DATABASE `test_db`;
USE `test_db`;

CREATE TABLE `user` (
  `user_id` BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '用户id',
  `username` VARCHAR(50) NOT NULL COMMENT '用户名',
  `age` TINYINT UNSIGNED DEFAULT 18 COMMENT '年龄',
  `gender` TINYINT UNSIGNED DEFAULT 2 COMMENT '性别;0=男,1=女,2=未知'
) COMMENT '用户表';

INSERT INTO `user` (`username`, `age`, `gender`) VALUES ('oopxiajun', '18', '0');

4.2 在从库查看是否同步

4.2.1 使用工具

我们直接刷新从库看下

所有都刷新下看下

4.2.2 进入节点查看

 kubectl exec -itn mysql-cluster pod/mysql-slave-01-0 -- mysql -uroot -p

查看库

show databases;

 查看表

use test_db;
show tables;

查看数据

 select * from user;

结果如下

我们看到库、表、数据都是同步了的。 

五,总结

5.1 为什么需要Mysql的主从复制

对于构建基于MySQL的大规模、高性能应用来讲,需要使用水平扩展(集群)的数据库架构方式。在MySQL内建的复制功能可以实现,通过为服务器配置一个或多个备库的方式来进行数据同步。

同时复制功能不仅有利于构建高性能的应用,也是高可用性、可扩展性、容灾、备份以及数据仓库等工作的基础。

复制的基本原理是让一台服务器的数据与其他服务器保持同步。一台主库的数据可以同步到多台备库上,备库本身也可以被配置成另外一台服务器的主库。主库和备库之间可以有多种不同的组合方式。

5.2 主从同步原理

MySQL实际上是如何复制数据的。总的来说,复制有三个步骤:

  1. 在主库上开启记录二进制日志。在每次准备提交事务完成数据更新前,主库将数据更新的事件记录到二进制日志中。MySQL会按事务提交的顺序而非每条语句的执行顺序来记录二进制日志。在记录二进制日志后,主库会告诉存储引擎可以提交事务了。
  2. 备库将主库的二进制日志复制到其本地的中继日志中。首先,备库会启动一个工作线程,称为I/O线程,I/O线程跟主库建立一个普通的客户端连接,然后在主库上启动一个特殊的二进制转储(binlog dump)线程(该线程没有对应的SQL命令),这个二进制转储线程会读取主库上二进制日志中的事件。它不会对事件进行轮询。如果该线程追赶上了主库,它将进入睡眠状态,直到主库发送信号量通知其有新的事件产生时才会被唤醒,备库I/0线程会将接收到的事件记录到中继日志中。
  3. 备库的SQL线程执行最后一步,该线程从中继日志中读取事件并在备库执行,从而实现备库数据的更新。当SQL线程追赶上I/O线程时,中继日志通常已经在系统缓存中,所以中继日志的开销很低。SQL线程执行的事件也可以通过配置选项来决定是否写入其自己的二进制日志中,它对于我们稍后提到的场景非常有用。 

在这个过程中,涉及两个角色:

  1. Master角色 启用 binlog 日志:开启 binlog 日志,记录所有除查询以外的 SQL 命令
  2. Slave角色: Slave_IO: 复制 master 主机 binlog 日志文件里的 SQL 命令到本机的 relay-log(中继日志) 文件里。从服务器上的 I/O thread(读写线程) 负责读取主服务器 binlog 日志中的 SQL 命令,并将其写入到 Relay log(中继日志中); Slave_SQL: 执行本机 relay-log(中继日志) 文件里的 SQL 语句,实现与 Master 数据一致。从服务器中的 SQL thread(SQL 线程)读取中继日志中的 SQL 命令,并将其写入到 Slave 的数据库中; 

5.3 主从同步结构模式

主从的复制的结果模式设置需要注意几点:

  1. 一个MySQL备库实例只能有一个主库。
  2. 每个备库必须有一个唯一的服务器ID。
  3. 一个主库可以有多个备库(或者相应的,一个备库可以有多个兄弟备库)。
  4. 如果打开了log_slave_updates选项,一个备库可以把其主库上的数据变化传播到其他备库。 

5.4 常见的结构模式

  1. 单向复制:一主一从
  2. 一主多从:从 <—— 主 ——> 从,即一个主节点,多个从节点(我们本章实现)
  3. 链式复制:主 <—— 从<—— 从:即链式复制,第一个主节点,最后一个为从节点,中间的为主从节点
  4. 互为主从:主 <——> 主:也叫双主复制或者双向复制。需要解决冲突问题。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【开源鸿蒙】OpenHarmony 5.0.0 发布了,速来下载最新代码

【开源鸿蒙】OpenHarmony 5.0.0 发布了&#xff0c;速来下载最新代码 一、写在前面二、准备命令工具三、配置用户信息四、下载OpenHarmony源码4.1 使用ssh协议下载&#xff08;推荐&#xff09;4.2 使用https协议下载 五、下载编译工具链六、参考链接 今天是9月30号&#xff0c…

【网络基础】网络常识快速入门知识清单,看这篇文章就够了

&#x1f490;个人主页&#xff1a;初晴~ 在现在这个高度智能化的时代&#xff0c;网络几乎已经成为了空气一般无处不在。移动支付、网上购物、网络游戏、视频网站都离不开网络。你能想象如果没有网络的生活将会变成什么样吗&#x1f914; 然而如此对于如此重要的网络&#xf…

2024年录屏软件排行榜:班迪录屏等四款软件实测!

不论是学习、娱乐还是工作&#xff0c;都有可能需要用到屏幕录制功能。在这篇文章中&#xff0c;我们将从不同的使用场景出发&#xff0c;为大家推荐几款实用的录屏工具——福昕录屏大师、转转大师录屏、爱拍录屏以及班迪录屏。 Foxit REC 直达链接&#xff08;复制到浏览器打…

STM32精确控制步进电机

目的&#xff1a;学习使用STM32电机驱动器步进电机&#xff0c;进行电机运动精确控制。 测试环境&#xff1a; MCU主控芯片STM32F103RCT6 &#xff1b;A4988步进电机驱动器模块&#xff1b; 微型2相4线步…

html5 + css3(下)

目录 CSS基础体验cssCSS引入方式选择器选择器-标签选择器-类选择器-id选择器-通配符 文字基本样式1.1 字体大小1.2 字体粗细1.3 字体样式&#xff08;是否倾斜&#xff09; 文字-字体1.4 常见字体系列&#xff08;了解&#xff09;1.5 字体系列 拓展-层叠性font复合属性文本缩进…

数电基础(组合逻辑电路+Proteus)

1.组合逻辑电路 1.1组合逻辑电路的分析 1.1.1组合逻辑电路的定义 组合逻辑电路的定义 &#xff08;1&#xff09;对于一个逻辑电路&#xff0c;其输出状态在任何时刻只取决于同一时刻的输入状态&#xff0c;而与电路的原来状态无关&#xff0c;这种电路被定义为组合逻辑电路…

vue3使用Teleport 控制台报警告:Invalid Teleport target on mount: null (object)

Failed to locate Teleport target with selector “.demon”. Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree main.…

等保测评:企业数字安全的坚实盾牌

1.1 企业数字化转型的浪潮 在当今时代&#xff0c;企业数字化转型的浪潮正以前所未有的速度席卷全球&#xff0c;据IDC预测&#xff0c;到2023年&#xff0c;全球数字化转型支出将达到惊人的2.3万亿美元。这一趋势不仅重塑了企业的运营模式&#xff0c;更对企业的信息安全提出…

TypeScript 算法手册【插入排序】

文章目录 TypeScript 算法手册 - 插入排序1. 插入排序简介1.1 插入排序定义1.2 插入排序特点 2. 插入排序步骤过程拆解2.1 选择当前元素2.2 寻找插入位置2.3 插入元素 3. 插入排序的优化3.1 二分查找插入排序案例代码和动态图 4. 插入排序的优点5. 插入排序的缺点总结 【 已更新…

工业制造场景中的设备管理深度解析

在工业制造的广阔领域中&#xff0c;设备管理涵盖多个关键方面&#xff0c;对企业的高效生产和稳定运营起着举足轻重的作用。 一、设备运行管理 1.设备状态监测 实时监控设备的运行状态是确保生产顺利进行的重要环节。通过传感器和数据采集系统等先进技术&#xff0c;获取设备…

【C#】CacheManager:高效的 .NET 缓存管理库

在现代应用开发中&#xff0c;缓存是提升性能和降低数据库负载的重要技术手段。无论是 Web 应用、桌面应用还是移动应用&#xff0c;缓存都能够帮助减少重复的数据查询和处理&#xff0c;从而提高系统的响应速度。然而&#xff0c;管理缓存并不简单&#xff0c;尤其是当你需要处…

【Linux】进程概念-2

文章目录 1.环境变量1.1 基本概念1.2 常见环境变量1.3 查看环境变量方法1.4 测试PATH1.5 测试HOME1.6 和环境变量相关的命令1.7 环境变量的组织方式1.8 通过代码如何获取环境变量1.9 通过系统调用获取或设置环境变量1.10 环境变量通常是具有全局属性的 1.环境变量 1.1 基本概念…

Vue3 + element-plus el-table二次封装组件新增虚拟滚动功能

1、此功能已集成到TTable组件 和TSelectTable 2、最终效果&#xff08;基于element-plus 的 el-table组件&#xff09; 3、TTable或TSelectTable组件使用&#xff08;只需要在标签中设置useVirtual即可&#xff09; 4、源码&#xff08;可以提取当做hooks方式来使用–具体看组…

物联网将如何影响全球商业?

互联网使人们能够交流&#xff0c;企业能够全天候不间断地跨洋跨洲持续运营。它重塑、颠覆并催生了新的产业&#xff0c;改变了人类与世界互动的方式。互联网曾经仅仅是一种方便、快捷、廉价的向世界各地发送信息的方式&#xff0c;而现在&#xff0c;只需打开或关闭任何连接到…

成都网安周暨CCS2024 | 大模型安全与产业应用创新研讨活动成功举办

9月11日-12日&#xff0c;作为2024年国家网络安全宣传周成都系列活动的重磅活动之一&#xff0c;CCS 2024成都网络安全系列活动在成都举行。“大模型安全与产业应用创新研讨活动”同期举办&#xff0c;本场活动由百度安全、成都无糖信息联合承办&#xff0c;特邀云安全联盟CSA大…

【智能算法应用】正余弦优化算法求解二维路径规划问题

摘要 正余弦优化算法&#xff08;Sine Cosine Algorithm, SCA&#xff09;是一种新颖的群体智能优化算法&#xff0c;能够有效地求解复杂的非线性问题。在本研究中&#xff0c;我们将SCA应用于二维路径规划问题&#xff0c;以找到从起点到终点的最优路径&#xff0c;同时避开障…

心觉:如何抓住宇宙送来的运气和机会?

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作186/1000天 赚钱需要系统学习吗 你会发现生活中没什么学历&#xff0c;知道的也没你多&#xff0c;行动力也不一定有你强&#x…

《线性代数》学渣笔记

文章目录 1 行列式1.1 克拉默法则1.2 基本性质1.3 余子式 M i j M_{ij} Mij​1.4 代数余子式 A i j ( − 1 ) i j ⋅ M i j A_{ij} (-1)^{ij} \cdot M_{ij} Aij​(−1)ij⋅Mij​1.5 具体型行列式计算&#xff08;化为基本型&#xff09;1.5.1 主对角线行列式&#xff1a;主…

PostgreSQL的字段存储类型了解

PostgreSQL的字段存储类型了解 在 PostgreSQL 中&#xff0c;每个字段&#xff08;列&#xff09;都有其存储类型&#xff0c;这些存储类型决定了数据库如何存储和处理该字段的数据。了解和适当地利用这些存储类型&#xff0c;可以提高数据库的性能和存储效率。 主要的存储类…

【设计模式-模板】

定义 模板方法模式是一种行为设计模式&#xff0c;它在一个方法中定义了一个算法的骨架&#xff0c;并将一些步骤延迟到子类中实现。通过这种方式&#xff0c;模板方法允许子类在不改变算法结构的情况下重新定义算法中的某些特定步骤。 UML图 组成角色 AbstractClass&#x…