MySQL第二讲 MySQL主从架构搭建

2023-11-03

主从架构意义

通过搭建MySQL主从集群,可以缓解MySQL的数据存储以及访问的压力。
1:数据安全
      给主服务增加一个数据备份。基于这个目的,可以搭建主从架构,或者也可以基
于主从架构搭建互主的架构。
2:读写分离,
     对于大部分的JAVA业务系统来说,都是读多写少的,读请求远远高于写请求。这
时,当主服务的访问压力过大时,可以将数据读请求转为由从服务来分担,主服务
只负责数据写入的请求,这样大大缓解数据库的访问压力。 要理解,MySQL的主从架构只是实现读写分离的一个基础。实现读写分离还是需 要一些中间件来支持,比如ShardingSphere。
3: 故障转移-高可用
    当MySQL主服务宕机后,可以由一台从服务切换成为主服务,继续提供数据读写 功能。
    对于高可用架构,主从数据的同步也只是实现故障转移的一个前提条件,要实现MySQL主从切换,还需要依靠一些其他的中间件来实现。比如MMM、MHA、 MGR。
在一般项目中,如果数据库的访问压力没有那么大,那读写分离不一定是必须要做的,但是,主从架构和高可用架构则是必须要搭建的。

同步的原理

          MySQL服务的主从架构一般都是通过binlog日志文件来进行的。即在主服务上打
开binlog记录每一步的数据库操作,然后从服务上会有一个IO线程,负责跟主服务
建立一个TCP连接,请求主服务将binlog传输过来。这时,主库上会有一个IO dump线程,负责通过这个TCP连接把Binlog日志传输给从库的IO线程。接着从服务的IO线程会把读取到的binlog日志数据写入自己的relay日志文件中。然后从服务上另外一个SQL线程会读取relay日志里的内容,进行操作重演,达到还原数据的目的。我们通常对MySQL做的读写分离配置就必须基于主从架构来搭建。

        MySQL的binlog不光可以用于主从同步,还可以用于缓存数据同步等场景。 例如Canal,可以模拟一个slave节点,向MySQL发起binlog同步,然后将数据落地到Redis、Kafka等其他组件,实现数据实时流转、

 搭建主从集群时,有两个必要的要求:

1:双方MySQL必须版本一致。至少需要主服务的版本低于从服务

2:两节点间的时间需要同步。

搭建主从架构

我们直接使用docker搭建mysql主从架构,首先配置master节点

配置Master节点

创建目录,以及目录下的文件

mkdir /mydata/MHA/master

在conf目录下创建配置文件

[mysqld]
server-id=47
#开启binlog
log_bin=master-bin
log_bin-index=master-bin.index
skip-name-resolve
#设置连接端口
port=4306
#设置mysql数据库的数据的存放目录
datadir=/var/lib/mysql-files
#允许最大连接数
max_connections=200
#允许连接失败的次数。
max_connect_errors=10
#服务端使用的字符集默认为UTF8
character-set-server=utf8
#创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#默认使用“mysql_native_password”插件认证
#mysql_native_password
default_authentication_plugin=mysql_native_password
server-id:服务节点的唯一标识。需要给集群中的每个服务分配一个单独的ID
log_bin:打开Binlog日志记录,并指定文件名。
log_bin-index:Binlog日志文件

启动mysql master主节点

docker stop mysqlMaster && docker rm mysqlMaster
docker run  --restart=always --privileged=true \
-p 4306:4306 \
--name mysqlMaster \
-v /mydata/MHA/master/data:/var/lib/mysql-files \
-v /mydata/MHA/master/conf/my.cnf:/etc/mysql/my.cnf \
-v /mydata/MHA/master/conf/conf.d:/etc/mysql/conf.d \
-v /mydata/MHA/master/logs:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-e TZ=Asia/Shanghai \
-d mysql:8.0.28

 为主节点赋予用户权限以及给root用户分配一个replication slave的权限。 

mysql  -u  root  -p
初始没有密码直接登陆
赋予用户其他主机可以登陆的权限以及密码
CREATE USER  'root'@'ip地址/主机名' IDENTIFIED BY '密码';
mysql> grant all privileges on *.* to 'username'@'%'; //赋权限,%表示所有(host)
 
