我希望我的Drupal8安装在数据库出现故障时更加可靠,因此我想在MySQL中启用主/从复制,并使其与Drupal 8一起使用。
我设置了两个MySQL服务器(一个主服务器,一个服务器),并且复制正在运行。
现在,我想设置Drupal来平衡SELECT查询到slave,以及对master的INSERT / UPDATE / DELETE查询。它将平衡两个服务器之间的负载,我将有一个(litle)HA概念。
为了测试这个架构,我安装了一个全新的Drupal 8实例,根本没有自定义模块。如果可能的话,只有纯粹的香草Drupal 8。
我更改了settings.php文件,如下所示:
$databases['default']['default'] = array (
'database'=>'drupaldb',
'username'=>'masteruser',
'host'=>'database-master.com'
...
);
$databases['default']['slave'] = array (
'database'=>'drupaldb',
'username'=>'slaveuser',
'host'=>'database-slave.com'
...
);
“slaveuser”是只具有READ访问权限的MySQL用户; “masteruser”对数据库具有RW访问权限。
使用此设置,应用程序运行正常,但是当我查看Slave指标时,没有连接。即使我正在重新加载前端的页面。
如果我关闭主服务器,或者如果我在配置php文件中更改主设置(密码错误,数据库错误),我希望前端页面的应用程序能够使用从属设置。但是首页出错:“该网站遇到意外错误。请稍后再试”。错误日志表示SQL连接失败。
我在这里看到的是,没有办法平衡查询到master(用于写入)和slave(用于读取)。 我希望Drupal8能够在没有任何额外插件的情况下管理它。
我是否必须使用mysql_nd_ms PHP扩展来进行M / S平衡?
答案 0 :(得分:2)
副本数据库配置的语法可以在settings.php
https://api.drupal.org/api/drupal/sites%21default%21default.settings.php/8.7.x
默认数据库副本的语法为:
// $info_array is the db connection details
$databases['default']['replica'][] = $info_array;
注意:D8使用replica
而不是slave
作为术语。
答案 1 :(得分:0)
注意:据我所知,除非您使用的是db_ *函数调用(已弃用),或者在任何自定义查询中手动实例化了database.replica连接,否则添加“副本服务器”不会起作用。
例如
/** @var \Drupal\Core\Database\Connection $database_replica */
$database_replica = \Drupal::service('database.replica');
$query = $database_replica->select('node', 'n');....
答案 2 :(得分:0)
$database_replica = \Drupal::service('database.replica');
or
$database_replica = Database::getConnection('replica', 'default');