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

目录

  • 前言
  • 一、基本介绍
    • 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.rhkb.cn/news/315098.html

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

相关文章

2024 年最好的免费数据恢复软件,您可以尝试的几个数据恢复软件

由于系统崩溃而丢失数据可能会给用户带来麻烦。我们将重要的宝贵数据和个人数据保存在我们的 PC、笔记本电脑和其他数字设备上。您可能会因分区丢失、意外删除文件和文件夹、格式化硬盘驱动器而丢失数据。数据丢失是不幸的,如果您不小心从系统中删除了文件或数据&am…

远程连接docker,实现本地发布版本到服务器

最近在学jenkins的时候,发现涉及到了docker的远程发布调用。后续应该还要自己搭建一个docker的本地仓库。 简单描述一下具体是如何实现的: 1、将docker的服务器开启2375端口(注意,这里的开启是将端口直接暴露出去,不用…

spring高级篇(四)

1、DispatcherServlet DispatcherServlet 是 Spring MVC 中的一个关键组件,用于处理 Web 请求并将其分发给相应的处理器(Controller)进行处理。它是一个 Servlet,作为前端控制器(Front Controller)的核心&a…

基于深度学习神经网络的AI图片上色DDcolor系统源码

第一步:DDcolor介绍 DDColor 是最新的 SOTA 图像上色算法,能够对输入的黑白图像生成自然生动的彩色结果,使用 UNet 结构的骨干网络和图像解码器分别实现图像特征提取和特征图上采样,并利用 Transformer 结构的颜色解码器完成基于视…

以生命健康为中心的物联网旅居养老运营平台

随着科技的飞速发展和人口老龄化的日益加剧,养老问题逐渐成为社会关注的焦点。传统的养老模式已经难以满足现代老年人的多元化需求,因此,构建一个以生命健康为中心的物联网旅居养老运营平台显得尤为重要。 以生命健康为中心的物联网旅居养老运…

未来已来:解锁AGI的无限潜能与挑战

未来已来:解锁AGI的无限潜能与挑战 引言 假设你有一天醒来,发现你的智能手机不仅提醒你今天的日程,还把你昨晚做的那个奇怪的梦解释了一番,并建议你可能需要减少咖啡摄入量——这不是科幻电影的情节,而是人工通用智能…

本地认证的密码去哪了?怎么保证安全的?

1. windows登录的明文密码,存储过程是怎么样的?密文存在哪个文件下?该文件是否可以打开,并且查看到密文? 系统将输入的明文密码通过hash算法转为哈希值,且输入的值会在内存中立即删除无法查看。 然后将密文存放在C:…

Vue3+Vite开发的项目进行加密打包

本文主要介绍Vue3+Vite开发的项目如何进行加密打包。 目录 一、vite简介二、混淆工具三、使用方法1. 安装插件:2. 配置插件:3. 运行构建:4. 自定义混淆选项:5. 排除文件:下面是Vue 3+Vite开发的项目进行加密打包的方法。 一、vite简介 Vite 是一个由 Evan You 创造的现代…

MultiHeadAttention在Tensorflow中的实现原理

前言 通过这篇文章,你可以学习到Tensorflow实现MultiHeadAttention的底层原理。 一、MultiHeadAttention的本质内涵 1.Self_Atention机制 MultiHeadAttention是Self_Atention的多头堆嵌,有必要对Self_Atention机制进行一次深入浅出的理解,这…

AJAX——案例

1.商品分类 需求&#xff1a;尽可能同时展示所有商品分类到页面上 步骤&#xff1a; 获取所有的一级分类数据遍历id&#xff0c;创建获取二级分类请求合并所有二级分类Promise对象等待同时成功后&#xff0c;渲染页面 index.html代码 <!DOCTYPE html> <html lang&qu…

ssh 文件传输:你应该掌握的几种命令行工具

这篇文章主要分享一下我使用过的 ssh 传输文件的进阶路程&#xff0c;从 scp -> lrzsz -> trzsz&#xff0c;希望能给你带来一些帮助&#xff5e; scp scp 命令可以用于在 linux 系统之间复制文件&#xff0c;具体的语法可以参考下图 其实使用起来也还比较方便&#x…

【Docker】Docker 实践(三):使用 Dockerfile 文件构建镜像

Docker 实践&#xff08;三&#xff09;&#xff1a;使用 Dockerfile 文件构建镜像 1.使用 Dockerfile 文件构建镜像2.Dockerfile 文件详解 1.使用 Dockerfile 文件构建镜像 Dockerfile 是一个文本文件&#xff0c;其中包含了一条条的指令&#xff0c;每一条指令都用于构建镜像…

智慧码头港口:施工作业安全生产AI视频监管与风险预警平台方案

一、建设思路 随着全球贸易的快速发展&#xff0c;港口作为连接海洋与内陆的关键节点&#xff0c;其运营效率和安全性越来越受到人们的关注。为了提升港口的运营效率和安全性&#xff0c;智慧港口视频智能监控系统的建设显得尤为重要。 1&#xff09;系统架构设计 系统应该采…

针对icon报错

针对上篇文章生成图标链接中图标报错 C# winfrom应用程序添加图标-CSDN博客 问题&#xff1a;参数“picture”必须是可用作Icon的参数 原因&#xff1a;生成的ico图标类型不匹配 解决方法&#xff1a; 更改导出的ico类型

下载学浪视频,小浪助手一键搞定

小浪助手可以一键获取课程&#xff0c;一键根据课程获取视频列表&#xff0c;而且内置了2大下载器&#xff0c;N_m3u8和逍遥一仙下载器 小浪助手我已经打包好了&#xff0c;有需要的自己取一下 学浪下载工具链接&#xff1a;https://pan.baidu.com/s/1_Sg-EGGXKc4bMW-NPqUqvg…

第55篇:创建Nios II工程之Hello_World<一>

Q&#xff1a;本期我们开始介绍创建Platform Designer系统&#xff0c;并设计基于Nios II Processor的Hello_world工程。 A&#xff1a;设计流程和实验原理&#xff1a;需要用到的IP组件有Clock Source、Nios II Processor、On-Chip Memory、JTAG UART和System ID外设。Nios I…

Maven多模块快速升级超好用Idea插件-MPVP

功能&#xff1a;多模块maven项目快速升级指定版本插件&#xff0c;并提供预览和相关升级模块日志能力。 可快速进行版本升级&#xff0c;进行部署到Maven仓库。 安装&#xff1a; 可在idea插件中心进行安装 / 下载资源拖动安装 MPVP(Maven) - IntelliJ IDEs Plugin | Marke…

构建安全高效的前端权限控制系统

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起进步&am…

数据库变更时,OceanBase如何自动生成回滚 SQL

背景 在开发中&#xff0c;数据的变更与维护工作一般较频繁。当我们执行数据库的DML操作时&#xff0c;必须谨慎考虑变更对数据可能产生的后果&#xff0c;以及变更是否能够顺利执行。若出现意外数据丢失、操作失误或语法错误等情况&#xff0c;我们必须迅速将数据库恢复到变更…

Bayes判别示例数据:鸢尾花数据集

使用Bayes判别的R语言实例通常涉及使用朴素贝叶斯分类器。朴素贝叶斯分类器是一种简单的概率分类器&#xff0c;基于贝叶斯定理和特征之间的独立性假设。在R中&#xff0c;我们可以使用e1071包中的naiveBayes函数来实现这一算法。下面&#xff0c;我将通过一个简单的示例展示如…