GRANT  REPLICATION SLAVE ON *.* TO   'root' @ '%' ;
#刷新权限
flush privileges;
更新用户的信息
use mysql;
update  user  set  host= '%'  where  user= 'root' ; # 开启远程登录
flush privileges;
# 查看主节点同步状态:
show master status;

     这个指令结果中的File和Position记录的是当前日志的binlog文件以及文件中的索 引。  
      而后面的Binlog_Do_DB和Binlog_Ignore_DB这两个字段是表示需要记录binlog 文件的库以及不需要记录binlog文件的库。目前我们没有进行配置,就表示是针对全库记录日志。这两个字段如何进行配置,会在后面进行介绍。
开启binlog后,数据库中的所有操作都会被记录到datadir当中,以一组 轮询文件的方式循环记录。而指令查到的File和Position就是当前日志的 文件和位置。而在后面配置从服务时,就需要通过这个File和Position通 知从服务从哪个地方开始记录binLog。

 在实际生产环境中,通常不会直接使用root用户,而会创建一个拥有全部权限的用户来负责主从同步。

可以查看我们映射目录data下的bin文件

 配置Slave从节点

和上面创建master节点目录一样,创建slave目录

 创建my.cnf文件

[mysqld]
#主库和从库需要不一致
server-id=48
#打开MySQL中继日志
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
#打开从服务二进制日志
log_bin=mysql-bin
#使得更新的数据写进二进制日志中
log-slave-updates=1
#设置连接端口
port=4306
#设置mysql数据库的数据的存放目录
datadir=/var/lib/mysql-files
#允许最大连接数
max_connections=200
#允许连接失败的次数。
max_connect_errors=10
#服务端使用的字符集默认为UTF8
character-set-server=utf8
#创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#默认使用“mysql_native_password”插件认证
#mysql_native_password
default_authentication_plugin=mysql_native_password

配置说明:主要需要关注的几个属性:

server-id:服务节点的唯一标识
relay-log:打开从服务的relay-log日志。
log-bin:打开从服务的bin-log日志记录。

启动slave节点:并设置他的主节点同步状态。

docker stop mysqlSlave && docker rm mysqlSlave
docker run  --restart=always --privileged=true \
-p 4307:4306 \
--name mysqlSlave \
-v /mydata/MHA/slave/data:/var/lib/mysql-files \
-v /mydata/MHA/slave/conf/my.cnf:/etc/mysql/my.cnf \
-v /mydata/MHA/slave/conf/conf.d:/etc/mysql/conf.d \
-v /mydata/MHA/slave/logs:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-e TZ=Asia/Shanghai \
-d mysql:8.0.28        

[root@node01 MHA]# docker exec -it mysqlSlave bash
root@3b072fba3bd9:/# mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.28 MySQL Community Server - GPL

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

# 设置同步主节点:
CHANGE MASTER TO
MASTER_HOST = 'node01' ,
MASTER_PORT =4 306 ,
MASTER_USER = 'root' ,
MASTER_PASSWORD = 'root' ,
MASTER_LOG_FILE = 'master-bin.000003' ,
MASTER_LOG_POS = 157,
GET_MASTER_PUBLIC_KEY = 1 ;
# 开启 slave
start slave;
# 查看主从同步状态
show slave status;
或者用 show slave status \G; 这样查看比较简洁
注意,CHANGE MASTER指令中需要指定的MASTER_LOG_FILE和 MASTER_LOG_POS必须与主服务中查到的保持一致。 并且后续如果要检查主从架构是否成功,也可以通过检查主服务与从服 务之间的File和Position这两个属性是否一致来确定。

 我们重点关注的就是红框内的数据,其中     Master_Log_File: master-bin.000003
   Read_Master_Log_Pos: 157 与主节点保持一致就是正确的,其中        Slave_IO_Running: Yes
Slave_SQL_Running: Yes

yes表示主节点和从节点都是运行状态

从这个指令的结果能够看到,有很多Replicate_开头的属性,这些属性指 定了两个服务之间要同步哪些数据库、哪些表的配置。只是在我们这个 示例中全都没有进行配置,就标识是全库进行同步。后面我们会补充如 何配置需要同步的库和表。

主从集群测试

测试时,我们先用showdatabases,查看下两个MySQL服务中的数据库情况

