0

我一直在使用 sequelize 迁移,而没有任何问题,例如在我们的开发服务器中:

"development": {
    "username": "root",
    "password": "password",
    "database": "db",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }

使用 sequelize-cli 可以正常工作:

npx sequelize db:migrate

结果:

Sequelize CLI [Node: 12.16.1, CLI: 6.2.0, ORM: 6.3.5]

Loaded configuration file "config\config.json".
Using environment "development".
No migrations were executed, database schema was already up to date.

我们的生产服务器也是如此,其中 db 与 app 位于不同的服务器上:

"production": {
    "username": "root",
    "password": "password",
    "database": "db",
    "host": "172.xx.xx.11",
    "dialect": "mysql"
  }

所以最近我们升级了我们的生产服务器,使用 mariadb 拥有 3 个 db 服务器,由负载均衡器(maxscale)、galera 集群或其他东西管理,使用与以前相同的设置,所以现在它类似于:

server a: 172.xx.xx.11, 
server b: 172.xx.xx.12, 
server c: 172.xx.xx.13, 
load balancer: 172.xx.xx.10

我们的新配置如下:

"production": {
    "username": "root",
    "password": "password",
    "database": "db",
    "host": "172.xx.xx.10",
    "dialect": "mysql"
  }

应用服务器和数据库服务器之间没有直接打开防火墙,只有应用服务器到负载均衡器。

用sequelize测试app server和负载均衡器的连接似乎没有问题,如果用户名和密码正确可以通过,如果用户名错误,或者密码错误会给出

ERROR: Access denied for user 'root'@'172.xx.xx.10' (using password: YES)

那里没有问题。只是说有联系。

那么使用也没有问题:

npx sequelize db:drop

或者

npx sequelize db:create

导致

Sequelize CLI [Node: 12.16.1, CLI: 6.2.0, ORM: 6.3.5]

Loaded configuration file "config\config.json".
Using environment "production".
Database db created.

在我们所有的数据库服务器中验证数据库确实删除和创建。

但是当我尝试进行迁移时,会发生这种情况:

Sequelize CLI [Node: 12.16.1, CLI: 6.2.0, ORM: 6.3.5]

Loaded configuration file "config\config.json".
Using environment "production".

ERROR: Unknown database 'db'

我已经验证我们所有的 db 服务器确实有那个 'db' 数据库,它甚至是由基于配置的 sequelize 创建的,但不知何故,sequelize 似乎无法识别或识别那个 'db' 数据库。

如果您以前有任何类似的经验,请提供帮助,如果您需要更多信息,请告诉我。谢谢。

4

2 回答 2

0

Turns out the maxscale user don't have enough privileges. granting SHOW DATABASES privileges to maxscale user fixed my issue.

more info: https://mariadb.com/kb/en/mariadb-maxscale-14/maxscale-configuration-usage-scenarios/#service

Related issue on MariaDB Jira

于 2020-10-30T01:45:55.383 回答
0

log_info=true您可以通过在该[maxscale]部分下添加来启用 MaxScale 中的详细日志级别。这应该有助于解释正在发生的事情以及失败的原因。

Sequelize 可能会假设它正在使用相同的数据库服务器。例如,执行 INSERT 并立即读取插入的值将始终在单个服务器上工作,但使用分布式设置,这些值可能没有复制到所有节点。

如果您找不到关于它为什么会出现这种行为的解释,或者您认为 MaxScale 做错了什么,请在 MaxScale 项目下的 MariaDB Jira 上打开错误报告。

于 2020-10-29T07:41:40.337 回答