@vlarkanov

Mariadb Galera Cluster: почему кластер рандомно падает?

Приветствую коллеги.

Есть кластер (2 ноды 2x Intel Xeon E5-2670 2.6Ghz , 192Gb, RAID1 из 2 SSD + 1 арбитратор на виртуалке). Запросы на него идут через maxscale proxy, настроенную таким образом, чтобы все запросы (и чтения и записи) шли на одну ноду, а в случает если нода окажется недоступна - на вторую. Репликация бодренько идет, но через некоторое время может появиться один или два зависших запроса в статусе Query End, при попытке их "убить" статус меняется на Killed - и всё. Кластер при этом работает, всё ок. А потом (с момента запуска проходит от 10 минут до нескольких дней) кластер становится колом - перестает обрабатывать запросы.

В PROCESSLIST при этом висит некоторое количество запросов (8-10) в статусе Query End, при попытке их "убить" статус меняется на Killed.

В syslog\mysql-error.log может не быть ошибок совсем, а может быть что-то вроде

Aug 3 10:43:32 ru-tul-dc01-db-galera-node1 mysqld[1122]: 2017-08-03 10:43:32 139707425306368 [Warning] Aborted connection 2905 to db: 'basename' user: 'username' host: 'ip' (Got an error reading communication packets)
Aug 3 10:43:32 ru-tul-dc01-db-galera-node1 mysqld[1122]: 2017-08-03 10:43:32 139707424700160 [Warning] Aborted connection 2919 to db: 'basename' user: 'username' host' host: 'ip' (Got an error reading communication packets)

и\или множество

Aug 3 14:35:08 ru-tul-dc01-db-galera-node1 mysqld[1115]: 2017-08-03 14:35:08 140310822119168 [Warning] WSREP: certification interval for trx source: dcdccd42-7837-17837-11e7-a045-2a82ddbaac7a version: 3 local: 1 state: CERTIFYING flags: 1 conn_id: 1010 trx_id: 10244940 seqnos (l: 152638, g: 5113465, s: 5088151, d: -1, ts: 3445: 3445393337346) exceeds the limit of 16384)

Единственный способ вернуть кластер к жизни (на время) - перезапустить ноду на которую ведется запись. Переносить mysqld в одну NUMA ноду пробовал - проблема остается. Помогите пожалуйста понять где грабли, уже голову сломал. Конфиг прилагаю.
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock

# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0

[mysqld]
#
# * Basic Settings
#
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc_messages_dir = /usr/share/mysql
lc_messages = en_US
skip-external-locking

# MyISAM #
key-buffer-size = 32M
myisam-recover = FORCE,BACKUP

# SAFETY #
max-allowed-packet = 16M
max-connect-errors = 1000000
skip-name-resolve

# DATA STORAGE #
datadir = /var/lib/mysql/

# BINARY LOGGING #
log-bin = /var/lib/mysql/mysql-bin
expire-logs-days = 14
#sync-binlog = 1
sync-binlog = 0

# CACHES AND LIMITS #
tmp-table-size = 32M
max-heap-table-size = 32M
query-cache-type = 0
query-cache-size = 0
max-connections = 500
thread-cache-size = 50
open-files-limit = 65535
table-definition-cache = 4096
table-open-cache = 4096

# INNODB #
innodb-flush-method = O_DIRECT
innodb-log-files-in-group = 2
innodb-log-file-size = 512M
innodb-flush-log-at-trx-commit = 1
innodb-file-per-table = 1
innodb-buffer-pool-size = 160G

# LOGGING #
log-error = /var/lib/mysql/mysql-error.log
log-queries-not-using-indexes = 1
slow-query-log = 1
slow-query-log-file = /var/lib/mysql/mysql-slow.log
!includedir /etc/mysql/conf.d/

#GALERA
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Galera Cluster Configuration
wsrep_cluster_name="galera-cluster"
wsrep_cluster_address="gcomm://ip1,ip1"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
#wsrep_sst_method=xtrabackup
# Galera Node Configuration
wsrep_node_address="ip1"
wsrep_node_name="galera-node1"

wsrep_retry_autocommit = 4
wsrep_slave_threads = 64
wsrep_provider_options="gcache.size=5G; gcs.fc_limit = 320; gcs.fc_factor = 0.8; repl.commit_order=3;"
#wsrep_debug=ON
wsrep_log_conflicts=ON

  • Вопрос задан
  • 1074 просмотра
Пригласить эксперта
Ответы на вопрос 2
@maxtm
Make money, not job
А что за запрос то висит в состоянии query end?

Был печальный опыт с Галерой, расскажу вкратце.

При определенном векторе нагрузки (до сих пор не могли вручную повторить эти действия), одна из нод падала. Падала всегда более нагруженная нода.
При этом, корраптились все данные базы, и при запуске начинала вытаскивать ВСЮ базу с другой ноды.
Т.к. размер базы был >100gb - это занимало порой до одного часа.

Мы исследовали этот вопрос, но однозначно ответить на вопрос - что приводило к падению одной из нод - не нашли.

В логах было очень много инфы о состояние базы до момента падения, кор-дампы и прочее. Но дебажить марию мы не решились :)

Вышли из ситуации убрав мастер-мастер репликацию, и сделали классическую master-slave. Немного допилили софт, и теперь - за несколько последних месяцев - ни одного падения.

Вывод - не использовать галеру, без прямой необходимости.
Осталось впечатление что продукт еще сырой...
Ответ написан
@shagguboy
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы