メインコンテンツまでスキップ

負荷分散

ユーザーはMySQLプロトコルを使用してFEのクエリポート(query_port、デフォルト9030)を通じてDorisに接続します。複数のFEノードを配置する場合、ユーザーは複数のFE上にロードバランシング層を配置することで、Dorisクエリの高可用性を実現できます。

この文書では、Dorisに適した様々なロードバランシングソリューションを紹介し、Proxy Protocolを使用してクライアントIPパススルーを実装する方法について説明します。

Load Balancing

この記事では、手順を説明するため、以下の3つのFEノードを例として使用します:

192.168.1.101:9030
192.168.1.102:9030
192.168.1.103:9030

プロキシサーバーノード:

192.168.1.100

01 JDBC URL

JDBC URLで組み込みのロードバランシング設定を使用します。

jdbc:mysql:loadbalance://192.168.1.101:9030,192.168.1.102:9030,192.168.1.103:9030/test_db

詳細については、MySQL Official Documentationを参照してください。

02 Nginx

Nginx TCP リバースプロキシを使用してDorisロードバランシングを実装します。

Nginx のインストール

Nginxの正しいインストールについては、Nginx公式ウェブサイトを参照してください。ここでは、Ubuntu システムでNginx 1.18.0バージョンを例として、Nginxのコンパイルとインストール手順を説明します。

  1. コンパイル依存関係のインストール

    sudo apt-get install build-essential
    sudo apt-get install libpcre3 libpcre3-dev
    sudo apt-get install zlib1g-dev
    sudo apt-get install openssl libssl-dev
  2. Nginxをインストールする

    sudo wget http://nginx.org/download/nginx-1.18.0.tar.gz
    sudo tar zxvf nginx-1.18.0.tar.gz
    cd nginx-1.18.0
    sudo ./configure --prefix=/usr/local/nginx --with-stream --with-http_ssl_module --with-http_gzip_static_module --with-http_stub_status_module
    sudo make && make install

リバースプロキシの設定

新しい設定ファイルを作成します:

vim /usr/local/nginx/conf/default.conf
events {
worker_connections 1024;
}
stream {
upstream mysqld {
hash $remote_addr consistent;
server 192.168.1.101:9030 weight=1 max_fails=2 fail_timeout=60s;
server 192.168.1.102:9030 weight=1 max_fails=2 fail_timeout=60s;
server 192.168.1.103:9030 weight=1 max_fails=2 fail_timeout=60s;
}
server {
# Proxy port
listen 6030;
proxy_connect_timeout 300s;
proxy_timeout 300s;
proxy_pass mysqld;
}
}

Nginxの開始

指定した設定ファイルで開始:

cd /usr/local/nginx
/usr/local/nginx/sbin/nginx -c conf.d/default.conf

確認

proxyポートを使用して接続します:

mysql -uroot -P6030 -h192.168.1.100

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
2 rows in set (0.00 sec)

03 HAProxy

HAProxyは、C言語で書かれた高性能なTCP/HTTPロードバランサーです。

HAProxyのインストール

  1. HAProxyをダウンロード

    ダウンロードリンク: https://src.fedoraproject.org/repo/pkgs/haproxy/

  2. 展開

    tar -zxvf haproxy-2.6.15.tar.gz -C /opt/
    mv haproxy-2.6.15 haproxy
    cd haproxy
  3. コンパイル

    yum install gcc gcc-c++ -y
    make TARGET=linux-glibc PREFIX=/usr/local/haproxy
    make install PREFIX=/usr/local/haproxy

HAProxyの設定

  1. haproxy.confファイルを設定する

    設定ファイルを開く:

    vim /etc/rsyslog.d/haproxy.conf
    $ModLoad imudp 
    $UDPServerRun 514
    local0.* /usr/local/haproxy/logs/haproxy.log
    &~
  2. リモートログを有効にする

    vim /etc/sysconfig/rsyslog

コンテンツを追加:

```text
SYSLOGD_OPTIONS="-c 2 -r -m 0"
```

パラメータの説明:

- `-c 2`: 互換モードを使用、デフォルトは `-c 5`。
- `-r`: リモートロギングを有効化。
- `-m 0`: タイムスタンプをマーク。分単位で、0の場合、この機能が無効であることを示す。

変更を適用:

`systemctl restart rsyslog`

3. ロードバランシングファイルを編集

