MySQL主从同步(一主一从、一主多从、主从从)等结构的概述与配置

article/2025/9/27 8:41:21

前言:前面我们了解了MySQL数据库的基础知识,今天及接下来的五天时间里我会给大家带来MySQL进阶方面的一些学习总结,如有不足,还请大家留言指出;下面我们就开始今天的内容。
**

部署mysql主从同步结构

**
 主从同步概述
MYSQL主从同步
客户端访问主库,从库复制、同步主库的所有操作
单项复制时,建议将从库设置为只读
1
主从同步原理——从库 从主机上同步数据的工作过程
Master,记录数据更改操作
— 启用binlog日志
— 设置binlog日志格式
— 设置server_id
Slave运行2个线程
— Slave_IO:复制master主机binlog日志文件里的SQL到本机的relay-log文件里
— Slave_SQL:执行本机relay-log文件里的SQL语句,重现Master的数据操作
2
 构建主从同步
基本构建思路

  1. 确保数据相同
    – 从库必须要有主库上的数据。

  2. 配置主服务器
    – 启用 binlog 日志及设置格式,设置 server_id, 授权用户

  3. 配置从服务器
    – 设置 server_id ,指定主数据库服务器信息

  4. 测试配置
    – 客户端连接主库,写入的数据,在连接从库的时候也确保数据一致

