Во многих случаях продуктивность разработчика действительно зависит от того, насколько быстро и эффективно приложение может получить доступ к предварительному набору данных. Что, если набор данных находится в ТБ и миллионах записей? Что, если данные меняются плавно? А что, если сеть отключилась, вы в самолете или вам просто нужно работать в автономном режиме?

Откройте для себя геопрозрачность уровня данных EdgeFS!

Что такое EdgeFS? Это новый поставщик хранилища, добавленный к проекту CNCF Rook, и вы можете прочитать о нем подробнее на странице https://rook.io/docs/rook/master/edgefs-storage.html. Несмотря на то, что это горизонтально масштабируемый кластер хранения, он все еще может работать в так называемом одиночном режиме, одноузловом контейнере Docker с возможностью масштабирования развертывания по мере его роста путем простого подключения большего количества узлов и / или географически. распределенные сегменты кластера к нему.

Сильной стороной EdgeFS является его способность виртуализировать базовую инфраструктуру как масштабируемую, высокодоступную и географически распределенную систему хранения. Он работает аналогично «git», где все модификации являются глобально неизменяемыми, полностью версионными, самопроверяемыми, распределенными и, следовательно, отказоустойчивыми. В результате он обеспечивает кросс-облачный и географически прозрачный высокопроизводительный распределенный доступ к часто используемым протоколам хранения для объектных, файловых, блочных и NoSQL баз данных.

При настройке на Mac он может использовать локальный каталог и представлять его как удаленную точку доступа к гораздо большему набору данных. Благодаря плавающим снимкам и выборке данных по запросу с помощью локального кеша E-LRU вы сможете создать довольно классную минилабораторию локально на своем ноутбуке, что значительно сократит количество операций ввода-вывода в сети. В некоторых из моих экспериментов я добился 50-кратной экономии на выборке данных. Это связано с глобальной дедупликацией данных, сжатием при передаче и неизменяемостью в нескольких случаях использования: файл, блок, объект (S3, S3X или SWIFT) и NoSQL.

Давай настроим!

Примером использования будет настройка удаленного доступа к набору данных, доступному через интерфейсы, предоставляемые EdgeFS, в автономном режиме. Для простоты я сосредоточусь на создании локальной службы S3 с двунаправленным каналом ISGW (межсегментный шлюз) и локальной прозрачной службой NFS.

Я буду использовать Docker Desktop для Mac, но помните об этой ошибке:



Похоже, что в «краевой» версии это исправлено. Обязательно переходите на «краевую» версию!

Тем не менее, имейте в виду, что при большой нагрузке процесс vpnkit-forwarder все еще может умереть из-за нехватки памяти, и поэтому я рекомендую вам увеличить объем памяти виртуальной машины до 4 ГБ.

Создайте каталог / edgefs и загрузите YAML-файл docker-compose по этой сути: docker-compose-embedded.yml, переименуйте его в docker-compose.yml. Создайте структуру каталогов, которая выглядит как показано ниже, и каталоги, доступные через настройки рабочего стола Docker:

Создайте каталог, в котором будут храниться локальные данные EdgeFS:

mkdir /edgefs/data/store1

И запустите инструмент настройки:

cd /edgefs
docker-compose run --rm -e CCOW_LOG_STDOUT=1 target \
    config node -n localhost -i eth0 -D /data/store1 -r 1
    -o '{"MaxSizeGB":10,"RtPlevelOverride":1,"DisableVerifyChid":true,"Sync":2}'

Приведенная выше команда будет делать следующее:

  • сопоставить каталог local / data / store1 с целевым контейнером EdgeFS (-D);
  • разрешить использование до 10 ГБ дискового пространства (MaxSizeGB)
  • ограничить разделение каталога до 1 (каждый дополнительный раздел выделяет дополнительную память, поэтому важно сохранить ее минимум) (RtPlevelOverride);
  • отключить дополнительную сетевую проверку блока данных перед его записью в стабильное хранилище, чтобы сэкономить несколько циклов процессора (DisableVerifyChid);
  • поскольку у нас настроен только 1 раздел, мы устанавливаем репликацию локального сайта по умолчанию на 1 (-r);
  • включить синхронизацию журнала для обеспечения согласованности в случае сбоя linuxkit (Sync).

