我想在我的应用程序中将余额查询加载到2个mysql服务器。
最好的方法是什么,以便每个查询都转到不同的数据库服务器?
我正在考虑使用一个全局计数器,每次建立连接时都会递增,使用我的数据库服务器修改计数器以获取我应该连接的主机。然而,上述过程需要是原子的,因此没有2个请求看到相同的计数器。
我应该怎么做?使用信号量锁,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)]
由于
答案 0 :(得分:2)
最好的方法?
使用MySQL Proxy ...它会自动补偿关闭服务器。另外,您可以编写规则来说明每个查询的位置(循环选择,或者指定特定服务器以获得更好的缓存关联)。另外,它可以自动将所有写入指向主服务器......
我不会尝试在您的应用程序中实现它。原因是在多个实例中处理全局锁定要困难得多,并且更难以进行故障检测而不会导致大的性能损失......
答案 1 :(得分:0)
为什么不采用rand方式?
$this->read_host = $this->prod_slaves_array[rand(0,(count($this->prod_slaves_array)-1))];
优点是它无锁,虽然它不完全是50/50,但它真的需要吗?