```shell
vim /usr/local/haproxy/haproxy.cfg
```
```text
global
maxconn 2000
ulimit-n 40075
log 127.0.0.1 local0 info
uid 200
gid 200
chroot /var/empty
daemon
group haproxy
user haproxy

defaults
log global
mode http
retries 3
option redispatch

timeout connect 5000
timeout client 5000
timeout server 5000
timeout check 2000

frontend agent-front
bind *:6030
mode tcp
default_backend forward-fe

backend forward-fe
mode tcp
balance roundrobin
server fe-1 192.168.1.101:9030 weight 1 check inter 3000 rise 2 fall 3
server fe-2 192.168.1.102:9030 weight 1 check inter 3000 rise 2 fall 3
server fe-3 192.168.1.103:9030 weight 1 check inter 3000 rise 2 fall 3
```

HAProxyの開始

  1. サービスの開始

    /opt/haproxy/haproxy -f /usr/local/haproxy/haproxy.cfg

  2. サービス状態の確認

    netstat -lnatp | grep -i haproxy

確認

mysql -h 192.168.1.100 -uroot -P6030 -p

04 ProxySQL

ProxySQLは、C言語で記述されたオープンソースのMySQLデータベースプロキシソフトウェアです。接続管理、読み書き分散、負荷分散、フェイルオーバーなどの機能を実装できます。高性能、設定可能性、動的管理などの利点があり、Webサービス、ビッグデータプラットフォーム、クラウドデータベースなどのシナリオで一般的に使用されています。

ProxySQLのインストール

ProxySQLを正しくインストールするには、公式ドキュメントを参照してください。

ProxySQLの設定

ProxySQLには設定ファイル/etc/proxysql.cnfと設定データベースファイル/var/lib/proxysql/proxysql.dbが含まれています。

特に注意すべき点は、/var/lib/proxysqlディレクトリに「proxysql.db」ファイルが存在する場合、ProxySQLサービスは初回起動時のみproxysql.cnfを読み取り、解析し、その後の起動では読み取らなくなることです。

再起動後にproxysql.cnfの設定を有効にするには、サービスを再起動する前に/var/lib/proxysql/proxysql.dbを削除する必要があります。これは初期化起動と同等で、新しいproxysql.dbファイルが生成され、元の設定ルールはクリアされます。

以下は設定ファイルproxysql.cnfの主要内容です:

datadir="/var/lib/proxysql"         #Data directory
admin_variables=
{
admin_credentials="admin:admin" # Admin database username and password.
mysql_ifaces="0.0.0.0:6032" # Admin database port, used for connecting admin database of ProxySQL
}
mysql_variables=
{
threads=4
max_connections=2048
default_query_delay=0
default_query_timeout=36000000
have_compress=true
poll_timeout=2000
interfaces="0.0.0.0:6030"
default_schema="information_schema"
stacksize=1048576
server_version="5.7.99"
connect_timeout_server=3000
monitor_username="monitor"
monitor_password="monitor"
monitor_history=600000
monitor_connect_interval=60000
monitor_ping_interval=10000
monitor_read_only_interval=1500
monitor_read_only_timeout=500
ping_interval_server_msec=120000
ping_timeout_server=500
commands_stats=true
sessions_sort=true
connect_retries_on_failure=10
}
mysql_servers =
(
)
mysql_users:
(
)
mysql_query_rules:
(
)
scheduler=
(
)
mysql_replication_hostgroups=
(
)

ProxySQL Admin データベースに接続する

mysql -uadmin -padmin -P6032 -hdoris01
ProxySQL > show databases;
+-----+---------------+-------------------------------------+
| seq | name | file |
+-----+---------------+-------------------------------------+
| 0 | main | |
| 2 | disk | /var/lib/proxysql/proxysql.db |
| 3 | stats | |
| 4 | monitor | |
| 5 | stats_history | /var/lib/proxysql/proxysql_stats.db |
+-----+---------------+-------------------------------------+
5 rows in set (0.000 sec)
ProxySQL > use main;

ProxySQL > show tables;
+--------------------------------------------+
| tables |
+--------------------------------------------+
| global_variables |
| mysql_collations |
| mysql_group_replication_hostgroups |
| mysql_query_rules |
| mysql_query_rules_fast_routing |
| mysql_replication_hostgroups |
| mysql_servers |
| mysql_users |
| proxysql_servers |
| runtime_checksums_values |
| runtime_global_variables |
| runtime_mysql_group_replication_hostgroups |
| runtime_mysql_query_rules |
| runtime_mysql_query_rules_fast_routing |
| runtime_mysql_replication_hostgroups |
| runtime_mysql_servers |
| runtime_mysql_users |
| runtime_proxysql_servers |
| runtime_scheduler |
| scheduler |
+--------------------------------------------+
20 rows in set (0.000 sec)

