我们有一个系统,我们有一个主/多个奴隶。
目前一切都发生在Master上,而奴隶只是在这里进行备份。
我们使用Codeigniter作为开发平台。
现在我们决定使用Reads的Slave和Write查询的Master。
有人告诉我,如果不修改源代码,这是不可行的,因为代理无法知道查询的类型。
任何想法如何继续这样做而不会对完美工作的系统造成太大的损害......
答案 0 :(得分:3)
我们将使用此:http://dev.mysql.com/downloads/mysql-proxy/
它完全符合我们的要求:
更多信息:
http://jan.kneschke.de/2007/8/1/mysql-proxy-learns-r-w-splitting/
http://www.infoq.com/news/2007/10/mysqlproxyrwsplitting
http://archive.oreilly.com/pub/a/databases/2007/07/12/getting-started-with-mysql-proxy.html
答案 1 :(得分:1)
我还在寻找一些东西,几个月前我做了类似的事情,但我添加了3个带有主奴隶mysql服务器的web服务器,第一个启用mod_proxy的web服务器重定向请求读写服务器所有请求都将来到这个服务器,如果发送,放入或删除请求到服务器它将去写服务器,所有获取或正常请求将去读取服务器
在这里你可以找到我使用的mod_proxy设置
在这里,您可以阅读有关负载平衡的信息 http://www.rackspace.com/knowledge_center/article/simple-load-balancing-with-apache
仍然在寻找更好的解决方案,而且涉及的硬件更少
答案 2 :(得分:1)
通过CI找出另一个解决方案,在database.php文件中创建两个数据库连接保存mysql服务器作为默认数据库连接和其他连接只写服务器
你可以使用这个基础模型扩展
https://github.com/jamierumbelow/codeigniter-base-model
您需要使用此模型扩展模型,并且需要使用此扩展模型,它具有插入,更新,删除和获取查询之前和之后的回调功能,只需要添加一个自定义方法或回调change_db_group < / p>
//this method in MY_Model
function change_db_group{
$this->_database = $this->load->database('writedb', TRUE)
}
没有您的示例模型
class Example_Model extends MY_Model{
protected $_table = 'example_table';
protected $before_create = array('change_db_group');
protected $before_update = array('change_db_group');
protected $before_delete = array('change_db_group');
}
在执行插入,更新或删除查询之前,将更改数据库连接