Как приложение nodejs может подключаться к одному из отказоустойчивых серверов MySQL при использовании кластеризации (NDBCluster или Galera)? - PullRequest
0 голосов
/ 29 октября 2018

Если у меня есть один сервер 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 следует использовать в приложении узла?

Что произойдет, если этот хост выйдет из строя? Как приложение моего узла может подключиться к одному из резервных хостов?

Я пытался найти ответ на этот вопрос, но ничего не могу найти.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

ОК. Я нашел простое решение, которое хорошо работает.

  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();
                }
            });
        }
    });
    

Обратите внимание, что в этом случае, если один или несколько узлов базы данных выйдут из строя, запросы будут перенаправлены на любой из существующих узлов. Когда сбойные узлы перезапускаются, все отсутствующие данные будут синхронизироваться с одним из активных серверов.

0 голосов
/ 29 октября 2018

Хорошо, я понимаю ваш вопрос сейчас, и некоторые из них могут быть более подходящими для ServerFault, но я дам вам мнение разработчиков здесь, и если у вас возникнут проблемы с настройкой инфраструктуры, спросите там. :)

Итак, вопрос о том, какой хост и что происходит, в некоторой степени зависит от того, какие кластерные технологии вы настроили и как вы его настраивали, но на примере Galera кластер находится за каким-то балансировщиком нагрузки. Galera поддерживает один из своих собственных, или HAProxy, или тот, который называется Pen. Это хост, на который вы укажете свое приложение.

При развертывании балансировщика нагрузки необходимо развернуть два или более и настроить их для динамического переключения при сбое. Digital Ocean имеет хорошее руководство по выполнению этого для HAProxy перед веб-серверами, но принцип тот же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...