Master服务器
– 应包括希望同步的所有库
– 对采用 MyISAM 的库,可离线备份
主库配置选项
3
Slave 服务器
– 离线导入由 Master 提供的备份
– 清空同名库(若有的话
从库配置选项
4主从配置常用参数
写在主库配置文件里参数(对所有从库都有效)
binlog_do_db=库名列表 //允许同步的库
binlog_ignore_db=库名列表 //不允许同步的库

写在从库配置文件里参数(只针对从库本机有效)
replicate_do_db=库名列表 //指定只同步的库
replicate_ignore_db=库名列表 //指定不同步的库

 主从同步结构模式
基本应用:
— 单项复制:一主一从
扩展应用:
— 一主多从
— 链式复制:主从从
— 主主(互为主从)

 mysql主从同步配置步骤
配置主库
启用binlog日志
用户授权
查看当前正在使用的binlog日志
配置从库
指定server_id
指定主库信息
启动slave程序
查看slave程序的状态信息
【一主一从同步结构配置】
确保数据相同
主库:192.168.4.51
启用 binlog 日志及设置格式,设置 server_id

[root@mysql51 ~]# vim /etc/my.cnf
[mysqld]
server_id=51
log_bin=mysql51   //binlog日志文件名称
binlog_format="mixed"   //日志文件格式
[root@mysql51 ~]# systemctl restart mysqld
[root@mysql51 ~]# ls /var/lib/mysql/mysql51*

授权用户

[root@mysql51 ~]# mysql  -uroot -p123asd...A
mysql> grant  replication slave on *.*  to  repluser@"%"  identified  by  "123asd...A";
mysql> select  host,user  from mysql.user where user='repluser';
mysql> show master status;     //查看使用的日志文件及偏移量

从库:192.168.4.52

[root@mysql52 ~]# vim /etc/my.cnf
[mysqld]
server_id=52
[root@mysql52 ~]# systemctl restart mysqld
[root@mysql52 ~]# mysql  -u root -p123asd...A
mysql> show master status;   
mysql> change  master to master_host='192.168.4.51',    //主库ip地址-> master_user='repluser',       //出库授权用户名-> master_password='123asd...A',  		//授权用户密码-> master_log_file='mysql51.000001',		//日志文件-> master_log_pos=441;			//偏移文件mysql> start slave;     	//启动salve进程
mysql> show slave status\G;    //查看slave状态
Slave_IO_Running: Yes    //IO线程状态
Slave_SQL_Running: Yes	//SQL线程状态如果 Slave_IO_Running为NO,查看下面Last_IO_Error: Fatal error:的报错信息[root@mysql52 mysql]# vim auto.cnf  //此配置文件查看sql数据库的uuid

从服务器相关文件
5
测试主从同步配置:在及客户端50主机连接主机51对数据库做访问
• 在 Master 上操纵数据
– 新建 newdb 库、 newtbl 表
– 任意插入几条表记录
• 在 Slave 上查看数据更改情况
– 确认新建的 newdb 库、 newtbl 表
– 列出 newtbl 表的所有记录

  1. 在主库51上添加授权用户给客户端50主机连接使用

     mysql> create  database db1;mysql> create table db1.a(id int);mysql> grant select,insert,update on db1.* to admin@"%" identified by "123asd...A";
    
  2. 在客户端50主机连接主库服务器51,对记录做访问

     [root@client50 ~]# mysql  -uadmin  -h192.168.4.51  -p123asd...Amysql> select @@hostname;mysql> insert into db1.a  values(111),(1231),(324);mysql> select * from  db1.a;
    
  3. 再从库服务器52本机也能查看到相同的数据为成功

     [root@mysql52 mysql]# mysql  -u root -p123asd...Amysql> select  * from  db1.a;
    

【一主多从 同步结构配置】
把数据库服务器53 也配置为51的从数据库服务器
主库主机51 已经是主数据库服务器,无需再做配置
配置从库53
与主库数据一致(把主库数据的完全备份拷贝到本机执行恢复)

[root@mysql51 ~]# mysqldump  -uroot -p123asd...A  db1  >  /root/db1.sql
[root@mysql51 ~]# scp  db1.sql   192.168.4.53:/root/[root@mysql53 ~]# mysql  -u root -p123asd...A
mysql> create database db1;
mysql> use db1;
mysql> source  /root/db1.sql;
mysql> select * from db1.a;[root@mysql53 ~]# vim /etc/my.cnf
[mysqld]
server_id=53
[root@mysql53 ~]# systemctl restart mysqld

检测授权用户能否连接数据库

[root@mysql53 ~]# mysql -h192.168.4.51  -urepluser  -p123asd...A

数据管理员指定主库数据信息

[root@mysql53 ~]# mysql -uroot -p123asd...A
mysql> change master  to-> master_host='192.168.4.51',-> master_user='repluser',-> master_password='123asd...A',-> master_log_file='mysql51.000001',-> master_log_pos=1337;

master_log_pos=1337:从51主机上执行sql命令mysql> show master status;获取
查看slave程序的状态信息

mysql> start slave;
mysql> show slave status\G;Slave_IO_Running: YesSlave_SQL_Running: Yes

测试
客户端50连接主机51写入的数据在从库52和53主机上也能查看到数据,即成功

[root@client50 ~]# mysql  -uadmin  -h192.168.4.51  -p123asd...A
mysql> insert into db1.a values(66066);

51和52主机:登入数据库,执行mysql> select * from db1.a;查看是否有插入的数据

配置从库暂时不同步主机数据:停止从库的slave程序即可
把从库还原成独立的数据服务器:让主机53不做51的从库
1.停止服务

[root@mysql53 ~]# systemctl stop mysqld    

2.删除从库文件

[root@mysql53 ~]# rm -rf /var/lib/mysql/master.info 
[root@mysql53 ~]# rm -rf /var/lib/mysql/mysql53-relay-bin.*
[root@mysql53 ~]# rm -rf /var/lib/mysql/relay-log.info 

3.修改配置

[root@mysql53 ~]# vim /etc/my.cnf
[mysqld]
#server_id=53    //删除此行

4.重起服务查看主从状态

[root@mysql53 ~]# systemctl start mysqld
[root@mysql53 ~]# mysql -uroot -p123asd...A -e "show slave  status\G"

【主从从同步结构配置】
配置主库51:
启用binlog日志 用户授权 查看日志信息

配置从库52(既做主又做从)
主配置文件里:要启用log_slave_updates配置
做主库的配置:启用binlog日志 用户授权 查看日志信息

[root@mysql52 mysql]# vim /etc/my.cnf
[mysqld]
server_id=52
log_slave_updates     //记录从库更新,允许链路复制
log_bin=slave52
binlog_format="mixed"
[root@mysql52 mysql]# systemctl restart  mysqld
[root@mysql52 mysql]# mysql -uroot -p123asd...A
mysql> grant replication slave on *.*  to repluser2@"%" identified by  "123asd...A";
mysql> show master status;
mysql> show slave status\G;Slave_IO_Running: YesSlave_SQL_Running: Yes

做从库的配置:指定server_id 指定主库信息
启动slave程序 查看slave程序状态信息

把主机53配置为52的从库服务器
在没有配置为从库之前要与主库数据一致
指定server_id 、 指定主库信息
启动slave 程序 、 看slave程序状态信息

[root@mysql53 ~]# vim /etc/my.cnf
[mysqld]
server_id=53[root@mysql53 ~]# systemctl restart mysqld
[root@mysql53 ~]# mysql -urepluser2 -h192.168.4.52 -p123asd...A[root@mysql53 ~]# mysql -uroot -p123asd...A
mysql> change  master to master_host='192.168.4.52',-> master_user='repluser2',-> master_password='123asd...A',-> master_log_file='slave52.000001',-> master_log_pos=442;
mysql> start slave;
mysql> show slave  status\G;Slave_IO_Running: YesSlave_SQL_Running: Yes

在客户端50上连接主机51写入数据,在52和53主机上都可以查看到即为成功

【配置主主结构】:
提示:把数据库服务器54 55 配置为主主结构
把数据库服务器51 52 53 恢复为独立的数据库
[此部分操作借鉴上面的知识综合即可]

 mysql主从同步数据复制模式
复制模式介绍
• 异步复制( Asynchronous replication )
– 主库在执行完客户端提交的事务后会立即将结果返给客户端,并不关心从库是否已经接收并处理。
• 全同步复制( Fully synchronous replication )
– 当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。
• 半同步复制( Semisynchronous replication )
– 介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到 relay log 中才返回给客户端

【配置半同步复制模式】

  1. 查看当前的数据库服务器是否支持动态加载模块

    mysql> show variables  like  'have_dynamic_loading';
    

6
2. 使用命令安装模块
主库半同步复制的模块

mysql> install plugin  rpl_semi_sync_master  soname  'semisync_master.so';

从库半同步复制的模块

mysql> install plugin  rpl_semi_sync_slave  soname  'semisync_slave.so';

3.查看模块状态

mysql> select plugin_name,plugin_status from information_schema.plugins where plugin_name like '%semi%';

4.启用半同步复制——在安装完插件后,半同步复制默认是关闭的

主:mysql> set global  rpl_semi_sync_master_enabled = 1;
从:mysql> set global rpl_semi_sync_slave_enabled = 1;

5.查看是否启用成功

mysql> show  variables like 'rpl_semi_sync_%_enabled';

6.把配置写进配置文件使其永久生效
– 命令配置临时配置,重启服务会失效
– 修改后需要重启服务
– 写在主配置文件 /etc/my.cnf 的 [mysqld] 下方

# vim /etc/my.cnf
plugin-load = "rpl_semi_sync_master=semisync_master.so;
rpl_semi_sync_slave=semisy	nc_slave.so"   //安装模块
rpl-semi-sync-master-enabled = 1  //启用半同步复制
rpl-semi-sync-slave-enabled = 1	# systemctl restart mysqld

查看模块状态

mysql> select plugin_name,plugin_status from information_schema.plugins  where  plugin_name like '%semi%';

7
查看是否启用成功

mysql> show variables like "rpl_semi_sync_%_enabled";

8

今天的内容到这里就结束了,欢迎评论区留言,期待和您一起探讨。


http://chatgpt.dhexx.cn/article/1Gjrprsf.shtml

相关文章

MySQL的主从

前言 金三银四面试的时候,面试官经常会问MySQL主从。今天就跟大家聊聊MySQL的主从。 数据库主从概念、优点、用途 数据库主从复制原理 主主、主从、主备的区别 MySQL是怎么保证主从一致的 数据库主从延迟的原因与解决方案 聊聊数据库的高可用方案 1. 数据库…

主从原理,一主多从架构

主从架构总结 主从原理 用binlog做主从,redolog只支持innodb 过程 ①start slave后从库启动io线程连接主库,请求读日志②dump线程根据请求信息读取指定位置后的日志③完成后就响应成功,没有确认机制④IO线程收到信息,将受到的日…

主从复制:主从复制的概述、一主一从架构搭建主从复制的原理、同步数据一致性问题

文章目录 1. 主从复制的概述1.1 如何提升数据库的并发能力1.2 主从复制的作用 2. 主从复制的原理2.1 原理剖析2.2 复制的最大问题2.3 复制的基本原则 3. 一主一从架构搭建3.1 准备工作3.2 主机配置文件3.3 从机配置文件3.4 建立账户并授权3.5 配置需要复制的主机3.6 测试3.7 停…

c/c++经典面试题(高频考点)

一、数据结构及算法(快排、归并、堆排等) 十大排序算法 数据结构(c/c版)-严蔚敏 数据结构与算法(思维导图) E:\学习\4.数据结构(C语言版)].严蔚敏_吴伟民.扫描版.pdf 数据结构分为8类有:数组、栈、队列、链表、树、散列表、堆、图 1.快速排…

