Балансировка Хранилища S3 С Помощью Gobetween+Vrrp

Используя Ceph для хранения резервных копий с помощью своего S3-совместимого хранилища RadosGW, мы пришли к выводу, что один radosGW не справляется с возложенной на него нагрузкой и решили, что пришло время разбалансировать его с сопутствующей отказоустойчивостью.

В результате мы пришли к решению балансировки с помощью GoBetween (очень легкий балансировщик L4, подробнее на сайте).

gobetween.io ), а отказоустойчивость была организована с помощью VRRP. Получилась следующая схема:

  1. главный узел vrrp получает поток данных через http(s);
  2. gobetween распределяет весь трафик на себя и резервный узел vrrp;
  3. radosgw, в свою очередь, пишет напрямую в ceph;
  4. в случае падения мастера vrrp узла резервный узел принимает на себя всю нагрузку до тех пор, пока мастер не поднимется
Прочитайте нашу реализацию этого действия ниже.

Данный:

  1. Кластер цефов (Jewel)
    • IP-мониторы: 10.0.1.1, 10.0.1.2, 10.0.1.3
  2. Два аппаратных сервера (CentOS)
    • Первый сервер — 10.0.0.1 (назовем его gbt1.example.com).

    • Второй сервер 10.0.0.2 (gbt2.example.com)
    • Публичный IP-адрес будет 10.0.0.3 (s3.example.com).

  3. Домен example.com
Задача: Сделать балансировку с отказоустойчивостью для хранилища S3, организованного с помощью RadosGW. ? краны:
  1. Разверните RadosGW на двух серверах.

  2. Организуйте отказоустойчивость с помощью VRRP
  3. Организуйте балансировку трафика S3 с помощью GoBetween
  4. Проверять


Подготовка (на обеих машинах все идентично)

На серверах установлена CentOS 7.4, сразу после установки ОС все обновим:
  
  
  
  
  
  
  
  
  
  
  
  
  
  
   

# yum -y update

Установим все программное обеспечение, которое нам нужно по техническому заданию (кроме самого ceph, потому что сначала устанавливается только его репозиторий):

# yum -y install keepalived centos-release-ceph-jewel wget

На данный момент у нас еще не установлен Ceph, поэтому давайте его установим:

# yum -y install ceph-radosgw

Давайте сразу настроим фаервол, открыв необходимые порты и разрешив сервисы:

# firewall-cmd --permanent --add-port=18080/tcp # firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface enp2s0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT # firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface enp2s0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT # firewall-cmd --permanent --add-port=10050/tcp # firewall-cmd --reload

Давайте отключим SELinux (на всякий случай):

# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux # setenforce 0



Развертывание RadosGW

Изначально кластер Ceph уже поднят, думаю подробностей здесь касаться не будем, это не тема данной статьи, перейдем сразу к настройке radosGW. Конфигурация приведена для примера; в вашем случае некоторые параметры могут отличаться:

# cat /etc/ceph/ceph.conf [global] fsid = 01dea7f3-91f4-48d1-9d44-ba93d4a103c5 mon_host = 10.0.1.1, 10.0.1.2, 10.0.1.3 auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx public_network = 10.0.1.0/24 [client] rbd_cache = true [client.radosgw.gateway] rgw_frontends = civetweb port=18080 rgw_region = example rgw_region_root_pool = .

example.rgw.root rgw_zone = example-s3 rgw_zone_root_pool = .

example-s3.rgw.root host = s3 keyring = /etc/ceph/client.radosgw.gateway rgw_dns_name = s3.example.com rgw_print_continue = true

Не забудьте скопировать ключ /etc/ceph/client.radosgw.gateway с любого узла кластера Ceph. Запустим radosgw:

# systemctl start [email protected]

И добавляем его в автозагрузку:

# systemctl enable [email protected]



Развертывание VRRP

На мастер-узле (отличие заключается в параметрах состояния и приоритета):

