В статье рассматривается пример установки SeaweedFS в качестве объектного хранилища S3 для программного комплекса ELMA365.
Перед установкой ознакомьтесь с информацией:
Топология и репликация в SeaweedFS
Рекомендуемой топологией SeaweedFS для ELMA365 является распределённая (distributed) конфигурация. С помощью настроек репликации вы можете определить, сколько копий ваших данных будут храниться и где именно.
Для этого при конфигурации серверов кластера используйте параметр репликации, задавая его в формате XYZ. Где:
- X — количество дополнительных копий в разных дата‑центрах (DC);
- Y — количество дополнительных копий в разных стойках (rack);
- Z — количество дополнительных копий в одной стойке.
Общее количество копий = одна основная + сумма всех цифр, указанных в параметре репликации. С примерами этого параметра можно ознакомиться в таблице.
Параметр
|
Всего копий
|
Где хранится
|
000
|
1
|
Одна основная копия (volume) без репликации
|
001
|
2
|
Две копии в одной стойке
|
010
|
2
|
Две копии в разных стойках одного дата-центра
|
020
|
3
|
Три копии в разных стойках одного дата-центра
|
100
|
2
|
Две копии в разных дата-центрах
|
Рассмотрим подробнее несколько примеров параметра репликации:
- replication=001:
- всего — две копии (основная + 1);
- хранятся в одной стойке;
- если у вас три виртуальные машины, такая репликация не гарантирует, что каждая виртуальная машина получит свою копию.
- replication=002:
- всего — три копии (основная + 2);
- хранятся в одной стойке;
- при наличии трёх виртуальных машин на каждой будет одна копия.
- replication=020:
- всего — три копии (основная + 2);
- хранятся в трёх разных стойках (rack1, rack2, rack3);
- при наличии трёх виртуальных машин на каждой из них есть одна копия;
- ограничение: при выходе из строя одной из трёх стоек кластер прекращает работу.
Подробнее о репликации читайте в официальной документации SeaweedFS.
Установка SeaweedFS
Состоит из нескольких этапов:
- Подготовка серверов.
- Установка Docker и Docker Compose.
- Установка SeaweedFS.
- Настройка включения TLS/SSL в SeaweedFS.
- Установка MC Client.
- Запуск сервиса SeaweedFS.
- Настройка подключения к SeaweedFS.
- Создание бакетов.
- Конфигурация HAproxy.
- Подключение к SeaweedFS.
Шаг 1. Подготовка серверов
Создайте три сервера (ноды) с последовательно пронумерованными именами хостов, например:
- seaweedfs-server1.your_domain;
- seaweedfs-server2.your_domain;
- seaweedfs-server3.your_domain.
Шаг 2. Установка Docker и Docker Compose
На созданных серверах установите:
- Docker — согласно инструкциям для вашей операционной системы на официальном сайте;
- Docker Compose — согласно инструкциям для вашей операционной системы на официальном сайте.
Шаг 3. Установка SeaweedFS
- Создайте каталог для монтирования диска на всех серверах:
mkdir -p /opt/seaweedfs/data/{master,volume,filer}
- Создайте файл /opt/seaweedfs/s3.json на всех серверах:
{
"identities": [
{
"name": "admin",
"credentials": [
{
"accessKey": "elma365user",
"secretKey": "SecretPassword"
}
],
"actions": ["Admin", "Read", "Write"]
}
]
}
- По умолчанию в SeaweedFS используется база данных LevelDB. Она поддерживает несколько реплик файлового сервера, которые будут автоматически синхронизироваться с некоторыми ограничениями. Подробнее читайте в официальной документации SeaweedFS.
При наличии ограничений или при большом количестве реплик файлового сервера рекомендуем использовать внешнее хранилище данных, например PostgreSQL или MySQL.
Рассмотрим, как настроить такое внешнее хранилище в PostgreSQL. Создайте базу данных в PostgreSQL и свяжите конфигурацию с компонентом filer: /opt/seaweedfs/filer.toml. Пример:
#/etc/seaweedfs/filer.toml
[leveldb2]
enabled = false
[postgres2]
enabled = true
createTable = """
CREATE TABLE IF NOT EXISTS "%s" (
dirhash BIGINT,
name VARCHAR(65535),
directory VARCHAR(65535),
meta bytea,
PRIMARY KEY (dirhash, name)
)
"""
hostname = "hostname"
port = 5432
username = "username"
password = "password"
database = "database"
scheme = "scheme"
sslmode = "disable"
- Создайте файл docker-compose.yml на всех серверах.
Пример конфигураций для первого сервера
version: "3.9"
services:
master:
image: chrislusf/seaweedfs:4.06
command: >
master
-garbageThreshold=0.3
-volumeSizeLimitMB=1024
-ip=192.168.1.101
-defaultReplication=010
-peers=192.168.1.101:9333,192.168.1.102:9333,192.168.1.103:9333
-ip.bind=0.0.0.0
ports:
- "9333:9333"
- "19333:19333"
volumes:
- /opt/seaweedfs/data/master:/data
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9333/cluster/status"
interval: 30s
timeout: 10s
retries: 3
volume:
image: chrislusf/seaweedfs:4.06
command: >
volume
-fileSizeLimitMB=1024
-mserver=192.168.1.101:9333,192.168.1.102:9333,192.168.1.103:9333
-ip=192.168.1.101
-ip.bind=0.0.0.0
-dir=/data
-dataCenter=dc1
-rack=rack1
ports:
- "8080:8080"
- "18080:18080"
depends_on:
- master
volumes:
- /opt/seaweedfs/data/volume:/data
restart: unless-stopped
filer:
image: chrislusf/seaweedfs:4.06
command: >
filer
-defaultReplicaPlacement=010
-master=192.168.1.101:9333,192.168.1.102:9333,192.168.1.103:9333
-ip=192.168.1.101
-ip.bind=0.0.0.0
-s3
-s3.config=/etc/seaweedfs/s3.json
-s3.port=8333
ports:
- "8888:8888"
- "8333:8333"
- "18888:18888"
depends_on:
- master
- volume
volumes:
- /opt/seaweedfs/data/filer:/data
- /opt/seaweedfs/s3.json:/etc/seaweedfs/s3.json:ro
- /opt/seaweedfs/filer.toml:/etc/seaweedfs/filer.toml:ro
restart: unless-stopped
worker:
image: chrislusf/seaweedfs:4.06
command: >
worker
-admin=192.168.1.101:9333,192.168.1.102:9333,192.168.1.103:9333
depends_on:
- master
|
Пример конфигураций для второго сервера
version: "3.9"
services:
master:
image: chrislusf/seaweedfs:4.06
command: >
master
-garbageThreshold=0.3
-volumeSizeLimitMB=1024
-ip=192.168.1.102
-defaultReplication=010
-peers=192.168.1.101:9333,192.168.1.102:9333,192.168.1.103:9333
-ip.bind=0.0.0.0
ports:
- "9333:9333"
- "19333:19333"
volumes:
- /opt/seaweedfs/data/master:/data
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9333/cluster/status"
interval: 30s
timeout: 10s
retries: 3
volume:
image: chrislusf/seaweedfs:4.06
command: >
volume
-fileSizeLimitMB=1024
-mserver=192.168.1.101:9333,192.168.1.102:9333,192.168.1.103:9333
-ip=192.168.1.102
-ip.bind=0.0.0.0
-dir=/data
-dataCenter=dc1
-rack=rack2
ports:
- "8080:8080"
- "18080:18080"
depends_on:
- master
volumes:
- /opt/seaweedfs/data/volume:/data
restart: unless-stopped
filer:
image: chrislusf/seaweedfs:4.06
command: >
filer
-defaultReplicaPlacement=010
-master=192.168.1.101:9333,192.168.1.102:9333,192.168.1.103:9333
-ip=192.168.1.102
-ip.bind=0.0.0.0
-s3
-s3.config=/etc/seaweedfs/s3.json
-s3.port=8333
ports:
- "8888:8888"
- "8333:8333"
- "18888:18888"
depends_on:
- master
- volume
volumes:
- /opt/seaweedfs/data/filer:/data
- /opt/seaweedfs/s3.json:/etc/seaweedfs/s3.json:ro
- /opt/seaweedfs/filer.toml:/etc/seaweedfs/filer.toml:ro
restart: unless-stopped
worker:
image: chrislusf/seaweedfs:4.06
command: >
worker
-admin=192.168.1.101:9333,192.168.1.102:9333,192.168.1.103:9333
depends_on:
- master
|
Пример конфигураций для третьего сервера
version: "3.9"
services:
master:
image: chrislusf/seaweedfs:4.06
command: >
master
-garbageThreshold=0.3
-volumeSizeLimitMB=1024
-ip=192.168.1.103
-defaultReplication=010
-peers=192.168.1.101:9333,192.168.1.102:9333,192.168.1.103:9333
-ip.bind=0.0.0.0
ports:
- "9333:9333"
- "19333:19333"
volumes:
- /opt/seaweedfs/data/master:/data
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9333/cluster/status"
interval: 30s
timeout: 10s
retries: 3
volume:
image: chrislusf/seaweedfs:4.06
command: >
volume
-fileSizeLimitMB=1024
-mserver=192.168.1.101:9333,192.168.1.102:9333,192.168.1.103:9333
-ip=192.168.1.103
-ip.bind=0.0.0.0
-dir=/data
-dataCenter=dc1
-rack=rack3
ports:
- "8080:8080"
- "18080:18080"
depends_on:
- master
volumes:
- /opt/seaweedfs/data/volume:/data
restart: unless-stopped
filer:
image: chrislusf/seaweedfs:4.06
command: >
filer
-defaultReplicaPlacement=010
-master=192.168.1.101:9333,192.168.1.102:9333,192.168.1.103:9333
-ip=192.168.1.103
-ip.bind=0.0.0.0
-s3
-s3.config=/etc/seaweedfs/s3.json
-s3.port=8333
ports:
- "8888:8888"
- "8333:8333"
- "18888:18888"
depends_on:
- master
- volume
volumes:
- /opt/seaweedfs/data/filer:/data
- /opt/seaweedfs/s3.json:/etc/seaweedfs/s3.json:ro
- /opt/seaweedfs/filer.toml:/etc/seaweedfs/filer.toml:ro
restart: unless-stopped
worker:
image: chrislusf/seaweedfs:4.06
command: >
worker
-admin=192.168.1.101:9333,192.168.1.102:9333,192.168.1.103:9333
depends_on:
- master
|
Шаг 4. Настройка включения TLS/SSL в SeaweedFS
Для включения поддержки TLS/SSL в SeaweedFS на каждом сервере:
- Сохраните файл сертификата и файл закрытого ключа в каталоге /opt/seaweedfs/ssl.
- Переименуйте файл сертификата сервера в cert.pem.
- Переименуйте файл закрытого ключа в key.pem.
- При использовании самоподписанных сертификатов сохраните файл корневого CA в каталоге /opt/seaweedfs/certs.
- Подготовьте файл настроек безопасности security.toml:
[jwt.signing]
key = "MASTERVOLUMESECRET"
[jwt.filer_signing]
key = "FILERSECRET"
[grpc]
ca = "/etc/seaweedfs/certs/ca.pem"
[grpc.master]
cert = "/etc/seaweedfs/certs/cert.pem"
key = "/etc/seaweedfs/certs/key.pem"
[grpc.volume]
cert = "/etc/seaweedfs/certs/cert.pem"
key = "/etc/seaweedfs/certs/key.pem"
[grpc.filer]
cert = "/etc/seaweedfs/certs/cert.pem"
key = "/etc/seaweedfs/certs/key.pem"
[grpc.client]
cert = "/etc/seaweedfs/certs/cert.pem"
key = "/etc/seaweedfs/certs/key.pem"
[https.client]
enabled = true
ca = "/etc/seaweedfs/certs/ca.pem"
cert = "/etc/seaweedfs/certs/cert.pem"
key = "/etc/seaweedfs/certs/key.pem"
[https.volume]
cert = "/etc/seaweedfs/certs/cert.pem"
key = "/etc/seaweedfs/certs/key.pem"
ca = "/etc/seaweedfs/certs/ca.pem"
[https.master]
cert = "/etc/seaweedfs/certs/cert.pem"
key = "/etc/seaweedfs/certs/key.pem"
ca = "/etc/seaweedfs/certs/ca.pem"
[https.filer]
cert = "/etc/seaweedfs/certs/cert.pem"
key = "/etc/seaweedfs/certs/key.pem"
ca = "/etc/seaweedfs/certs/ca.pem"
Пример конфигураций для первого сервера c TLS
version: "3.9"
services:
master:
image: chrislusf/seaweedfs:4.06
command: >
master
-garbageThreshold=0.3
-volumeSizeLimitMB=1024
-ip=192.168.1.101
-defaultReplication=010
-peers=192.168.1.101:9333,192.168.1.102:9333,192.168.1.103:9333
-ip.bind=0.0.0.0
ports:
- "9333:9333"
- "19333:19333"
volumes:
- /opt/seaweedfs/data/master:/data
- /opt/seaweedfs/certs:/etc/seaweedfs/certs:ro
- /opt/seaweedfs/security.toml:/etc/seaweedfs/security.toml:ro
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9333/cluster/status"
interval: 30s
timeout: 10s
retries: 3
volume:
image: chrislusf/seaweedfs:4.06
command: >
volume
-fileSizeLimitMB=1024
-mserver=192.168.1.101:9333,192.168.1.102:9333,192.168.1.103:9333
-ip=192.168.1.101
-ip.bind=0.0.0.0
-dir=/data
ports:
- "8080:8080"
- "18080:18080"
depends_on:
- master
volumes:
- /opt/seaweedfs/data/volume:/data
- /opt/seaweedfs/certs:/etc/seaweedfs/certs:ro
- /opt/seaweedfs/security.toml:/etc/seaweedfs/security.toml:ro
restart: unless-stopped
filer:
image: chrislusf/seaweedfs:4.06
command: >
filer
-defaultReplicaPlacement=010
-master=192.168.1.101:9333,192.168.1.102:9333,192.168.1.103:9333
-ip=192.168.1.101
-ip.bind=0.0.0.0
-s3
-s3.config=/etc/seaweedfs/s3.json
-s3.port.https=8334
-s3.cacert.file=/etc/seaweedfs/certs/ca.pem
-s3.cert.file=/etc/seaweedfs/certs/cert.pem
-s3.key.file=/etc/seaweedfs/certs/key.pem
ports:
- "8888:8888"
- "8334:8334"
- "18888:18888"
depends_on:
- master
- volume
volumes:
- /opt/seaweedfs/data/filer:/data
- /opt/seaweedfs/s3.json:/etc/seaweedfs/s3.json:ro
- /opt/seaweedfs/certs:/etc/seaweedfs/certs:ro
- /opt/seaweedfs/security.toml:/etc/seaweedfs/security.toml:ro
- /opt/seaweedfs/filer.toml:/etc/seaweedfs/filer.toml:ro
restart: unless-stopped
worker:
image: chrislusf/seaweedfs:4.06
command: >
worker
-admin=192.168.1.101:9333,192.168.1.102:9333,192.168.1.103:9333
depends_on:
- master
volumes:
- /opt/seaweedfs/certs:/etc/seaweedfs/certs:ro
- /opt/seaweedfs/security.toml:/etc/seaweedfs/security.toml:ro
|
Пример конфигураций для второго сервера c TLS
version: "3.9"
services:
master:
image: chrislusf/seaweedfs:4.06
command: >
master
-garbageThreshold=0.3
-volumeSizeLimitMB=1024
-ip=192.168.1.102
-defaultReplication=010
-peers=192.168.1.101:9333,192.168.1.102:9333,192.168.1.103:9333
-ip.bind=0.0.0.0
ports:
- "9333:9333"
- "19333:19333"
volumes:
- /opt/seaweedfs/data/master:/data
- /opt/seaweedfs/certs:/etc/seaweedfs/certs:ro
- /opt/seaweedfs/security.toml:/etc/seaweedfs/security.toml:ro
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9333/cluster/status"
interval: 30s
timeout: 10s
retries: 3
volume:
image: chrislusf/seaweedfs:4.06
command: >
volume
-fileSizeLimitMB=1024
-mserver=192.168.1.101:9333,192.168.1.102:9333,192.168.1.103:9333
-ip=192.168.1.102
-ip.bind=0.0.0.0
-dir=/data
ports:
- "8080:8080"
- "18080:18080"
depends_on:
- master
volumes:
- /opt/seaweedfs/data/volume:/data
- /opt/seaweedfs/certs:/etc/seaweedfs/certs:ro
- /opt/seaweedfs/security.toml:/etc/seaweedfs/security.toml:ro
restart: unless-stopped
filer:
image: chrislusf/seaweedfs:4.06
command: >
filer
-defaultReplicaPlacement=010
-master=192.168.1.101:9333,192.168.1.102:9333,192.168.1.103:9333
-ip=192.168.1.102
-ip.bind=0.0.0.0
-s3
-s3.config=/etc/seaweedfs/s3.json
-s3.port.https=8334
-s3.cacert.file=/etc/seaweedfs/certs/ca.pem
-s3.cert.file=/etc/seaweedfs/certs/cert.pem
-s3.key.file=/etc/seaweedfs/certs/key.pem
ports:
- "8888:8888"
- "8334:8334"
- "18888:18888"
depends_on:
- master
- volume
volumes:
- /opt/seaweedfs/data/filer:/data
- /opt/seaweedfs/s3.json:/etc/seaweedfs/s3.json:ro
- /opt/seaweedfs/certs:/etc/seaweedfs/certs:ro
- /opt/seaweedfs/security.toml:/etc/seaweedfs/security.toml:ro
- /opt/seaweedfs/filer.toml:/etc/seaweedfs/filer.toml:ro
restart: unless-stopped
|
Пример конфигураций для третьего сервера c TLS
version: "3.9"
services:
master:
image: chrislusf/seaweedfs:4.06
command: >
master
-garbageThreshold=0.3
-volumeSizeLimitMB=1024
-ip=192.168.1.103
-defaultReplication=010
-peers=192.168.1.101:9333,192.168.1.102:9333,192.168.1.103:9333
-ip.bind=0.0.0.0
ports:
- "9333:9333"
- "19333:19333"
volumes:
- /opt/seaweedfs/data/master:/data
- /opt/seaweedfs/certs:/etc/seaweedfs/certs:ro
- /opt/seaweedfs/security.toml:/etc/seaweedfs/security.toml:ro
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9333/cluster/status"
interval: 30s
timeout: 10s
retries: 3
volume:
image: chrislusf/seaweedfs:4.06
command: >
volume
-fileSizeLimitMB=1024
-mserver=192.168.1.101:9333,192.168.1.102:9333,192.168.1.103:9333
-ip=192.168.1.103
-ip.bind=0.0.0.0
-dir=/data
ports:
- "8080:8080"
- "18080:18080"
depends_on:
- master
volumes:
- /opt/seaweedfs/data/volume:/data
- /opt/seaweedfs/certs:/etc/seaweedfs/certs:ro
- /opt/seaweedfs/security.toml:/etc/seaweedfs/security.toml:ro
restart: unless-stopped
filer:
image: chrislusf/seaweedfs:4.06
command: >
filer
-defaultReplicaPlacement=010
-master=192.168.1.101:9333,192.168.1.102:9333,192.168.1.103:9333
-ip=192.168.1.103
-ip.bind=0.0.0.0
-s3
-s3.config=/etc/seaweedfs/s3.json
-s3.port.https=8334
-s3.cacert.file=/etc/seaweedfs/certs/ca.pem
-s3.cert.file=/etc/seaweedfs/certs/cert.pem
-s3.key.file=/etc/seaweedfs/certs/key.pem
ports:
- "8888:8888"
- "8334:8334"
- "18888:18888"
depends_on:
- master
- volume
volumes:
- /opt/seaweedfs/data/filer:/data
- /opt/seaweedfs/s3.json:/etc/seaweedfs/s3.json:ro
- /opt/seaweedfs/certs:/etc/seaweedfs/certs:ro
- /opt/seaweedfs/security.toml:/etc/seaweedfs/security.toml:ro
- /opt/seaweedfs/filer.toml:/etc/seaweedfs/filer.toml:ro
restart: unless-stopped
|
Шаг 5. Установка MC Client
Загрузите последний стабильный binary файл SeaweedFS Client и установите его в систему:
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mс
sudo mv mc /usr/local/bin/
Шаг 6. Запуск сервиса SeaweedFS
Запустите манифест:
docker-compose -f docker-compose.yml up -d
Шаг 7. Настройка подключения к SeaweedFS
Создайте алиас для SeaweedFS:
/usr/local/bin/mc alias set seaweedfs http://seaweedfs.your_domain:8333 elma365user SecretPassword
Шаг 8. Создание бакетов
Важно: наименование бакетов в S3 должно соответствовать формату s3elma365*. Для примера в статье используется имя бакета s3elma365, пользователь elma365user и пароль SecretPassword. При настройке задайте эти данные согласно политике безопасности, принятой в вашей организации.
Примеры наименований для бакетов: s3elma365; s3elma365-dev; s3elma365-prod.
Для работы ELMA365 создайте бакет c наименованием s3elma365, используя команду:
/usr/local/bin/mc mb -p seaweedfs/s3elma365 --region=ru-central-1
Создание в S3 бакетов для работы ELMA Bot
Если вы планируете использовать ELMA Bot, создайте бакеты:
- s3elmabot;
- elmabot-temporary-files;
- elmabot-static-files.
Для создания бакетов выполните следующие команды:
/usr/local/bin/mc mb -p SeaweedFS/s3elmabot --region=ru-central-1
/usr/local/bin/mc mb -p SeaweedFS/elmabot-temporary-files --region=ru-central-1
/usr/local/bin/mc mb -p SeaweedFS/elmabot-static-files --region=ru-central-1
|
Шаг 9. Конфигурация HAproxy
В рамках статьи пользовательский трафик приходит в HAproxy по подключению seaweedfs.your_domain:8333 и равномерно балансируется между серверами кластера SeaweedFS. Для этого выполните настройки согласно статье «Конфигурация HAProxy для S3».
Шаг 10. Подключение к SeaweedFS
Параметры для подключения к SeaweedFS:
- address — seaweedfs.your_domain:8333;
- bucket — s3elma365;
- region — ru-central-1;
- access key ID — elma365user;
- secret access key — SecretPassword;
- upload method — PUT;
- enable SSL — No.
Если SeaweedFS ожидает подключения с использованием TLS/SSL, укажите:
- в параметре enable SSL — значение Yes;
- в параметр address — порт подключения seaweedfs.your_domain:8334.