GoBetween + VRRPを使用したS3ストレージのバランス

Cephを使用して、S3互換RadosGWストレージを使用してバックアップを保存すると、1つのradosGWがそれに割り当てられた負荷に対応できないという結論に達し、それに付随するフォールトトレランスとのバランスをとる時であると判断しました。 その結果、GoBetween(非常に軽量なL4バランサー、さらにgobetween.ioを使用)を使用したバランシングソリューションを思い付き、VRRPを使用してフォールトトレランスを整理しました。

次のスキームが登場しました。

  1. マスターvrrpノードは、http(s)を介してデータストリームを受信します。
  2. gobetweenはすべてのトラフィックを自身に分散し、vrrpノードをバックアップします。
  3. 次に、radosgwはcephに直接書き込みます。
  4. vrrpマスターノードが落ちた場合、マスターが立ち上がるまでバックアップノードはそれ自体のすべての負荷を引き受けます

以下のこのアクションの実装をお読みください。

与えられた:

  1. Ceph Cluster(ジュエル)
    • IPモニター:10.0.1.1、10.0.1.2、10.0.1.3
  2. 2台のアイロンサーバー(CentOS)
    • 最初のサーバーは10.0.0.1です(gbt1.example.comと呼びましょう)。
    • 2番目のサーバー10.0.0.2(gbt2.example.com)
    • 共有IPは10.0.0.3(s3.example.com)になります
  3. ドメインexample.com

チャレンジ:

RadosGWで編成されたS3ストレージのフェールオーバーバランシングを行う

ステージ:

  1. RadosGWを2つのサーバーに展開する
  2. VRRPでフォールトトレランスを整理する
  3. GoBetweenを使用してS3トラフィックバランシングを整理する
  4. 確認する

準備(すべてが両方のマシンで同一)


CentOS 7.4がサーバーにインストールされます。OSをインストールしたらすぐにすべてを更新します。

# yum -y update 

ToRに必要なすべてのソフトウェアをインストールします(最初にリポジトリのみがインストールされるため、cefを除く)。

 # 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 

Cephクラスターの任意のノードから/etc/ceph/client.radosgw.gatewayキーをコピーすることを忘れないでください
radosgwを実行します。

 # systemctl start ceph-radosgw@radosgw.gateway 

そして、自動開始に追加します:

 # systemctl enable ceph-radosgw@radosgw.gateway 

VRRPを展開する


マスターノード上(状態と優先度のオプションの違い):

 # cat /etc/keepalived/keepalived.conf global_defs { notification_email { user@example.com } notification_email_from gbt@example.com 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 { user@example.com } notification_email_from gbt@example.com 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 configを記述します(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 

確認する


検証には、たとえばs3cmdやDragonDiskなど、任意のS3クライアントを使用できます。 s3cmdの検証オプションは次のようになります(s3.example.comが既に構成でサーバーとして指定されていることを考慮して)。

 # s3cmd ls 

少なくともいくつかのバケットがすでにある場合、彼の名前は排気口にあります;バケットがない場合、空の排気口があります。

現在の外観-下の画面で確認できます。 1日あたりの統計(1秒あたりのギガバイト単位のグラフ):



まとめ


負荷は大幅に減少し、鈍いものはなく、すべてのバックアップが一晩で集まる時間があります(それ以前は、営業日の高さで、まだ組み立てることができました)。

このhautushkaがradosgwの負荷を加速および軽減するのに役立つことを願っています

Source: https://habr.com/ru/post/J346436/


All Articles