然后我们在主服务器上创建一个数据库 

然后我们再用show databases,来看下这个testdemo的数据库是不是已经同步 到了从服务。

 

可以看到从库里是 多了一个testdemo数据库,表示数据库已经同步过去了。

接下来我们继续在testdemo这个数据库中创建一个表,并插入一条数据。

 看看从库的数据表是否也同步成功:

 在从库 testdemo库中可以看到新增了一个表demotable且可以得到主库插入的一条记录。

从上面的测试过程看到,我们在主服务中进行的数据操作,就都已经同步到了从服 务上。这样,我们一个主从集群就搭建完成了。

另外,这个主从架构是有可能失败的,如果在slave从服务上查看slave状 态,发现Slave_SQL_Running=no,就表示主从同步失败了。这有可能 是因为在从数据库上进行了写操作,与同步过来的SQL操作冲突了,也 有可能是slave从服务重启后有事务回滚了。
如果是因为slave从服务事务回滚的原因,可以按照以下方式重启主从同 步:
mysql> stop slave ;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER= 1 ;
mysql> start slave ;
而另一种解决方式就是重新记录主节点的binlog文件消息
mysql> stop slave ;
mysql> change master to .....
mysql> start slave ;
但是这种方式要注意binlog的文件和位置,如果修改后和之前的同步接 不上,那就会丢失部分数据。所以不太常用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL第二讲 MySQL主从架构搭建 的相关文章

  • 从 Grib 天气模型中提取数据

    我已经下载了grib1模型数据来自GFS http en wikipedia org wiki Global Forecast System 我使用的是 Mac OS X 并且能够构建wgrib2文件来自NOAA http en wikip
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • 加载数据infile,Windows和Linux的区别

    我有一个需要导入到 MySQL 表的文件 这是我的命令 LOAD DATA LOCAL INFILE C test csv INTO TABLE logs fields terminated by LINES terminated BY n
  • AWS RDS MySql - 如何在设置“公开可用”后允许访问

    刚刚使用默认设置和用户 密码创建了新的 AWS RDS MySql 实例 我也将其设置为publicly available并在此过程中创建新的 VPC 目前无法从我的笔记本电脑连接到此 RDS mysql h endpoint u myu
  • MySQL 将表从 Latin1 转换为 utf8

    我需要将包含大量数据的表从 Latin1 转换为 utf8 以便它可以接受韩语字符 如何更改该表而不损坏其中的数据 我的 SQL 语句是什么 最好的方法是什么 ALTER TABLE database name table name CON
  • 无法在 mysql-apt-config [Ubuntu 14.04] 中选择“确定”

    我使用的是 Ubuntu 14 04 sudo apt get update总是给我这个选项来配置 mysql apt config 我尝试选择版本 按 tab gt 在 确定 上突出显示的键 按 Enter 但没有任何反应 它再次返回并突
  • 如何为我的整个 Node.js 应用程序使用相同的 MySQL 连接?

    我有一个app js 我从那里运行我的整个应用程序 在 app js 内部 我require许多文件中都有代码 对于每个文件 我都这样做 var mysql require mysql var mclient mysql createCon
  • MySQL 可选的带有 MATCH 的 LEFT JOIN

    我有以下查询 它对 MySQL Innodb 数据库中同一搜索词的两个不同表中的两列执行全文搜索 SELECT Id MATCH tb1 comment tb2 comment AGAINST search term IN BOOLEAN
  • 如何在查询语句之外从mysql查询中获取值?

    这是下面的函数console log function quo value value connection query SELECT role from roles where id 1 function error results fi
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • 没有提示指令的直连接中表的顺序是否会影响性能?

    所有基于 SQL 的 RDBMS 10 年前的版本 直接连接查询 没有提示指令 中的表顺序是否会对最佳性能和内存管理产生影响 听说最后一个join应该是最大的表 您的数据库的查询优化器如何处理这种情况 回答你的问题 是的 表的顺序在连接中有
  • MySQL正则表达式:如何将字符串中的数字与\d匹配?

    我有一个专栏release date它以字符串格式存储日期 不是 DATETIME 格式 因为它们有时可以是任何其他字符串文字 我想根据给定的月份和年份查找任意日期的所有记录 尝试遵循但对我不起作用 gt Post find all con
  • 如何删除 MySQL 数据库?

    你可能从我的上一个问题中注意到一个问题引发了更多的问题 在 MySQL 监视器中阅读 MySQL 手册 https stackoverflow com questions 1081399 我的数据库现在无法使用 部分原因是我想破坏东西并且无
  • MySQL 概念:会话与连接

    我对 MySQL 的概念有点困惑 会话与连接 当谈论连接到 MySQL 时 我们使用连接术语 连接池等 然而在 MySQL 在线文档中 http dev mysql com doc refman 4 1 en server system v
  • 无法连接到 MAMP 上的 phpMyAdmin

    我收到此错误消息 MySQL 说道 无法连接 设置无效 phpMyAdmin 尝试连接 MySQL 服务器 但服务器拒绝连接 您应该检查配置中的主机 用户名和密码 并确保它们与 MySQL 服务器管理员提供的信息相对应 用户和通行证是默认的
  • MySQL中查找id最大的行

    看一下下面名为 Articles 的 MySQL 表 id articleId version title content 1 1 0 0 ArticleNo 1 title v0 0 ArticleNo 1 content v0 0 2
  • 如何为 MySQL 中的字段或列添加别名?

    我正在尝试做这样的事情 但我收到未知的列错误 SELECT SUM field1 field2 AS col1 col1 field3 AS col3 from core 基本上 我只想使用别名 这样我就不需要执行之前执行的操作 这在mys
  • MySQL如何获取unix时间戳的时间差

    我有一个保存值1506947452的变量 需要使用公式从该日期提取分钟 started data now date 但started date采用unix时间戳格式10位int数字 我以ajax形式收到并需要放入mysql查询i试试这个 S
  • 选择获取与 MySQL Group 中 max 对应的整行

    当我使用Max使用后查找特定 MySQL 组中字段的最大值GROUP BY 是否可以获取包含最大值的整行 我在处理一些论坛代码时偶然发现了这个线程 我想获取每个线程的最新帖子并将其显示在特定板的线程列表中 Quassnoi上面的回答对我非常
  • 查询为空 Node Js Sequelize

    我正在尝试更新 Node js 应用程序中的数据 我和邮递员测试过 我的开发步骤是 从数据库 MySQL 获取ID为10的数据进行更新 gt gt 未处理的拒绝SequelizeDatabaseError 查询为空 我认识到 我使用了错误的

