nixops — настраиваем кластер mariadb galera

Thank you for reading this post, don't forget to subscribe!

Установка удаленных систем

Уста­нав­ли­ва­ем на 3 уда­лен­ных систе­мах OC NixOS с такой конфигурацией

Зна­че­ния hashedPassword и openssh.authorizedKeys.keys у вас будут отличаться.

Под­го­то­вим струк­ту­ру для деплоя:

mkdir -p ~/works/nixops/deploy/labs-galera/{galera1,galera2,galera3}

Созда­дим кон­фи­гу­ра­ци­он­ные файлы:

nano ~/works/nixops/deploy/labs-galera.nix

В поле deployment.targetHost = «192.168.0.231»; ука­зы­ва­ем IP-адрес, кото­рый назна­чен нашей уста­нов­лен­ной уда­лен­ной систе­ме. В вашем слу­чае IP-адрес будет отличаться.
nano ~/works/nixops/deploy/labs-galera/galera1/configuration.nix
nano ~/works/nixops/deploy/labs-galera/galera2/configuration.nix
nano ~/works/nixops/deploy/labs-galera/galera3/configuration.nix

Не забы­ва­ем ско­пи­ро­вать с уда­лен­ных систем кон­фи­гу­ра­цию hardware-configuration.nix:


В фай­ле users.nix в раз­де­ле users.root.openssh.authorizedKeys.keys про­пи­сы­ва­ем ssh-ключ, кото­рый сге­не­ри­ро­ва­ли выше. В раз­де­ле users.rebrain.openssh.authorizedKeys.keys уже про­пи­сан ключ, кото­рый мы сге­не­ри­ро­ва­ли при пер­вом зна­ком­стве с NixOS.
nano ~/works/nixops/deploy/labs-galera/galera1/users.nix

Копи­ру­ем файл users.nix на осталь­ные уда­лен­ные системы:
cp ~/works/nixops/deploy/labs-galera/galera1/users.nix ~/works/nixops/deploy/labs-galera/galera2/users.nix
cp ~/works/nixops/deploy/labs-galera/galera1/users.nix ~/works/nixops/deploy/labs-galera/galera3/users.nix

Созда­ем деп­лой labs-galera:

nixops create -d labs-galera ~/works/nixops/deploy/labs-galera.nix
created deployment ‘b37dab82-e16e-11ea-be56-525400c283bd’
b37dab82-e16e-11ea-be56-525400c283bd

Про­смот­рим инфор­ма­цию о нашем деплое:

nixops info -d labs-galera

 

Если вы созда­ли, как в про­шлой ста­тье, SSH-ключ с паро­лем, то, что­бы каж­дый раз не вво­дить пароль, пред­ва­ри­тель­но загру­зим его коман­дой ssh-add:

ssh-add ~/.ssh/id_ed25519
Enter passphrase for /home/rebrain/.ssh/id_ed25519:
Identity added: /home/rebrain/.ssh/id_ed25519 (rebrain@NixOS-example)

Раз­во­ра­чи­ва­ем нашу конфигурацию:

nixops deploy -d labs-galera

Про­смот­рим еще раз инфор­ма­цию о нашем деплое:

nixops info -d labs-galera

Началь­ная настрой­ка закон­че­на, сохра­ним ком­мит в git:
cd ~/works/nixops/deploy
git add -A
git commit -m "add labs-galera"

Мы сде­ла­ли началь­ную настрой­ку уда­лен­ных систем. Теперь доба­вим основ­ные служ­бы — фаер­вол, fail2ban и мони­то­ринг netdata:
cp -r /etc/nixos/nix-config/servers/example/services ~/works/nixops/deploy/labs-galera/galera1
cp -r /etc/nixos/nix-config/servers/example/services ~/works/nixops/deploy/labs-galera/galera2
cp -r /etc/nixos/nix-config/servers/example/services ~/works/nixops/deploy/labs-galera/galera3

В фай­лы configuration.nix добав­ля­ем новые сервисы:

nano ~/works/nixops/deploy/labs-galera/galera1/configuration.nix
nano ~/works/nixops/deploy/labs-galera/galera2/configuration.nix
nano ~/works/nixops/deploy/labs-galera/galera3/configuration.nix

Долж­но полу­чить­ся так:
git diff

Добав­ля­ем изме­не­ния в git:
git add -A
git commit -m "labs-galera: add default services"

бнов­ля­ем уда­лен­ные системы:

nixops deploy -d labs-galera

Пере­за­гру­жа­ем наши уда­лен­ные системы:

nixops reboot -d labs-galera

