阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL AB复制

384次阅读
没有评论

共计 7723 个字符,预计需要花费 20 分钟才能阅读完成。

mysql AB 复制实战

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

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

2、数据的安全

一、mysql AB 复制

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

至少两台机器

二、AB 复制原理

MySQL AB 复制

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

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

2、从 有两个线程

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

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

注意:AB 是异步

三、master 服务器设置

实验拓扑

MySQL AB 复制

  • 安装 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.000002 Position: 155 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.00 sec) ERROR: No query specified mysql> 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 event Master_Host: 192.168.98.201 Master_User: sko Master_Port: 3306 Connect_Retry: 60 Master_Log_File: binlog.000002 Read_Master_Log_Pos: 337 Relay_Log_File: node2-relay-bin.000002 Relay_Log_Pos: 545 Relay_Master_Log_File: binlog.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 337 Relay_Log_Space: 753 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_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: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: ae106b21-59c3-11ea-aa77-000c29b8d045 Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0 Network_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 上是否能连接 master Slave_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 event Master_Host: 192.168.98.201 Master_User: sko Master_Port: 3306 Connect_Retry: 60 Master_Log_File: binlog.000002 Read_Master_Log_Pos: 515 Relay_Log_File: node2-relay-bin.000002 Relay_Log_Pos: 545 Relay_Master_Log_File: binlog.000002 Slave_IO_Running: Yes Slave_SQL_Running: No Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 1008 Last_Error: Error 'Can't drop database 'db1'; database doesn't exist' on query. Default database: 'db1'. Query: 'drop database db1' Skip_Counter: 0 Exec_Master_Log_Pos: 337 Relay_Log_Space: 931 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_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: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 1008 Last_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: 1 Master_UUID: ae106b21-59c3-11ea-aa77-000c29b8d045 Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: 200227 20:36:57 Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0 Network_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)

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-06-09发表,共计7723字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7801702
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统

从“纸堆”到“电子化”文档:用这个开源系统打造你的智能文档管理系统 大家好,我是星哥。公司的项目文档存了一堆 ...
150元打造低成本NAS小钢炮,捡一块3865U工控板

150元打造低成本NAS小钢炮,捡一块3865U工控板

150 元打造低成本 NAS 小钢炮,捡一块 3865U 工控板 一块二手的熊猫 B3 工控板 3865U,搭...
CSDN,你是老太太喝粥——无齿下流!

CSDN,你是老太太喝粥——无齿下流!

CSDN,你是老太太喝粥——无齿下流! 大家好,我是星哥,今天才思枯竭,不写技术文章了!来吐槽一下 CSDN。...
240 元左右!五盘位 NAS主机,7 代U硬解4K稳如狗,拓展性碾压同价位

240 元左右!五盘位 NAS主机,7 代U硬解4K稳如狗,拓展性碾压同价位

  240 元左右!五盘位 NAS 主机,7 代 U 硬解 4K 稳如狗,拓展性碾压同价位 在 NA...
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸 前言 作为天天跟架构图、拓扑图死磕的...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

  星哥带你玩飞牛 NAS-16:不再错过公众号更新,飞牛 NAS 搭建 RSS 对于经常关注多个微...
把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地 大家好,我是星哥,今天教大家在飞牛 NA...
星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛 NAS 硬件 02:某鱼 6 张左右就可拿下 5 盘位的飞牛圣体 NAS 前言 大家好,我是星...
告别Notion焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁”

告别Notion焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁”

  告别 Notion 焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁” 引言 在数字笔记工...
如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的 Nano Banana Pro?附赠邪修的用法 前言 大家好,我是星哥,今天来介绍谷歌的 ...