当前位置:网站首页>一、MySQL主从复制原理
一、MySQL主从复制原理
2022-07-31 07:42:00 【m0_67401382】
MySQL主从复制
一、MySQL主从复制原理
MySQL的主从复制和MySQL的读写分离两者有必然的联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离
1)MySQL支持的复制类型
(1)基于语句的复制:在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。但是必须开启二进制日志功能;
(2)基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍;
(3)混合类型的复制:默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制;
2)复制的工作过程
MySQL复制的工作过程详细介绍:
1.在每个事物更新数据完成之前,Master在二进制日志记录这些变化。写入二进制日志完成后,Master通知存储引擎提交事务;
2.Slave将Master的Binary log(二进制日志)复制到其Relay log(中继日志)。首先Slave开始一个工作进程——I/O线程,I/O线程在Master上打开一个普通的连接,然后开始Binlog dump process(二进制日志转储过程)。Binlog dump process从Master的二进制日志中读取事件,如果已经跟上Master,它就会睡眠并等待Master产生新的事件。I/O线程将这些时间写入中继日志;
3.SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志中读取事件,并重放其中的事件而更新Slave的数据,使其与Master中的数据一致,只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小;
复制过程有一个很重要的限制,即复制在Slave上是串行化的,也就是说Master上的并行更新操作不能在Slave上并行操作。
二、搭建MySQL主从复制
大致步骤分为:
(1)MySQL主服务器建立时间同步;
(2)MySQL从服务器进行时间同步;
(3)关闭防火墙;
(4)安装MySQL数据库;
(5)配置MySQL主服务器;
(6)配置MySQL从服务器;
(7)验证主从复制效果;
实验环境
master:192.168.38.138
slave1:192.168.38.139
slave2:192.168.38.140
(1)MySQL主服务器建立时间同步
yum -y install ntp
//安装NTP
vim /etc/ntp.conf
//编写ntp服务的配置文件 并在末尾添加
server 127.127.1.0
//需要同步上层服务器(本身)
fudge 127.127.1.0 stratum 10
//同步上层服务器的层数(大小不能超过或等于16)
systemctl start ntpd
//重启ntp服务
(2)MySQL从服务器进行时间同步
两台从服务器上都要进行时间同步!
yum -y install ntpdate
systemctl start ntpd
ntpdate 192.168.38.138
//安装ntpdate工具,并指定ntp服务器实现同步
crontab -e
*/30 * * * * /usr/sbin/ntpdate 192.168.38.138
(3)关闭防火墙(或开启相应端口)
systemctl stop firewalld
//关闭防火墙
systemctl disable firewalld
//开机自动关闭
(4)安装MySQL数据库
具体过程详见之前数据库安装
(5)配置MySQL主服务器
vim /etc/my.cnf
server-id = 1 #服务器ID号,自定义但不可以与别的MySQL服务器冲突
log-bin=master-bin #添加,主服务器开启二进制日志
log-slave-updates=true #添加,允许从服务器更新二进制日志
systemctl restart mysqld
mysql -u root -p
grant replication slave on *.* to 'myslave'@'192.168.38.%' identified by '密码';
//授权用户myslave,密码是123456,在192.168.38.0网段的所有MySQL服务器上对所有数据库、表具有复制的权限
flush privileges; #刷新
show master status; #File 列显示日志名,Fosition 列显示偏移量
show master statusG; #查看日志文件名,position位置。。。。
(6)配置MySQL从服务器
vim /etc/my.cnf
server-id = 2
//修改,注意id与Master的不同,两个Slave的id也要不同
relay-log=relay-log-bin
//添加,开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index
//添加,定义中继日志文件的位置和名称
systemctl restart mysqld
mysql -u root -p
//配置同步,注意 master_log_file 和 master_log_pos 的值要与Master查询的一致,
change master to master_host='192.168.38.138' , master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=603;
start slave; #启动同步,如有报错执行 reset slave;
show slave statusG #查看 Slave 状态
//确保 IO 和 SQL 线程都是 Yes,代表同步正常。
Slave_IO_Running: Yes #负责与主机的io通信
Slave_SQL_Running: Yes #负责自己的slave mysql进程
(7)验证主从复制效果
在主服务器上登录MySQL数据库,创建并查看数据库;
mysql> create database work;
Query OK, 1 row affected (0.00 sec)
在从服务器上查看
show databases;
总结
主从复制:
主从复制核心部分就是两个日志三个线程(高版本的mvsal以及异步复制、半同步复制、全同步复制三种模式)
二个日志:二进制日志和中继日志
三个线程:master的dump和slave的I/O、SQL
主要原理:master将数据保存在二进制日志中,I/O向dump发出同步请求,dump把数据发送给I/O线程,I/O写入本地的中继日志
SOL线程读取本地中继日志数据,同步到自己数据库中,完成同步
、半同步复制、全同步复制三种模式)
二个日志:二进制日志和中继日志
三个线程:master的dump和slave的I/O、SQL
主要原理:master将数据保存在二进制日志中,I/0向dump发出同步请求,dump把数据发送给I/0线程,I/O写入本地的中继日志
SOL线程读取本地中继日志数据,同步到自己数据库中,完成同步
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
- 日志导致线程Block的这些坑,你不得不防
- 【C#】说说 C# 9 新特性的实际运用
- mysql insert new field method
- 中软国际携手深开鸿发布(1+1) x N 战略,以数字化、智慧化改变人类生产和生活方式
- Zabbix6.2 Surprise Release!Especially optimize the performance of medium and large environment deployment!
- MySQL安装到最后一步 write configuration file 失败 怎么办?及后安装步骤
- regex bypass
- PowerCLi 通过自建PXE Server一键esxi7下批量部署常规New-VM
- Environment_Variable_and_SetUID
- @Transactional注解的失效场景
猜你喜欢
随机推荐
进程和线程的区别&&run和start区别与联系
深度学习随机数设置,保证实验的可重复性
Embedded system driver primary [2] - _ parameters and dependencies under the kernel module
shell/bash脚本命令教程
【Objective-C语言中的@property】
MySQL table creation statement_Three commonly used MySQL table creation statements
动态顺序表的增删查改(C语言实现)
手把手教你开发微信小程序自定义底部导航栏
分布式缓存系统必须要解决的四大问题
7/28-7/29 Expectation + thinking + suffix array + ST table
Docker-compose安装mysql
【小程序专栏】总结uniapp开发小程序的开发规范
UML图及在drawio中的绘制
Pygame Surface对象
使用MySQL如何查询一年中每月的记录数
MySQL详解
mysql insert new field method
MySQL安装到最后一步 write configuration file 失败 怎么办?及后安装步骤
一文搞定代码中的命名
普通函数的参数校验