【经验分享】MySQL集群部署一:主从模式

news2024/11/18 18:38:07

目录

  • 前言
  • 一、基本介绍
    • 1.1、概念
    • 1.2、执行流程
  • 二、部署
    • 2.1、通用配置
    • 2.2、主节点配置
    • 2.3、从节点配置
    • 2.4、主从测试
    • 2.5、谈一谈主节点历史数据同步问题

前言

MySQL的部署模式常见的包括以下几种:

  • 独立服务器部署
  • 主从复制部署
  • 高可用性集群(HA)
  • 分片
  • 容器化部署
部署方式优点缺点
独立服务器部署简单直接,适用于小规模应用。
管理和维护相对容易。
性能相对稳定,不受其他服务器影响。
单点故障风险,如果服务器崩溃,将导致应用不可用。
难以实现高可用性和故障切换。
主从复制部署数据冗余和备份,从服务器可以作为主服务器的备份。
支持读写分离,提高读操作的性能。
故障切换机制,当主服务器故障时,可以快速切换到从服务器
写操作只能在主服务器上执行,可能会造成主服务器的负载压力。
数据同步延迟,从服务器与主服务器之间存在一定的复制延迟。
高可用性集群高可用性,集群中的节点可以承担故障并实现自动故障切换。
数据冗余和备份,每个节点都包含完整的数据副本。
支持水平扩展和负载均衡。
配置和管理相对复杂。
集群节点之间的同步可能会引入一定的网络延迟。
需要额外的硬件和资源。
分片数据分布在多个节点上,可以扩展存储容量和吞吐量。
水平扩展,减轻单个节点的负载压力。
负载均衡,每个节点只处理部分数据和查询。
需要应用层支持,必须将数据分片逻辑嵌入应用程序中。
数据访问变得更加复杂,需要在多个节点上进行查询和事务操作。
数据一致性管理较为复杂
容器化部署快速部署和可移植性,通过容器技术实现快速启动和停止。
灵活性,可以在不同的环境中部署和迁移。
资源利用率高,容器可以共享主机的资源并提供隔离性。
对容器化技术和容器编排的要求较高。
配置和管理容器化的 MySQL 实例可能会更复杂。
维护多个容器的状态和版本控制。

本文主要介绍MySQL集群模式的主从复制部署模式,觉得写得不错的可以点赞支持一下。

一、基本介绍

1.1、概念

主从复制(Master-Slave Replication):主从复制是最简单的 MySQL 集群架构,将读写操作分离到不同的服务器上。主服务器接收所有的写操作,并将更改记录到二进制日志中,而从服务器则定期地检查主服务器的二进制日志并应用这些更改。主从复制适用于高读写比例,对数据一致性要求不高的场景。简而言之,在主从复制中,数据变更主要通过binlog来实现同步。
在这里插入图片描述

1.2、执行流程

在这里插入图片描述
执行流程(标红画线)

1、从库不断试探主库的二进制日志文件,如果这个文件有更新则发送请求到主库获取主库中更新的内容;

2、当向主库中写数据时:包括增加、删除、修改、建库建表等等;

3、主库将写命令记录到二进制日志文件中,并更新二进制日志文件的偏移量;

4、如果从库试探主库的二进制日志文件发现偏移量与从库记录的偏移量值不同,则标识主库有更新,那么就启动IO线程向主库请求从某个偏移量开始到二进制日志文件结束位置之间的所有数据;

5、主库根据从库请求偏移量位置来推送数据到从库中,然后从接收到数据以后,会更新从库所记录的偏移量位置;

6、从库获取到主库的数据后,将这些命令数据写入到中继文件中,然后唤醒SQL线程同时让当前IO线程挂起(休眠等待);

7、SQL线程根据记录在中继日志文件的偏移量,读取中继日志文件中的命令;

8、SQL线程拿到命令以后在本地数据库进行回放(从库中执行主库更新的SQL语句),回放完成后当前SQL线程挂起(等待下一次操作);

二、部署

本文主要根据三台服务器来部署一主二从的MySQL集群,服务器布置如下所示:

  • 192.168.100.101:3306(主)
  • 192.168.100.102:3306(从)
  • 192.168.100.103:3306(从)

mysql数据库版本:8.0.34
准备好安装包 mysql-8.0.34-linux-glibc2.17-x86_64.tar

2.1、通用配置

通用配置即为在101、102、103三台服务器上都安装MySQL,并进行基本配置。

# 1、创建目录/opt/mysql,并将安装包上传至当前目录
cd /opt/mysql

