负载平衡 MySql 服务器?

负载平衡 MySql 服务器?

我从一位在托管公司工作的人那里听说,无法对 mysql 服务器进行负载平衡。这是真的吗?

附带一个问题,我应该如何编程来处理这些停机时间?

答案1

从非常简单的幼儿园水平来看,他是对的 —— 您不能仅仅将第 4 层负载均衡器放在一堆 MySQL 服务器前面并期望它能够正常工作,就像您对一堆 Web 服务器所做的那样。

然而,有一些技术可以将负载分散到多个 MySQL 服务器之间,比如分片和多主复制,从这个意义上来说,你正在交谈的那个人是完全错误的。

至于“这些停机时间”,我不确定你的意思——负载平衡不一定是高可用性的,如果你想正确使用这些技术,了解两者之间的关系和差异非常重要。

一般来说,您可以通过向用户显示一个道歉页面,然后在后台向值班系统管理员大声呼救来处理存储层的停机问题。

答案2

检查 MySQL 代理和读/写分离。基本上,写入到主服务器,您可以对主服务器和一个或多个从服务器的读取进行负载平衡。

查看:http://agiletesting.blogspot.com/2009/04/mysql-load-balancing-and-read-write.html

干杯

答案3

当然,您可以对任何类型的服务器进行负载平衡,但您可能无法获得想要的结果。

例如,如果 DB 应用程序是一个纯只读查询系统,那么为什么不呢,您可以通过 LB 获得巨大的收益,但您遇到的问题是写入,因为它们不会很好/正确地聚集 - 它只是为这种事情设计的,除非您认真地从上到下设计您的系统以以这种方式工作。

所以我要问您的是您希望它如何运作?

答案4

可以对 MySQL 数据库环境进行负载平衡,但不能通过在应用服务器和数据库服务器之间放置 LB 设备来实现。这完全不是进行负载平衡的好地方。

在 MySQL 连接级别执行此操作的问题在于知识。SQL 的本质就是针对单个存储,即“数据库”。原始 SQL 没有足够的关于不同类型数据的关系的信息,也没有所需的数据有效性。相反,它必须通过查看访问未知数据的方式来猜测访问未知数据的原因。这就是 MySQL Proxy 的工作方式。而且它仍然需要对数据库实例本身进行额外的配置。

真正的集群感知负载平衡要求数据库实例能够相互通信,以整理访问序列化和有关数据库引擎和存储级别的比较负载的知识。我没有研究过它们,但据我所知,这是 DB2 和 Oracle 在集群设置中所做的类型。MySQL 则没有 - 它没有为此设计的架构。

因此,您必须在更高层实现负载平衡:在应用程序中,在发出 SQL 之前。这是一个更好的实现位置,因为所有关于数据相关性的知识实际上都在这里。在这里,代码可以知道它需要在那边的一个数据库中查找此表,在那边的一个数据库中查找另一个表。它可以知道它可以读取此数据库以查找此表,因为它是一个副本,但它必须写入那边的那个数据库。它甚至可以决定数据在不再有用之前可以使用多长时间,从而允许智能缓存策略。这也意味着许多数据库实例。这是 LiveJournal 经过数年摸索得出的结论。

这种方法的缺点是你会失去一些东西。没有(或很少)存储过程,约束很难,跨不同数据库的报告很困难。它使你复杂的 SQL 引擎成为简单的存储。但他们擅长这一点!这也意味着要么你的 DBA 必须成为 DB 程序员,要么你的 DB 程序员必须成为 DBA。去过那里。做到了。我在对象层实现了这种可扩展性。它工作得非常好。它只是非常不合常规。

相关内容