Во многих случаях продуктивность разработчика действительно зависит от того, насколько быстро и эффективно приложение может получить доступ к предварительному набору данных. Что, если набор данных находится в ТБ и миллионах записей? Что, если данные меняются плавно? А что, если сеть отключилась, вы в самолете или вам просто нужно работать в автономном режиме?
Откройте для себя геопрозрачность уровня данных 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, дайте нам отзывы, помогите нам улучшить опыт разработчиков!