Linux运维:mysql主从复制原理及实验

news2024/12/29 10:48:26

当一台数据库服务器出现负载的情况下,需要扩展服务器服务器性能扩展方式有向上扩展,垂直扩展。向外扩展,横向扩展。通俗的讲垂直扩展是将一台服务器扩展为性能更强的服务器。横向扩展是增加几台服务器。

主从复制好比存了1000块钱在主上,在从上查不到,主从复制就是主和从数据一致。

复制的功能:负载均衡读操作,备份,高可用和故障切换,数据分布,MySQL升级。

一、主从复制架构和原理

1.1 mysql主从复制

读写分离

复制:每个节点都有相同的数据集,向外扩展,基于二进制日志的单向复制

1.2 复制的功能

负载均衡读操作

备份

高可用和故障切换

数据分布

MySQL升级

1.3复制结构和主从复制原理

一主一从,和一主多从。

主从复制的相关程序。

1.3.1 两个日志三个线程:

日志:二进制日志,中继日志(主上的二进制日志)

线程:dump线程,io线程,sql线程

主服务器:mysqldump线程,传输二进制日志给从

从服务器:io线程:接收主的二进制日志,写入中继日志;sql线程:读取中继日志,写入数据库。

1.3.2 原理:

1.主节点负责用户的写操作,用户发起写操作,会修改数据库

2.数据库修改后,会更新主节点上的二进制日志

3.主服务器会产生一个dump线程,一边读取二进制日志一边将二进制日志通过网络传给从服务器

4.从服务器会开启io线程,接收主服务器的二进制日志

5.io线程会将主服务器的二进制日志写入中继日志,这时只是生成了一个文件,并没有同步

6.从服务器再开启sql线程将中继日志中操作写入数据库完成更新

主从数据就保持一致了!

主从复制相关线程:

dump Thread:为每个slave的I/O Thread启动一个dump线程,用于向其发送binary log events从节点

I/O Thread:向master请求二进制日志事件,并保存于中继日志中

SQL Thread:从中继日志中读取日志事件,在本地完成同步操作。

主数据更新 -> 写入bin log -> slave服务器线程 -> io Thread -> 写入Relay Log -> SQL Thread -> 从数据库更新。这样就主从一致了。

yum安装数据库:

二、主从复制

2.1 主-从复制

Node3作为主192.168.114.30,Node4作为从192.168.114.40

2.2 主节点配置:

(1)启用二进制日志

主节点配置:启用二进制日志

(2)为当前节点设置一个全局唯一的ID号

[mysqld]

server-id=                        #区分自己的日志和别人的日志

log-basename=master        #可选项,设置datadir中日志名称,确保不依赖主机名

(3)查看从二进制日志的文件和位置开始进行复制

show master status;

(4)创建有复制权限的用户账号

grant replication slave on *.* 'repluser'@'HOST' identified by 'repluser';

2.3 从节点配置:

(1)启动中继日志

[mysqld]

server-id=

log-bin=

(2) 使用有复制权限的用户账号连接至主服务器,并启用复制线程

mysql> CHANGE MASTER TO
 MASTER_HOST='192.168.114.10',
 MASTER_USER='test',
 MASTER_PASSWORD='ABC123',
 MASTER_PORT=3306,
 MASTER_LOG_FILE='mysql-bin.000002',
 MASTER_LOG_POS=448;

show slave status;

2.4 实际操作:一主一从

Node3作为主:

在文件最后添加两条配置。

[root@Node3 ~]#:vim /etc/my.cnf
......
server-id=30
log-bin=/data/mysql/mysql-bin

建立目录并修改权限:

[root@Node3 ~]#:mkdir -p /data/mysql
[root@Node3 ~]#:chown -R mysql.mysql /data

重启数据库:

systemctl restart mysqld

登录并新建同步用户:

mysql -uroot -pabc123

master状态,查看同步文件和同步位置:763

Node4作为从:

[root@Node4 ~]#:vim /etc/my.cnf
......
server-id=40
log-bin=/data/mysql/mysql-bin

建立目录:

[root@Node4 ~]#:mkdir /data/mysql -p
[root@Node4 ~]#:chown -R mysql.mysql /data

重启:systemctl start mysqld

主上查看节点:449

主上查看二进制文件,我们指定了在/data/mysql/下:

