Samba/CTDB

Материал из ALT Linux Wiki

Описание

В этой статье рассмотрим построение масштабируемого кластера файлового сервиса Samba. Для обеспечения высокой доступности мы будет использовать сетевую файловую систему, которая будет доступна одновременно всем серверам в кластере. В качестве кластерной файловой системы будем использовать GlusterFS. Для механизма блокировок Samba использует TBD (trivial data base), нам понадобится его кластерная реализация CTDB. CTDB будет управлять переносом IP-адреса и запуском сервиса Samba (и winbind если речь идет о доменной конфигурации).

Используемые версии компонентов

  • glusterfs
    • glusterfs9-server-9.3-alt1.x86_64
    • glusterfs9-client-9.3-alt1.x86_64
  • ctdb
    • samba-ctdb-4.19.9
    • samba-4.19.9-alt3.x86_64
    • task-auth-ad-winbind-0.44.11
  • Контроллер домена samba
    • task-samba-dc-4.19.9-alt3.noarch

Как это работает

  • Все ноды стартуют и монтируют сетевую ФС
  • CTDB назначает одной из нод публичный ip адрес и запускает smb сервис (в случае с доменом еще и winbind)
  • CTDB на других нодах мониторят состояние ноды с публичным адресом и если, что-то идет не так, адрес назначается другой ноде

Конфигурация (без доменной поддержки)

Общий вид можно представить схемой

Ctdb-wo-domain.png


Кластер GlusterFS

Построение кластера GlusterFS не рассматривается в данной статье. Немного устаревшие, но в целом верные шаги, возможно посмотреть в отдельном документе GlusterFS

  • gluster1 - 192.168.160.11/24
  • gluster2 - 192.168.160.12/24
  • gluster3 - 192.168.160.13/24

Кластер Samba

  • samba1 - первая нода сервиса smb - 192.168.160.151/24
  • samba2 - первая нода сервиса smb - 192.168.160.152/24
  • 192.168.160.180/24 - виртуальный IP по которому будет отвечать один из узлов

Установка необходимого ПО

На все ноды сервиса samba нужно установить один набор ПО.

# apt-get update
# apt-get install samba-ctdb glusterfs9-client


Внимание: Важно! Убедитесь, что у вас активна samba с поддержкой кластеризации. Результат должен быть таким
[root@samba1 ~]# smbd -b | grep -A 1 -i cluster
   CLUSTER_SUPPORT
   COMPILER_SUPPORTS_LL
--
Cluster support features:
   CLUSTER_SUPPORT
   CTDB_SOCKET: /var/run/ctdb/ctdbd.socket

если у вас результат такой

Cluster support features:
   NONE

то, вероятно, у вас стоит несколько пакетов с smbd, к примеру пакет samba-dc, который нам сейчас не нужен и должен быть удален.

Кластерную файловую систему примонтировать в /mnt/gluster/, проще всего это сделать через /etc/fstab

gluster1,gluster2,gluster3:/gfs-volume /mnt/gluster/ glusterfs defaults,_netdev 0 0


Памятка: Я не использую vfs модуль для работы с glusterfs в виду его жесткой привязки к версии самбы при сборке. На текущий момент это gluster8, а у меня используется gluster9

Настройка службы ctdb

  • в файле /etc/ctdb/nodes перечисляются IP адреса всех нод кластера
192.168.160.151
192.168.160.152
  • в файле /etc/ctdb/public_addresses указываем адрес (и интерфейс) по которому будет взаимодействие с клиентами.
192.168.160.180/24 ens19
  • в файле /etc/ctdb/ctdb.conf указать recovery lock на сетевой ФС
[cluster]
recovery lock=/mnt/gluster/ctdb.lock


Внимание: Важно! писать именно recovery lock=/mnt/gluster/ctdb.lock без кавычек и прочего.
  • включить поддержку скриптов для управления необходимыми службами. CTDB сам будет запускать и управлять ими.
# for i in 00.ctdb 10.interface 50.samba; do ctdb event script enable legacy $i; done

и проверить, что они включились (наличие * у имени)

[root@samba1 ~]#  ctdb event script list legacy
* 00.ctdb
  01.reclock
  05.system
  06.nfs
* 10.interface
  11.natgw
  11.routing
  13.per_ip_routing
  20.multipathd
  31.clamd
  40.vsftpd
  41.httpd
  48.netbios
  49.winbind
* 50.samba
  60.nfs
  70.iscsi
  91.lvs
 
  • запустить ctdb