吐血整理 | 最常见的 C/C++ 面试题(含答案)

大家好,我是 K 哥! 最近群里有小伙伴想跳槽,问我有没有常见的 C/C 面试题。这不正好,K 哥之前整理了一份 PDF,里面包含了各种经典的 C/C 题目,当然更重要的是还附带了非常详细的答案。 K 哥不仅面试之前会反…

2018秋招C/C++面试题总结

博主从8月中旬开始大大小小面试了十几家公司,至今也许是告一段落吧,希望后面会有好结果,因此总结记录一些C/C方向常见的问题。和大家一起学习! 参考了互联网的各种资源,自己尝试归类整理,谢谢~ 一、C和C的区…

C++面试题总结,一篇就够了

C面试题汇总 1. C基础1.1 内存模型1.1.0 内存四区1.1.1 简述C、C程序编译的内存分配情况1.1.2 分配函数与释放函数1.1.2.1 malloc / free1.1.2.2 new / delete1.1.2.3 new/delete 与 malloc/free 区别1.1.2.5 calloc 、realloc1.1.2.6 在C中,使用malloc申请的内存能…

C面试题--汇总

目录 一、C语言基础面试题1. gcc编译器编译的完整流程,分别有什么作用?2.什么是回调函数?3.地址能否使用 printf函数中的 %u形式打印?4.结构体与共用体(联合体)的区别5. static、const、volatile关键字有什…

