2017-01-10 25 views
1

Требование: CentOS на основе Docker контейнер обеспечивает кластер MariaDB 10.x ГалераКак отлаживать «WSREP: SST не удалось: 1 (операция не разрешена)» с кластером MariaDB Galera в Docker?

Принимающая среда: OX X El Capitan 10.11.6, Docker 1.12.5 (14777)

Docker Контейнер ОС: CentOS Linux релиз 7.3.1611 (ядро)

DB: 10.1.20-MariaDB

Я нашел a promising Docker image, но документация кажется устаревшим, команды для запуска кластера не работают. На момент написания изображения использует wsrep_sst_method = Rsync и поэтому я решил, что следующие команды должны работать (заменить/Users/Me/somedb с пустым каталогом на хосте):

docker pull dayreiner/centos7-mariadb-10.1-galera 

docker run -d --name db1 -h db1host -p 3306:3306 -e CLUSTER_NAME=joe -e CLUSTER=BOOTSTRAP -e MYSQL_ROOT_PASSWORD='pwd' -v /Users/Me/somedb:/var/lib/mysql dayreiner/centos7-mariadb-10.1-galera:latest 

docker run -d --name db2 -h db2host -p 3307:3306 --link db1 -e CLUSTER_NAME=joe -e CLUSTER=db1host,db2host -e MYSQL_ROOT_PASSWORD='pwd' -v /Users/Me/somedb:/var/lib/mysql dayreiner/centos7-mariadb-10.1-galera:latest 

Первый контейнер (db1) появляется и кажется ОК. Но последняя строка, которая пытается добавить db2 в качестве второго узла в кластере результаты Галеры в следующей ошибке (журналы Докер db2):

2017-01-10 15:26:10 139742710823680 [Note] WSREP: New cluster view: global state: :-1, view# 0: Primary, number of nodes: 1, my index: 0, protocol version 3 
2017-01-10 15:26:10 139742711142656 [ERROR] WSREP: SST failed: 1 (Operation not permitted) 
2017-01-10 15:26:10 139742711142656 [ERROR] Aborting 

Я не мог понять, что здесь не так, и хотела бы идеи о том, как проанализировать это дальше. Это проблема rsync, Galera или даже Docker?

ответ

1

Это мое изображение на докер-хабе.

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

Это связано с тем, что сеть моста по умолчанию не ведет себя красиво. Возможно, возникла проблема с обработкой портов для передачи состояния. Не совсем уверен, почему.

Если вы изменяете ваши команды сначала создать пользовательскую сеть для вашей кластерной контейнеры для использования на внутреннем интерфейсе, а затем запустить элементы кластера, используя эту сеть, которая, кажется, работает при запуске два узлов на одном хосте:

# docker network create mariadb 

# docker run -d --network=mariadb -p 3307:3306 --name db1 -e CLUSTER_NAME=test -e CLUSTER=BOOTSTRAP -e MYSQL_ROOT_PASSWORD=test -v /opt/test/db1:/var/lib/mysql dayreiner/centos7-mariadb-10.1-galera:latest 

# docker run -d --network=mariadb -p 3308:3306 --name db2 -e CLUSTER_NAME=test -e CLUSTER=db1,db2 -e MYSQL_ROOT_PASSWORD=test -v /opt/test/db2:/var/lib/mysql dayreiner/centos7-mariadb-10.1-galera:latest 

Никакие ошибки на этот раз на втором узле:

# docker logs db2 -f 
...snip 
2017-01-12 20:33:08 139726185019648 [Note] WSREP: Signalling provider to continue. 
2017-01-12 20:33:08 139726185019648 [Note] WSREP: SST received: 42eaa277-d906-11e6-b98a-3e6b9531c1b7:0 
2017-01-12 20:33:08 139725604124416 [Note] WSREP: 1.0 (f170852fe1b6): State transfer from 0.0 (951fdda2454b) complete. 
2017-01-12 20:33:08 139725604124416 [Note] WSREP: Shifting JOINER -> JOINED (TO: 0) 
2017-01-12 20:33:08 139725604124416 [Note] WSREP: Member 1.0 (f170852fe1b6) synced with group. 
2017-01-12 20:33:08 139725604124416 [Note] WSREP: Shifting JOINED -> SYNCED (TO: 0) 
2017-01-12 20:33:08 139726105180928 [Note] WSREP: Synchronized with group, ready for connections 
2017-01-12 20:33:08 139726105180928 [Note] WSREP: wsrep_notify_cmd is not defined, skipping notification. 
2017-01-12 20:33:08 139726185019648 [Note] mysqld: ready for connections. 
Version: '10.1.20-MariaDB' socket: '/var/lib/mysql/mysql.sock' port: 3306 MariaDB Server 

Попробуйте это, увидеть, как она идет. Кроме того, если вы запустите его с помощью docker-compose, он также будет работать без проблем. Это, вероятно, потому, что compose создает по умолчанию специализированную сеть контейнеров.Вы можете увидеть пример файла in this gist.

Просто убедитесь, что для каждого экземпляра mariadb используется другой каталог, а после запуска кластера остановите db1 и перезапустите его как обычный член кластера (иначе при следующем запуске db1 он будет продолжать загружать новый кластер).

+0

Большое спасибо за выяснение решения и дополнительных объяснений! Как и сейчас, он работает сейчас для меня, также с версией 10.1.20 от MariaDB. – StaticNoiseLog

+1

Привет, рад его работе! На самом деле не уверен, почему сеть моста по умолчанию будет таким барьером. Мое единственное предположение было бы потому, что порт SST, открытый компанией socat, является только по требованию во время передачи состояния, а не все время. Возможно, некоторые проблемы обработки, поскольку порт не открыт при запуске контейнера. При работе с несколькими хостами я всегда использую либо: a) режим сетевой сети, либо b) сеть swarm + overlay для связи порта SST. В этом случае стандартная переадресация портов тоже может быть обрушена. – Jon

+0

Спасибо за дополнительную информацию! Я заметил, что 10.2.3 работает (см. Мой собственный ответ). Возможно, что-то было исправлено относительно обращения с портом. – StaticNoiseLog

0

Работы после Обновление изображения Докера в MariaDB 10.2.3 (с 10.1.20).

Я не 100% уверен, есть ли у меня действительно действующий кластер сейчас, но, по крайней мере, show status like "wsrep_cluster_size"; производит следующий вывод и DB может использоваться:

+--------------------+-------+ 
| Variable_name  | Value | 
+--------------------+-------+ 
| wsrep_cluster_size | 3  | 
+--------------------+-------+ 

Примечание: Я также опустили опцию -v и поместил файлы DB внутри контейнера Docker вместо внешнего тома. Я не думаю, что это имеет значение для кластера, но я не проверял 10.2.3 с -v. Тем не менее, я пробовал 10.1.20 с обоими вариантами (внешний том с -v и внутренними файлами контейнера), и оба делали не работы.