负载均衡

    自己在应用层代码进行重试和负载均衡。比如发现一个连接挂掉,就自动在其他连接上进行重试。应用层代码重试需要应用自己配置多个 doris 前端节点地址。

    如果使用 mysql jdbc connector 来连接 Doris,可以使用 jdbc 的自动重试机制:

    详细可以参考Mysql官网文档

    ProxySQL是灵活强大的MySQL代理层, 是一个能实实在在用在生产环境的MySQL中间件,可以实现读写分离,支持 Query 路由功能,支持动态指定某个 SQL 进行 cache,支持动态加载配置、故障切换和一些 SQL的过滤功能。

    Doris 的 FE 进程负责接收用户连接和查询请求,其本身是可以横向扩展且高可用的,但是需要用户在多个 FE 上架设一层 proxy,来实现自动的连接负载均衡。

    1. # vim /etc/yum.repos.d/proxysql.repo
    2. [proxysql_repo]
    3. name= ProxySQL YUM repository
    4. baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
    5. gpgcheck=1
    6. gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
    7. 执行安装
    8. # yum clean all
    9. # yum makecache
    10. # yum -y install proxysql
    11. 查看版本
    12. # proxysql --version
    13. ProxySQL version 1.4.13-15-g69d4207, codename Truls
    14. 设置开机自启动
    15. # systemctl enable proxysql
    16. # systemctl start proxysql
    17. # systemctl status proxysql
    18. 启动后会监听两个端口, 默认为603260336032端口是ProxySQL的管理端口,6033ProxySQL对外提供服务的端口 (即连接到转发后端的真正数据库的转发端口)。
    19. # netstat -tunlp
    20. Active Internet connections (only servers)
    21. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
    22. tcp 0 0 0.0.0.0:6032 0.0.0.0:* LISTEN 23940/proxysql
    23. tcp 0 0 0.0.0.0:6033 0.0.0.0:* LISTEN

    ProxySQL 配置

    ProxySQL 有配置文件 /etc/proxysql.cnf 和配置数据库文件/var/lib/proxysql/proxysql.db这里需要特别注意:如果存在如果存在"proxysql.db"文件(在/var/lib/proxysql目录下),则 ProxySQL 服务只有在第一次启动时才会去读取proxysql.cnf文件并解析;后面启动会就不会读取proxysql.cnf文件了!如果想要让proxysql.cnf 文件里的配置在重启 proxysql 服务后生效(即想要让 proxysql 重启时读取并解析 proxysql.cnf配置文件),则需要先删除 /var/lib/proxysql/proxysql.db数据库文件,然后再重启 proxysql 服务。这样就相当于初始化启动 proxysql 服务了,会再次生产一个纯净的 proxysql.db 数据库文件(如果之前配置了 proxysql 相关路由规则等,则就会被抹掉)

    查看及修改配置文件

    1. # egrep -v "^#|^$" /etc/proxysql.cnf
    2. datadir="/var/lib/proxysql" #数据目录
    3. admin_variables=
    4. {
    5. admin_credentials="admin:admin" #连接管理端的用户名与密码
    6. mysql_ifaces="0.0.0.0:6032" #管理端口,用来连接proxysql的管理数据库
    7. }
    8. mysql_variables=
    9. {
    10. threads=4 #指定转发端口开启的线程数量
    11. max_connections=2048
    12. default_query_delay=0
    13. default_query_timeout=36000000
    14. have_compress=true
    15. poll_timeout=2000
    16. interfaces="0.0.0.0:6033" #指定转发端口,用于连接后端mysql数据库的,相当于代理作用
    17. default_schema="information_schema"
    18. stacksize=1048576
    19. server_version="5.5.30" #指定后端mysql的版本
    20. connect_timeout_server=3000
    21. monitor_username="monitor"
    22. monitor_password="monitor"
    23. monitor_history=600000
    24. monitor_connect_interval=60000
    25. monitor_ping_interval=10000
    26. monitor_read_only_interval=1500
    27. monitor_read_only_timeout=500
    28. ping_interval_server_msec=120000
    29. ping_timeout_server=500
    30. commands_stats=true
    31. sessions_sort=true
    32. connect_retries_on_failure=10
    33. }
    34. mysql_servers =
    35. (
    36. )
    37. mysql_users:
    38. (
    39. )
    40. mysql_query_rules:
    41. (
    42. )
    43. scheduler=
    44. (
    45. )
    46. mysql_replication_hostgroups=
    47. (
    48. )

    连接 ProxySQL 管理端口测试

    1. # mysql -uadmin -padmin -P6032 -hdoris01
    2. 查看main库(默认登陆后即在此库)的global_variables表信息
    3. MySQL [(none)]> show databases;
    4. +-----+---------------+-------------------------------------+
    5. | seq | name | file |
    6. +-----+---------------+-------------------------------------+
    7. | 0 | main | |
    8. | 2 | disk | /var/lib/proxysql/proxysql.db |
    9. | 3 | stats | |
    10. | 4 | monitor | |
    11. | 5 | stats_history | /var/lib/proxysql/proxysql_stats.db |
    12. +-----+---------------+-------------------------------------+
    13. 5 rows in set (0.000 sec)
    14. MySQL [(none)]> use main;
    15. Reading table information for completion of table and column names
    16. You can turn off this feature to get a quicker startup with -A
    17. MySQL [main]> show tables;
    18. +--------------------------------------------+
    19. | tables |
    20. +--------------------------------------------+
    21. | global_variables |
    22. | mysql_collations |
    23. | mysql_group_replication_hostgroups |
    24. | mysql_query_rules |
    25. | mysql_replication_hostgroups |
    26. | mysql_servers |
    27. | mysql_users |
    28. | proxysql_servers |
    29. | runtime_checksums_values |
    30. | runtime_global_variables |
    31. | runtime_mysql_group_replication_hostgroups |
    32. | runtime_mysql_query_rules |
    33. | runtime_mysql_query_rules_fast_routing |
    34. | runtime_mysql_replication_hostgroups |
    35. | runtime_mysql_servers |
    36. | runtime_mysql_users |
    37. | runtime_proxysql_servers |
    38. | runtime_scheduler |
    39. | scheduler |
    40. +--------------------------------------------+
    41. 20 rows in set (0.000 sec)

    ProxySQL 配置后端 Doris FE

    使用 insert 语句添加主机到 mysql_servers 表中,其中:hostgroup_id 为10表示写组,为20表示读组,我们这里不需要读写分离,无所谓随便设置哪一个都可以。

    1. [root@mysql-proxy ~]# mysql -uadmin -padmin -P6032 -h127.0.0.1
    2. ............
    3. MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.9.211',9030);
    4. Query OK, 1 row affected (0.000 sec)
    5. MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.9.212',9030);
    6. Query OK, 1 row affected (0.000 sec)
    7. MySQL [(none)]> insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.9.213',9030);
    8. Query OK, 1 row affected (0.000 sec)
    9. 如果在插入过程中,出现报错:
    10. ERROR 1045 (#2800): UNIQUE constraint failed: mysql_servers.hostgroup_id, mysql_servers.hostname, mysql_servers.port
    11. 说明可能之前就已经定义了其他配置,可以清空这张表 或者 删除对应host的配置
    12. MySQL [(none)]> select * from mysql_servers;
    13. MySQL [(none)]> delete from mysql_servers;
    14. Query OK, 6 rows affected (0.000 sec)
    15. 查看这3个节点是否插入成功,以及它们的状态。
    16. MySQL [(none)]> select * from mysql_servers\G;
    17. *************************** 1. row ***************************
    18. hostgroup_id: 10
    19. hostname: 192.168.9.211
    20. port: 9030
    21. status: ONLINE
    22. weight: 1
    23. compression: 0
    24. max_connections: 1000
    25. max_replication_lag: 0
    26. use_ssl: 0
    27. max_latency_ms: 0
    28. comment:
    29. *************************** 2. row ***************************
    30. hostgroup_id: 10
    31. hostname: 192.168.9.212
    32. port: 9030
    33. status: ONLINE
    34. weight: 1
    35. compression: 0
    36. max_connections: 1000
    37. max_replication_lag: 0
    38. use_ssl: 0
    39. max_latency_ms: 0
    40. comment:
    41. *************************** 3. row ***************************
    42. hostgroup_id: 10
    43. hostname: 192.168.9.213
    44. port: 9030
    45. status: ONLINE
    46. weight: 1
    47. compression: 0
    48. max_connections: 1000
    49. max_replication_lag: 0
    50. use_ssl: 0
    51. max_latency_ms: 0
    52. comment:
    53. 6 rows in set (0.000 sec)
    54. ERROR: No query specified
    55. 如上修改后,加载到RUNTIME,并保存到disk,下面两步非常重要,不然退出以后你的配置信息就没了,必须保存
    56. MySQL [(none)]> load mysql servers to runtime;
    57. Query OK, 0 rows affected (0.006 sec)
    58. MySQL [(none)]> save mysql servers to disk;
    59. Query OK, 0 rows affected (0.348 sec)

    监控Doris FE节点配置

    添 doris fe 节点之后,还需要监控这些后端节点。对于后端多个FE高可用负载均衡环境来说,这是必须的,因为 ProxySQL 需要通过每个节点的 read_only 值来自动调整

    它们是属于读组还是写组。

    首先在后端master主数据节点上创建一个用于监控的用户名

    配置Doris用户

    上面的所有配置都是关于后端 Doris FE 节点的,现在可以配置关于 SQL 语句的,包括:发送 SQL 语句的用户、SQL 语句的路由规则、SQL 查询的缓存、SQL 语句的重写等等。

    本小节是 SQL 请求所使用的用户配置,例如 root 用户。这要求我们需要先在后端 Doris FE 节点添加好相关用户。这里以 root 和 doris 两个用户名为例.

    1. 首先,在Doris FE master主数据库节点上执行:
    2. # mysql -P9030 -uroot -p
    3. .........
    4. mysql> create user doris@'%' identified by 'P@ssword1!';
    5. Query OK, 0 rows affected, 1 warning (0.04 sec)
    6. mysql> grant ADMIN_PRIV on *.* to doris@'%';
    7. Query OK, 0 rows affected, 1 warning (0.03 sec)
    8. 然后回到mysql-proxy代理层节点,配置mysql_users表,将刚才的两个用户添加到该表中。
    9. admin> insert into mysql_users(username,password,default_hostgroup) values('root','',10);
    10. Query OK, 1 row affected (0.001 sec)
    11. admin> insert into mysql_users(username,password,default_hostgroup) values('doris','P@ssword1!',10);
    12. Query OK, 1 row affected (0.000 sec)
    13. 加载用户到运行环境中,并将用户信息保存到磁盘
    14. admin> load mysql users to runtime;
    15. Query OK, 0 rows affected (0.001 sec)
    16. Query OK, 0 rows affected (0.108 sec)
    17. mysql_users表有不少字段,最主要的三个字段为usernamepassworddefault_hostgroup
    18. - username:前端连接ProxySQL,以及ProxySQLSQL语句路由给MySQL所使用的用户名。
    19. - password:用户名对应的密码。可以是明文密码,也可以是hash密码。如果想使用hash密码,可以先在某个MySQL节点上执行
    20. select password(PASSWORD),然后将加密结果复制到该字段。
    21. - default_hostgroup:该用户名默认的路由目标。例如,指定root用户的该字段值为10时,则使用root用户发送的SQL语句默认
    22. 情况下将路由到hostgroup_id=10组中的某个节点。
    23. admin> select * from mysql_users\G
    24. *************************** 1. row ***************************
    25. username: root
    26. password:
    27. active: 1
    28. use_ssl: 0
    29. default_hostgroup: 10
    30. default_schema: NULL
    31. schema_locked: 0
    32. transaction_persistent: 1
    33. fast_forward: 0
    34. backend: 1
    35. frontend: 1
    36. max_connections: 10000
    37. *************************** 2. row ***************************
    38. username: doris
    39. password: P@ssword1!
    40. active: 1
    41. use_ssl: 0
    42. default_hostgroup: 10
    43. default_schema: NULL
    44. schema_locked: 0
    45. transaction_persistent: 1
    46. fast_forward: 0
    47. backend: 1
    48. frontend: 1
    49. max_connections: 10000
    50. 2 rows in set (0.000 sec)
    51. 虽然这里没有详细介绍mysql_users表,但只有active=1的用户才是有效的用户。
    52. MySQL [(none)]> load mysql users to runtime;
    53. Query OK, 0 rows affected (0.001 sec)
    54. MySQL [(none)]> save mysql users to disk;
    55. Query OK, 0 rows affected (0.123 sec)
    56. 这样就可以通过sql客户端,使用doris的用户名密码去连接了ProxySQL

    通过 ProxySQL 连接 Doris 进行测试

    1. #mysql -uroot -p -P6033 -hdoris01 -e "show databases;"
    2. Enter password:
    3. ERROR 9001 (HY000) at line 1: Max connect timeout reached while reaching hostgroup 10 after 10000ms
    4. 这个时候发现出错,并没有转发到后端真正的doris fe
    5. 通过日志看到有set autocommit=0 这样开启事务
    6. 检查配置发现:
    7. mysql-forward_autocommit=false
    8. mysql-autocommit_false_is_transaction=false
    9. 我们这里不需要读写分离,只需要将这两个参数通过下面语句直接搞成true就可以了
    10. mysql> UPDATE global_variables SET variable_value='true' WHERE variable_name='mysql-forward_autocommit';
    11. Query OK, 1 row affected (0.00 sec)
    12. mysql> UPDATE global_variables SET variable_value='true' WHERE variable_name='mysql-autocommit_false_is_transaction';
    13. Query OK, 1 row affected (0.01 sec)
    14. mysql> LOAD MYSQL VARIABLES TO RUNTIME;
    15. Query OK, 0 rows affected (0.00 sec)
    16. mysql> SAVE MYSQL VARIABLES TO DISK;
    17. Query OK, 98 rows affected (0.12 sec)
    18. 然后我们在重新试一下,显示成功
    19. [root@doris01 ~]# mysql -udoris -pP@ssword1! -P6033 -h192.168.9.211 -e "show databases;"
    20. Warning: Using a password on the command line interface can be insecure.
    21. +--------------------+
    22. | Database |
    23. +--------------------+
    24. | doris_audit_db |
    25. | information_schema |
    26. | retail |
    27. +--------------------+

    OK,到此就结束了,你就可以用 Mysql 客户端,JDBC 等任何连接 mysql 的方式连接 ProxySQL 去操作你的 doris 了

    概述

    Nginx能够实现HTTP、HTTPS协议的负载均衡,也能够实现TCP协议的负载均衡。那么,问题来了,可不可以通过Nginx实现Apache Doris数据库的负载均衡呢?答案是:可以。接下来,就让我们一起探讨下如何使用Nginx实现Apache Doris的负载均衡。

    注意:使用Nginx实现Apache Doris数据库的负载均衡,前提是要搭建Apache Doris的环境,Apache Doris FE的IP和端口分别如下所示, 这里我是用一个FE来做演示的,多个FE只需要在配置里添加多个FE的IP地址和端口即可

    通过Nginx访问MySQL的Apache Doris和端口如下所示。

    1. IP: 172.31.7.119
    2. 端口: 9030

    安装依赖

    1. sudo apt-get install build-essential
    2. sudo apt-get install libpcre3 libpcre3-dev
    3. sudo apt-get install zlib1g-dev
    4. sudo apt-get install openssl libssl-dev

    安装Nginx

    这里是新建了一个配置文件

    1. vim /usr/local/nginx/conf/default.conf

    然后在里面加上下面的内容

    1. events {
    2. worker_connections 1024;
    3. }
    4. stream {
    5. upstream mysqld {
    6. hash $remote_addr consistent;
    7. server 172.31.7.119:9030 weight=1 max_fails=2 fail_timeout=60s;
    8. ##注意这里如果是多个FE,加载这里就行了
    9. }
    10. ###这里是配置代理的端口,超时时间等
    11. server {
    12. listen 6030;
    13. proxy_connect_timeout 300s;
    14. proxy_timeout 300s;
    15. proxy_pass mysqld;
    16. }
    17. }

    启动Nginx

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

    验证

      参数解释:-u 指定Doris用户名-p 指定Doris密码,我这里密码是空,所以没有-h 指定Nginx代理服务器IP-P 指定端口