# 2、解压安装包
tar -zxvf mysql-8.0.34-linux-glibc2.17-x86_64.tar.gz

# 3、将安解压后的安装包移动到/usr/local/目录下,并改个名字
mv mysql-8.0.34-linux-glibc2.17-x86_64 /usr/local/mysql-8

# 4、创建配置文件 my.cnf,并输入以下内容
vim my.cnf
# *****************************************************************
#-------------------------文本内容分割线----------------------------
[mysqld]
basedir=/usr/local/mysql-8
datadir=/usr/local/mysql-8/data
port=3306
socket=/tmp/mysql.sock
character_set_server=utf8
# 忽略大小写配置 1忽略
lower_case_table_names=1
log-error=/usr/local/mysql-8/data/mysql.log
pid-file=/usr/local/mysql-8/data/mysql.pid

# 默认使用mysql_native_password插件认证
default_authentication_plugin=mysql_native_password
[mysql]
default-character-set = utf8
# 退出保存,首先按 【esc】然后 【:wq】保存并退出
#-------------------------文本内容分割线----------------------------
# *****************************************************************

# 5、在 /usr/local/mysql-8 目录下创建一个 data 文件夹
cd /usr/local/mysql-8
mkdir data

# 6、增加用户组 mysql:
sudo groupadd mysql

# 7、在用户组下增加用户 mysql:
sudo useradd -r -g mysql mysql

# 8、检查用户组、用户是否存在,存在会输出:mysql : mysql
groups mysql

# 9、初始化mysql
./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql-8/ --datadir=/usr/local/mysql-8/data/

# 10、将mysql加入到可控制启动服务的文件夹内,并命名mysql(service可控制的服务名):目的:可用 service mysql start命令来控制启动 mysql
cd /usr/local/mysql-8/support-files
cp mysql.server /etc/init.d/mysql

# 11、增加mysql配置
vim /etc/profile
# *****************************************************************
#-------------------------文本内容分割线----------------------------
export MYSQL_HOME=/usr/local/mysql-8
export PATH=$PATH:$MYSQL_HOME/bin
# 退出保存,首先按 【esc】然后 【:wq】保存并退出
#-------------------------文本内容分割线----------------------------
# *****************************************************************

# 12、配置生效
source /etc/profile

# 13、启动mysql
service mysql start

# 14、查看初始MySQL的密码
grep 'A temporary password is generated for' /usr/local/mysql-8/data/mysql.log

# 15、登录mysql
mysql -u root -p 

# 16、修改密码
alter user 'root'@'localhost' identified with mysql_native_password by 'qwerDF123!@#';

# 17、授权远程访问,*.* 表示所有数据库名,第二个*表示所有的数据库表; 
# root@'%'中的root表示用户名,%表示所有ip地址,%也可以指定具体的ip地址,比如:root@192.168.100.102
grant all privileges on *.* to root@'%' identified by 'qwerDF123!@#';

# 18、刷新权限
flush privileges;

# 19、选择mysql数据库,允许使用某个用户名及密码从任何主机连接到该 mysql 服务:
use mysql;
update user set host='%' where user = 'root';
flush privileges;

# 20、退出
exit

# 21、重启mysql
service mysql restart

至此,mysql的通用配置已经完成,之后就是主从节点的配置。

2.2、主节点配置

连接192.168.100.101:3306(主)数据库。

# 1、登录mysql
mysql -u root -p

# 2、创建copy用户,并授权,主节点需要做的操作,从节点不需要做
create user 'copy'@'%' identified by 'qwerDF123!@#';
grant replication slave on *.* to 'copy'@'%';

# 或者执行下面的命令(二选一)
grant replication slave on *.* to 'copy'@'%' identified by 'qwerDF123!@#';

# 3、退出mysql
exit

# 4、打开mysql的my.cnf文件
vim /etc/my.cnf
# *****************************************************************
#-------------------------文本内容分割线----------------------------
# 主节点配置
[mysqld]
# 这个id是唯一的,不能和其他从节点相同,否则从节点开启同步时会报错,我这里是以IP为id
server-id=192168100101
# 开启binlog,主节点必须要开启
log_bin=master-bin
log_bin-index=master-bin.index
# 用于在查询过程中跳过DNS反向解析,从而加快查询速度
skip-name-resolve
basedir=/usr/local/mysql-8
datadir=/usr/local/mysql-8/data
port=3306
socket=/tmp/mysql.sock
character_set_server=utf8
# 忽略大小写配置 1忽略
lower_case_table_names=1
log-error=/usr/local/mysql-8/data/mysql.log
pid-file=/usr/local/mysql-8/data/mysql.pid