Переходим к MariaDB Galera

Теперь при­сту­пим к настрой­ке MariaDB Galera. Мини­маль­ная кон­фи­гу­ра­ция кла­сте­ра выгля­дит так:

nano ~/works/nixops/deploy/labs-galera/galera1/services/mysql.nix

Где:
  • networking = { extraHosts — про­пи­сы­ва­ет име­на хостов для наших уда­лен­ных сер­ве­ров, кото­рые будут исполь­зо­вать­ся сер­ви­сом MariaDB Galera.
  • services.mysql.package = pkgs.mariadb; — ука­зы­ва­ем исполь­зо­вать пакет MariaDB.
  • initialScript = pkgs.writeText «mariadb-init.sql» — SQL-скрипт, кото­рый выпол­ня­ет­ся при пер­во­на­чаль­ной ини­ци­а­ли­за­ции базы дан­ных MariaDB. Здесь добав­ля­ем 2 поль­зо­ва­те­лей: repl_user для репли­ка­ции баз дан­ных и netdata для мониторинга.
  • services.mysql.settings.mysqld.bind_address = 0.0.0.0″; — ука­зы­ва­ем слу­шать все интерфейсы.
  • services.mysql.settings.mysqld.galera.wsrep_on = «ON»; — акти­ви­ру­ем MariaDB Galera кластер.
  • services.mysql.settings.mysqld.galera.wsrep_debug = «NONE»; — отклю­ча­ем DEBUG режим.
  • services.mysql.settings.mysqld.galera.wsrep_retry_autocommit = «3»; — ука­зы­ва­ем коли­че­ство повтор­ных попы­ток выпол­нен­ных запро­сов из-за кон­флик­тов внут­ри кла­сте­ра перед воз­вра­том ошиб­ки клиенту.
  • services.mysql.settings.mysqld.galera.wsrep_provider = «${pkgs.mariadb-galera}/lib/galera/libgalera_smm.so»; — ука­зы­ва­ем путь к биб­лио­те­ке MariaDB Galera.
  • services.mysql.settings.mysqld.galera.wsrep_cluster_address = «gcomm://»; — здесь пере­чис­ля­ем все ноды MariaDB Galera. Обра­ти­те вни­ма­ние, при пер­вом запус­ке кла­сте­ра на пер­вой ноде ука­зы­ва­ем пустое зна­че­ние gcomm://.
  • services.mysql.settings.mysqld.galera.wsrep_cluster_name = «galera»; — ука­зы­ва­ем назва­ние кластера.
  • services.mysql.settings.mysqld.galera.wsrep_node_address = «galera_01»; — ука­зы­ва­ем адрес ноды, сов­па­да­ет с име­нем в хост-файле.
  • services.mysql.settings.mysqld.galera.wsrep_node_name = «galera_01»; — ука­зы­ва­ем имя ноды.
  • services.mysql.settings.mysqld.galera.wsrep_sst_method = «mariabackup»; — ука­зы­ва­ем метод SST репликации.
  • services.mysql.settings.mysqld.galera.wsrep_sst_auth = «repl_user:repl_pass»; — ука­зы­ва­ем логин и пароль mysql поль­зо­ва­те­ля для репликации.
  • services.mysql.settings.mysqld.galera.binlog_format = «ROW»; — ука­зы­ва­ем исполь­зо­вать ROW фор­мат бин-логов.
  • services.mysql.settings.mysqld.galera.enforce_storage_engine = «InnoDB»; — запре­ща­ем исполь­зо­вать все фор­ма­ты базы дан­ных, кро­ме InnoDB.
  • services.mysql.settings.mysqld.galera.innodb_autoinc_lock_mode = «2»; — ука­зы­ва­ем исполь­зо­вать interleaved режим блокировки.
nano ~/works/nixops/deploy/labs-galera/galera2/services/mysql.nix
nano ~/works/nixops/deploy/labs-galera/galera3/services/mysql.nix

 

Добав­ля­ем файл mysql.nix в кон­фи­гу­ра­цию configuration.nix:

nano ~/works/nixops/deploy/labs-galera/galera1/configuration.nix
nano ~/works/nixops/deploy/labs-galera/galera2/configuration.nix
nano ~/works/nixops/deploy/labs-galera/galera3/configuration.nix
./services/mysql.nix
./services/netdata.nix
./hardware-configuration.nix
git diff

Добав­ля­ем изме­не­ния в git, но пока не сохраняем:
git add -A

Так как у нас уста­нов­лен фаер­вол nftables, необ­хо­ди­мо открыть пор­ты для кор­рект­ной рабо­ты кластера:

nano ~/works/nixops/deploy/labs-galera/galera1/services/firefall-nft.nix
nano ~/works/nixops/deploy/labs-galera/galera2/services/firefall-nft.nix
nano ~/works/nixops/deploy/labs-galera/galera3/services/firefall-nft.nix

Где:
  • set allow-mysql { — ука­зы­ва­ем, с каких IP-адре­сов раз­ре­шен доступ к mysql серверу.
  • set mariadb-galera — здесь пере­чис­ле­ны хосты наше­го кластера.
  • tcp dport { 4444, 4567, 4568 } и udp dport { 4567 } — откры­ва­ем пор­ты, кото­рые исполь­зу­ют­ся для репли­ка­ции кла­сте­ром MariaDB Galera.

Теку­щие изме­не­ния в фаерволе:

git diff

Сно­ва добав­ля­ем изме­не­ния в git, но не сохраняем:

git add -A

Теперь при­ме­ним изме­не­ния на наших уда­лен­ных систе­мах. Для того что­бы при обнов­ле­нии не раз­ва­лить кла­стер MariaDB Galera во вре­мя пере­за­пус­ка служ­бы mysql, реко­мен­дую обнов­лять уда­лен­ные систе­мы по одной за раз. Для это­го в ути­ли­те ‘nixops’ есть опция —include, кото­рая поз­во­ля­ет ука­зать, с какой уда­лен­ной систе­мой нам работать:

nixops deploy -d labs-galera --include galera1

Пер­вая уда­лен­ная систе­ма гото­ва, настра­и­ва­ем осталь­ные по порядку:
nixops deploy -d labs-galera --include galera2
nixops deploy -d labs-galera --include galera3

Про­ве­рим состо­я­ние кла­сте­ра MariaDB Galera:

nixops ssh-for-each -d labs-galera --include galera1 -- "mysql -N -e \"show status where variable_name in ('wsrep_cluster_size','wsrep_local_state_comment');\""
galera1> wsrep_local_state_comment Synced
galera1> wsrep_cluster_size 3

Как мы видим, кла­стер под­нял­ся и син­хро­ни­зи­ро­вал­ся. Теперь на пер­вом хосте про­пи­сы­ва­ем пол­ный адрес кла­сте­ра gcomm://galera_01,galera_02,galera_03:

nano ~/works/nixops/deploy/labs-galera/galera1/services/mysql.nix
git diff

При­ме­ня­ем изме­не­ние на уда­лен­ной машине:
nixops deploy -d labs-galera --include galera1

Добав­ля­ем изме­не­ния в git и дела­ем коммит:

git add -A
git commit -m "labs-galera: init mariadb galera cluster"

ще мы можем доба­вить мони­то­ринг наше­го кла­сте­ра с помо­щью ути­ли­ты netdata. Для это­го при­во­дим содер­жи­мое фай­ла netdata.nix к тако­му виду:
nano ~/works/nixops/deploy/labs-galera/galera1/services/netdata.nix

Где:

  • services.netdata.python.enable — акти­ви­ру­ет пла­ги­ны на осно­ве python.
  • services.netdata.python.extraPackages = ps: [ ps.mysqlclient ]; — добав­ля­ет ути­ли­ту ps.mysqlclient, кото­рая выпол­ня­ет мони­то­ринг mysql.
  • environment.etc.»netdata/python.d/mysql.conf».text — созда­ет файл /etc/netdata/python.d/mysql.conf с кон­фи­гу­ра­ци­ей mysql пла­ги­на netdata.

Копи­ру­ем изме­нен­ный файл на дру­гие системы:

cp -f ~/works/nixops/deploy/labs-galera/galera1/services/netdata.nix ~/works/nixops/deploy/labs-galera/galera2/services/netdata.nix
cp -f ~/works/nixops/deploy/labs-galera/galera1/services/netdata.nix ~/works/nixops/deploy/labs-galera/galera3/services/netdata.nix

При­ме­ним изме­не­ния на уда­лен­ных систе­мах поочередно:

nixops deploy -d labs-galera --include galera1
nixops deploy -d labs-galera --include galera2
nixops deploy -d labs-galera --include galera3

Добав­ля­ем изме­не­ния в git и дела­ем коммит:

git add -A
git commit -m "netdata: add mysql monitoring"
[master 61fa857] netdata: add mysql monitoring
3 files changed, 42 insertions(+)

В ито­ге мы настро­и­ли кла­стер MariaDB Galera с помо­щью ути­ли­ты nixops.