mysql主主同步 mysql主从数据库

创业分享 2024-07-24 09:49:49

mysql keepalive+ 双主多从是怎么做的

所谓 MySQL 主从,就是建立两个完全一样的数据库,一个是主库,一个是从库, 主库对外提供读写的作,从库对外提供读的作 ,下面是一主一从模式:

我们通常说的双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务。当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短。MySQL双主,即互为Master-Sle(只有一个Master提供写作),可以实现数据库服务器的热备,但是一个Master宕机后不能实现动态切换。使用Keepalived,可以通过虚拟IP,实现双主对外的统一接口以及自动检查、失败切换机制,从而实现MySQL数据库的高可用方案。之前梳理了Mysql主从/主主同步,下面说下Mysql+keeoalived双主热备高可用Replicate_Do_DB: test,test方案的实施。

mysql主主同步 mysql主从数据库mysql主主同步 mysql主从数据库


Keepalived看名字就知道,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导

1)Keepalived的工作原理是VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议。在VRRP中有两组重要的概念:VRRP路由器和虚拟路由器,主控路由器和备份路由器。

2)VRRP路由器是指运行VRRP的路由器,是物理实体,虚拟路由器是指VRRP协议创建的,是逻辑概念。一组VRRP路由器协同工作,共同构成一台虚拟路由器。

Vrrp中存在着一种选举机制,用以选出提供服务的路由即主控路由,其他的则成了备份路由。当主控路由失效后,备份路由中会重新选举出一个主控路由,来继

如何监控MySQL主从同步情况

log-bin

用 pt-table-checksum 时,会不会影响业务性能?

二、 环境

实验

实验开始前,给大家分享一个小经验:任何性能评估,不要相信别人的评测结果,要在自己的环境上测试,并(大概)知晓原理。

我们先建一对主从:

然后用 mysqlslap跑一个持续的压力:

开另外一个会话,将 master 上的 general log 打开:

然后通过 pt-table-checksum 进行一次比较:

查看 master 的 general log,由于 mysqlslap 的影响,general log 中有很多内容,我们找到与 pt-table-checksum 相关的线程:

将该线程的作单独列出来:

作比较多,我们一点一点来说明:

这里工具调小了 innodb 锁等待时间。使得之后的作,只要在 innodb 上稍微有锁等待,就会马上放弃作,对业务影响很小。

另外工具调小了 wait_timeout 时间,倒是没有特别的作用。

工具将隔离级别调整为了 RR 级别,事务的维护代价会比 RC 要高,不过后面我们会看到工具使用的每个事务都很小,加上之前提到 innodb 锁等待时间调到很小,对线上业务产生的成本比较小。

RR 级别是数据对比的基本要求。

工具通过一系列作,了解表的概况。工具是一个数据块一个数据块进行校验,这里获取了个数据块的下边界。

接下来工具获取了下一个数据块的下边界,每个 SQL前都会 EXPLAIN 一下,看一下执行成本,非常小心翼翼。

之后工具获取了一个数据块的 checksum,这个数据块不大,如果跟业务流量有冲突,会马上出发 innodb 的锁超时,立刻退让。

以上是 pt-table-checksum 的一些设计,可以看到这几处都是精心维护了业务流量不受影响。

工具还设计了其他的一些机制保障业务流量,比如参数 --max-load 和 --pause-file 等,还有精心设计的数据块划分方法,索引选择方法等。大家根据自己的情况配合使用即可达到很好的效果。

总结

本期我们介绍了简单分析 pt-table-checksum 是否会影响业务流量,坊间会流传工具的各种参数建议或者不建议使用,算命的情况比较多,大家都可以用简单的实验来分析其中机制。

还是那个观点,性能测试不能相信道听途说,得通过实验去分析。

MySQL 主从,5 分钟带你掌握

2. 创建账号。数据库中缺省的帐户的host值是localhost,所以应该创建一个可以远端访问的帐号。比如:root@’%’ or root@10.x.x.x

MySQL 主从一直是面试常客,里面的知识点虽然基础,但是能回答全的同学不多。

Master_Port: 3306

比如楼哥之前面试小米,就被问到过主从的原理,以及主从延迟的解决方案,因为回答的非常不错,给面试官留下非常好的印象。你之前面试,有遇到过哪些 MySQL 主从的问题呢?

对于数据库单机部署,在 4 核 8G 的机器上运行 MySQL 5.7 时,大概可以支撑 500 的 TPS 和 10000 的 QPS, 当遇到一些活动时,查询流量骤然,就需要进行主从分离。

大部分系统的访问模型是读多写少,读写请求量的距可能达到几个数量级,所以我们可以通过一主多从的方式, 主库只负责写入和部分核心逻辑的查询,多个从库只负责查询,提升查询性能,降低主库压力。

MySQL 主从还能做到服务高可用,当主库宕机时,从库可以切成主库,保证服务的高可用,然后主库也可以做数据的容灾备份。

整体场景总结如下:

MySQL 的主从是依赖于 binlog 的,也就是记录 MySQL 上的所有变化并以二进制形式保存在磁盘上二进制日志文件。

主从就是将 binlog 中的数据从主库传输到从库上,一般这个过程是异步的,即主库上的作不会等待 binlog 同步的完成。

详细流程如下:

对于下面的情况,假如主库执行如下 SQL,其中 a 和 create_time 都是索引:

我们知道,数据选择了 a 索引和选择 create_time 索引, limit 1 出来的数据一般是不一样的。

所以就会存在这种情况:在 binlog = statement 格式时,主库在执行这条 SQL 时,使用的是索引 a,而从库在执行这条 SQL 时,使用了索引 create_time,主从数据不一致了。

那么我们改如何解决呢?

可以把 binlog 格式修改为 row,row 格式的 binlog 日志记录的不是 SQL 原文,而是两个 event:Table_map 和 Delete_rows。

Table_map event 说明要作的表,Delete_rows event用于定义要删除的行为,记录删除的具体行数。 row 格式的 binlog 记录的就是要删除的主键 ID 信息,因此不会出现主从不一致的问题。

但是如果 SQL 删除 10 万行数据,使用 row 格式就会很占空间的,10 万条数据都在 binlog 里面,写 binlog 的时候也很耗 IO。但是 statement 格式的 binlog 可能会导致数据不一致。

设计 MySQL 的大叔想了一个折中的方案,mixed 格式的 binlog,其实就是 row 和 statement 格式混合使用, 当 MySQL 判断可能数据不一致时,就用 row 格式,否则使用就用 statement 格式。

有时候我们遇到从数据库中获取不到信息的诡异问题时,会纠结于代码中是否有一些逻辑会把之前写入的内容删除,但是你又会发现,过了一段时间再去查询时又可以读到数据了,这基本上就是主从延迟在作怪。

主从延迟,其实就是“从库回放” 完成的时间,与 “主库写 binlog” 完成时间的值, 会导致从库查询的数据,和主库的不一致 。

谈到 MySQL 数据库主从同步延迟原理,得从 MySQL 的主从原理说起:

总结一下主从延迟的主要原因 :主从延迟主要是出现在 “relay log 回放” 这一步,当主库的 TPS 并发较高,产生的 DDL 数量超过从库一个 SQL 线程所能承受的范围,那么延时就产生了,当然还有就是可能与从库的大型 query 语句产生了锁等待。

我们一般会把从库落后的时间作为一个重点的数据库指标做监控和报警,正常的时间是在毫秒级别,一旦落后的时间达到了秒级别就需要告警了。

解决该问题的方法,除了缩短主从延迟的时间,还有一些其它的方法,基本原理都是尽量不查询从库。

具体解决方案如下:

在实际应用场景中,对于一些非常核心的场景,比如库存,支付订单等,需要直接查询从库,其它非核心场景,就不要去查主库了。

两台机器 A 和 B,A 为主库,负责读写,B 为从库,负责读数据。

一台主库多台从库,A 为主库,负责读写,B、C、D为从库,负责读数据。

