doris:负载均衡

用户通过 FE 的查询端口(query_port,默认 9030)使用 MySQL 协议连接 Doris。当部署多个 FE 节点时,用户可以在多个 FE 之上部署负载均衡层来实现 Doris 查询的高可用。

本文档介绍多种适用于 Doris 的负载均衡方案,并介绍如何通过 Proxy Protocol 实现客户端 IP 透传。

负载均衡​

本文使用以下三个 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 官网文档

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 portlisten 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

验证​

使用代理端口进行连接:

mysql -uroot -P6030 -h192.168.1.100mysql> 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
    

    添加内容:

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

    参数说明:

    • -c 2:使用兼容模式,默认是 -c 5
    • -r:开启远程日志。
    • ·-m 0`:标记时间戳。单位是分钟,为 0 时,表示禁用该功能。

    使修改生效:

    systemctl restart rsyslog

  3. 编辑负载均衡文件

    vim /usr/local/haproxy/haproxy.cfg
    

    globalmaxconn         2000ulimit-n        40075log             127.0.0.1 local0 infouid             200gid             200chroot          /var/emptydaemongroup           haproxyuser            haproxydefaultslog globalmode httpretries 3option redispatchtimeout connect 5000timeout client 5000timeout server 5000timeout check 2000frontend agent-frontbind *:6030mode tcpdefault_backend forward-febackend forward-femode tcpbalance roundrobinserver fe-1 192.168.1.101:9030 weight 1 check inter 3000 rise 2 fall 3server fe-2 192.168.1.102:9030 weight 1 check inter 3000 rise 2 fall 3server 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 是基于 MySQL 的开源数据库代理软件,用 C 语言编写。能实现连接管理、读写分离、负载均衡、故障切换等功能,具有高性能、可配置、动态管理等优势,常用于 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"         #数据目录
admin_variables=
{admin_credentials="admin:admin"  # Admin databse username and password.mysql_ifaces="0.0.0.0:6032"    # Admin database port, used for connecting admin database of ProxySQL
}
mysql_variables=
{threads=4max_connections=2048default_query_delay=0default_query_timeout=36000000have_compress=truepoll_timeout=2000interfaces="0.0.0.0:6030"default_schema="information_schema"stacksize=1048576server_version="5.7.99"connect_timeout_server=3000monitor_username="monitor"monitor_password="monitor"monitor_history=600000monitor_connect_interval=60000monitor_ping_interval=10000monitor_read_only_interval=1500monitor_read_only_timeout=500ping_interval_server_msec=120000ping_timeout_server=500commands_stats=truesessions_sort=trueconnect_retries_on_failure=10
}
mysql_servers =
(
)
mysql_users:
(
)
mysql_query_rules:
(
)
scheduler=
(
)
mysql_replication_hostgroups=
(
)

连接 ProxySQL 管理数据库​
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 配置后端 Doris FE​

使用 INSERT 语句将需要被代理的 FE 节点和端口添加到 mysql_servers 表中。

其中:hostgroup_id 为 10 表示写组,为 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

说明可能之前就已经定义了其他配置,可以清空这张表,或者删除对应 host 的配置:

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)

然后回到 ProxySQL 代理层节点上配置监控

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)

心跳监控:

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)

客户端 IP 透传​

多数情况下,通过代理服务连接到后端 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 portlisten 6030;proxy_connect_timeout 300s;proxy_timeout 300s;proxy_pass mysqld;# Enable Proxy Protocol to the upstream serverproxy_protocol on;}
}

02 HAProxy​

在 haproxy.cfg 的 backend 部分新增 send-proxy 参数:

backend forward-femode tcpbalance roundrobinserver fe-1 192.168.1.101:9030 weight 1 check inter 3000 rise 2 fall 3 send-proxyserver fe-2 192.168.1.102:9030 weight 1 check inter 3000 rise 2 fall 3 send-proxyserver 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 地址。

同时,在 fe.audit.log 中也会记录真实的客户端 IP。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/74139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【大语言模型_6】mindie启动模型错误整理

一、启动报 [hccl_runner.cpp:141] AllGatherHcclRunner:0 HcclCommInitRootInfo fa il, error:2, rank:0, rankSize:2 背景:运行DeepSeek-R1-Distill-Qwen-14B模型,在2张300 P卡可以运行,单独一张启动报以上错误。 问题分析&…

dcat-admin已完成项目部署注意事项

必须 composer update 更新项目php artisan admin:publish 发布dcatadmin的静态资源手动创建目录(如果没有) storage/appstorage/framework/cachestorage/framework/sessionsstorage/framework/views 需检查 php不要禁用以下函数 putenvsymlinkproc_…

【计算机网络】网络简介

文章目录 1. 局域网与广域网1.1 局域网1.2 广域网 2. 路由器和交换机3. 五元组3.1 IP和端口3.2 协议3.3 协议分层 4. OSI七层网络协议5. TCP/IP五层模型5.1 TCP/IP模型介绍5.2 网络设备所在分层 6. 封装与分用6.1 数据包的称谓6.2 封装6.3 分用 1. 局域网与广域网 1.1 局域网 …

在QT中进行控件提升操作

目录 一、概述 二、功能需求 三、提升操作 1)拖入标准控件 2)自定义类 3)提升控件 一、概述 QT中提供的标准控件能够满足我们大多数情况下的功能需求,但是在一些特殊应用场合,我们可能需要对控件的功能进行扩展&am…

如何自定义知行之桥Webhook端口返回的Response消息

一、Webhook端口功能概述 知行之桥的Webhook端口提供灵活的消息响应机制,支持用户通过修改配置文件自定义返回的消息体内容,能够查看是否调用接口成功、数据是否推送成功以及自定义返回给用户端的响应内容。 本指南将详解如何通过脚本配置实现以下需求…

pnpm config set ignore-workspace-root-check true

异常 ERR_PNPM_ADDING_TO_ROOT  Running this command will add the dependency to the workspace root, which might not be what you want - if you really meant it, make it explicit by running this command again with the -w flag (or --workspace-root). If you don…

【iOS】SwiftUI 路由管理(NavigationStack)

QDRouter.swift import SwiftUIMainActor class QDRouter: ObservableObject {Published var path NavigationPath()static let main QDRouter() // 单例private init() {}func open(_ url: String) {guard let url URL(string: url) else {return}UIApplication.shared.op…

蓝桥杯学习-13回溯

13回溯 一、回溯1 例题1–递归实现排列型枚举-蓝桥19684 1.递归可以解决不定次数的循环问题 2.使用数组来标记数字是否被选过import java.util.Scanner;public class Main {static int n;static boolean[] st new boolean[10]; //判断数字是否被选过static int[] path ne…

【IDEA中配置Maven国内镜像源】

1. 为什么需要配置国内镜像源? 首先,Maven本身的工作原理是通过从仓库中下载依赖包。而这些依赖通常来自于 Maven中央仓库(位于国外),由于网络原因,我们在国内访问这些远程仓库的速度比较慢,甚至…

【QA】观察者模式在QT有哪些应用?

1. 信号与槽机制 Qt的**信号与槽(Signals & Slots)**是观察者模式的典型实现,通过元对象系统(Meta-Object System)实现松耦合通信。 核心特点: 类型安全:编译时检查参数匹配跨线程支持&…

uniapp中的路由、本地存储与网络请求

navigator 在UniApp中,navigator 组件用于页面跳转和应用内导航。 基本使用 属性: url: 需要跳转的目标页面路径,路径可以是相对路径或绝对路径。open-type: 跳转的方式,默认为 navigateTo。其他可选值包括:redirec…

python3使用lxml解析xml时踩坑记录

文章目录 你的 XML 数据解析 XML----------------------------1. 获取 mlt 根元素的属性--------------------------------------------------------2. 获取 chain 元素的属性--------------------------------------------------------3. 获取所有 property 的值-------------…

【DeepSeek 学c++】dynamic_cast 原理

用于向下转化。 父类引用指向指类对象 假设父亲是a, 子类是b. B* pb new B; 子类对象 A* pa 父类引用指向子类对象, 那么向上转化 Apa pb 这个是自动完成的,隐式转化,不需要dynamic_cast 向下转化指的是 A pa new B。 这个是指向子类对象…

c++ 数组索引越界检查

用 c 编写了一些程序&#xff0c;发现 c 不会自动检查数组的索引越界问题。有时候程序运行错误&#xff0c;提示的错误信息莫名其妙&#xff0c;但很可能是某个数组越界的问题。 例如&#xff1a; #include <iostream>int main() {double arr[5] {1.1, 2.2, 3.3, 4.4,…

Touch Diver:Weart为XR和机器人遥操作专属设计的触觉反馈动捕手套

在虚拟现实&#xff08;VR&#xff09;和扩展现实&#xff08;XR&#xff09;领域&#xff0c;触觉反馈技术正逐渐成为提升沉浸感和交互体验的重要因素。Weart作为这一领域的创新者&#xff0c;凭借其TouchDIVER Pro和TouchDIVER G1触觉手套&#xff0c;为用户带来了高度逼真的…

基于deepseek的智能语音客服【第二讲】后端异步接口调用封装

本篇内容主要讲前端请求&#xff08;不包含&#xff09;访问后端服务接口&#xff0c;接口通过检索知识库&#xff0c;封装提示词&#xff0c;调用deepseek的&#xff0c;并返回给前端的全过程&#xff0c;非完整代码&#xff0c;不可直接运行。 1.基于servlet封装异步请求 为…

归并排序的思路与实现

归并排序主要是两大模块 分治 和 合并 即将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有序&#xff0c;再使子序列段间有序。若将两个有序表合并成一个有序表&#xff0c;称为二路归并 由于使用了新的数组 那么空间复杂度就为O(n) 但这…

Word中公式自动标号带章节编号

&#xff08;1&#xff09;插入一行三列的表格&#xff0c;设置宽度分别为0.5&#xff0c;13.39和1.5&#xff0c;设置纵向居中&#xff0c;中间列居中对齐&#xff0c;最右侧列靠右对齐&#xff0c;设置段落如下 &#xff08;2&#xff09;插入域代码 【Word】利用域代码快速实…

阿里云服务器环境部署 四 MySQL主从配置

安装MySQL 导入mysql镜像 docker load -i /opt/dockerinstall/mysql/mysql-8.1.0.tar docker run --privilegedtrue --name mysql8 --restartunless-stopped -e MYSQL_ROOT_PASSWORD123456 -p 3306:3306 -v /usr/local/mysql/logs:/var/log/mysql -v /usr/local/mysql/d…

[RH342]iscsi配置与排错

[RH342]iscsi配置与排错 1. 服务端配置1.1 安装targetcli1.2 准备磁盘1.3 服务端配置1.4 防火墙配置 2. 客户端配置2.1 安装客户端软件2.2 配置客户端2.3 连接登录服务端2.4 挂载使用 3. 安全验证扩展3.1 服务端3.2 客户端 4. 常见的排错点4.1 服务端常见错误4.2 客户端常见错误…