[root@Node3 ~]#:ls /data/mysql/
mysql-bin.000001  mysql-bin.000002  mysql-bin.index

这个是最新的。

登录数据库添加主的信息,有模版,注意修改:

help change master to;

mysql> help change master to;
......
CHANGE MASTER TO
  MASTER_HOST='source2.example.com',
  MASTER_USER='replication',
  MASTER_PASSWORD='password',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='source2-bin.001',
  MASTER_LOG_POS=4,
  MASTER_CONNECT_RETRY=10;
#这里是模版,要根据自己环境修改

开启IO线程以及SQL线程:start slave;

 查看从服务器的状态:都是yes就是正常状态。如果有错就清空主从配置:reset slave all;

这里还有个状态:Seconds_Behind_Master: 0   代表与主服务器的信息差,0代表同步

2.5 验证

先看从上的数据库:

在主上创建一个数据库,看从上是否也有这个数据库:

mysql> create database test;
Query OK, 1 row affected (0.00 sec)

在从上查看:

也有了test数据库。实现主从复制!

可以看到主从建立了连接

三、案例:(主从复制+完备)

假设主节点的数据库已经运行了一段时间,产生了一定量的数据,主从复制只能复制开启后数据,那之前的数据如何处理?

把之前的那些数据做好完全备份。之后的数据通过主从复制实现备份。再结合在一起。(快照,重新还原到mysql)

安装好数据库之后,把一个数据库文件拖进来/data/下。把数据库hellodb_innodb.sql文件导进数据库中。

 进入数据库查看:

开启二进制日志:

[root@Node3 ~]#:vim /etc/my.cnf
......
server-id=30
log-bin=/data/mysql/log/mysql-bin

建立路径:

[root@Node3 ~]#:mkdir /data/mysql/log -p
[root@Node3 ~]#:chown -R mysql.mysql /data
[root@Node3 ~]#:systemctl restart mysqld

 完全备份:-A是把所有的数据库都备份在/data/下取名为all.sql。-F备份前滚动日志,锁定表完成后,执行flush logs命令,生成新的二进制日志文件。

mysqldump -uroot -pabc123 -A -F --master-data=1 --single-transaction > /data/all.sql

创建个登录用户,并授权:

由于之前在备份的时候加入了--master-data=1选项,就添加了主从复制的选项000002文件的619位置往后开始主从复制

000002文件619位置之前的配置由备份文件自行实现

接下来把备份的文件远程拷贝到Node4主机上:

scp /data/all.sql 192.168.114.40:/opt

从Node4上:

开启二进制日志:

[root@Node4 ~]#:vim /etc/my.cnf
......
server-id=40
log-bin=/data/mysql/log/mysql-bin

建立路径并重启数据库:

[root@Node4 ~]#:mkdir /data/mysql/log/ -p
[root@Node4 ~]#:chown -R mysql.mysql /data
[root@Node4 ~]#:systemctl restart mysqld

这时先看一下数据库:是没有hellodb数据库的。

修改备份脚本:

vim /opt/all.sql

找到CHANGE MASTER TO这一行,做以下修改:

进入数据库:把/opt/all.sql备份文件导入进来:source /opt/all.sql

开启从。查看从节点的状态

再次查看数据库:

模拟故障:

我们在从上给数据库中的表teachers插入一条数据:那么是第5条数据了

在主上也插入同样的数据:

按说这一条应该是第6条数据。

在从上查看节点状态:发现主从复制就失败了。出现了一个错误!

这时在主上再插入一条数据:

这里的err按说是第6条数据,lisi是第7条数据。

由于前面的错误,导致在从上就不会再显示了,提示主键重复,整个都down掉了。需要解决故障问题。先看一下从上的表数据:

通过show slave status\G;查看,显示主键重复!

重启一下,就是两个yes了:start slave;

在主上插入一条数据:

mysql> insert into teachers values(null,'lisi2',20,'M');
Query OK, 1 row affected (0.00 sec)

查看主上的数据:

在从上查看是否有lisi2:

mysql> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name          | Age | Gender |
+-----+---------------+-----+--------+
|   1 | Song Jiang    |  45 | M      |
|   2 | Zhang Sanfeng |  94 | M      |
|   3 | Miejue Shitai |  77 | F      |
|   4 | Lin Chaoying  |  93 | F      |
|   5 | err           |  24 | F      |
|   6 | lisi          |  21 | M      |
|   7 | lisi2         |  20 | M      |
+-----+---------------+-----+--------+

同步了!

四、级联

级联与一主一从一样,就在从后面再加一台服务器。作为从

主1--主2--从1

主2上要做的操作:在/etc/my.cnf中最下面添加一个:

[root@Node2 ~]#:vim /etc/my.cnf
......
log_slave_updates    #级联操作必须加

由于中间的服务器是前面的从也是后面的主,对于后面来说,中间的这个也需要建立一个用户:

mysql> grant replication slave on *.* to test@'192.168.114.%' identified by 'Admin@123';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

这样是为了给后面从服务器指定节点。

后面可以跟两台从服务器:

在/etc/my.cnf中只需要配置一个server-id即可:

7-3:
	7-2上:show master stauts;
CHANGE MASTER TO
	MASTER_HOST='192.168.114.20',
	MASTER_USER='test',
	MASTER_PASSWORD='Admin@123',
	MASTER_PORT=3306,
	MASTER_LOG_FILE='mysql-bin.000001',
	MASTER_LOG_POS=154;
start slave;
7-4:
	7-2上:show master stauts;
CHANGE MASTER TO
	MASTER_HOST='192.168.114.20',
	MASTER_USER='test',
	MASTER_PASSWORD='Admin@123',
	MASTER_PORT=3306,
	MASTER_LOG_FILE='mysql-bin.000001',
	MASTER_LOG_POS=449;
start slave;

验证:

在Node1主上创建一个数据库lxd;

在中间的从服务器(也是后面两台的主)也同步了Node1主的数据:

Node1主创建数据库:

mysql> create database lxd;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| lxd                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

Node2从:(也是后面两台的主)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| lxd                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

实现级联同步!

---end---

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

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

相关文章

如何在 PostgreSQL 中实现数据的去重操作,尤其是对于复杂的数据结构?

文章目录 一、基本数据类型的去重二、多列数据的去重三、复杂数据结构的去重(一)数组类型的去重(二)JSON 类型的去重(三)结构体类型(复合类型)的去重 四、使用 GROUP BY 进行去重五、…

102.二叉树的层序遍历——二叉树专题复习

迭代方式&#xff1a; class Solution {// 定义一个成员变量res来存储层序遍历的结果List<List<Integer>> res new ArrayList<>();// levelOrder方法是层序遍历的接口&#xff0c;它接受一个二叉树的根节点rootpublic List<List<Integer>> lev…

计组-测验题6

7.假设有7位信息码0110101&#xff0c;则低位增设偶校验位的代码和低位增设奇校验位后的代码分别是&#xff08;&#xff09; A.01101010 01101010 B.01101010 01101011 C.01101011 01101010 D.01101011 01101011 B 奇校验码&#xff1a;整个校验码&#xff08;有效信息位…

行内元素、块级元素居中

