- PVSM.RU - https://www.pvsm.ru -

Катастрофоустойчивое хранение данных — одна из актуальных задач при построении IT-инфраструктуры. Но ее решение может завести в тупик. Как оптимальнее организовать хранение данных, исключив домены отказа? Как разместить определенные данные ближе к целевой нагрузке или части аудитории? Как организовать асинхронную репликацию данных между Москвой и Санкт-Петербургом?
Всем привет! Меня зовут Гришин Александр, я продакт-менеджер в Selectel и отвечаю за развитие объектного хранилища [1] и облачных баз данных [2]. Под катом я расскажу, как с помощью мультирегиональности взаимодействовать с разными регионами S3 через Python и библиотеку boto3. Это поможет хранить и обрабатывать данные в Москве и Санкт-Петербурге, используя единую авторизацию и простой интерфейс. К тому же — улучшить катастрофоустойчивость и доступность данных, а еще снизить задержки при работе с объектами, когда инфраструктура распределена между городами.
Используйте навигацию, если не хотите читать текст целиком:
→ Обзор регионов в объектном хранилище Selectel [3]
→ Часть работы в панели управления Selectel [4]
→ Настройка клиента boto3 для разных регионов [5]
→ Создание бакетов в разных регионах [6]
→ Список объектов в бакетах разных регионов [7]
→ Копирование объектов между регионами [8]
→ Тривиальный пример работы с мультирегиональным хранилищем [9]
→ Заключение [10]
Объектное S3-хранилище в Selectel на данный момент предлагает к использованию два региона: Санкт-Петербург и Москву.
Регион Санкт-Петербург, пул ru-1. Находится в группе ЦОД Дубровка и представляет собой три отдельных, независимых друг от друга дата-центра уровня Tier III общей мощностью около 1 000 стоек. Суммарная полезная площадь — около 2 500 м2. Каждый ЦОД в этой группе имеет независимые системы: питание (в том числе резервное с дизель-генераторными установками), сетевое оборудование, сетевой канал, системы охлаждения, системы пожаротушения и т. д. Кстати, мы планируем кратно увеличить мощности в этом регионе.
Регион Москва, пулы gis-1 и ru-7. Находятся в группе ЦОД Берзарина и представляют собой отдельные независимые друг от друга этажи в одном здании уровня Tier III. Объем мощности — около 1 500 стоек, полезная площадь — около 2 800 м2. Каждый этаж в этой локации также обладает теми же независимыми системами жизнеобеспечения, что и дата-центры в Петербурге.
В этом году мы планируем ввести в эксплуатацию первую очередь нового ЦОД «Юрловский» в Москве. Это будет дата-центр уровня Tier IV. Особенностью локации станет самый большой единый машинный зал в России площадью 4 500 м2. Более того, здесь мы разместим стойки с водяным охлаждением и увеличенным питанием для оборудования с GPU, в том числе для Big Data, ML и HPC-суперкомпьютеров.
Отдельно отмечу, что пул gis-1 соответствует требованиям 17 Приказа ФСТЭК для работы государственных информационных систем. Используйте его, если для вас актуальны:
К тому же, дата-центр подходит для размещения:

Очень подробный пошаговый гайд вы найдете в недавней статье [11] моего коллеги. Я же перечислю только основные шаги.
Для работы с мультирегиональным хранилищем будем указывать соответствующий endpoint — URL для каждого региона:
import boto3
def get_s3_client(region):
endpoints = {
'ru-1': 'https://s3.ru-1.storage.selcloud.ru',
'gis-1': 'https://s3.gis-1.storage.selcloud.ru',
'ru-7': 'https://s3.ru-7.storage.selcloud.ru'
}
return boto3.client(
's3',
endpoint_url=endpoints[region],
aws_access_key_id='ВАШ_ACCESS_KEY',
aws_secret_access_key='ВАШ_SECRET_KEY'
)
В рамках нашей услуги бакет — это контейнер с vHosted-адресацией и, как следствие, уникальным именем и доменом вида имя_контейнера.s3.storage.selcloud.ru.