Если вы хотите изменить предложенную конфигурацию, передайте флаг «- help».

Теперь, когда вы довольны конфигурацией, загрузите ее:

# docker-compose up -d
Creating edgefs_target_1
Creating edgefs_mgmt_1
Creating edgefs_s301_1
Creating edgefs_ui_1
Creating edgefs_nfs01_1
Creating edgefs_isgw01_1
# docker-compose logs -f

Инициализировать сегмент кластера myspace

И после того, как статус будет онлайн, инициализируйте кластер и создайте системные объекты:

### initialize local cluster segment
efscli system init
### initialize myspace/work/shared1
efscli cluster create myspace
efscli tenant create myspace/work
efscli bucket create myspace/work/shared1 -s 4M -t 1

EdgeFS использует глобально уникальный системный путь в формате NAMESPACE / TENANT / BUCKET / OBJECT. Выше мы создали корзину myspace / work / shared с размером блока по умолчанию, равным 4 МБ, и включенной прозрачностью объекта NFS / S3.

Мы также можем подключиться к графическому интерфейсу и создавать / отслеживать / управлять службами через приятный интерфейс, указав в веб-браузере адрес http: // IPADDR: 3000, пользователь по умолчанию admin, а пароль по умолчанию - edgefs.

Теперь, когда сегмент пространства имен кластера, клиент и сегменты созданы, мы можем настроить определения сервисов S3 и ISGW:

### NFS service with myspace/work/shared1 export
efscli service create nfs nfs01
efscli service config nfs01 X-MH-ImmDir 1
efscli service serve nfs01 myspace/work/shared1
### S3 service servicing myspace/work tenant
efscli service create s3 s301
efscli service serve s301 myspace/work
### ISGW endpont link
efscli service create isgw isgw01
efscli service serve isgw01 myspace/work/shared1
efscli service config isgw01 X-ISGW-Remote ccow://REMOTE_IP:14000
efscli service config isgw01 X-Status enabled

Чтобы настроить двунаправленную ссылку ISGW, вам необходимо знать REMOTE_IP. Нет ограничений на количество настраиваемых ссылок, это полная сетка, поэтому ваша локальная настройка может синхронизировать географически распределенные установки EdgeFS.

На этом этапе сценарий создания докеров внесет изменения при следующем перезапуске политики, и службы должны быть доступны. Если по какой-то причине он не работает, ускорьте перезапуск службы с помощью следующей команды:

docker-compose logs -f nfs01         # monitor nfs service logs
docker-compose logs -f s301          # monitor s3 service logs
docker-compose logs -f isgw01        # monitor isgw01 service logs
docker-compose restart nfs01
docker-compose restart s301
docker-compose restart isgw01

Проверка

Начнем с проверки конечной точки S3. Самый простой, конечно же, завиток:

# curl -k https://localhost:9443/shared1
<?xml version="1.0"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Name>shared1</Name><Prefix></Prefix><Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated></ListBucketResult>

Теперь вы можете указать его на свое приложение и начать использовать его локально. ISGW Link прозрачно позаботится о синхронизации набора данных. Если для вашего набора данных вам нужно синхронизировать только метаданные глобального пространства имен, установите MDOnly = true в конфигурации службы isgw01. Это обеспечит эффективную выборку фрагментов данных по запросу и по умолчанию сохранит кешированные фрагменты в течение 24 часов (настраивается для каждого сегмента).

Теперь проверим функцию NFS. На Mac нет простого способа напрямую подключить экспорт NFS с сервера NFS, доступного через контейнер Docker. Существует способ настроить прокси-сервер SOCKS, но на самом деле вам, скорее всего, понадобится предоставить его вашему приложению в самом Docker, и он будет работать отлично:

# docker run -it --rm -d --privileged=true --link nfs01 \
    --net=edgefs_default -e MOUNTPOINT=/mnt -e SERVER=nfs01 \
    -e SHARE=/work/shared1 outstand/nfs-client
b6b97c464e4b98899bfb575472a6aed61cb3f71cee80c3c6119be9a6f91a8043
# docker docker exec -it b6b ls /mnt

Расширенное использование

Гео-прозрачность с глобально активированным дедупликацией для всего разнообразия широко используемых протоколов хранения: файловых, блочных, объектных и NoSQL. Это действительно уровень хранения данных, который был разработан для масштабирования на множестве распределенных сайтов, облаков, локальных центров обработки данных и устройств Edge IoT.

Продолжайте ... читать дальше!

Подключите все свои сайты с гарантированной согласованностью

С ISGW Links вы можете включить сложные схемы синхронизации потока ввода-вывода данных. Глобальное пространство имен может состоять из сотен маленьких и больших установок EdgeFS, соединенных вместе. В моем примере здесь / work / shared1 - это сегмент, который я хочу синхронизировать между REMOTE_IP и этой настройкой. Но я также могу легко добавить еще одну службу isgw02 и подключить ее к REMOTE_IP2 и так далее, чтобы мои изменения распространялись в двух направлениях.

В случаях, когда мне не нужно хранить реплицированный контент, у меня есть возможность включить синхронизацию только для метаданных с фрагментами данных, полученными по запросу, с включенной семантикой кэширования E-LRU:

efscli service config isgw01 X-ISGW-MDOnly true

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

# docker-compose exec mgmt toolbox
Welcome to EdgeFS Mgmt Toolbox.
Hint: type neadm or efscli to begin
root@55fce9350b63:/opt/nedge# efscli object
Objects operations, e.g. create, delete, list
Usage:
  efscli object [command]
Aliases:
  object, o
Available Commands:
  create          create a new object
  delete          delete an existing object
  get             get a new object
  list            list objects
  put             put a new object
  show            show object
  snapshot-add    add a new object's snapshot to snapview
  snapshot-clone  clone snapshot to object
  snapshot-list   list snapshots of specified snapview object
  snapshot-rm     remove snapshot from snapview
  snapview-create create a new snapview section
  snapview-delete delete a snapview object

Группы моментальных снимков (например, snapview) будут «плавать» во всех синхронизированных местах, и мне не нужно будет беспокоиться о состоянии моей работы.

Создавайте настройки SAN с помощью iSCSI Targets EdgeFS

Блочное устройство - еще один вариант, который может быть интересно изучить. Если мне понадобится устройство iSCSI, легко создать службу и подписаться на корзину с устройствами iSCSI. ISGW Link начнет синхронизацию содержимого блочных устройств.

efscli service create iscsi isc01
efscli object create myspace/work/shared1/lun1 -s 128K \
    -o volsize=10g,blocksize=4096
efscli service serve isc01 myspace/work/shared1/lun1

Теперь перезапустите службу с помощью docker-compose restart isc01 и попробуйте найти свой LUN (обратите внимание, что я изменил порт службы isc01 на 3261, чтобы избежать конфликта с globalSAN, поскольку он выделяет 3260):

LUN EdgeFS iSCSI на самом деле просто объекты, доступные через интерфейсы NFS, S3, S3X или SWIFT:

curl -i http://localhost:9982/shared1/lun1
HTTP/1.1 200 OK
X-Powered-By: Express
x-amz-id-2: 90fc4c79c9b21ba4
x-amz-request-id: e9e301fcdfebb694
Content-Length: 0
Last-Modified: Sat, 16 Mar 2019 16:41:44 GMT
Accept-Ranges: bytes
X-volsize: 10737418240
X-blocksize: 4096
ETag: "BED78C44556C9B268C85B3DC1C2E12979CF264F81C06517A705E5137C531FBD70000000000000000000000000000000000000000000000000000000000000000"
Date: Sun, 17 Mar 2019 21:02:52 GMT
Connection: keep-alive