如果 A 库发生故障,B 库成为主库负责读写,C、D负责读,修复故障后,A 也成为从库,主库 B 同步数据到从库 A。

MYSQL主从同步,新增的表会不会自动在从服务器同步

整个系统架构的不可用)的发生,那说到keepalived不得不说的一个协议不是VRRP协议,可以说这个协议就是keepalived实现的基础。

当然会,mysql主从是通过binlog日志来进行了。master会生成binlog日志,sle会开启2个线程,一个IO线程,主要是连接master,将master的binlog到sle的中继日志中,另外一个则是sql线程,会读取中继日志执行基于语句的(mysql默认是基于语句的),将master的变化到slaMaster_Port: 4331ve中。此外还有基于行的和混合。

mysql 主主同步,服务器重启后需要重新做吗?

从你的日志来看,并没有报Error的错误,Note表示正常记录事物日志,说明你的主主是好的。

只要不是意外断电造成数据库意外关闭或关闭数据库,就不会出现主从失效的情况,放心吧。

看主从是否同步,主要通过show sle status\G 查看2两个Yes。

例如:

mysql> show sle status \G;

Mas续工作,来保障不间断服务。ter_Host: 172.17.2.40

Master_User: photorepl

Connect_Retry: 60

Master_Log_File: mysql-bin.005502

Read_Master_Log_Pos: 64401238

Relay_Log_File: mysqld-relay-bin.015418

Relay_Log_Pos: 13456757

Relay_Master_Log_File: mysql-bin.005152

SlQuery OK, 0 rows affected (0.00 sec)e_SQL_Running: Yes

...

...

mysql 主从同步 只同步数据吗

Sle_IO_Running: Yes

主从同步原Sle_IO_State: Waiting for master to send event理就是备机一直不停的读主机的binlog日志,并把读取到的变动同步在备机进行执行。这样你在主机做的任何作备机都自动重做一遍。

比如:建表,删表,修改表结构,插入数据,删除数据等等。

不是 同步所有的改变,包括数据,表结构,存储过程等等

MySQL中主从不同步?

Until_Log_Pos: 0

我也遇到了这个问题,我是这样解决的:

3.1 设置环境:

show variables like '%server_id%';看看是不是没有设置成功

第二看看是不是数据库的版本不同,

配置mysql主从 数据库怎么同步过来

Seconds_Behind_Master:

主从数据库同步 可以参考如下:

一、 概述

MySQL从3.23.15版本以后提供数据库(replication)功能,利用该功能可以实现两个数据库同步、主从模式、互相备份模式的功能。本文档主要阐述了如何在linux系统中利用mysql的replication进行双机热备的配置。

作系统:Linux 2.6.23.1-42.fc8 # SMP(不安装XEN)

Mysql版本:5.0.45-4.fc8

设备环境:PC(或者虚拟机)两台

数据库同步功能的设置都在MySQL的配置文件中体现,MySQL的配置文件(一般是):在本环境下为。

IP的设置:

A主机 IP:10.10.0.119

Mask:255.255.0.0

B主机 IP:10.10.8.112

Mask:255.255.0.0

在IP设置完成以后,需要确定两主机的防火墙确实已经关闭。可以使用命令service iptables status查看防火墙状态。如果防火墙状态为仍在运行。使用service iptables stop来停用防火墙。如果想启动关闭防火墙,可以使用setup命令来禁用或定制。

3.2 配置A主(master) B从(sle)模式

、增加一个用户同步使用的帐号:

GRANT FILE ON . TO ‘backup’@'10.10.8.112' IDENTIFIED BY ‘1234’;

GRANTREPLICATION SLAVE ON . TO ‘backup’@'10.10.8.112' IDENTIFIED BY ‘1234’;

、增加一个数据库作为同步数据库:

create database test;

、创建一个表结构:

create table mytest (username varchar(20),password varchar(20));

、修改配置文件:

修改A的文件,在配置项中加入下面配置:

server-id = 1 #Server标识

binlog-do-db=test #指定需要日志的数据库

、重起数据库服务:

查看server-id:

show variable like ‘server_id’;

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| server_id | 1 |

+---------------+-------+

1 row in set (0.00 sec)

、用show master status/G命令看日志情况。

正常为:

mysql> show master status/G

File: mysqld-bin.000002

Position: 198

Binlog_Do_DB: test,test

Binlog_Ignore_DB:

1 row in set (0.08 sec)

3.2.2 配置B 为sle

、增加一个数据库作为同步数据库:

create database test;

、创建一个表结构:

create table mytest (username varchar(20),password varchar(20));

、修改配置文件:

修改B的文件,在配置项中加入下面配置:

server-id=2

master-host=10.10. 0.119

master-user=backup #同步用户帐号

master-password=1234

master-port=3306

master-connect-retry=60 #预设重试间隔秒

、重起数据库服务:

查看server-id:

show variables like ‘server_id’;

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| server_id | 2 |

+---------------+-------+

1 row in set (0.00 sec)

正常为:

mysql> show sle status/G

Master_Host: 10.10.0.119

Master_User: backup

Connect_Retry: 60

Master_Log_File: mysqld-bin.000001

Read_Master_Log_Pos: 98

Relay_Log_File: mysqld-relay-bin.000003

Relay_Log_Pos: 236

Relay_Master_Log_File: mysqld-bin.000001

Sle_SQL_Running: Yes

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: 98

Relay_Log_Space: 236

Until_Condition: None

Until_Log_File:

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

1 row in set (0.01 sec)

3.2.3 验证配置

分别使用insert, delete , update在A主机进行增删改查数据库;查看B主机的数据库是否与A主机一致;若一致,则配置成功。

3.3双机互备模式

如果在A主机加入sle设置,在B主机加入master设置,则可以做B->A的同步。

、在A主机的配置文件中 mysqld配置项加入以下设置:

master-host=10.10.8.112

master-user=backup

master-password=1234

replicate-do-db=test

master-connect-retry=10

、在B的配置文件中 mysqld配置项加入以下设置:

binlog-do-db=test

注意:当有错误产生 1. row 时,.err日志文件同步的线程退出,当纠正错误后,要让同步机制进行工作,运行sle start。

重起A、B机器,则可以实现双向的热备份。

、Sle机器的权限问题,不但要给sle机器File权限,还要给它REPLICATION SLAVE的权限。

、在修改完Sle机器之后,sle机器的mysql服务启动之前,记得要删除掉master.info

、在show master status或着show sle status不正常时,看看.err是怎样说的。

、Sle上Mysql的Replication工作有两个线程, I/O thread和SQL thread。I/O的作用是从master 3306端口上把它的binlog取过来(master在被修改了任何内容之后,就会把修改了什么写到自己的binlog等待sle更新),然后写到本地的relay-log,而SQL thread则是去读本地的relay-log,再把它转换成本Mysql所能理解的语句,于是同步就这样一步一步的完成.决定I/O thread的是/var/lib/mysql/master.info,而决定SQL thread的是/var/lib/mysql/relay-log.info.

、启动sle,命令用start sle;重新启动用restart sle

如何监控MySQL主从同步情况

你好start sle;,

MySQL同步功能由3个线程(master上1个,sle上2个)来实现,简单的说就是:master发送日志一个,sle接收日志一个,sle运行日志一个。

首先,我们解释一下 show sle status 中重要的几个参数:

Sle_IO_Running: I/O线程是否被启动并成功地连接到主服务器上。

Sle_SQLservice mysqld restart_Running: SQL线程是否被启动。

本字段是从属服务器“落后”多少的一个指示。当从属SQL线程正在运行时(处理更新),本字段为在主服务器上由此线程执行的近的一个的时间标记开始,已经过的秒数。当此线程被从属服务器I/O线程赶上,并进入闲置状态,等待来自I/O线程的更多的时,本字段为零。总之,本字段测量从属服务器SQL线程和从属服务器I/O线程之间的时间距,单位以秒计。

版权声明:本文内容由互联。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发 a13828211729@163.com 邮箱删除。