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

blmhpbnm  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(328)

如果我有一台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 应该在节点应用程序中使用吗?
如果这个主机坏了怎么办?我的节点应用程序如何连接到备份主机之一?
我试着找到答案,但什么也找不到。

yzxexxkh

yzxexxkh1#

好的,我找到了一个简单的解决方案,效果很好。
我选择galera作为解决方案。您可以在此处阅读一篇精彩的演练:https://www.digitalocean.com/community/tutorials/how-to-configure-a-galera-cluster-with-mysql-5-6-on-ubuntu-16-04
然后我使用下面的代码进行db查询。注意,我仍在使用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();
            }
        });
    }
});

注意:在此设置中,如果一个或多个数据库节点宕机,则查询将路由到活动的节点。当失败的节点重新启动时,它们丢失的任何数据都将从一个活动服务器同步。

wlsrxk51

wlsrxk512#

好的,我现在理解你的问题了,事实上有些问题可能更适合serverfault,但我会在这里向你介绍开发人员的观点,如果你在设置基础设施时遇到问题,请在那里提问。:)
因此,what host和what happens问题在一定程度上取决于您设置了哪些集群技术以及如何设置它,但是以galera为例,集群位于某种负载均衡器之后。galera支持自己的一个,或haproxy,或一个叫pen的。这就是你将应用程序指向的主机。
在部署负载平衡器时,实际上应该部署两个或多个负载平衡器,并将它们配置为动态故障切换。digital ocean在web服务器前为haproxy提供了一个很好的教程,但原理是一样的。

相关问题