行内元素居中 水平居中 {text-align&#xff1a;center;}垂直居中 单行——行高等于盒子高度 <head><style>.father {width: 400px;height: 200px;/* 行高等于盒子高度&#xff1a;line-height: 200px; */line-height: 200px;background-color: pink;}.son {}&…

码云远程仓库, 回滚到指定版本号

1. 打开项目路径, 右击Git Bash Here 2. 查找历史版本 git reflog 3. 回退到指定版本 git reset --hard 版本号 4. 强制推送到远程 git push -f

shared_ptr的operator = 里都发生了什么

std::shared_ptr<A01> ptr std::make_shared<A01>(); std::shared_ptr<A01> sec ptr; std::shared_ptr<A01> third ptr; std::cout << sec.use_count() << std::endl; sec third; //这一步的时候&#xff0c;计数有哪些逻辑&#xff1…

智能化代码审查系统设计

设计一个智能化代码审查系统&#xff0c;特别是针对Java开发&#xff0c;需要综合考虑多个维度来提升代码质量、提高审查效率&#xff0c;并促进团队间的协作。以下是该系统设计的关键要素和功能特性&#xff1a; 系统架构 客户端-服务器架构&#xff1a;前端提供友好的Web界面…

三级_网络技术_08_IP地址规划技术

1.如果内网的某Web服务器允许外网访问&#xff0c;并且该服务器NAT转换表如图所示&#xff0c;那么外网主机正确访问该服务器时使用的URL是()。 http://59.12.1.1:1423 http://135.2.2.1 http://135.2.2.1:5511 http://192.168.33.11:80 2.如果内网的某FTP服务器允许外网访…

深度学习3 基于规则的决策树模型

1.决策树是一种归纳学习算法&#xff0c;从一些没有规则、没有顺序、杂乱无章的数据中&#xff0c;推理出决 策模型。不管是什么算法的决策树&#xff0c;都是一种对实例进行分类的树形结构。决策树有三个要素&#xff1a;节点(Node)、分支(Branches)和结果(Leaf)。 训练决策树…

在线制作网页PHP源码+IAPPv3源码

好久以前刚学PHP的时候搞的&#xff0c;现在翻出来并修复了一下就分享出来了&#xff0c;希望可以给初学者一点借鉴学习例子&#xff0c;虽然不是很好哈&#xff0c;但拿来耍耍应该还算可以吧。 使用教程 环境是PHP就行&#xff0c;直接把源码上传到服务器&#xff08;虚拟主…

[算法] 优先算法(四):滑动窗口(下)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

代码随想录算法训练营第五十三天| 739. 每日温度 , 496.下一个更大元素 I , 503.下一个更大元素II

739. 每日温度 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int[] dailyTemperatures(int[] temperatures) {int[] result new int[temperatures.length];Deque<Integer> monoStack new LinkedList<Integer>();for(int i0;i<temperatures…

PXIe-6674T PXIe,OCXO PXI同步模块

PXIe-6674T PXIe&#xff0c;OCXO PXI同步模块 PXIe‑6674T可生成时钟和触发信号&#xff0c;并在单个PXI Express机箱中的多个设备之间路由这些信号&#xff0c;也可将这些信号路由到其他PXI和PXI Express机箱或第三方仪器。 PXIe‑6674T可利用PXI Express的高级低电压差分…

项目一单机安装基于LNMP结构的WordPress网站 web与数据库服务分离

网站的类型&#xff1a; Jave:LNMT PHP:LNMP Python: LNMU 项目部署&#xff1a; 1.项目的类型&#xff08;项目的开发语言&#xff09; 2.项目运营平台的技术选择 3.尽快让项目运行起来 all in one部署 4. 架构的优化 配置ansible管理环境 配置nginx 配置数据库服务…

[Flink]二、Flink1.13

7. 处理函数 之前所介绍的流处理 API,无论是基本的转换、聚合,还是更为复杂的窗口操作,其实都是基于 DataStream 进行转换的;所以可以统称为 DataStream API ,这也是 Flink 编程的核心。而我们知道,为了让代码有更强大的表现力和易用性, Flink 本身提供了多…

数据库性能优化系统设计

设计一个数据库性能优化系统&#xff0c;目标是监测、诊断并改善数据库的运行效率&#xff0c;确保系统能够高效稳定地处理大量数据请求。以下是一个概要设计&#xff0c;包括关键模块、功能和实现思路&#xff1a; 1. 系统架构 分布式监控中心&#xff1a;采用分布式架构收集…

Alt与Tab切换窗口时将Edge多个标签页作为一个整体参与切换的方法

本文介绍在Windows电脑中&#xff0c;使用Alt与Tab切换窗口时&#xff0c;将Edge浏览器作为一个整体参与切换&#xff0c;而不是其中若干个页面参与切换的方法。 最近&#xff0c;需要将主要使用的浏览器由原本的Chrome换为Edge&#xff1b;但是&#xff0c;在更换后发现&#…

Vine: 一种全新定义 Vue 函数式组件的解决方案

7月6日的 vue confg 大会上 ShenQingchuan 大佬介绍了他的 Vue Vine 项目&#xff0c; 一种全新定义 Vue 函数式组件的解决方案。 和 React 的函数式组件有异曲同工之妙&#xff0c;写起来直接起飞了。 让我们来快速体验一下 vine&#xff0c; 看看到底给我们带来了哪些惊喜吧…

【漏洞复现】TerraMaster TOS exportUser.php 远程命令执行

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

@[TOC](六、数据可视化—Echars(爬虫及数据可视化))

六、数据可视化—Echars&#xff08;爬虫及数据可视化&#xff09; Echarts应用 Echarts Echarts官网&#xff0c;很多图表等都是我们可以 https://echarts.apache.org/zh/index.html 是百度自己做的图表&#xff0c;后来用的人越来越多&#xff0c;捐给了orange组织&#xf…