Выше мы уже создавали нужные бакеты через панель управления [12]. Однако создание бакета поддерживается и через S3 API, а значит оно возможно из кода:
s3_ru1 = get_s3_client('ru-1')
s3_gis1 = get_s3_client('gis-1')
s3_ru7 = get_s3_client('ru-7')
bucket_name_ru1 = 'my-bucket-ru1'
bucket_name_gis1 = 'my-bucket-gis1'
bucket_name_ru7 = 'my-bucket-ru7'
# Создаём бакеты в каждом регионе
s3_ru1.create_bucket(Bucket=bucket_name_ru1)
s3_gis1.create_bucket(Bucket=bucket_name_gis1)
s3_ru7.create_bucket(Bucket=bucket_name_ru7)
print('Бакеты успешно созданы в разных регионах.')
Теперь выведем список объектов в нашем мультирегиональном хранилище:
def list_objects(s3_client, bucket_name):
response = s3_client.list_objects_v2(Bucket=bucket_name)
return [obj['Key'] for obj in response.get('Contents', [])]
print('Файлы в ru-1:', list_objects(s3_ru1, bucket_name_ru1))
print('Файлы в gis-1:', list_objects(s3_gis1, bucket_name_gis1))
print('Файлы в ru-7:', list_objects(s3_ru7, bucket_name_ru7))
Просто и элегантно мы получаем список объектов, фактически хранящихся в разных городах и ЦОДах.
Для репликации данных можно перемещать их между регионами. Например, при помощи copy_object:
copy_source = {'Bucket': bucket_name_ru1, 'Key': file_name}
s3_gis1.copy_object(CopySource=copy_source, Bucket=bucket_name_gis1, Key=file_name)
print(f'Файл {file_name} скопирован из ru-1 в gis-1')
Теперь мы уверены, что в случае катастрофы в одном регионе наши данные продублированы в другом.
Теперь соберем все это воедино:
import boto3
import botocore.exceptions
def get_s3_client(region):
""" Создает S3 клиент для указанного региона """
endpoints = {
'ru-1': 'https://s3.ru-1.storage.selcloud.ru',
'gis-1': 'https://s3.gis-1.storage.selcloud.ru',
'ru-7': 'https://s3.ru-7.storage.selcloud.ru'
}
return boto3.client(
's3',
endpoint_url=endpoints[region],
region_name=region, # Указываем регион явно
aws_access_key_id="YOUR_ACCESS_KEY",
aws_secret_access_key="YOUR_SECRET_KEY"
)
def bucket_exists(s3_client, bucket_name):
""" Проверяет, существует ли бакет, используя head_bucket() """
try:
s3_client.head_bucket(Bucket=bucket_name)
return True
except botocore.exceptions.ClientError as e:
if e.response['Error']['Code'] == '404': # Бакета нет, можно создать
return False
print(f'Ошибка при проверке существования бакета {bucket_name}: {e}')
return False
def create_bucket_if_not_exists(s3_client, bucket_name, region):
""" Создает бакет, если он не существует """
if bucket_exists(s3_client, bucket_name):
print(f'Бакет {bucket_name} уже существует.')
return
try:
s3_client.create_bucket(
Bucket=bucket_name,
CreateBucketConfiguration={'LocationConstraint': region}
)
print(f'Бакет {bucket_name} успешно создан в регионе {region}.')
except Exception as e:
print(f'Ошибка при создании бакета {bucket_name}: {e}')
# Подключаемся к разным регионам
s3_clients = {
'ru-1': get_s3_client('ru-1'),
'gis-1': get_s3_client('gis-1'),
'ru-7': get_s3_client('ru-7'),
}
buckets = {
'ru-1': 'habr-ru-1',
'gis-1': 'habr-gis-1',
'ru-7': 'habr-ru-7',
}
# Проверяем и создаем бакеты, если их нет
for region, s3_client in s3_clients.items():
create_bucket_if_not_exists(s3_client, buckets[region], region)
print('Все бакеты обработаны.')
Мультирегиональность в объектном хранилище Selectel открывает новые возможности для управления данными. Среди них — балансировка нагрузки, катастрофоустойчивость, резервное копирование и ускоренный доступ. Используя Python и boto3, можно легко работать с разными регионами, перемещать объекты и обеспечивать отказоустойчивость.
Хотели бы вы попробовать мультирегиональное хранение в Selectel? Делитесь опытом в комментариях!
Автор: GrishinAlex
Источник [13]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/415895
Ссылки в тексте:
[1] объектного хранилища: https://selectel.ru/services/cloud/storage/?utm_source=habr.com&utm_medium=referral&utm_campaign=storage_article_multiregs3_020425_content
[2] облачных баз данных: https://selectel.ru/services/cloud/managed-databases/?utm_source=habr.com&utm_medium=referral&utm_campaign=dbaas_article_multiregs3_020425_content
[3] Обзор регионов в объектном хранилище Selectel: #1
[4] Часть работы в панели управления Selectel: #2
[5] Настройка клиента boto3 для разных регионов: #3
[6] Создание бакетов в разных регионах: #4
[7] Список объектов в бакетах разных регионов: #5
[8] Копирование объектов между регионами: #6
[9] Тривиальный пример работы с мультирегиональным хранилищем: #7
[10] Заключение: #8
[11] в недавней статье: https://habr.com/ru/companies/selectel/articles/875956/%232
[12] в панель управления: https://my.selectel.ru/
[13] Источник: https://habr.com/ru/companies/selectel/articles/896758/?utm_source=habrahabr&utm_medium=rss&utm_campaign=896758
Нажмите здесь для печати.