在Drupal 8

时间:2018-04-19 10:38:04

标签: mysql amazon-rds drupal-8 database-replication

我希望我的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平衡?

3 个答案:

答案 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');