关于MySQL集群的一些看法
链接:https://zhuanlan.zhihu.com/p/20204156
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
市面上的招聘往往要求DBA精通MySQL集群,实际上,应该指得是MySQL复制。由于MySQL cluster应用场景很少且很复杂,所以国内擅长MySQL cluster的DBA其实是很少的。许多人/公司还停留在试用阶段。
由于数据量的不断增加,读写吞吐的不断增加,业务对于数据库的高可用/高吞吐要求越来越高,单个节点往往承载不了工作负荷,如果我们拥有一个多节点的集群,可以把数据分布在多个节点,多个节点同时对外提供部分或者全部服务,那么将可以大大改善我们系统的可用性和扩展性。
在现实领域,由于MySQL集群产品的复杂性和维护成本,DBA往往并不倾向于采用这种方案,特别是DBA本身成为工作瓶颈的情况下,当然DBA希望方案越简单越好,而MySQL主从就是最简单的方案。
数据库的扩展一般可分为读的扩展、写的扩展以及数据量的扩展。对于读的扩展,通过复制架构,增加更多的从库,是可以大大缓解读的,而在合适的时机使用缓存架构,是普遍认为更良好的一种解决方案。缓存的方案也可以比MySQL自身的从库更高效的处理工作负荷。
复制架构扩展读,需要考虑的一个问题是读的一致性,由于一些数据对于复制延时是敏感的,你可能不能简单的从从库读取,而是仍然从主库读取,以获得强一致性,所以,对于你的数据,你一定要清楚,明确知道各种数据对于时间的敏感度,分别加以处理,这种处理工作在应用层处理成本会更少,更好处理。
MySQL复制为了获得各种级别的一致性,有异步、半同步、强同步之分,对同步要求越高,对性能影响最大。一般生产环境,我建议仍然是采用异步复制的方式,这也是默认的,如果真的需要很高的一致性,我觉得从应用的访问策略解决更好,直接从主库或者缓存中读取是更优雅的处理方式。
对于MySQL复制集群,实例数比较少,DBA往往可以手动处理,如果你拥有大量实例,那么需要更自动化的方案,网上有一些开源的方案,大家可以参考,比如MHA,Proxy的方案也是可行,可以更透明的处理节点异常,在5.6 gtid实现后,MySQL的节点复制的异常处理,已经变得比以前简单多了,相对低版本来说,自动化程度也可以更为提高,自动化方案也会更稳健。
传统的技术仍然有一定的用武之地,比如基于存储层的同步,MySQL提供了一个软raid的方案DRBD, 据说也有许多人采用这个方案,但是我认为,这种方案是不可取的,现在的PC服务器已经很强劲,基于主机之间做故障切换是主流,我们设计方案也应该从这点出发,主库如果不可用,就把流量切换到从库。如果使用DRBD这样的方案,意味着有一边节点是不能用的,而且切换的时间也很可能达不到你的需求。在一个,DRBD可能自身成为整个系统的评价,因为现在的SSD硬盘已经很快了,网络raid反而成为瓶颈,限制了性能/吞吐。
对于写的扩展,复制架构其实无助于解决问题,如果不能从应用层减少数据的写入,我们只能进行垂直或者水平的拆分,把数据的写入平均分布到多个节点,sharding的技术方案这个时候会用到,对于sharding的策略,不要求很自动化或者扩展很多倍,但预先进行sharding策略是需要的,如果你的业务真的可能有大量的数据增长。常见的一个问题是,软件设计人员不清楚硬件,往往预留了太多的扩展空间,这点可以通过和硬件运维团队、DBA加以沟通尽量避免。
数据库的写的优化,和其他应用程序的写入优化差不多,减少写的次数、减少写的频率、批量写、合并写、压缩、利用 时间/空间的局部性,你需要选择的是,在应用层做呢,还是在数据库的层次做。对于很大的的字段,如果实际是可以获得很高压缩比的话,比如是文本,MySQL 5.6的压缩表,是值得考虑尝试的。
我倾向于数据库控制在1个T以下,并不是说MySQL就处理不来超过1T的数据,而在于这种有的方式更可控,基于经验认为这样的数据量 单个实例,是比较成本平衡的,MySQL对于大数据量的备份,仍然存在一些带解决的问题。所以如果集群有多个节点,能在多个节点分别备份,那么基于每个节点的备份/恢复也会快的多的。
有一个观点认为,集群有更多的节点,那么可以容错性更高,因为单个节点可能只负责部分访问,那么单个节点的失效,整个系统仍然大部分可用,这取决于你的系统的设计,如果你的集群系统是松散耦合的,单个节点不怎么影响整个系统,那么这种想法是有道理的,如果单个节点可能导致整个系统不可用,那么多个节点,可能导致更多的问题出现,显而易见的情况是,数据分布到多台机器,出故障的概率肯定是要多了,如果没有一套自动化的发现和处理问题的手段,那么必然意味着管理维护成本的攀升。
有人使用官方的MySQL cluster,也有人使用percona公司出品的Percona XtraDB Cluster, 但由于使用的人少,务必做好充分的测试验证工作,你可能碰到许多问题需要小心加以避免。这些产品在解决问题的同时,往往带来一些新的问题。
基于目前的官方文档,MySQL cluster是紧耦合设计的,对于节点之间的网络要求很高,而Percona XtraDB Cluster相对来说是松耦合设计,容错性更高,这方面我没有足够的经验。有想使用cluster的同学,建议从试用Percona XtraDB Cluster开始。
关于MySQL集群的一些看法的更多相关文章
- mysql集群数据一致性校验
目前,mysql在互联网行业使用地如火如荼,很多大型网站都在使用MySQL数据库,通过搭建mysql主备集群,实现高性能,高可用的存储方案.mysql集群的共同特性是通过复制来实现主备间的同步,保证主 ...
- MySQL集群在断网后再启动报"Unable to start missing node group"问题处理
总所周知,MySQL集群又名ndb cluster,而ndb就是network based database的简称,数据库节点之间依靠网络来通信和保证数据分块间的一致性.今天由于机房交换机损坏,导致集 ...
- 京东分布式MySQL集群方案介绍
背景 数据库作为一个非常基础的系统,任何一家互联网公司都会使用,数据库产品也很多,有Oracle.SQL Server .MySQL.PostgeSQL.MariaDB等,像SQLServer/Ora ...
- MySql集群FAQ----mysql主从配置与集群区别、集群中需要多少台计算机呢?为什么? 等
抽取一部分显示在这里,如下, What's the difference in using Clustervs using replication? 在复制系统中,一个MySQL主服务器会更新一个或多 ...
- linux上使用amoeba实现MySql集群,以及读写分离,主从复制
一.由于是MySql集群,所以就不可能只有一个MySql,需要多个MySql,具体安装步骤,可以参考http://www.cnblogs.com/ywzq/p/4882140.html这个地址进行安装 ...
- 高可用性、负载均衡的mysql集群解决方案
高可用性.负载均衡的mysql集群解决方案 一.mysql的市场占有率 二.mysql为什么受到如此的欢迎 三.mysql数据库系统的优缺点 四.网络服务器的需求 五.什么是mysql的集群 六.什么 ...
- mysql集群实例
原文地址:http://www.it165.net/database/html/201403/5678.html http://www.cnblogs.com/seesea125/archive/20 ...
- MySQL Cluster(MySQL 集群) 初试(转)
作/译者:叶金荣(imysql#imysql.com>),来源:http://imysql.com,欢迎转载. 作/译者:叶金荣(Email: ),来源:http://imysql.cn,转载请 ...
- 浅谈mysql集群
一.什么是MySQL集群 MySQL集群是一个无共享的(shared-nothing).分布式节点架构的存储方案,其目的是提供容错性和高性能. 数据更新使用读已提交隔离级别(read-committe ...
随机推荐
- 一次apk打开时报内存溢出错误,故写下内存溢出的各种原因和解决方法
原转载:https://blog.csdn.net/cp_panda_5/article/details/79613870 正文内容: 对于JVM的内存写过的文章已经有点多了,而且有点烂了,不过说那么 ...
- Android 插件化技术窥探
在Android 插件化技术中(宿主app和插件app设置相同的sharedUserId),动态加载apk有两种方式: 一种是将资源主题包的apk安装到手机上再读取apk内的资源,这种方式的原理是将宿 ...
- SQL Server 2008R2 :远程调用失败 的解决方法(全部方法)
SQL 中远程调用失败的原因 1.服务里面的启动权限未能启动,修改sql对应的服务进程权限就可以了 2.是因为VS 和SQL 起冲突了,数据库找不到访问地址导致的.解决的办法很简单,就是卸载掉多余的版 ...
- 实现iframe高度自适应
iframe高度自适应使用场景是类似于微博,新闻等点击加载更多这种功能实现,要求iframe的高度能够跟随内容的变化而变化. 父html文件,也就是引用ifram的文件 src="blog/ ...
- LDAP概念和原理介绍
LDAP概念和原理介绍 相信对于许多的朋友来说,可能听说过LDAP,但是实际中对LDAP的了解和具体的原理可能还比较模糊,今天就从“什么是LDAP”.“LDAP的主要产品”.“LDAP的基本模型”.“ ...
- Node.js微服务实践(一)
什么是微服务 微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务可被独立部署,各个微服务之间是松耦合的.每个微服务仅关注于完成一件任务并很好地完成该任务.在所有情况下 ...
- 『Shell编程』学习记录(1)
例1. $ cat ex1 date pwd cd .. $ bash ex1 # 运行,显示当前日期和当前目录,但没有执行返回上级目录,因为执行的时候终端会产生一个子shell(类似于C语言调用函数 ...
- 关于 Docker 镜像的操作,看完这篇就够啦 !(上)
文章首发于微信公众号: 小哈学Java 镜像作为 Docker 三大核心概念中,最重要的一个关键词,它有很多操作,是您想学习容器技术不得不掌握的.本文将带您一步一步,图文并重,上手操作来学习它. 目录 ...
- springboot~ EventListener事件监听的使用
EventListener事件触发和监听器可以对代码解耦,在一些与业务无关的,通用的操作方法,我们可以把它设计成事件监听器,像通知,消息这些模块都可以这样设计. 事件源 @Getter @Builde ...
- 深入理解Linux内核 学习笔记(3)
第三章 进程 可以看到很多熟悉的结构体 进程状态: 可运行状态(TASK_ RUNNING) 进程要么在CPU上执行,要么准备执行. 可巾断的等待状态(TASK_ INTERRUPTIBLE) 进程被 ...