ProxySQL で Backend Doris FE を設定する

INSERT 文を使用して、プロキシが必要な FE ノードとポートを mysql_servers テーブルに追加します。

ここで:hostgroup_id10 は書き込みグループを示し、20 は読み取りグループを示します。ここでは読み書き分離は不要なので、任意に設定できます。

mysql -uadmin -padmin -P6032 -h127.0.0.1
ProxySQL > insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.0.101',9030);
Query OK, 1 row affected (0.000 sec)

ProxySQL > insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.0.102',9030);
Query OK, 1 row affected (0.000 sec)

ProxySQL > insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.0.103',9030);
Query OK, 1 row affected (0.000 sec)

結果を確認:

ProxySQL > select hostgroup_id,hostname,port,status,weight from mysql_servers;
+--------------+---------------+------+--------+--------+
| hostgroup_id | hostname | port | status | weight |
+--------------+---------------+------+--------+--------+
| 10 | 192.168.0.101 | 9030 | ONLINE | 1 |
| 20 | 192.168.0.102 | 9030 | ONLINE | 1 |
| 20 | 192.168.0.103 | 9030 | ONLINE | 1 |
+--------------+---------------+------+--------+--------+
3 rows in set (0.000 sec)

挿入中にエラーが発生した場合:

ERROR 1045 (#2800): UNIQUE constraint failed: mysql_servers.hostgroup_id, mysql_servers.hostname, mysql_servers.port

これは、他の設定が以前に定義されている可能性があることを示しています。このテーブルを空にするか、対応するホストの設定を削除することができます:

ProxySQL > select * from mysql_servers;
ProxySQL > delete from mysql_servers;
Query OK, 6 rows affected (0.000 sec)

情報を保存:

ProxySQL > load mysql servers to runtime;
Query OK, 0 rows affected (0.006 sec)

ProxySQL > save mysql servers to disk;
Query OK, 0 rows affected (0.348 sec)

Doris FEノードの監視設定

Doris FEノードを追加した後、これらのバックエンドノードを監視する必要があります。

まず、Dorisで監視用のユーザーを作成します:

mysql -uroot -P9030 -h192.168.0.101
Doris > create user monitor@'192.168.0.100' identified by 'P@ssword1!';
Query OK, 0 rows affected (0.03 sec)

Doris > grant ADMIN_PRIV on *.* to monitor@'192.168.0.100';
Query OK, 0 rows affected (0.02 sec)

その後、mysql-proxy プロキシレイヤーノードに戻り、監視を設定します

mysql -uadmin -padmin -P6032 -h127.0.0.1
ProxySQL > set mysql-monitor_username='monitor';
Query OK, 1 row affected (0.000 sec)

ProxySQL > set mysql-monitor_password='P@ssword1!';
Query OK, 1 row affected (0.000 sec)

設定を保存して終了:

ProxySQL > load mysql servers to runtime;
Query OK, 0 rows affected (0.006 sec)

ProxySQL > save mysql servers to disk;
Query OK, 0 rows affected (0.348 sec)

検証監視結果。

ProxySQL監視モジュールのメトリクスはすべてmonitor.logテーブルに保存されます。

接続監視:

ProxySQL > select * from mysql_server_connect_log;
+---------------+------+------------------+-------------------------+---------------+
| hostname | port | time_start_us | connect_success_time_us | connect_error |
+---------------+------+------------------+-------------------------+---------------+
| 192.168.0.101 | 9030 | 1548665195883957 | 762 | NULL |
| 192.168.0.102 | 9030 | 1548665195894099 | 399 | NULL |
| 192.168.0.103 | 9030 | 1548665195904266 | 483 | NULL |
| 192.168.0.101 | 9030 | 1548665255883715 | 824 | NULL |
| 192.168.0.102 | 9030 | 1548665255893942 | 656 | NULL |
| 192.168.0.101 | 9030 | 1548665495884125 | 615 | NULL |
| 192.168.0.102 | 9030 | 1548665495894254 | 441 | NULL |
| 192.168.0.103 | 9030 | 1548665495904479 | 638 | NULL |
| 192.168.0.101 | 9030 | 1548665512917846 | 487 | NULL |
| 192.168.0.102 | 9030 | 1548665512928071 | 994 | NULL |
| 192.168.0.103 | 9030 | 1548665512938268 | 613 | NULL |
+---------------+------+------------------+-------------------------+---------------+
20 rows in set (0.000 sec)

Heartbeat監視:

ProxySQL > select * from mysql_server_ping_log;
+---------------+------+------------------+----------------------+------------+
| hostname | port | time_start_us | ping_success_time_us | ping_error |
+---------------+------+------------------+----------------------+------------+
| 192.168.0.101 | 9030 | 1548665195883407 | 98 | NULL |
| 192.168.0.102 | 9030 | 1548665195885128 | 119 | NULL |
...........
| 192.168.0.102 | 9030 | 1548665415889362 | 106 | NULL |
| 192.168.0.103 | 9030 | 1548665562898295 | 97 | NULL |
+---------------+------+------------------+----------------------+------------+
110 rows in set (0.001 sec)

Client IP Passthrough

ほとんどの場合、プロキシサービス経由でバックエンドのDorisサービスに接続する際、クライアントIP情報が失われ、DorisサーバーはプロキシサーバーのIPアドレス情報のみを取得できます。

バージョン2.1.1以降、DorisはProxy Protocolプロトコルをサポートしています。このプロトコルを使用することで、クライアントIPパススルーを実装でき、ロードバランシングを経由した後でも、Dorisがクライアントの実際のIPを取得してホワイトリストやその他の権限制御を実装できます。

以下では、NginxとHaproxyでそれぞれProxy Protocolを有効にする方法を紹介します。

DorisでProxy Protocolサポートを有効にする

FEのfe.confに追加:

enable_proxy_protocol = true
注記
  1. Proxy Protocol V1のみサポートしています。

  2. MySQLプロトコルポートのみサポートし、影響を与えます。HTTP、ADBC、およびその他のプロトコルポートはサポートしておらず、影響を与えません。

  3. Doris 3.1バージョン以前では、有効化後はProxy Protocolプロトコルを使用して接続する必要があり、そうでなければ接続に失敗します。バージョン3.1以降では、Proxy Protocolを有効化した後でも、標準のMySQL接続プロトコルを使用して接続できます。

01 Nginx

設定ファイルのserverセクションにproxy_protocol on;を追加します:

events {
worker_connections 1024;
}
stream {
upstream mysqld {
hash $remote_addr consistent;
server 192.168.1.101:9030 weight=1 max_fails=2 fail_timeout=60s;
server 192.168.1.102:9030 weight=1 max_fails=2 fail_timeout=60s;
server 192.168.1.103:9030 weight=1 max_fails=2 fail_timeout=60s;
}
server {
# Proxy port
listen 6030;
proxy_connect_timeout 300s;
proxy_timeout 300s;
proxy_pass mysqld;
# Enable Proxy Protocol to the upstream server
proxy_protocol on;
}
}

02 HAProxy

haproxy.cfgbackendセクションにsend-proxyパラメータを追加します:

backend forward-fe
mode tcp
balance roundrobin
server fe-1 192.168.1.101:9030 weight 1 check inter 3000 rise 2 fall 3 send-proxy
server fe-2 192.168.1.102:9030 weight 1 check inter 3000 rise 2 fall 3 send-proxy
server fe-3 192.168.1.103:9030 weight 1 check inter 3000 rise 2 fall 3 send-proxy

IP パススルー成功の確認

プロキシ経由でDorisに接続:

mysql -uroot -P6030 -h192.168.1.100

検証する

mysql> show processlist;
+------------------+------+------+-------------------+---------------------+----------+------+---------+------+-------+-----------------------------------+------------------+
| CurrentConnected | Id | User | Host | LoginTime | Catalog | Db | Command | Time | State | QueryId | Info |
+------------------+------+------+-------------------+---------------------+----------+------+---------+------+-------+-----------------------------------+------------------+
| Yes | 1 | root | 192.168.1.101:34390 | 2024-03-17 16:32:22 | internal | | Query | 0 | OK | 82edc460d93f4e28-8bbed058a068e259 | show processlist |
+------------------+------+------+-------------------+---------------------+----------+------+---------+------+-------+-----------------------------------+------------------+
1 row in set (0.00 sec)

Host列に実際のクライアントIPが表示されれば、検証は成功です。そうでない場合は、プロキシサービスのIPアドレスのみが表示されます。

同時に、実際のクライアントIPはfe.audit.logにも記録されます。