高可用的并行MySQL数据同步及分布式

首先聊聊MySQL的数据分布式,目前最为常用的就是Replication(复制)技术。基于此技术外延开来有很多中架构,分类归结为如下:

1、树状结构(Master,Backup-Master,Slaves)

这种结构是目前Web系统用的最为通用的一种。整个系统有1个写入/更新点,即Master;Master-Backup和Slaves都是Replication的Master从库;多级Slave的原因是为了数据过滤和节省网络资源。

2、环状结构(Master-Master,Slaves)

Dual-Master结构是为了提高写吞吐而提出的,通过提高由原来一台MySQL Master服务器提供写/更新的

单点提高到2个点,从框架结构上来说就能看出此方法的提升。

Dual-Master需要解决的问题:

a)ID冲突问题,即对数据库中唯一ID资源的分配必须是一个统一的地方发出。

解决办法有MySQL自带的auto_increment_increment和auto_increment_offset来实现,通过N个Master来设置auto_increment_offset=N,每一台Master上的auto_increment_increment采用1~N中的任意值,但是不能互相重复。如此一来即可。

id-server: 1

auto_increment_increment=1

auto_increment_offset=2

id-server: 2

auto_increment_increment=2

auto_increment_offset=2

针对id-server1来说,id都是1,3,5这样;id-server2来说,id都是2,4,6这样。如此看似很美好,其实不然。在并发情况下,id-server1上相同的表和在id-server2上的表auto_increment值是不同的,但是又需要相互同步,也就是说如果写入分布不均的情况,就可能存在表中id会是1,3,5,7,8,9,11,etc这样的情况,id资源中间空洞太多。

还有一种解决办法是一个独立的ID发号器。实现ID发号器的办法很多,为了让维护更加的纯粹,我们使用一个MySQL的一张表,Master-slave这种结构的来作为一个发号器server。这样一来流程就变成了先去id发号器服务器获取id,再写入Dual-Master中去。多了一个中间环节,而且此中间环节还是个单点,存在风险。但是思路基本这样,可以通过别的服务,基于一定分布式规则的来并行发号器。

b)更新冲突的问题,一条范围的update语句被两台Master server都给执行了,这个时候数据就和最初设想的不一致了。

c)死锁问题,这个在N(N>=3)个以上的环路Master中,出现异常断开后的服务器的binlog,在极端情况下会被恢复后的N-1个环路中的数据server反复执行。

为了解决Multi-Master中的更新冲突和死锁问题,我的办法是多点Insert,但是只有一个点update这样的结构来解决以上b和c的问题。

以上已经将Replication的常用的两种数据分布架构介绍清楚,下来看看另外一种,即MySQL Cluster。MySQL Cluster在一段时间内,我都认为它是相当的鸡肋,生产环境使用它的几乎没有。因为它在跨IDC和数据存储等资源消耗巨大。

MySQL Cluster依赖的两个核心资源就是网络带宽和内存(share nothing和高一致性)。同IDC内的网络带宽还很容易达到百兆或者更高,但是跨IDC的VPN或者专线,要达到这样的速度还是有些困难。数据全部存在内存中,这在小数据时感受不明显,但是对于爆炸式的信息增长来说未免很容易产生瓶颈。虽然新版的Cluster支持将数据写到硬盘,实际速度还有待观察。

Replication基本能够满足可用的需求,但是MySQL的binlog是一个单线程的,这就会在数据同步方面产生瓶颈。一般的做法是通过写一个plugin,来提高并发能力;这个plugin既要满足性能,有要高可用。采用以下方式,通过将一些并行的App绑定在MySQL Cluster Queue上来执行,利用MySQL Cluster自身的高一致性,高可用的特点,存储消息。

如此可以既能满足数据分布式,又能满足并行数据同步。

时间: 2024-11-02 23:30:12

高可用的并行MySQL数据同步及分布式的相关文章

MySQL 高可用之 keepalived+Mysql 双主双活。

环境描述:[[email protected] ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) [[email protected] ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) IP 规划:MySQL-M 192.168.10.10 MySQL-S 192.168.10.20 配置两服务服务器双主: MySQL 安装: [[ema

MySQL性能调优与架构设计——第 18 章 高可用设计之 MySQL 监控

第 18 章 高可用设计之 MySQL 监控 前言: 一个经过高可用可扩展设计的 MySQL 数据库集群,如果没有一个足够精细足够强大的监控系统,同样可能会让之前在高可用设计方面所做的努力功亏一篑.一个系统,无论如何设计如何维护,都无法完全避免出现异常的可能,监控系统就是根据系统的各项状态的分析,让我们能够尽可能多的提前预知系统可能会出现的异常状况.即使没有及时发现将要发生的异常,也要在异常出现后的第一时间知道系统已经出现异常,否则之前的设计工作很可能就白费了. 18.1 监控系统设计 系统监控

Heartbeat+MySQL+NFS 实现高可用(HA)的MySQL集群

一:试验目的 利用heartbeat心跳机制haresource实现高可用(HA)mysql数据库的搭建. 二:试验拓扑图 三:安装前的环境准备 规划IP为192.168.1.14为node1;IP为192.168.1.2为node2 1)修改各主机名称 修改node1主机名称  vim /etc/sysconfig/network   NETWORKING=yes   HOSTNAME=node1 #修改主机名称为node1  vim /etc/hosts     192.168.1.2 no

MetaQ 高可用配置(异步复制和同步复制)

介绍 Meta相比于kafka的一个重要特性就是消息高可用方案的实现,我们称之为HA方案.消息在发送到broker之后立即写入磁盘才返回客户端告诉消息生产者消息发送成功,通过unflushThreshold和unflushInterval两个参数的控制,可以保证单机消息数据的安全性,只要机器的磁盘没有永久损坏,消息总可以在重启后恢复并正常投递给消费者们.但是,如果遇到了磁盘永久损坏或者数据文件永久损坏的情况,那么该broker上的消息数据将可能永久丢失.为了防止这种情况的发生,一个可行的方案就是

MySQL的高可用实现:MySQL系列之十四

MySQL的高可以有三种实现方式:多主模式(Multi Master MySQL),MHA(Master High Availability)和 Galera Cluster:wresp 一.MHA ? 对主节点进行监控,可实现自动故障转移至其它从节点:通过提升某一从节点为新的主节点,基于主从复制实现,还需要客户端配合实现,目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库.

MySQL高可用架构:mysql+keepalived实现

MySQL 作者:安全剑客 时间:2019-08-16 11:23:48 589 0 删除 编辑 系统环境及架构 #主机名    系统版本        mysql版本  ip地址 mysqlMaster    centos7.4        mysql5.7        192.168.1.42 mysqlSlave    centos7.4        mysql5.7        192.168.1.43 #vip:192.168.1.41 在master和slave上分别进行数据

Corosync+Pacemaker+DRBD+MySQL 实现高可用(HA)的MySQL集群

大纲一.前言二.环境准备三.Corosync 安装与配置四.Pacemaker 安装与配置五.DRBD 安装与配置六.MySQL 安装与配置七.crmsh 资源管理 推荐阅读: Linux 高可用(HA)集群基本概念详解 http://www.linuxidc.com/Linux/2013-08/88522.htm Linux 高可用(HA)集群之Heartbeat详解 http://www.linuxidc.com/Linux/2013-08/88521.htm 一.前言      前几篇博文

MySQL数据库之高可用MHA简介 MySQL学习

MHA目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件.在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用. MHA还提供在线主库切换的功能,能够安全地切换当前运行的主库到一个新的主库中(通过将从库提升为主库),大概0.5-2秒内即可完成. ? 自动故

redis与mysql数据同步

应用Redis实现数据的读写,同时利用队列处理器定时将数据写入mysql,此种情况存在的问题主要是如何保证mysql与redis的数据同步, 二者数据同步的关键在于mysql数据库中主键,方案是在redis启动时去mysql读取所有表键值存入redis中,往redis写数据时,对redis主 键自增并进行读取,若mysql更新失败,则需要及时清除缓存及同步redis主键. 1 String tbname = "login"; 2 3 //获取mysql表主键值--redis启动时 4