【MySQL基础随缘更系列】AB复制

2024-06-18 05:44

本文主要是介绍【MySQL基础随缘更系列】AB复制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

文章目录

  • mysql AB复制实战
    • 一、mysql AB复制
    • 二、AB复制原理
    • 三、master服务器设置
      • 3.1、安装mysql并启动
      • 3.2、关闭防火墙,selinux
      • 3.3、设置时间服务器
      • 3.4、修改配置文件 设置server-id=N
      • 3.5、创建slave连接master的账号,用于取SQL语句
    • 四、slave设置
      • 4.3、修改配置文件 设置server-id=N+x
      • 4.4、设置slave同步
      • 4.5、验证slave
      • 4.6、干货分享,如何解决AB不同步的问题

🌈你好呀!我是 山顶风景独好
🎈欢迎踏入我的博客世界,能与您在此邂逅,真是缘分使然!😊
🌸愿您在此停留的每一刻,都沐浴在轻松愉悦的氛围中。
📖这里不仅有丰富的知识和趣味横生的内容等您来探索,更是一个自由交流的平台,期待您留下独特的思考与见解。🌟
🚀让我们一起踏上这段探索与成长的旅程,携手挖掘更多可能,共同进步!💪✨

mysql AB复制实战

mysqldump解决了mysql数据库的备份,它只是基于某个时间点做备份,无法解决实时备份的问题,为了解决mysql实时备份的问题,mysql官方推出了mysql主从备份机制,可以让用户通过设置mysql主从来实现数据库实时备份。

1、MySQL服务器宕机怎么 单点故障

2、数据的安全

一、mysql AB复制

通过多台机器实现一主多从的方式来实现数据备份,主服务器负责让用户读写数据,从服务器负责同步主服务器数据,也可以承担用户读的任务。

至少两台机器

二、AB复制原理

在这里插入图片描述

1、用户or web 对主服务器的所有修改操作都会记录在binary log日志

成功的修改操作【增加 修改 删除】 记录的是SQL语句 主上的一个线程

2、从 有两个线程

IO线程:负责连接主mysql【AB通信 A授权账号】提取binlog中的SQL语句到relay log

SQL线程:在本地执行relay log中新增的SQL语句

注意:AB是异步

三、master服务器设置

实验拓扑

在这里插入图片描述

  • 安装mysql并启动
  • 关闭防火墙,selinux
  • 设置时间服务器
  • 修改配置文件 设置server-id=N
  • 创建slave连接master的账号,用于取SQL语句

3.1、安装mysql并启动

a、安装mysql

官网下载mysql yum源,安装
安装方法:yum -y install mysql-server mysql

b、启动mysql

systemctl enable mysqld;systemctl start mysqld

c、修改root密码

mysql> alter user 'root'@'localhost' identified by '98989';
Query OK, 0 rows affected (0.01 sec)

3.2、关闭防火墙,selinux

[root@node1 ~]# systemctl disable firewalld
[root@node1 ~]# iptables -F
[root@node1 ~]# iptables -t nat -F
[root@node1 ~]# sed -i -r '/SELINUX=/c\SELINUX=disabled' /etc/selinux/config
[root@node1 ~]# reboot其他机器同理

3.3、设置时间服务器

禁止向centos默认时间服务器同步时间
[root@node1 ~]# sed -i.bak '/^pool 2.centos.pool.ntp.org iburst$/s//#/' /etc/chrony.conf 设置时间服务器为阿里云的
[root@node1 ~]# cat >> /etc/chrony.conf <<EOF
> server ntp1.aliyun.com
> server ntp2.aliyun.com
> server ntp3.aliyun.com
> server ntp4.aliyun.com
> EOF重启服务生效
[root@node1 ~]# systemctl restart chronyd
查看命令,看一下时间服务器IP地址
[root@node1 ~]# chronyc sources -v

3.4、修改配置文件 设置server-id=N

server-id的数字越小,优先级越高。

[root@node1 ~]# echo "server-id=1"  >> /etc/my.cnf.d/mysql-server.cnf 

确认binlog是开启的

如果没有开启   log-bin=binlog

3.5、创建slave连接master的账号,用于取SQL语句

登陆进入mysql: mysql -u root -p

password:

mysql> create user sko identified by "98989";
Query OK, 0 rows affected (0.00 sec)mysql> grant replication slave on *.* to sko;
Query OK, 0 rows affected (0.00 sec)mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

查看主的状态

mysql> show master status \G;
*************************** 1. row ***************************File: binlog.000002Position: 155Binlog_Do_DB: Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)ERROR: 
No query specifiedmysql> 
mysql> create database db1;
Query OK, 1 row affected (0.00 sec)File: binlog.000002  当前主的binlog日志
Position: 155        当前binlog日志的SQL语句记录点

四、slave设置

实验步骤

  • 安装mysql并启动
  • 关闭防火墙、selinux
  • 设置时间服务器
  • 修改配置文件 设置server-id=N+x
  • 设置master主信息
  • 测试同步
- [4.1] 安装mysql并启动
- [4.2] 关闭防火墙、selinux
- [4.3] 设置时间服务器省略......

4.3、修改配置文件 设置server-id=N+x

从服务器的server-id要比主的数字大。

[root@node2 ~]# echo "server-id=2"  >> /etc/my.cnf.d/mysql-server.cnf 

