Облачное хранилище с помощью SeaWeedFS

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

Для кластера нам понадобится 9 хостов (это самый начальный кластер). Хост не обязательно отдельная тачка, это может быть LXD контейнер на железке, но как минимум должно быть 3 разных железки, иначе смысл кластера пропадает. НО! Все действия из статьи будут выполняться на одной тачке, поднимем по одной копии каждого сервиса заместо трех, дальше по аналогии уже поднимете сколько вам нужно.

Ссылки

Офф. репозиторий — https://github.com/chrislusf/seaweedfs/

Офф. документация (есть ссылка из репы) — https://github.com/chrislusf/seaweedfs/wiki

Как оно работает?

Все как обычно:

  • у нас есть master — отвечает за подключение всего ко всему, т.е все кластеризируется с помощью мастеров, все диски и другие плюшки подключаются и работают так же через мастеровМастеров в кластере может быть только нечетное количество (т.е. два или четыре мастера не можем завести в кластер, сам сиавидфс этого не даст сделать)
  • дальше главным компонентов является сам сторадж — volume. Все волюмы подключаются к мастерам. Волюмы можно делить / объединять с помощью датацентров / реков. При создании волюма указывается папка на жестком диске, куда складываются сжатые файлы (не в чистом виде)
  • поверх всего можно поставить filer — через который проще всего управлять файлами в кластере SeaWeedFSFiler кластеризуется с помощью, например, баз данных — mysql / redis / postresql / cassandra / etcd и др.

У каждого компонента есть API, через которое можно просматривать ту или иную информацию о кластере / данных. Вся подробная информация о загруженных файлах хранится в API Filer’a.

Как настроить?

Настройка не сложная, все бинарники запускаются с параметрами. Главными параметрами является указание папки на жестком диске и перечень мастеров. Ниже приведены настройки для master / volume / filer.

/etc/systemd/system/swfs-master.service

[Unit]
Description=weed master server of cluster
 
[Service]
EnvironmentFile=/etc/environment
ExecStart=/usr/bin/weed master -mdir="/opt/seaweedfs" -ip="IP_ADDRESS" -port=9333 -peers=IP_ADDRESS:PORT (через запятую перечень всех мастеров)
Restart=always
RestartSec=5s
 
[Install]
WantedBy=multi-user.target

/etc/systemd/systemc/swfs-volume.service

[Unit]
Description=weed volume server of cluster
 
[Service]
EnvironmentFile=/etc/environment
ExecStart=/usr/bin/weed volume -dir=/opt/seaweedfs -mserver=MASTER_IP_ADDRESS_OR_DNS:PORT -dataCenter="stage" -rack="rack2" -port=8080 -max=100 -ip="LOCAL_IP_ADDRESS"
Restart=always
RestartSec=5s
 
[Install]
WantedBy=multi-user.target

/etc/systemd/system/swfs-filer.service

[Unit]
Description=weed filer server of cluster
 
[Service]
EnvironmentFile=/etc/environment
ExecStart=/usr/bin/weed filer -dataCenter="stage" -ip="LOCAL_IP_ADDRESS" -master=MASTER_IP_ADDRESS_OR_DNS:PORT -defaultReplicaPlacement=010
Restart=always
RestartSec=5s
 
[Install]
WantedBy=multi-user.target

Как уже писал выше — вся работа всех компонентов осуществляется через master. Следовательно главным параметров является указание перечня мастеров(указываются через запятую). Указывается ИП_АДРЕС:ПОРТ мастера.

Репликация

Глядя на таблички ниже можно понять, что репликация очень гибкая, можно настроить как угодно между ДЦ / Рек, а совсем для параноиков можно сделать по несколько копий файлов в одном ДЦ / Рек.

ValueMeaning
ValueMeaning
000no replication, just one copy
001replicate once on the same rack
010replicate once on a different rack in the same data center
100replicate once on a different data center
200replicate twice on two other different data center
110replicate once on a different rack, and once on a different data center

So if the replication type is xyz

ColumnMeaning
xnumber of replica in other data centers
ynumber of replica in other racks in the same data center
znumber of replica in other servers in the same rack

x,y,z each can be 0, 1, or 2. So there are 9 possible replication types, and can be easily extended. Each replication type will physically create x+y+z+1 copies of volume data files.

Кластеризация Filer

Filer содержит метаданные о расположении файлов на волюмах. Через Filer’s API можно заливать / забирать файлы, смотреть всю информацию по файлам и всю файловую структуру, которая находится на volume. Следовательно если мы имеем один filer, то при выходе из строя диска, где стоял этот filer, мы сталкиваемся с проблемой потери всех метаданных. Т.е файлы на volume остались, а обратиться через filer мы не можем, т.к в новом filer не будет данных. Чтобы избежать данной проблемы, к filer подключается одна из баз данных (mysql / redis / postresql / cassandra / etcd и др), в которую filer  записывает метаданные по файлам. Настраивается все очень легко: нужно поднять базу данных (а точнее лучше сразу кластер, чтобы было прям совсем наверняка и не потерять данные) и внести пару строк в файл конфигурации.

Файл конфигурации для filer — /etc/seaweedfs/filer.toml

[etcd]
 
enabled = true
servers = "localhost:2379"
timeout = "3s"

Я поднял кластер хранилища Etcd, которое подключил к Filer. После чего просто перезапускаем filer и радуемся

systemctl restart swfs-filer

Каждая нода Etcd находится на тачке с Filer. Настройку кластера Etcd можно найти в интернете или ждите статьи =)

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Отправить ответ

avatar
  Subscribe  
Уведомить