轮询连接到MySQL数据库。

3

我想在我的应用程序中将查询负载均衡到2个mysql服务器上。

最好的方法是什么,以便每个查询都发送到不同的数据库服务器?

我考虑使用全局计数器,在每次连接时递增计数器,对我的db服务器取模,以获取应该连接的主机。然而,上述过程需要是原子性的,以便没有两个请求看到相同的计数器。

我该如何处理?使用信号量锁,mysql的get_lock()?

伪代码

counter = 0
hosts = array('192.168.1.1:3306', '192.168.1.2:3306')

//the below code needs to be atomic
GET A GLOBAL LOCK
counter = counter+1
RELEASE THE LOCK

host = hosts[counter % len(hosts)]

谢谢

2个回答

2

最好的方法是使用MySQL Proxy... 它会自动补偿宕机的服务器。此外,您可以编写规则来指定每个查询应该去哪里(轮询选择还是到特定服务器以获得更好的缓存亲和性)。此外,它可以自动将所有写操作定向到主服务器...

我不建议在您的应用程序中实现它。原因是跨多个实例处理全局锁更加困难,并且难以具有不会导致大量性能损失的故障检测...


嗨,如果我没记错的话,Mysql Proxy仍处于测试版。无论如何,我需要它在应用程序逻辑中。 - Thomas
这在技术上是alpha版本。你为什么需要它在应用逻辑中?使用代理不行吗?它能为你带来什么好处? - ircmaxell
这是为了测试目的。还有HaProxy可以完成这项工作,但现在我只想在应用程序逻辑中进行测试。 - Thomas
嗯,就像我说的那样,处理所有边缘情况将会相当复杂。我个人会使用锁文件(使用 flock)来控制计数器(锁定它,读取和增加计数器,写入增加的数字,释放锁)。但要注意这可能很危险,因为它是应用程序的瓶颈......而且为什么这么重要呢?如果两个连续进程访问同一数据库服务器,谁在乎呢?只要平均情况分为50-50,这真的很重要吗? - ircmaxell

0

为什么不采用随机方法呢?

$this->read_host = $this->prod_slaves_array[rand(0,(count($this->prod_slaves_array)-1))];

优点在于它是无锁的,虽然它不完全是50/50,但真的需要吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接