随机推荐

  • SpringCloudAlibaba负载均衡器-Ribbbon

    SpringCloudAlibaba负载均衡器 Ribbon 文章目录 SpringCloudAlibaba负载均衡器 Ribbon 1 什么是Ribbon 1 1 客户端的负载均衡 1 2服务端的负载均衡 1 3 常见的负载均衡算法 2
  • 【合天网安】SQLi-Labs系列之字符型报错注入

    SQL注入介绍 SQLi sql injection 我们称之为sql注入 何为sql 英文 Structured Query Language 叫做结构化查询语言 常见的结构化数据库有MySQL MS SQL Oracle以及Postgr
  • IDEA中快速搜索Jar包里面的内容

    版权声明 本文为CSDN博主 IT model 的原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接及本声明 原文链接 https blog csdn net IT model article details 888
  • vue3中引入全局的less 和配置代理

    使用vue cli搭建的项目 在项目中引入公共less变量 创建vue config js 内容如下 use strict const path require path const proxyUrlPort http xxxx modul
  • Failed to start mysqld.service: Unit not found

    很多人对本博客的方法提出了质疑 在此我解释一下 由于MySQL在CentOS7中收费了 所以已经不支持MySQL了 取而代之在CentOS7内部集成了mariadb 而安装MySQL的话会和MariaDB的文件冲突 所以本文建议直接安装ma
  • C# 系统应用之TreeView控件 (一).显示树状磁盘文件目录及加载图标

    在C 系统应用毕设U盘防御软件中需要实现文件不可恢复的删除 首先需要实现类似于资源管理器的界面 通过TreeView控件显示 我的电脑 所有磁盘文件树状目录并加载相应图标 显示结果如下图所示 一 界面设计 主窗体是一个Windowss窗体文
  • 简单的hashmap的实现

    package com public class linkList public final class Node public Object k public Object v public Node next null public N
  • suparc服务器没信号,SupARC对战平台新手上手教程

    11对战平台1 2 8 3 官方最新版 类型 修改器 游戏工具 大小 88 1M语言 中文 评分 9 8 标签 立即下载 这里有各种版本的SupARC客户端供选择 另外还有很多ROM 客户端下载成功后需要玩家注册新账号 新手玩家需要点击 注
  • dell服务器开启64位支持,dell服务器虚拟化开启(戴尔bios设置虚拟化)

    开机按f2进入bios设置界面 将光标移至 advanced 再使用上下方向键将光标移至 以上就是设置戴尔笔记本硬盘模式为ahci教程 有遇到戴尔笔记本不懂的如何修改硬 您好 戴尔电脑 一般进入bios的方法为开机按f2 而开机按f12是选
  • springboot毕设项目外文学术期刊遴选服务平台ba094(java+VUE+Mybatis+Maven+Mysql)

    springboot毕设项目外文学术期刊遴选服务平台ba094 java VUE Mybatis Maven Mysql 项目运行 环境配置 Jdk1 8 Tomcat8 5 Mysql HBuilderX Webstorm也行 Eclis
  • Python爬取租房信息并保存至Excel文件

    Python爬取租房信息并保存至Excel文件 爬取网页 解析数据 保存数据 本案例为Python编写Spider程序 获取租房相关信息 并保存至Excel文件 大致分为爬取网页 解析数据 保存数据三个步骤 程序具有通用性 只需获取目标网站
  • 大一下第一场

    大一下第一场比赛 太菜了 总结 小错误太多 应该提高严密性 long long scanf lld 有 gt lt 不要忘记了等于的情况 成绩那题 我默认把它看成了小数 其实还有整数的情况 一题有一些小细节没注意导致花了很多时间 诶 长寿的
  • 02-kafka集群搭建

    文章目录 0 服务器准备 1 zookeeper集群 1 1 下载 1 2 拷贝 1 3 配置变量 1 4 配置 1 5 启动 2 kafka 2 1 下载 2 2 拷贝到服务器 2 2 配置文件 2 3 启动 3 使用密码 3 1 配置文
  • win7 计算机属性 灰,打不开win7计算机属性解决方法

    1 点击 开端 单击翻开 记事本 程序 2 复制下面的代码 黏贴到新建的记事本里面 3 Windows Registry Editor Version 5 00 HKEY LOCAL MACHINE SOFTWARE Microsoft W
  • vue-router之 tag 和 v-solt 对比

    1 在vue router4 0之前 我们都是使用 tag 来自定义 router link 渲染成什么标签
  • 获取系统中各应用的运行时间

    通过增加动态库获取应用的运行时间 同事提出一个问题 如何获取嵌入式设备系统中各个应用已运行的时间 这个问题的解决方案有多种 其中一种是使用功能较强的软件作为系统的init进程和服务管理 例如systemd 以它启动各应用软件服务后 可通过s
  • K近邻算法,Matlab实现

    邻近算法 K近邻 通过计算测试样本与训练样本之间的距离 然后找出距离测试样本最近的K个样本 统计他们的结果 哪种类型的的结果出现的次数多则预测测试样本的结果为此结果 代码如下 function label1 KNN training tes
  • Python开发工具PyCharm的web开发教程:创建并运行 Python 项目

    在你开始前 要确定以下两点 PyCharm下载 已完成 安装了 Python PyCharm官方正版下载 要开始使用PyCharm 让我们编写一个 Python 脚本 创建一个 Python 项目 1 如果您在欢迎屏幕上 请单击新建项目 如
  • 关于 “定义_sys_exit()以避免使用半主机模式”的问题

    今天编译一个STM32程序的时候 遇到了一个问题 编译通不过 定义 sys exit 以避免使用半主机模式 void sys exit int x x x 输出的错误信息是 SYSTEM usart usart c 41 error 260
  • MySQL第二讲 MySQL主从架构搭建

    主从架构意义 通过搭建MySQL主从集群 可以缓解MySQL的数据存储以及访问的压力 1 数据安全 给主服务增加一个数据备份 基于这个目的 可以搭建主从架构 或者也可以基 于主从架构搭建互主的架构 2 读写分离 对于大部分的JAVA业务系统