# 默认使用mysql_native_password插件认证
default_authentication_plugin=mysql_native_password
[mysql]
default-character-set = utf8
# 退出保存,首先按 【esc】然后 【:wq】保存并退出
#-------------------------文本内容分割线----------------------------
# *****************************************************************

# 5、再次登录主数据库
mysql -u root -p

# 6、授权
GRANT REPLICATION SLAVE ON *.* TO 'root'@'%';

# 7、刷新
flush privileges;

# 8、查看主节点同步状态:记录目前的file和position
show master status;

至此,主节点配置完成。

2.3、从节点配置

# 1、打开mysql的my.cnf文件
vim /etc/my.cnf
# *****************************************************************
#-------------------------文本内容分割线----------------------------
# 从节点配置
[mysqld]
#主库和从库需要不一致,我这里是以IP为id
server-id=192168100102
#打开MySQL中继日志
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
#打开从服务二进制日志
log-bin=mysql-bin
#使得更新的数据写进二进制日志中
log-slave-updates=1
basedir=/usr/local/mysql-8
datadir=/usr/local/mysql-8/data
port=3306
socket=/tmp/mysql.sock
character_set_server=utf8
# 忽略大小写配置 1忽略
lower_case_table_names=1
log-error=/usr/local/mysql-8/data/mysql.log
pid-file=/usr/local/mysql-8/data/mysql.pid

# 默认使用mysql_native_password插件认证
default_authentication_plugin=mysql_native_password
[mysql]
default-character-set = utf8
# 退出保存,首先按 【esc】然后 【:wq】保存并退出
#-------------------------文本内容分割线----------------------------
# *****************************************************************

# 2、登录从数据库
mysql -u root -p

# 3、设置同步主节点配置, 信息需要看主节点的 show master status;
CHANGE MASTER TO
MASTER_HOST='192.168.100.101',
MASTER_PORT=3306,
MASTER_USER='copy',
MASTER_PASSWORD='qwerDF123!@#',
MASTER_LOG_FILE='binlog.000011',
MASTER_LOG_POS=156,
GET_MASTER_PUBLIC_KEY=1;


# 4、开启同步
start slave;

# 5、查看同步状态
SHOW SLAVE STATUS\G;

# 注意:假如主从同步失败,就一定要先执行以下命令停止同步。
stop slave;


# 假如第5步打印的问题描述不清楚,那么就执行查看具体信息
select * from performance_schema.replication_applier_status_by_worker \G;

第3步说明:

  • MASTER_HOST:主节点的IP地址;
  • MASTER_PORT:主节点的端口;
  • MASTER_USER:这里是主节点的用户,我们上面新建了一个copy用户,所以这里是copy,可以填root或者其他;
  • MASTER_PASSWORD:这个是用户密码;
  • MASTER_LOG_FILE:这个是binlog日志的文件号,主节点中使用show master status命令展示的File值;
  • MASTER_LOG_POS:这个是binlog日志偏移量,主节点中使用show master status命令展示的Position值;
  • GET_MASTER_PUBLIC_KEY:用于在MySQL中获取主节点的公钥,因为从节点需要主服务器的公钥来验证主服务器发送的加密数据;

第5步说明:
SHOW SLAVE STATUS\G; 会展示从节点的状态,主从是否配置成功,看Slave_IO_RunningSlave_SQL_Running都为Yes,如果有其中一个不是Yes,那么就表示主从配置失败。

假如主从配置失败,那么具体原因可查看Last_IO_Error参数说明,例如:

  • 表示主从集群中,存在相同的server_id,那么就需要更改本节点中的my.cnf文件中的server-id参数,然后重新从第三步开始执行。
Last_IO_Errno: 13117
Last_IO_Error: Fatal error: The replica I/O thread stops because source and replica have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on replica but this does not always make sense; please check the manual before using it).
  • 其他问题可百度。我这边就不一一列举了。

2.4、主从测试

使用Navicat或者其他工具连接主节点192.168.100.101:3306,然后新建一个数据库,新建一个表,然后连接其他两个从节点可以发现,那边也将新建的数据库和表同步过来了,同样的,在主节点中增、删、改数据,从节点也会同步过来。

需要注意的是:不可用在从节点中新增/删除/修改数据、建表、删除表等数据库变更操作,否则主从就会失效,失效之后从节点就需要重新配置主从关系,先stop slave,然后又是从2.3的第3步开始。

2.5、谈一谈主节点历史数据同步问题

