Геораспределенный s3-кластер в режимі active-active



Передмова
Почавши настроювати rados геораспределенную реплікацію, зіткнувся з проблемою, що офіційна документація трохи не підходить під новий мажорний реліз jewel, так і в інтернеті поки ще немає актуальних інструкцій. Даний мануал збереже багато часу тим, хто захоче собі невелике, своє геораспределенное s3-хмара.

Трохи термінів
Zone: група копій об'єктів, одна з яких є майстром
Zonegroup: складається з zone
Zonegroup map: карта zonegroup, яка містить карту всієї системи, тобто стосунки між різними zonegroup та zone
Realm: складається з zonegroup
Period: структура поточного стану realm. Кожне нове зміна relam, zonegroup або zone повинно супроводжуватися новим period

Вихідні дані
ОС: ubuntu 14.04
realm: project1
zonegroup: uk
zone: dc1, dc2

Маємо вже розгорнуті 2 ceph-кластера в 2-х дата-центрах. Інформації багато, так що не буду описувати. Відразу згенеруємо key та secret_key, зробимо їх ідентичними для всіх зон, та системних юзверя.

SYSTEM_ACCESS_KEY

cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 20 | head -n 1

SYSTEM_SECRET_KEY

cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 40 | head -n 1

Підготовка конфіги
Для роботи реплікації необхідно підготувати конфіги, json-файли, ідентичні в обох дата-центрах.

zonegroup.json

{
"name": "ru",
"api_name": "ru",
"is_master": "true",
"endpoints": [
"http:\/\/s3.dc1.superdomain.ru:80\/"
],
"master_zone": "ru-dc1",
"zones": [
{
"name": "ru-dc1",
"endpoints": [
"http:\/\/s3.dc1.superdomain.ru:80\/"
],
"log_meta": "true",
"log_data": "true",
},
{
"name": "ru-dc2",
"endpoints": [
"http:\/\/s3.dc2.superdomain.ru:80\/"
],
"log_meta": "true",
"log_data": "true",
}
],
"placement_targets": [
{
"name": "default-placement",
"tags": []
}
],
"default_placement": "default-placement",
}

dc1.json

{
"name": "ru-dc1",
"domain_root": "ru-dc1.наrgw.data.root",
"control_pool": "ru-dc1.наrgw.control",
"gc_pool": "ru-dc1.наrgw.gc",
"log_pool": "ru-dc1.наrgw.log",
"intent_log_pool": "ru-dc1.наrgw.intent-log",
"usage_log_pool": "ru-dc1.наrgw.usage",
"user_keys_pool": "ru-dc1.наrgw.users.keys",
"user_email_pool": "ru-dc1.наrgw.users.email",
"user_swift_pool": "ru-dc1.наrgw.users.swift",
"user_uid_pool": "ru-dc1.наrgw.users.uid",
"system_key": {
"access_key": "SYSTEM_ACCESS_KEY",
"secret_key": "SYSTEM_SECRET_KEY"
},
"placement_pools": [
{
"key": "default-placement",
"val": {
"index_pool": "ru-dc1.наrgw.buckets.index",
"data_pool": "ru-dc1.наrgw.buckets.data",
"data_extra_pool": "ru-dc1.наrgw.buckets.non-ec",
"index_type": 0
}
}
],
"metadata_heap": "ru-dc1.наrgw.meta",
}

dc2.json

{
"name": "ru-dc2",
"domain_root": "ru-dc2.наrgw.data.root",
"control_pool": "ru-dc2.наrgw.control",
"gc_pool": "ru-dc2.наrgw.gc",
"log_pool": "ru-dc2.наrgw.log",
"intent_log_pool": "ru-dc2.наrgw.intent-log",
"usage_log_pool": "ru-dc2.наrgw.usage",
"user_keys_pool": "ru-dc2.наrgw.users.keys",
"user_email_pool": "ru-dc2.наrgw.users.email",
"user_swift_pool": "ru-dc2.наrgw.users.swift",
"user_uid_pool": "ru-dc2.наrgw.users.uid",
"system_key": {
"access_key": "SYSTEM_ACCESS_KEY",
"secret_key": "SYSTEM_SECRET_KEY"
},
"placement_pools": [
{
"key": "default-placement",
"val": {
"index_pool": "ru-dc2.наrgw.buckets.index",
"data_pool": "ru-dc2.наrgw.buckets.data",
"data_extra_pool": "ru-dc2.наrgw.buckets.non-ec",
"index_type": 0
}
}
],
"metadata_heap": "ru-dc2.наrgw.meta",
}

