关于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 ...
随机推荐
- FontAwesome 图标字体库的使用
在前端开发中,许多新手常会遇见一个问题,参考的网页上有类似下图的图标,但在资源里却找不到对应的文件,这是因为这些网页使用了图标库.这里介绍一种常见的图标库——FontAwesome的使用. 1.登录F ...
- K3数据字典备查
select distinct f.FNumber as 系统代码, f.FName AS 系统名称, d.FTableName AS 表名,d.FDescription AS 表说明,a.[nam ...
- 解决Error:All flavors must now belong to a named flavor dimension. Learn more at...
低版本的gradle里面不会出现这个错误,高版本出现,不多说,看如何解决 在defaultConfig{}中添加:flavorDimensions "default" 保证所有的f ...
- Android之Realm详解
文章大纲 一.Realm介绍二.Realm实战三.Realm官方文档四.项目源码下载五.参考文章 一.Realm介绍 1. 什么是Realm Realm 是一个手机数据库,是用来替代 SQli ...
- c/c++ 动态库与静态库的制作和使用
静态库的用法 静态库的文件名 libxxx.a -->对应windows的.lib文件 做静态库的命令: ar rcs libxxx.a file1.o file2.o file.o 使用静态库 ...
- 【XSS】对抗蠕虫 —— 如何让按钮不被 JS 自动点击
前言 XSS 自动点按钮有什么危害? 在社交网络里,很多操作都是通过点击按钮发起的,例如发表留言.假如留言系统有 XSS,用户中招后除了基本攻击外,还能进行传播 -- XSS 自动填入留言内容,并模拟 ...
- Linux知识要点大全(第一章)
第一章 Linux操作系统简介 主要内容: 1:Linux的发展历史 2:开源软件 3:Linux系统结构与特性 ...
- 【Android Studio安装部署系列】三十一、从Android studio3.0.0升级到Android studio3.0.1
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 突然想要升级到较高版本.要跟随潮流嘛,不然就落后了. 下载IDE http://www.wanandroid.com/tools/i ...
- jdk切换小工具
今天无意之中看到一个小工具,就是可以自由切换jdk版本!以前每次切换jdk还要去找环境变量找半天,emmm.... 现在我们只需要双击一个xxx.bat的一个批处理文件,就可以自由切换jdk版本,很方 ...
- Python:bs4中 string 属性和 text 属性的区别及背后的原理
刚开始接触 bs4 的时候,我也很迷茫,觉得 string 属性和 text 属性是一样的,不明白为什么要分成两个属性. html = '<p>hello world</p>' ...