C/C++ 最常见50道面试题

C/C经典面试题 面试题 1:变量的声明和定义有什么区别 为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明, 但是只在一个地方定义。加入 extern 修饰的是变量的声明,说明此变量将在文件以外或…

C语言经典面试题学习

1. 请填写bool , float, 指针变量 与“零值”比较的if 语句。 提示:这里“零值”可以是0, 0.0 , FALSE 或者“空指针” 。例如int 变量n 与“零值”比较的if 语句为: if ( n 0 ) if ( n ! 0 ) 以此类推。 (1)请写出bool flag 与“…

C语言面试题目大全

http://blog.chinaunix.net/uid-12077574-id-145080.html 1.求下面函数的返回值(微软) int func(x) { int countx 0; while(x) { countx ; x x&(x-1); } return countx; } 假定x 9999。 答案:8 思路:将x转化为2进制&am…

C语言常见面试题汇总

文章目录 gcc的编译过程&#xff1f;static关键字变量/函数的声明和定义之间有什么区别各种指针指针常量与常量指针“引用”与指针的区别是什么&#xff1f;C语言参数传递方式&#xff1a;结构体的浅拷⻉与深拷⻉#include<> 与#include ""的区别&#xff1f;宏…

c语言打印菱形图案

1.打印空心菱形 #include<stdio.h> int main() {int n,i,m,j,k;scanf("%d", &n);m (n 1) / 2;for (i 1; i < n; i) //一行一行的循环打印{if (i < m) //分两种情况&#xff0c;上半部分和下半部分{for (j m - i; j > 0; j--)pri…

菱形的打印

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 菱形的打印 前言菱形的打印是对于初学者对for循环结构嵌套的考察&#xff0c;学会了菱形的打印基本也就掌握了for循环结构的嵌套&#xff0c;下面让我们一起看看吧~ 一、如何…

打印菱形的两种方法

1.利用字符串数组输出图案 思路&#xff1a; 用字符串数组来输出&#xff0c;第一次循环向这个字符串数组中填 ‘ * ’&#xff0c;i 从中间向左(⬅️)&#xff0c;j 从中间向右(➡️)。 第二次循环填 ‘ ’&#xff0c;i 从左向右(➡️)&#xff0c;j 从右向左(⬅️)。 char s…

JavaScript打印菱形

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><script type"text/javascript">// 请打印出菱形//1 3 5 7 9 7 5 3 1 九行 //1 2 3 4 5 6 7 8 9// 首先我们实现…

打印菱形图案

题目&#xff1a; 打印菱形 题目内容&#xff1a; 用C语言在屏幕上输出以下图案&#xff1a; 思路&#xff1a; 这道题的解决办法有很多&#xff0c;大多都是拆分法&#xff0c;这里捡一种我觉得最方便的方法作以介绍&#xff1a;首先我们需要明白&#xff0c;这种图案形式打…

【C】 打印菱形图案

使用VS2019 ISO C14 标准 (/std:c14) 打印菱形图案 打印出如下图案&#xff08;菱形&#xff09;。 ********* **************** 代码&#xff1a; //打印菱形图案 #include<stdio.h> int main() {//分析&#xff0c;菱形图案由空格和*号组成//声明函数void print(in…

打印菱形图案C语言详解

这是菱形图案 这是完整代码 #include<stdio.h> int main() {while(1)//这一步目的可以打印多次菱形{int i0,j0,k0,t0,n0,x0; scanf("%d",&n); //n的含义是菱形的长对角线的长度,因此n必须是奇数,也可以说是菱形竖着放时的高度x(n1)/2; //这是菱形边长…

打印菱形(两种思路)

一、输入的行数等于上半部分的金字塔行数 思路&#xff1a; 仔细观察图形&#xff0c;可以发现&#xff0c;此图形中是由空格和*按照不同个数的输出组成的。 上三角&#xff1a;先输出空格&#xff0c;后输出*&#xff0c;每行中空格&#xff1a;从上往下&#xff0c;一行减少一…