systemctl enable --now ctdb

Настройка samba

  • Выключить возможность запуска smb через systemd
systemctl disable --now smb
  • создать конфигурационный файл samba

т.к. все ноды должны иметь одинаковый конфигурационный файл, то лучше всего хранить его настройки в registry. Для этого достаточно создать минимальный /etc/samba/smb.conf с содержимым

[global]
clustering = yes
include = registry

Затем создать текстовый файл /etc/samba/main_smb.conf с содержимым

netbios name = mycluster
idmap config * : backend = autorid
idmap config * : range = 1000000-1999999
workgroup = cluster
security = user
passdb backend = tdbsam
map to guest = Bad User

[share]
guest ok = yes
path=/mnt/gluster/share
browseable=yes 
read only = no

и импортировать его (только на этой\одной ноде)

net conf import main_smb.conf

после чего net conf list покажет цельный конфиг на всех нодах, и все утилиты от smbd до testparm будут работать с полным единым конфигом на всех нодах кластера.

Повторюсь, все настройки/файлы должны быть идентичные на всех нодах кластера (кроме команды net conf import)

После настройки сделать ребут нод и убедится

  1. Шара glusterfs примонтирована
  2. Служба ctdb запущена
  3. Служба smb запущена
  4. на всех нодах вывод net conf list одинаков

Проверка работы

  1. После запуска ctdb, на одой из нод должен автоматически добавится еще один ip адрес указанный в /etc/ctdb/public_addresses
  2. При выключении сети, выключении сервиса ctdb, выклычении всей ноды с адресом из /etc/ctdb/public_addresses, этот адрес назначается другой серверу в кластере
  3. Для клиентов, весь кластер доступен по имени в smb.conf (netbios name), вне зависимости от локального hostname.

Конфигурация (c доменной поддержкой)

Общий вид можно представить схемой

Ctdb-with-domain.png

Общие подходы такие же, но добавлена еще одна сущность - контроллер домена. Таким образом имеем

Кластер GlusterFS

  • gluster1 - 192.168.160.11/24
  • gluster2 - 192.168.160.12/24
  • gluster3 - 192.168.160.13/24

Кластер Samba

  • samba1 - первая нода сервиса smb - 192.168.160.151/24
  • samba2 - первая нода сервиса smb - 192.168.160.152/24
  • 192.168.160.180/24 - виртуальный IP по которому будет отвечать один из узлов

Контроллер домена

  • dc1.cluster.alt - 192.168.160.10/24

Установка необходимого ПО

Все шаги нужно сделать на всех нодах (если не указано иного).

На все ноды сервиса samba нужно установить один набор ПО.

# apt-get update
# apt-get install samba-ctdb glusterfs9-client task-auth-ad-winbind


Внимание: Важно! Убедитесь, что у вас активна samba с поддержкой кластеризации.

Результат проверки должен быть таким

[root@samba1 ~]# smbd -b | grep -A 1 -i cluster
   CLUSTER_SUPPORT
   COMPILER_SUPPORTS_LL
--
Cluster support features:
   CLUSTER_SUPPORT
   CTDB_SOCKET: /var/run/ctdb/ctdbd.socket

если у вас результат такой

Cluster support features:
   NONE

то, вероятно, у вас стоит несколько пакетов с smbd, к примеру пакет samba-dc, который нам сейчас не нужен и должен быть удален.

Кластерную файловую систему примонтировать в /mnt/gluster/, проще всего это сделать через /etc/fstab

gluster1,gluster2,gluster3:/gfs-volume /mnt/gluster/ glusterfs defaults,_netdev 0 0

Настройка DNS

На контроллере домена нужно для IP адреса(ов) из /etc/ctdb/public_addresses создать хотя бы прямые и опционально обратные записи.

[dc.cluster.alt] # samba-tool dns add 127.0.0.1 cluster.alt mycluster A 192.168.160.180 -UAdministrator
[dc.cluster.alt] # samba-tool dns add 127.0.0.1 160.168.192.in-addr.arpa 180 PTR mycluster.cluster.alt -UAdministrator

Настройка ctdb

Для начала выключим все, что могло быть включено ранее

# for i in 00.ctdb 10.interface 49.winbind 50.samba; do ctdb event script disable legacy $i; done
# systemctl disable --now smb nmb winbind
  • включить включить все кроме winbind
# for i in 00.ctdb 10.interface 50.samba; do ctdb event script enable legacy $i; done
# systemctl start ctdb

