Используя Ceph для хранения резервных копий с помощью своего S3-совместимого хранилища RadosGW, мы пришли к выводу, что один radosGW не справляется с возложенной на него нагрузкой и решили, что пришло время разбалансировать его с сопутствующей отказоустойчивостью.
В результате мы пришли к решению балансировки с помощью GoBetween (очень легкий балансировщик L4, подробнее на сайте).
gobetween.io ), а отказоустойчивость была организована с помощью VRRP. Получилась следующая схема:
- главный узел vrrp получает поток данных через http(s);
- gobetween распределяет весь трафик на себя и резервный узел vrrp;
- radosgw, в свою очередь, пишет напрямую в ceph;
- в случае падения мастера vrrp узла резервный узел принимает на себя всю нагрузку до тех пор, пока мастер не поднимется
Данный:
- Кластер цефов (Jewel)
- IP-мониторы: 10.0.1.1, 10.0.1.2, 10.0.1.3
- Два аппаратных сервера (CentOS)
- Первый сервер — 10.0.0.1 (назовем его gbt1.example.com).
- Второй сервер 10.0.0.2 (gbt2.example.com)
- Публичный IP-адрес будет 10.0.0.3 (s3.example.com).
- Первый сервер — 10.0.0.1 (назовем его gbt1.example.com).
- Домен example.com
- Разверните RadosGW на двух серверах.
- Организуйте отказоустойчивость с помощью VRRP
- Организуйте балансировку трафика S3 с помощью GoBetween
- Проверять
Подготовка (на обеих машинах все идентично)
На серверах установлена CentOS 7.4, сразу после установки ОС все обновим:Установим все программное обеспечение, которое нам нужно по техническому заданию (кроме самого ceph, потому что сначала устанавливается только его репозиторий):# yum -y update
# 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
Если у вас там уже есть хоть какое-то ведро, то его название будет в выхлопе; если нет ведер, то будет пустой выхлоп.
Вы можете увидеть, как это выглядит сейчас, на скриншоте ниже.
Статистика за день (графики в гигабайтах в секунду):
Полученные результаты
Нагрузка значительно снизилась, тупиков не осталось и теперь все бэкапы успевают собраться за ночь (до этого еще можно было собрать в разгар рабочего дня).Надеюсь этот хат поможет вам ускориться и снизить нагрузку на radosgw Теги: #Системное администрирование #Хранение данных #s3 #ceph #VRRP #radosgw #gobetween
-
Ноутбук: Звук Через Наушники И/Или Динамики
19 Oct, 24 -
Тернистый Путь К Программированию
19 Oct, 24 -
Возможен Ли Асинхронный Процессор?
19 Oct, 24 -
Восемь Уроков Лидерства От Стива Балмера
19 Oct, 24 -
Покупка Adobe – Почему?
19 Oct, 24