Mysql可扩展性

可扩展性。 即通过增加资源提升整个系统吞吐量的能力

一般会有如下的角度影响负载:

  • 数据量
  • 用户量 更多的用户,意味着更多的数据,更复杂的查询,更多的事务
  • 用户活跃度 容易造成热点
  • 相关数据集的大小 即关联数据,比如好友

可扩展性的数学表现:

  • 最简单的是线性的,资源翻倍,吞吐量翻倍
  • 但是由于有些工作是线性的,无法通过并发来提升,这样曲线就会趋于平缓
  • 再引入扩展带来的内部节点或者是线程间的通信,会造成曲线的不降反升
  • 考虑到有一些I/O密集型的应用,扩展只会可能变成全都读取内存,还有可能造成曲线上扬

扩展Mysql

通常系统初建时要考虑一点可扩展性。在扩展之前,要先压榨单机性能,比如算法调优等等。

向上扩展就是换CPU,磁盘等等。总有上限。

横向扩展

读写分离

通过Mysql复制,将数据分发到多个服务器上,然后备库用于读查询。

按功能分

更像是系统层面分离。比如一个网站分为论坛,新闻等多个库。这样分发很快就会有界限。还得考虑其他的分发

数据分片

用的最多
扩展写容量必须分片
要有足够大的数据量以及业务可分的时候才分。
一般可以按照用户ID,时间等进行分片

分区键 , 决定哪一行存储在哪个位置。
常常是分厂重要的实体主键,会尽量避免跨库的查询和通讯。 特别是不能定位在哪个节点上,需要所有节点扫描。
可以使用ER图找到处于中间的点

多个分区键
这种情况可以把要分区的键的表的关键字段在其中另外一个键的表中做冗余。来做关联查询

问题1: 跨片查询和聚合。 可以使用汇总表,搜索引擎
问题2:一致性。外键失效,需要应用保证

数据分配策略
都会有分区方法,传入分区键, 输出分区号
固定分配:
分区方法只依赖分区键。
比如哈希函数和取模运算。 CRC32();
特性:

  • 简单开销低
  • 如果分片大但数量少,则不好分配负载
  • 无法自定义数据放到哪个分片上。 比如活跃度。 分片切分的小一点可以缓解这个问题
  • 修改策略困难

动态分配
利用外部资源,可以是表或者是目录服务器等等。来记录分区键和分区iD之间的关系。 这种可以很灵活。

通常都是两种结合使用。 比如先用静态的方式处理一下分区键,再用动态的方式把处理后的结果映射到分区Id上

显示分配
就是分配策略本身已经显示成为了分区键的一部分。能直接看出来。

重新均衡分片数据

可以使用动态分配策略。相对随机的分配。
并且还能够根据每个服务器的负载情况选择关闭
还可以为想均衡的表简历备库,然后修改访问机制,各负责一般的数据,然后删除不用的数据。

唯一ID

分片了,自增主键就不好用了。
可以有如下的方案搞:

  • auto_increment_increment和auto_increment_offset. 设置步长和偏移量来解决,比如第一个表是1,3,5. 第二个表是2,4,6
  • 全局表自增来生成唯一
  • 使用memcached的incr(),也可以用redis
  • 使用复合值,分片id_自增
  • 使用guid

分片工具

基于分片的系统,如果应用创建多个数据源分别访问分片就有点数不过去了,应该有抽象层。其应该具有如下的功能:

  • 连接到正确的分片并执行查询
  • 分布性一致性校验
  • 跨分片关联操作
  • 跨分片结果集聚合
  • 锁和实物管理
  • 对新分片的处理能力。

有很多不错的工具可用:
Hibernate Shards
HiveDB
Sphinx 全文检索引擎,在分片中的聚合关联查询等有用。

多实例扩展

为了更大的压榨CPU的性能,可以单机多实例多分片的部署
还可以通过虚拟化技术
这种扩展可能会带来I/O的瓶颈,可以使用多网卡的方式

集群扩展

云,集群。这个是理想的状态,数据库能够弹性扩展,自动分片等等。
Mysql收到了No SQL的挑战,其中一点就是Nosql可以更好地集群,但是Nosql存在很多其他的问题,比如事务,查询上的弱点,其为了解决这些弱点,也越来越像关系型数据库。

NDB Cluster是一个可扩展的数据库,既可以使用NoSQL,又可以使用Mysql存储引擎,我们经常可以选用的类似的组件有:

  1. Mysql Cluster
  2. Clustrix
  3. ScaleBase
  4. Akiban 查询加速器,可以加在备库上,目前没有生产环境的使用

向内扩展

对不需要的数据进行归档和清理
需要考虑如下的问题:

  • 对应用的影响 不影响业务,高效的找到行,并小块小块的删除,以平衡一次归档的行数锁,事务负载间的平衡
  • 数据一致性
  • 避免数据丢失
  • 接触归档, 要有一个补充方案,如当前找不到了,应该设计高效的去归档数据部分检查的策略

保持活跃数据独立

  • 分表 分成热表和不热表有利于高效的利用缓存。缓存每次缓存一页,一页中有10%热的可能就会整页缓存,造成了90浪费,分表之后,热度数据可能占据整个页的80%,效率更高。
  • 分区
  • 基于时间数据分区 把最近的时间的数据放到高速硬盘中。可以使用动态分片来实现这种策略。使用如下的分片目录表:users(user_id, shard_new, shard_archive, archive_timestamp)。定时数据转移。记录新分片和旧分片以及切换分片的时间。

负载均衡

前端负载均衡器,根据服务器性能情况分发请求。

目的: 更有效的使用资源。 可用性提高(保证有服务有用), 透明。

跟分片和复制关系密切,可以部署在任何一个环节,比如应用前端,数据库前端等

可选的方案: DNS, LVS, TCP代理等等。普遍使用F5, HAProxy

直接连接

应用直连。不使用中间件完全用业务来判断负载,如选择不同的备库做不同的逻辑。
1. 读写分离
写用主库,读用主备分担,实时性的用主库,其他用备库
让应用检查复制延迟,提高容忍脏数据的能力
基于会话,自己修改的数据查看时查主库。
基于版本,查看下备库的时间戳版本类型的字段查看下如果太旧就查主库
2. 修改DNS
比较粗的方式,把主库和备库绑定在不同的DNS中,然后切换。但是因为不是原子的,会被缓存等等原因并不是很好用。

引入中间件

  1. 负载均衡器
    一般的负载均衡器都是HTTP协议的,但是Mysql需要TCP协议的,因此要使用能支持TCP协议的,但是这不是专门为Mysql设计的,还是会有一些限制。

    • 不能很好的均衡,因为无法知道负载权重
    • 均衡器并不能很好的分辨Mysql连接的状态,保证他能尽量练到固定的服务器,提高缓存效率
    • 线程池可能用不到负载分发
    • 要求均衡器支持TCP分发及TCP端口监测等等。
  2. 负载均衡算法
    • 随机
    • 轮询 依次发送请求
    • 最少连接数 适合有新服务器加入的时候,因为加入了新的服务器,其响应速度没有缓存会比较慢,因此先把最少连接数
    • 最快响应
    • 哈希 对源IP进行hash
    • 权重
    • 排队,设置最大连接数。排队处理

一主多备间的负载均衡

  1. 功能分区
    报表,分析,数据仓库,全文索引等
  2. 过滤和数据分区
    通过复制的过滤功能,将不同的数据分配在不同的备库上
  3. 保证备库跟上主库 MASTER_POS_WAIT()可以保证主库等待备库同步
  4. 同步写操作, 有半同步机制
时间: 2024-11-02 02:53:21

Mysql可扩展性的相关文章

快速提升MySQL可扩展性的五大绝招

快速提升MySQL可扩展性的五大绝招 我对抽象类和接口的理解 今天公司组织培训.讲解到抽象类和接口这里的时候.好像有同事不太明白.(请允许我自作多情一下!) 鉴于我自己对这部分也不是掌握的很透彻.所以发个博文上来,一是记录一下.二是希望还不明白的朋友在阅读完本文之后能有个了解. 新手,如有不当之处,请多多包涵! MSDN:抽象类是从子类发现了公共的东西,泛化(也可以说把公共的东西单独提取出来)出父类,然后子类继承父类,而接口是根本不知道子类的存在,方法如何实现还不确定,预先定义的 有一个人,他叫

Uber是如何使用MySQL设计可扩展性数据存储的?

在Mezzanine项目中我们描述了我们是如何将Uber的核心行程数据从单个的Postgres节点迁移到Schemaless,这是我们开发的一个容错性很高.可用的数据存储. 根据Uber工程师的习惯使用MySQL设计的数据存储,使我们可以从2014 扩容到更高.本文分成三部分对Schemaless进行阐述. 一.Schemaless的总体设计   这一部分我们将讲述Schemaless的架构它在Uber基础结构中的角色以及他是如何成为该角色的. 1.我们对新数据库的迫切需求 2014年初,由于出

MySQL数据库存储引擎和分支现状

在MySQL经历了2008年Sun的收购和2009年Oracle收购Sun的过程中,基本处于停滞发展的情况,在可以预见的未来,MySQL是肯定会被Oracle搁置并且逐步雪藏消灭掉的.MySQL随着相应的各主创和内部开发人员的离去,缔造了各个不同的引擎和分支,让MySQL有希望继续发扬光大起来. 本文大致讲解一下MySQL目前除了主要的 MyISAM.InnoDB.Heap(Memory).NDB 等引擎之外的其他引擎的发展和现状,以及MySQL主干以外的分支的状况,为了我们未来更好的使用MyS

不使用MySQL数据库的五个给力理由

首先我们要知道,或许有一项技术存在很多理由让我们可以选择使用它,但是让我们不使用它往往只要有一个理由就足够了.选择一个软件产品同样也是如此. MySQL数据库虽然应用很广泛,受到大家的青睐,但MySQL数据库也有负面的作用,下面就介绍五个不适用 MySQL数据库的给力理由. 1.MySQL(和PHP搭配之最佳组合)的授权方式 MySQL(和PHP搭配之最佳组合)采用双重授权(Dual Licensed),它们是GPL和MySQL(和PHP搭配之最佳组合) AB制定的商业许可协议. 如果你在一个遵

MySQL是否值得我们选择的正反五个理由

开源数据库MySQL发展到今天已经具有了非常广泛的用户基础,有人说它对传统的商业数据库发起了强力的挑战,有人说,它在企业环境还有待于证明自己,本文就从这两方面来分别列出MySQL是否值得我们选择的五个理由. 一.MySQL值得我们选择的五大理由 列举选择MySQL的理由的最困难的地方在于,如何对这些理由进行排序.这就如同我们经常争论的故事:先有鸡还是先有蛋? MySQL的低成本来自于其简单性吗?它的普及性是由于其低成本吗?其实,在MySQL的最"好"与最"不好"的功

MySQL双主高可用架构之MMM实战

MMM简介: MMM即Master-Master Replication Manager for MySQL(mysql主主复制管理器),是关于mysql主主复制配置的监控.故障转移和管理的一套可伸缩的脚本套件(在任何时候只有一个节点可以被写入),这个套件也能基于标准的主从配置的任意数量的从服务器进行读负载均衡,所以你可以用它来在一组居于复制的服务器启动虚拟ip,除此之外,它还有实现数据备份.节点之间重新同步功能的脚本. MySQL本身没有提供replication failover的解决方案,

MySQL企业版数据库简介

MySQL是开源方面的领军企业,同时也是全球成长最快的开源数据库开发商之一.作为全球最流行的开源数据库软件,MySQL企业版是公司的旗舰产品,包括经过产品测试的软件.主动监测工具和金牌支持服务.许多全球最大.增长最快的企业和机构,包括行业领导者如雅虎.阿尔卡特-朗讯.谷歌.诺基亚.YouTube和Booking.com均采用MySQL产品,省时.省钱地创建大量网站.关键业务系统和打包软件.MySQL的开源数据库广泛部署于所有主要的操作系统,硬件用户.所涉地区.应用行业.应用类型极其广泛.MySQ

MySQL:开源数据库Sharding技术

从 Shard 到 Sharding "Shard" 这个词英文的意思是"碎片",而作为数据库相关的技术用语,似乎最早见于大型多人在线角 色扮演游戏(MMORPG)中."Sharding" 姑且称之为"分片". Sharding 不是一门新技术,而是一个相对简朴的软件理念.如您所知,MySQL 5 之后才有了数据表分 区功能,那么在此之前,很多 MySQL 的潜在用户都对 MySQL 的扩展性有所顾虑,而是否具备分区功能就 成

MySQL大企业级应用可行性分析

我在这里将讨论一些关于MySQL的面向企业级应用的思路,以及能否用MySQL替代当前Oracle的问题. 首先说明一点的是,我不是说MySQL没有大企业级的应用,事实上,可以看到越来越多的成功布署MySQL的应用,但是,还不够多,还有许多大企业的关键应用还不敢用MySQL.或许这篇小文能和大家一起探讨一些比较"虚"的东西. 存储引擎 由于MySQL自己一直没有一个成熟可靠的存储引擎,估计这让他们深感痛处(尤其是目前最成熟的事务型引擎InnoDB又在Oracle手里).MySQL寄予厚望