Настройка samba

Убедится, что в /etc/samba/smb.conf указан самый минимум

[global]
clustering = yes
include = registry

Затем на одной ноде создать текстовый файл /etc/samba/domain_smb.conf с содержимым

[global]
        security = ADS
        netbios name = MYCLUSTER
        workgroup = CLUSTER
        realm = CLUSTER.ALT
        template shell = /bin/bash
        kerberos method = dedicated keytab
        dedicated keytab file = /etc/krb5.keytab
        wins support = no
        template homedir = /home/CLUSTER.ALT/%U
        winbind enum users = no
        winbind use default domain = Yes
        winbind refresh tickets = yes
        winbind offline logon = yes
        machine password timeout = 0
        idmap config *:range = 10000-19999
        idmap config CLUSTER:range = 1000000-1999999
        idmap config CLUSTER:backend = rid

[share]
        path = /mnt/gluster/share
        browseable = yes
        read only = no
        valid users = @cluster-users

и импортировать его (на одной(этой же) ноде)

# net conf import /etc/samba/domain_smb.conf

После чего, на других нодах net conf list будет показывать тот же самый конфиг.

Настройка nsswitch.conf

После того, как мы подготовили конфигурационный файл, нужно настроить /etc/nssswich.conf

В /etc/nsswitch.conf изменить три опции вписав туда winbind

passwd:     files systemd winbind
shadow:     tcb files winbind
group:      files [SUCCESS=merge] winbind role

Настройка Kerberos

Файл /etc/krb5.conf привести к виду (указать default_realm, dns_lookup_kdc, dns_lookup_realm )

...
[libdefaults]
default_realm = CLUSTER.ALT
dns_lookup_kdc = true
dns_lookup_realm = false
...

Ввод в домен

Внимание: Важно: Использовать system-auth не стоит - он не расчитан на ввод кластерных конфигураций.


Внимание: Важно: Убедитесь, что /etc/resolv.conf указывает на КД


Внимание: Важно: В данной статье я не настраиваю PAM, он мне не нужен. Если вам нужен, сделайте это самостоятельно.


Внимание: Важно: Имя кластера (netbios name) и имя группы (workgroup) не должны быть одинаковыми т.е. cluster.cluster.alt использовать не получится, только отличные имена т.е. mycluster.cluster.alt

Вводим в домен

# net ads join -U Administrator

Результат должен быть таким

Using short domain name -- CLUSTER
Joined 'MYCLUSTER' to dns domain 'cluster.alt'
Not doing automatic DNS update in a clustered setup.

Создаем на одной ноде /etc/krb5.keytab

# net ads keytab create

и копируем его на другие ноды в /etc/krb5.keytab, не забывая указать верные права и владельца

# chmod 0640 /etc/krb5.keytab
# chown root:_keytab /etc/krb5.keytab

Завершение конфигурации

После всех проделанных настроек выполняем

# systemctl stop ctdb
# for i in 00.ctdb 10.interface 49.winbind 50.samba; do ctdb event script enable legacy $i; done
# systemctl enable --now ctdb

На ноде с включенным публичным адресом для связи с доменом работает winbind

# wbinfo -u
krbtgt
domainuser1
administrator
guest

# wbinfo -i Administrator
administrator:*:1000500:1000513::/home/CLUSTER.ALT/administrator:/bin/bash

Инструменты диагностики и управления ctdb

Одноименная утилита ctdb служит как для диагностики, так и работы с кластером (перенос ip, вывод режимов работы и т.д)
# ctdb status
Number of nodes:2
pnn:0 192.168.160.151  OK
pnn:1 192.168.160.152  OK (THIS NODE)
Generation:698254053
Size:2
hash:0 lmaster:0
hash:1 lmaster:1
Recovery mode:NORMAL (0)
Leader:0

Вариации

Как и все в мире Linux, это решение не является замоноличенным "в бронзе". Возможны вольные вариации, как в количестве нод, так и в используемых средствах. Вместо glusterfs вполне можно использовать ceph, DRBD_OCFS2 или что-то еще.

Может быть полезно

Если нужно скрыть шары, или файлы недоступные пользователю в связи отсутсвием прав, можно воспользоваться следующими параметрами (для smb.conf)

access based share enum = yes # скрывает шары (т.е. верхний уровнь)

hide unreadable = yes # скрывает файлы\папки внутри шары

Дополнительные ссылки