4.4、设置slave同步

mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> change master to master_host='192.168.98.201',master_user='sko',master_password='98989',master_log_file='binlog.000002';
Query OK, 0 rows affected, 3 warnings (0.01 sec)mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

4.5、验证slave

mysql> show slave status \G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.98.201Master_User: skoMaster_Port: 3306Connect_Retry: 60Master_Log_File: binlog.000002Read_Master_Log_Pos: 337Relay_Log_File: node2-relay-bin.000002Relay_Log_Pos: 545Relay_Master_Log_File: binlog.000002Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 337Relay_Log_Space: 753Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1Master_UUID: ae106b21-59c3-11ea-aa77-000c29b8d045Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0Network_Namespace: 
1 row in set (0.00 sec)ERROR: 
No query specified

4.6、干货分享,如何解决AB不同步的问题

Slave_IO_Running: Yes
#该线程负责从master上拿binlog日志到relaylog,复制线程
#该线程如果是NO,如何排除
#1、查主从网络是否能通信,iptables  selinux
#2、查你的repl账号在slave上是否能连接masterSlave_SQL_Running: Yes
#该线程负责将本机relaylog中的SQL语句执行一次
#该线程为NO,如何排除
#该线程为NO说明relaylog中的SQL语句在本地无法执行
#1、查看mysql> show slave status \G; 找到不能执行的语句mysql> show slave status \G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.98.201Master_User: skoMaster_Port: 3306Connect_Retry: 60Master_Log_File: binlog.000002Read_Master_Log_Pos: 515Relay_Log_File: node2-relay-bin.000002Relay_Log_Pos: 545Relay_Master_Log_File: binlog.000002Slave_IO_Running: YesSlave_SQL_Running: NoReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 1008Last_Error: Error 'Can't drop database 'db1'; database doesn't exist' on query. Default database: 'db1'. Query: 'drop database db1'Skip_Counter: 0Exec_Master_Log_Pos: 337Relay_Log_Space: 931Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 1008Last_SQL_Error: Error 'Can't drop database 'db1'; database doesn't exist' on query. Default database: 'db1'. Query: 'drop database db1'Replicate_Ignore_Server_Ids: Master_Server_Id: 1Master_UUID: ae106b21-59c3-11ea-aa77-000c29b8d045Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Master_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: 200227 20:36:57Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0Network_Namespace: 
1 row in set (0.00 sec)ERROR: 
No query specified#这段就能看到为何不能执行,原因是slave上没有db1数据库,所以不能删除。Last_SQL_Error: Error 'Can't drop database 'db1'; database doesn't exist' on query. Default database: 'db1'. Query: 'drop database db1'#2、最关键的一步,如何定位错误点 
#Read_Master_Log_Pos: 515   找到目前复制的master Binlog日志的pos位置,从这个位置开始,后续在slave上做差异还原同步。#拓展:如何找下一个POS位置,去看你master的当前binlog日志 
#定位错误点SQL语句的位置号
[root@node1 ~]# mysqlbinlog /var/lib/mysql/binlog.000002|egrep -B 30 "drop database db1"
.........
# at 414    错误点SQL语句的位置号
#200227 20:36:57 server id 1  end_log_pos 515 CRC32 0x683207a9 	Query	thread_id=8	exec_time=0	error_code=0	Xid = 17
SET TIMESTAMP=1582853817/*!*/;
drop database db1
..........#定位错误点SQL语句之后一条的位置号
[root@node1 ~]# mysqlbinlog /var/lib/mysql/binlog.000002|egrep -A 30 "drop database db1"
drop database db1
/*!*/;
# at 515   发现下一条SQL语句是515
#200227 20:42:37 server id 1  end_log_pos 592 CRC32 0x2677edde 	Anonymous_GTID	last_committed=2	sequence_number=3	rbr_only=no	original_committed_timestamp=1582854157245396	immediate_commit_timestamp=1582854157245396	transaction_length=182
# original_commit_timestamp=1582854157245396 (2020-02-27 20:42:37.245396 EST)
# immediate_commit_timestamp=1582854157245396 (2020-02-27 20:42:37.245396 EST)
/*!80001 SET @@session.original_commit_timestamp=1582854157245396*//*!*/;
/*!80014 SET @@session.original_server_version=80017*//*!*/;
/*!80014 SET @@session.immediate_server_version=80017*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;# at 592
#200227 20:42:37 server id 1  end_log_pos 697 CRC32 0x3624f753 	Query	thread_id=11	exec_time=0	error_code=0	Xid = 24
SET TIMESTAMP=1582854157/*!*/;
/*!80016 SET @@session.default_table_encryption=0*//*!*/;
create database db2
/*!*/;
....................
#发现下一条SQL语句是515#通过上述命令可以查看pos 515之后的语句,-A 30 是指往后30行   -B 30是看往前30行,根据自己的需求设置#3、重新设置同步指令
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)mysql> change master to master_host='192.168.98.201',master_user='sko',master_password='98989',master_log_file='binlog.000002',master_log_pos=515;
Query OK, 0 rows affected, 2 warnings (0.01 sec)mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

✨ 这就是今天要分享给大家的全部内容了,我们下期再见!😊
🏠 我在CSDN等你哦!我的主页😍

这篇关于【MySQL基础随缘更系列】AB复制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071460

相关文章

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、