以上配置其实是比较扯淡的,假如你目前项目是已经跑了有一段时间了,那么数据库里面肯定会有历史数据,而前面配置主从的时候,使用show master status;查看的肯定是主节点当前已有历史数据的状态,配置同步后历史数据不会同步过来,这就是一个很大的问题,那么如何解决这个问题呢?

我在网上看了挺多别人给出的解决方案,
首先是flush tables with read lock;将主库的写操作锁了,
然后show master status;记录当前主库的file 和 position值,
之后再使用mysqldump导出主库所有的数据库数据,然后再丢到从库中运行。
再之后就是执行2.3的第3步,将记录的主库file 和 position值填上去后,再开启同步,
从节点开启同步后,没问题的话,再将主库的写操作释放,然后进行测试。

目前我也是用的这个比较笨的办法,这种办法在生产环境的话会有较大问题,比如说你锁住主库的写操作这段期间,系统是不能进行写操作的,相当于从你锁住主库到释放主库这段时间,系统只可查不可写,而如果你生产的数据比较大,这个时间会延长。

如果有大佬有更好的方案,欢迎评论区讨论或留言,咱们一起学习。ヾ(◍°∇°◍)ノ゙

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

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

相关文章

【MRI重建】Cartesian采样中data consistency 常规数据一致性实现(pytorch)

关于 在MRI重建中,data consistency 可以帮助加快MRI图像重建和减少模型重建带来的重建误差。 工具 方法实现 x_rec: 重建图像, (batch_size,2,H,W) mask: 欠采样模版,(batch_size,2,H,W) k_un: 真实欠采样采集数据, (batch_size,2,H,W) torch.view_as_complex: 将实数数据…

【图解计算机网络】TCP协议三次握手与四次挥手

TCP协议三次握手与四次挥手 三次握手流程为什么是三次握手,而不是两次或四次四次挥手流程TIME_WAIT 为什么要等待 2MSL为什么握手是三次,挥手是四次? 三次握手流程 首先是客户端(也就是我们的浏览器)发送一个SYN标志位…

数字电路-可预置倒计时器Multisim仿真

数字电路之于FPGA意义重大。本可预置倒计时器设计采用40106作为振荡电路,由74LSl92、74LS47D和七段共阴数码管构成计时电路,具有启动/预置、暂停/继续计时和报警功能。紫色文字是超链接,点击自动跳转至相关博文。持续更新,原创不易…

鸿蒙内核源码分析(进程管理篇) | 谁在管理内核资源?

官方基本概念 从系统的角度看,进程是资源管理单元。进程可以使用或等待CPU、使用内存空间等系统资源,并独立于其它进程运行。 OpenHarmony内核的进程模块可以给用户提供多个进程,实现了进程之间的切换和通信,帮助用户管理业务程序…

rust前端web开发框架yew使用

构建完整基于 rust 的 web 应用,使用yew框架 trunk 构建、打包、发布 wasm web 应用 安装后会作为一个系统命令,默认有两个特性开启 rustls - 客户端与服务端通信的 tls 库update_check - 用于应用启动时启动更新检查,应用有更新时提示用户更新。nati…

MySQL数据库常见SQL语句宝典

一 、常用操作数据库的命令 1.查看所有的数据库 : show databases;2.创建一个数据库 : create database if not exists 数据库名;3.删除一个数据库 : drop database if exists 数据库名;4.选择一张表 (注意在建表之前必须要选择数据库) : use 表名;* --tab 键的上面&#x…

【学习笔记三十】EWM和PP集成的后台配置和前台演示

一、EWM和PP集成概述 在S4HANA版本中,PP模块强化了生产线的概念,并与EWM集成,使用生产供应区(PSA)的功能。PSA的基本配置包括在ERP系统中创建PSA、定义工作中心、将PSA分配给工作中心、在EWM中创建PSA、匹配ERP和EWM中…

【JavaSE】_继承

目录 1.继承的概念 2. 继承语法 3. 父类成员的访问 3.1 子类中访问父类的成员变量 3.1.1 子类和父类不存在同名成员变量 3.1.2 子类和父类成员变量同名 3.2 子类中访问父类的成员方法 3.2.1 成员方法名不同 3.2.2 成员方法名相同 4. super关键字 5. 子类构造方法 6.…

Swin Transformer—— 基于Transformer的图像识别模型