Підготовка першого датацентру
  1. Генерирем ключі для radosgw:

    ceph auth get-or-create client.наrgw.ru-dc1 osd 'allow rwx' mon 'allow rwx' -o /etc/ceph/ceph.client.radosgw.keyring
    

  2. Додаємо секцію, що описує наш radosgw у /etc/ceph/ceph.conf:

    [client.наrgw.ru-dc1]
     
    rgw_zonegroup = uk
     
    rgw_zone = ru-dc1
     
    log_file = /var/log/ceph/client.наrgw.dc1.log
     
    keyring = /etc/ceph/ceph.client.radosgw.keyring
     
    rgw_dns_name = s3.dc1.superdomain.ru
     
    rgw_socket_path = /tmp/наrgw.ru-dc1.sock
     
    host = ceph1
     
    

  3. Переглядаємо командою ceph osd pool ls, які пули в даний момент створені, і видаляємо всі, крім rbd, в цьому нам допоможе команда ceph osd pool delete $pool $pool --yes-i-really-really-mean it (так, саме 2 рази), де $pool — назва пулу.

    У мене це було:

    ceph osd pool delete default.наrgw.control default.наrgw.control-yes-i-really-really-mean it
    ceph osd pool delete default.наrgw.data.root default.наrgw.data.root --yes-i-really-really-mean it
    ceph osd pool delete default.наrgw.gc default.наrgw.gc --yes-i-really-really-mean it
    ceph osd pool delete default.наrgw.log default.наrgw.log --yes-i-really-really-mean it
    

  4. А тепер створюємо потрібні:

    ceph osd pool create .наrgw.root 8
    ceph osd pool create ru-dc1.наrgw.control 8
    ceph osd pool create ru-dc1.наrgw.data.root 8
    ceph osd pool create ru-dc1.наrgw.gc 8
    ceph osd pool create ru-dc1.наrgw.log 8
    ceph osd pool create ru-dc1.наrgw.intent-log 8
    ceph osd pool create ru-dc1.наrgw.usage 8
    ceph osd pool create ru-dc1.наrgw.users.keys 8
    ceph osd pool create ru-dc1.наrgw.users.email 8
    ceph osd pool create ru-dc1.наrgw.users.swift 8
    ceph osd pool create ru-dc1.наrgw.users.uid 8
    ceph osd pool create ru-dc1.наrgw.buckets.index 8
    ceph osd pool create ru-dc1.наrgw.buckets.data 128 128
    ceph osd pool create ru-dc1.наrgw.meta 8
    

  5. Створюємо директорію для нашого radosgw клієнта і правимо власника:

    mkdir /var/lib/ceph/radosgw/ceph-наrgw.ru-dc1
    chown ceph:ceph /var/lib/ceph/radosgw/ceph-наrgw.ru-dc1
    

  6. Видаляємо realm, zonegroup і zone, які були за замовчуванням. Переглянути їх можна командою radosgw-admin (realm|zonegroup|zone) list, в мене це було так:

    radosgw-admin zonegroup delete --наrgw-zonegroup=default
    radosgw-admin zone delete --наrgw-zone=default
    

  7. Створюємо наші realm, zonegroup, zone, новий period:

    radosgw-admin realm create --наrgw-realm=project1 --default
    radosgw-admin zonegroup set --наrgw-realm=project1 --наrgw-zonegroup=ru --default < zonegroup.json
    radosgw-admin zone set --наrgw-realm=project1 --наrgw-zonegroup=ru --наrgw-zone=ru-dc1 --default < dc1.json
    radosgw-admin zone set --наrgw-realm=project1 --наrgw-zonegroup=ru --наrgw-zone=ru-dc2 < dc2.json
    radosgw-admin period update --commit
    

  8. Ставимо і налаштовуємо apache2 на роботу з нашим хмарою. Для цього потрібен сам apache2 та libapache2-mod-fastcgi. Реплікація c версією стандартного репозиторію ubuntu у мене нормально не заробила, але команда ceph подбали про це, і його можна взяти в окремій ріпі.

    echo "deb http://gitbuilder.ceph.com/libapache-mod-fastcgi-deb-trusty-x86_64-basic/ref/master trusty main" > /etc/apt/sources.list.d/ceph-fastcgi.list
    apt-key adv --keyserver keyserver.ubuntu.com --recv-key 6EAEAE2203C3951A
    apt-get update
    apt-get install apache2 libapache2-mod-fastcgi
    a2enmod rewrite
    

  9. Сам конфіг апача:

    FastCgiExternalServer /var/www/s3gw.fcgi -socket /tmp/наrgw.ru-dc1.sock
    <VirtualHost *:80>
    ServerName s3.dc1.superdomain.ru
    ServerAlias *.s3.dc1.superdomain.ru
    DocumentRoot /var/www
    RewriteEngine On
    RewriteRule ^/(.*) /s3gw.fcgi?%{QUERY_STRING} [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
    <IfModule mod_fastcgi.c>
    <Directory /var/www>
    Options +ExecCGI
    AllowOverride All
    SetHandler fastcgi-script
    Order allow,deny
    Allow from all
    AuthBasicAuthoritative Off
    </Directory>
    </IfModule>
    
    AllowEncodedSlashes On
    ErrorLog /var/log/apache2/error.log
    CustomLog /var/log/apache2/access.log vhost_combined
    ServerSignature Off
    
    </VirtualHost>
    

  10. Апач рестартуем:

    service apache2 restart
    

  11. Створюємо скрипт /var/www/s3gw.fcgi

    #!/bin/sh
    exec /usr/bin/radosgw -c /etc/ceph/ceph.conf -n ceph-наrgw.ru-dc1
    

  12. правимо права:

    chmod +x /var/www/s3gw.fcgi
    

  13. І, нарешті, стартуємо radosgw:

    start radosgw id=наrgw.ru-dc1
    

  14. Створюємо системного користувача:

    radosgw-admin user create --uid=zone.user --display-name="ZoneUser" --access key=SYSTEM_ACCESS_KEY --secret=SYSTEM_SECRET_KEY --system
    

На цьому ми налаштували 1-й дц, і переходимо до 2-го.

Дц №2
Всі пункти проводимо аналогічним чином і для другого кластера, просто замінивши dc1 dc2.

Ще трохи
На поточному етапі ми отримуємо реплікацію даних у відрах, але, щоб синкать сам список відер і користувачів, потрібен radosgw-agent.

  1. Ставимо його в перший дата-центр:

    apt-get install radosgw-agent
    

  2. Робимо конфіг /etc/ceph/radosgw-agent/default.conf:

    src_zone: ru-dc1
    source: http://s3.dc1.superdomain.ru:80
    src_access_key: SYSTEM_ACCESS_KEY
    src_secret_key: SYSTEM_SECRET_KEY
    destination: http://s3.dc2.superdomain.ru:80
    dest_access_key: SYSTEM_ACCESS_KEY
    dest_secret_key: SYSTEM_SECRET_KEY
    log_file: /var/log/ceph/sync.dc1-dc2.log
    dest_zone: ru-dc2
    

  3. І запускаємо його:

    /etc/init.d/radosgw-agent start
    

Що в підсумку?
А в результаті ми отримуємо active-active геораспределенное s3-хмара. Всі операції запису/видалення об'єктів будуть проводитися асинхронно, з затримкою в пару десятків секунд. Єдине обмеження — це неможливість створення відер у другому дата-центрі.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.