首先聊聊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自身的高一致性,高可用的特点,存储消息。
    
 如此可以既能满足数据分布式,又能满足并行数据同步。

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

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

    第 18 章 高可用设计之 MySQL 监控 前言: 一个经过高可用可扩展设计的 MySQL 数据库集群,如果没有一个足够精细足够强大的监控系统,同样可能会让之前在高可用设计方面所做的努力功亏一篑.一 ...

  2. Mysql数据同步Elasticsearch方案总结

    Mysql数据同步Elasticsearch方案总结 https://my.oschina.net/u/4000872/blog/2252620

  3. 几篇关于MySQL数据同步到Elasticsearch的文章---第一篇:Debezium实现Mysql到Elasticsearch高效实时同步

    文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484358&idx=1&sn=3a78347 ...

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

    MySQL的高可以有三种实现方式:多主模式(Multi Master MySQL),MHA(Master High Availability)和 Galera Cluster:wresp 一.MHA ...

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

    系统环境及架构 #主机名 系统版本 mysql版本 ip地址 mysqlMaster <a href="https://www.linuxprobe.com/" title= ...

  6. 超详细干货!Docker+PXC+Haproxy搭建高可用强一致性的MySQL集群

    前言 干货又来了,全程无废话,可先看目录了解. MySQL搭建集群最常见的是binlog方式,但还有一种方式是强一致性的,能保证集群节点的数据一定能够同步成功,这种方式就是pxc,本篇就使用图文方式一 ...

  7. ProxySQL Cluster 高可用集群 + MySQL MGR环境部署 (多写模式) 部署记录

    文章转载自:https://blog.51cto.com/u_6215974/4937192 ProxySQL 在早期版本若需要做高可用,需要搭建两个实例,进行冗余.但两个ProxySQL实例之间的数 ...

  8. 高可用(vrrp)以及mysql主主备份部署

    高可用说起来感觉很高大上,我刚接触的时候也是一头雾水,但是需求的时候很容易理解的,当一台服务器挂了另一台能够马上顶上去继续提供服务,这就叫做高可用,需求其实不难理解,只是需要自身根据项目的实际需求还有 ...

  9. Elasticsearch和mysql数据同步(elasticsearch-jdbc)

    1.介绍 对mysql.oracle等数据库数据进行同步到ES有三种做法:一个是通过elasticsearch提供的API进行增删改查,一个就是通过中间件进行数据全量.增量的数据同步,另一个是通过收集 ...

随机推荐

  1. 2017-2018 第一学期201623班《程序设计与数据结构》-第7&8周作业问题总结

    一.作业内容 第7周作业 http://www.cnblogs.com/rocedu/p/7484252.html#WEEK07 第8周作业 http://www.cnblogs.com/rocedu ...

  2. mark1-git

    Administrator@-20131003RY MINGW64 ~ $ pwd /c/Users/Administrator Administrator@-20131003RY MINGW64 ~ ...

  3. VS2013的安装与测试

    第一步:下载完成之后点击安装,在安装过程中会出现很多选择,选择社区版(c++),安装完成: 第二步:安装完成之后打开VS2013,如图所示:   第三步:按以下步骤进行 第四步:点击[OK]之后 第五 ...

  4. linux 解压文件

    原文:android之常用解压缩指令 .tar解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName ---------------------- ...

  5. cxf 动态调用.

    import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.apache ...

  6. C# Redis 切换数据库

    对于Redis来说,它具有库的概念. 但是他只能通过    ChangeDb(long类型) 来操作. 如下代码: //实例化redis         public static RedisClie ...

  7. (转)C# Aop简单扫盲及ORM实体类属性拦截示例

    转自: http://www.cnblogs.com/cyq1162/archive/2012/05/30/2526573.html 先说下场景,C#中为什么要使用Aop,而我又是在哪里使用Aop? ...

  8. web入门之十 JS高级编程基础

    学习内容 JavaScript函数 JavaScript类和对象 解析JSON数据 能力目标 深入了解JavaScript函数 熟悉JavaScript面向对象编程 熟练进行JSON数据解析 本章简介 ...

  9. 几种简单的排序算法(JAVA)

    几种排序算法(JAVA) 一.代码 package com.hdwang; import java.util.Arrays; /** * Created by admin on 2017/1/20. ...

  10. Openstack 网络服务 Neutron介绍和控制节点部署 (九)

    Neutron介绍 neutron是openstack重要组件之一,在以前是时候没有neutron项目. 早期的时候是没有neutron,早期所使用的网络的nova-network,经过版本改变才有个 ...