Лес баз данных NoSQL

И, наконец, наиболее интересным вариантом для изучения является база данных в стиле NoSQL. Существует расширенный API S3X, который можно использовать напрямую с приложениями:



API обеспечивает доступ к расширенным интерфейсам объектов EdgeFS, таким как доступ к хранилищу ключей и значений, режим добавления объекта S3, режим RW объекта S3 и режим сеанса потока объектов S3 (совместимый с POSIX).

Сеанс потока включает в себя серию изменений одного объекта, сделанных одним источником, которые сохраняются как одна или несколько версий в течение определенного конечного времени. Потоковая сессия должна быть изолирована, пока она открыта. То есть пользователи, работающие в этом сеансе, не увидят обновлений этого объекта из других сеансов. После завершения сеанса создается новая версия объекта, которая в конечном итоге реплицируется через направленные ссылки ISGW.

Stream Session обеспечивает высокопроизводительный доступ к объекту в стиле POSIX, поэтому для клиентских приложений выгодно использовать расширения постоянного соединения HTTP / 1.1 или HTTP / 2, чтобы минимизировать задержку между обновлениями или чтениями.

Чтобы включить, раскомментируйте службу s3x01 в сценарии создания и выполните следующие команды на панели инструментов:

efscli service create s3x s3x01
efscli service serve s3x01 myspace/work

Вышеупомянутое создаст определение службы s3x01, обслуживающее myspace / work арендатора. Вот несколько примеров того, как его использовать:

# create JSON Key-Value database mydb.json in bucket bk1
curl -X POST -H "Content-Type: application/json" \
    --data '{"key1":"value1"}' \
    "http://localhost:4000/bk1/mydb.json?comp=kv&finalize"
# create CSV Key-Value database mydb.csv
curl -X POST --data "value1" \
    "http://localhost:4000/shared1/mydb.csv?comp=kv&finalize"
# list keys and values
curl "http://localhost:4000/shared1/mydb.json?comp=kv&values=1"

Базы данных индексируются в алфавитном порядке, и можно выбрать один или несколько совпадающих ключей и значений, используя параметры запроса key, maxresults и values:

# curl "http://localhost:4000/shared1/mydb.json?comp=kv&key=key1&maxresults=3&values=1"
key1;value1
key11;value11
key12;value12

Вывод может быть в форматах CSV или JSON. Также можно вставить значение в двоичном формате (размер двоичного значения не может превышать 1 МБ):

# insert binary data
curl -X POST  -F "file=@file.txt" \
    "http://localhost:4000/shared1/mydb.blob?comp=kv&finalize&key=file.txt"
# read it back
curl "http://localhost:4000/shared1/mydb.blob?comp=kv&values=1&maxresults=1&key=file.txt"

Также возможно создать поведение потоковой передачи «ключ-значение» в транзакционном стиле: открытие, изменение, изменение, изменение, фиксация. Этот подход можно использовать для эффективных механизмов сбора журналов или записей: поток данных непосредственно в EdgeFS с S3X! Подробнее о том, как это можно сделать, читайте в документации по API.

Резюме

EdgeFS может быть очень мощным инструментом для улучшения CI / CD или повседневного рабочего процесса разработчика. Благодаря истинной геопрозрачности данных, гарантированной согласованности для протоколов File, Block, Object и NoSQL, уровень данных EdgeFS может позволить некоторые варианты использования, о которых раньше вы даже не могли подумать. Данные любого типа и вида теперь перемещаются по распределенным локациям без необходимости какой-либо централизованной оркестровки метаданных!

Исследовать! Посмотрите закомментированные разделы docker-compose, если вы хотите включить дополнительные функции! Или еще лучше, присоединяйтесь к нашему растущему сообществу на http: //edgefs.i o, дайте нам отзывы, помогите нам улучшить опыт разработчиков!