使用集群(NDBCluster 或 Galera)时,nodejs 应用程序如何连接到故障转移 MySQL 服务器之一?

How can a nodejs app connect to one of the failover MySQL servers when using clustering (NDBCluster or Galera)?

如果我有一个 MySQL 服务器,我将使用 mysqljs/mysql 连接如下:

var mysql = require('mysql');

var con = mysql.createConnection({
  host: mysql.local,
  port: "3306",
  database: "my_db",
  user: "my_user",
  password: "my_password",
  charset : "utf8mb4"
});

一切正常。

但假设我更改了此设置,使其使用集群 - 通过 NDBCluster 或 Galera - 因此有几个不同的主机可用于写入和读取。

节点应用中应该使用什么host

如果该主机出现故障会怎样?我的节点应用程序如何连接到其中一台备份主机?

我试过寻找这个问题的答案,但我找不到任何东西。

好的,我现在明白你的问题了,其中一些问题实际上可能更适合 ServerFault,但我会在这里给你开发人员的观点,如果你 运行 在设置基础设施时遇到麻烦,在那里问。 :)

因此,什么主机和发生了什么问题在一定程度上取决于您设置的集群技术以及设置方式,但以 Galera 为例,该集群位于某种负载均衡器之后。 Galera 支持它自己的一种,或者 HAProxy,或者一种叫做 Pen。这是您要将您的应用程序指向的主机。

在部署负载均衡器时,您应该实际部署两个或更多,并将它们配置为动态故障转移。 Digital Ocean 有一个关于在 Web 服务器前为 HAProxy 执行此操作的很好的教程,但原理是相同的。

好的,我找到了一个效果很好的简单解决方案。

  1. 我选择了 Galera 作为解决方案。你可以在这里阅读一个很好的演练:https://www.digitalocean.com/community/tutorials/how-to-configure-a-galera-cluster-with-mysql-5-6-on-ubuntu-16-04

  2. 然后我使用以下代码进行数据库查询。请注意,我仍在使用 mysqljs/mysql:

    var mysql = require('mysql');
    var poolCluster = mysql.createPoolCluster();
    
    poolCluster.add('node1', {
      host : 'node1',
      database: 'my_db',
      user : 'my_user',
      password : 'my_password',
      charset : 'utf8mb4'
    });
    
    poolCluster.add('node2', {
      host : 'node2',
      database: 'my_db',
      user : 'my_user',
      password : 'my_password',
      charset : 'utf8mb4'
    });
    
    poolCluster.add('node3', {
      host : 'node3',
      database: 'my_db',
      user : 'my_user',
      password : 'my_password',
      charset : 'utf8mb4'
    });
    
    poolCluster.getConnection(function (err, connection) { 
        if (err) {
            console.log(err);
        } else {
            connection.query('SELECT * FROM some_table', function(err, rows) {
                if (err) {
                    console.log(err);
                } else {
                    console.log(rows);
                    connection.release();
                }
            });
        }
    });
    

请注意,在此设置中,如果一个或多个数据库节点出现故障,查询将被路由到任何一个活动的节点。当失败的节点重新启动时,它们丢失的任何数据将从其中一台实时服务器同步。