概述 Swin Transformer是微软研究院于2021年在ICCV上发表的一篇论文,因其在多个视觉任务中的出色表现而被评为当时的最佳论文。它引入了移动窗口的概念,提出了一种层级式的Vision Transformer,将Shifted Windows(移动窗口&#x…

Node.js -- 包管理工具

文章目录 1. 概念介绍2. npm2.1 npm 下载2.2 npm 初始化包2.3 npm 包(1) npm 搜索包(2) npm 下载安装包(3) require 导入npm 包的基本流程 2.4 开发依赖和生产依赖2.5 npm 全局安装(1) 修改windows 执行策略(2) 环境变量Path 2.6 安装包依赖2.7 安装指定版本的包2.8 删除依赖2.…

mysql主库delete一个没主键的表导致从库延迟很久问题处理

一 问题描述 发现线上环境一个从库出现延迟,延迟了2天了,还没追上主库。 查看当前运行的sql及事务,发现这个sql语句是在delete一个没主键的表。 二 问题模拟 这里在测试环境复现下这个问题。 2.1 在主库造数据 use baidd; CREATE TABL…

《QT实用小工具·四十三》历史编辑器(支持历史搜索 关键字匹配)

1、概述 源码放在文章末尾 该项目实现了在输入框中输入部分信息能全部展现之前的历史输入信息&#xff0c;支持历史搜索和关键词匹配&#xff0c;项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #include "historymodel.h" #include <QM…

C语言自定义类型【联合体与枚举】

文章目录 1.联合体1.1联合体的声明1.2联合体的特点1.3联合体的大小计算联合体的使用案例 2.枚举2.1枚举类型的声明2.2枚举类型的优点(为什么使用枚举)2.3枚举类型的使用 结语 1.联合体 1.1联合体的声明 和结构体一样&#xff0c;联合体也是由一个或多个成员构成&#xff0c;同…

ffmpeg中stream_loop参数不生效原因分析

问题 使用ffmpeg把一个视频文件发布成一个rtmp流&#xff0c;并设置成循环推流&#xff0c;此时需要使用参数stream_loop&#xff0c;命令如下: ffmpeg.exe -stream_loop -1 -re -i D:\tools\ffmpeg-5.1.2\bin\sei.h264 -c copy -f flv -safe 0 rtmp://localhost:1935/live/te…

BIO、NIO与AIO

一 BIO 同步并阻塞(传统阻塞型)&#xff0c;服务器实现模式为一个连接一个线程&#xff0c;即客户端有连接请求时服务器端就需要启动一个线程进行处理. BIO&#xff08;Blocking I/O&#xff0c;阻塞I/O&#xff09;模式是一种网络编程中的I/O处理模式。在BIO模式中&#xf…

杂项基础知识-部分

** 杂项基础知识 ** 一.常见的各类文件的文件头和文件结尾 列举常见文件头编码特征&#xff1a; JPEG&#xff1a; PNG&#xff1a; GIF&#xff1a; RAR&#xff1a; ZIP&#xff1a; 十六进制特征&#xff1a; 图片文件&#xff1a; JPEG&#xff1a;文件头格式为…

K8s 使用 CephFS 作为后端存储(静态供给、动态供给)

一、K8s 使用 CephFS CephFS是 Ceph 中基于RADOS&#xff08;可扩展分布式对象存储&#xff09;构建&#xff0c;通过将文件数据划分为对象并分布到集群中的多个存储节点上来实现高可用性和可扩展性。 首先所有 k8s 节点都需要安装 ceph-common 工具&#xff1a; yum -y ins…

C++面经(简洁版)

1. 谈谈C和C的认识 C在C的基础上添加类&#xff0c;C是一种结构化语言&#xff0c;它的重点在于数据结构和算法。C语言的设计首要考虑的是如何通过一个过程&#xff0c;对输入进行运算处理得到输出&#xff0c;而对C&#xff0c;首先要考虑的是如何构造一个对象&#xff0c;通…

PotatoPie 4.0 实验教程(41) —— FPGA实现RISC-V 扩展 GPIO UART Timer功能

TD工程介绍 我们提供的TD工程里的RISC-V核默认就开启了GPIO UART扩展&#xff0c;可以看到还有SPI和I2C扩展。因此后面的实验中TD的工程我们基本不怎么修改TD的内容&#xff0c;只需要修改TD工具中Soc_Top.v文件中的TCM0_INITFILE为FD生成的固件名称即可&#xff0c;主要修我以…

实时通讯技术 WebRTC 介绍

WebRTC WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音对话或视频对话的技术。 历史 2010年5月&#xff0c;Google以6820万美元收购VoIP软件开发商Global IP Solutions的GIPS引擎&#xff0c;并改为名为“WebRTC”。WebRTC使用…