# cat /etc/keepalived/keepalived.conf global_defs { notification_email { [email protected] } notification_email_from [email protected] smtp_server mail.example.com smtp_connect_timeout 30 router_id GBT1 } vrrp_instance VI_1 { state MASTER interface enp2s0 virtual_router_id 33 priority 101 advert_int 1 smtp_alert authentication { auth_type PASS auth_pass 123123123 } virtual_ipaddress { 10.0.0.3 } }

На резервном узле:

# cat /etc/keepalived/keepalived.conf global_defs { notification_email { [email protected] } notification_email_from [email protected] smtp_server mail.example.com smtp_connect_timeout 30 router_id GBT1 } vrrp_instance VI_1 { state BACKUP interface enp2s0 virtual_router_id 33 priority 100 advert_int 1 smtp_alert authentication { auth_type PASS auth_pass 123123123 } virtual_ipaddress { 10.0.0.3 } }

Перезапускаем и добавляем в автозагрузку (обе ноды):

# systemctl restart keepalived # systemctl enable keepalived



Развертывание GoBetween

Сначала загрузите и распакуйте двоичный файл gobetween:

# wget https://github.com/yyyar/gobetween/releases/download/0.5.0/gobetween_0.5.0_linux_amd64.tar.gz # tar -xzf gobetween_0.5.0_linux_amd64.tar.gz -C /usr/local/bin/

Пишем конфиг gobetween (для SSL-соединений указываем расположение ключей).

Конфигурация на обоих узлах одинакова:

# cat /etc/gobetween.toml [logging] level = "debug" # "debug" | "info" | "warn" | "error" output = "/var/log/gobetween.log" [api] enabled = true # true | false bind = ":8888" # "host:port" cors = false # cross-origin resource sharing [defaults] max_connections = 0 # Maximum simultaneous connections to the server client_idle_timeout = "0" # Client inactivity duration before forced connection drop backend_idle_timeout = "0" # Backend inactivity duration before forced connection drop backend_connection_timeout = "0" # Backend connection timeout (ignored in udp) [servers] [servers.sample] protocol = "tls" bind = "0.0.0.0:443" balance = "roundrobin" [servers.sample.discovery] kind = "static" static_list = [ "10.0.0.1:18080 weight=1", "10.0.0.2:18080 weight=1" ] [servers.sample.tls] root_ca_cert_path = "/etc/exampleSSC-CA.crt" cert_path = "/etc/s3.example.com.crt" key_path = "/etc/s3.example.com.key" [servers.sample.healthcheck] fails = 1 passes = 1 interval = "2s" timeout="1s" kind = "ping" ping_timeout_duration = "500ms" [servers.sample2] protocol = "tcp" bind = "0.0.0.0:80" balance = "roundrobin" [servers.sample2.discovery] kind = "static" static_list = [ "10.0.0.1:18080 weight=1", "10.0.0.2:18080 weight=1" ] [servers.sample2.healthcheck] fails = 1 passes = 1 interval = "2s" timeout="1s" kind = "ping" ping_timeout_duration = "500ms"

Gobetween запускается с помощью следующей команды (добавьте в автозагрузку любым удобным для вас способом):

# /usr/local/bin/gobetween -c /etc/gobetween.toml



обследование

Для проверки можно использовать любой S3-клиент, например, такой как s3cmd или DragonDisk. Вариант проверки для s3cmd будет выглядеть так (учитывая, что в качестве сервера в конфиге уже указан s3.example.com):

# s3cmd ls

Если у вас там уже есть хоть какое-то ведро, то его название будет в выхлопе; если нет ведер, то будет пустой выхлоп.

Вы можете увидеть, как это выглядит сейчас, на скриншоте ниже.

Статистика за день (графики в гигабайтах в секунду):

Балансировка хранилища S3 с помощью GoBetween+VRRP



Полученные результаты

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

Надеюсь этот хат поможет вам ускориться и снизить нагрузку на radosgw Теги: #Системное администрирование #Хранение данных #s3 #ceph #VRRP #radosgw #gobetween

Вместе с данным постом часто просматривают: