Rethinkdb, неправильная настройка кластера или что-то еще?

У меня огромные проблемы с моим кластером. Серверы продолжают отключаться по неизвестной причине (в журналах ничего нет) и сбиваются по неизвестной причине. Я думаю, что я мог неправильно настроить кластер.

Сначала это первое, я понимаю шардинг, и это отличная особенность, но что это:

"русская копия за осколок"?

Что это значит?

Второе. Как настроить кластер с "n" серверами? У меня 6 серверов из-за шардинга (у меня мало документов с записями более 10 миллионов), но я не уверен, что правильно настроил свой кластер.

На каждом сервере я написал:

for example (srv1.conf)
join=srv2:port
join=srv3:port
join=srv4:port
join=srv5:port
join=srv6:port

Это правильный способ добавить сервер в кластер?

В документации ничего нет, и было бы здорово, если бы вы опубликовали "рекомендованную" конфигурацию кластера.

И третье - это отработка отказа. На моем 6 кластерном сервере все таблицы имеют 6
осколки с тремя репликами. Как только я кричу, например, приложение сервера 1 выходит из строя, и некоторые сумасшедшие записи находятся в кластере. Какой смысл кластера, если у меня нет избыточности, если какой-то другой сервер выходит из строя?

Я действительно надеюсь, что кто-то может помочь мне с этим, потому что, когда у меня был только один сервер, мое приложение работало все время. Теперь каждый раз, когда некоторые серверы отключаются, все падает. Я использую nodejs rethinkdbdash.

ОБНОВИТЬ

Я знаю, что такое шард, у меня есть 2 миллиона записей для одной таблицы, например, и они распределены по 6 серверам (для меня это важно из-за скорости чтения). Я не понимаю, что такое "реплика". Каждый стол настроен так: 6 осколков и 3 копии на каждый осколок. Из того, что вы сказали, это означает, что если какой-то сервер выйдет из строя, таблица будет доступна для чтения, но это не так (скажем, что-то вроде set read_mode = устаревший и сбой приложения). Нет способа изменить каждую часть приложения, которая выполняет чтение, и сказать, что read_mode = устарела. Это просто плохое программирование.

В логах ничего нет. На каждом сервере в dmesg у меня есть это:

TCP: TCP: Possible SYN flooding on port 28015. Sending cookies.  Check SNMP counters.

1 ответ

Серверы продолжают отключаться по неизвестной причине (в журналах ничего нет) и сбиваются по неизвестной причине.

Будет трудно помочь вам с падением, если в журналах ничего нет. Что говорит ваш менеджер инициализации, если вы используете менеджер инициализации, например systemd? RethinkDB вышел или перестал отвечать? Сколько памяти доступно для RethinkDB? Есть ли какие-либо сообщения, касающиеся RethinkDB в dmesg или ваш syslog? В журналах хотя бы говорится, что серверы отключены? Веб-интерфейс сообщает о каких-либо проблемах?

"русская копия за осколок"?

Что это значит?

Итак, скажем, у нас есть пицца, которая представляет данные в базе данных. Осколок - это место, где вы нарезаете пиццу на более мелкие кусочки, поэтому, скажем, мы нарезаем ее на 4 части (осколки). Иметь n реплики, мы просто делаем n копии каждого среза. Давайте сделаем n = 3, поэтому у нас есть 4 осколка и 3 реплики для каждого осколка, всего до 12 штук. Теперь можно распределить эти части по нескольким серверам.

Таким образом, в вашем случае вам нужна система с высокой доступностью, для которой требуется минимальное количество из 3 реплик (т.е. 3 сервера), хотя предпочтительным является нечетное число, так как большинство реплик должно быть доступно для базы данных, чтобы продолжить работу. Для работы базы данных должно быть доступно большинство реплик для каждого шарда. Допустим, у меня есть 2 шарда, каждый с 3 репликами, распределенными по 6 серверам, каждый с одной репликой шарда. Если один сервер выйдет из строя, это нормально, потому что будут еще две реплики (серверы, хранящие те же данные, что и сервер, который вышел из строя), а также потому, что доступно 2/3 реплики (большинство), база данных может продолжать работать.

На каждом сервере я писал: ... Это правильный способ добавить сервер в кластер?

Вы должны указать сервер canonical-address, который является адресом (не включая порт), который другие серверы будут использовать для подключения к нему, и вы должны указать только 1 аргумент соединения, поскольку база данных автоматически запросит у сервера, к которому она подключается, список адресов всех серверов, подключенных к кластер. Все серверы в кластере должны иметь возможность общаться друг с другом, используя canonical-address,

В документации ничего нет, и было бы здорово, если бы вы опубликовали "рекомендованную" конфигурацию кластера.

Вот как выглядит мой файл конфигурации для кластера:

bind=all
canonical-address=server.domain.com
driver-port=28015
cluster-port=29015
join=otherserver.domain.com:29015

cluster-tls-key=/path/to/key.pem
cluster-tls-cert=/path/to/cert.pem
cluster-tls-ca=/path/to/cert.pem

Я настроил TLS для внутрикластерной связи, так как мои серверы должны общаться через Интернет, и я хочу, чтобы он был зашифрован. Обратитесь к https://www.rethinkdb.com/docs/security/ за информацией о защите вашего кластера. Вы также можете зашифровать подключения драйверов.

Какой смысл кластера, если у меня нет избыточности, если какой-то другой сервер выходит из строя?

Вы можете настроить реплики для своей базы данных. Я объяснил некоторые концепции этого выше.

Информацию о репликации можно найти здесь: https://www.rethinkdb.com/docs/sharding-and-replication/

Другие вопросы по тегам