6)、ProxySQL 方式负载均衡

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

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

一、安装ProxySQL (yum方式)

1、配置yum源

vim /etc/yum.repos.d/proxysql.repo

新建文件,添加如下内容

[proxysql_repo]
name= ProxySQL YUM repository
baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
gpgcheck=1
gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key

2、安装

yum clean all yum makecache yum -y install proxysql

查看版本

proxysql --version


设置开机自启动

systemctl enable proxysql
systemctl start proxysql      
systemctl status proxysql

启动后会监听两个端口, 默认为6032和6033。6032端口是ProxySQL的管理端口,6033是ProxySQL对外提供服务的端口 (即连接到转发后端的真正数据库的转发端口)。

netstat -tunlp


3、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)查看及修改配置文件

vim /etc/proxysql.cnf


2)、连接 ProxySQL 管理端口测试

mysql -uadmin -padmin -P6032 -h127.0.0.1
show databases;

use main;
show tables;


3)、ProxySQL 配置后端 Doris FE

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

mysql -uadmin -padmin -P6032 -h127.0.0.1
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'10.9.70.166',9030);
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'10.9.70.168',9030);
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'10.9.70.87',9030);


错误如果在插入过程中,出现报错:

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

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

MySQL [(none)]> select * from mysql_servers;
MySQL [(none)]> delete from mysql_servers;
Query OK, 6 rows affected (0.000 sec)

查看这3个节点是否插入成功,以及它们的状态。

select * from mysql_servers\G;


如上修改后,加载到RUNTIME,并保存到disk,下面两步非常重要,不然退出以后你的配置信息就没了,必须保存

load mysql servers to runtime;
save mysql servers to disk;


4)、监控Doris FE节点配置

添 doris fe 节点之后,还需要监控这些后端节点。对于后端多个FE高可用负载均衡环境来说,这是必须的,因为 ProxySQL
需要通过每个节点的 read_only 值来自动调整
它们是属于读组还是写组。
首先在后端master主数据节点上创建一个用于监控的用户名

在doris fe master主数据库节点行执行:

mysql -P9030 -uroot -h10.9.70.87 -p
create user 'monitor'@'10.9.70.%' identified by 'Stwc.2wsx';

grant ADMIN_PRIV on *.*.* to 'monitor'@'10.9.70.%'; 


然后回到mysql-proxy代理层节点上配置监控

mysql -uadmin -padmin -P6032 -h127.0.0.1
set mysql-monitor_username='monitor';
set mysql-monitor_password='Stwc.2wsx';


修改后,加载到RUNTIME,并保存到disk

load mysql variables to runtime;
save mysql variables to disk;

验证监控结果:ProxySQL监控模块的指标都保存在monitor库的log表中。
以下是连接是否正常的监控(对connect指标的监控):

select * from mysql_server_connect_log;

注意:可能会有很多connect_error,这是因为没有配置监控信息时的错误,配置后如果connect_error的结果为NULL则表示正常。

以下是对心跳信息的监控(对ping指标的监控)

select * from mysql_server_ping_log;

read_only日志此时也为空(正常来说,新环境配置时,这个只读日志是为空的)

select * from mysql_server_read_only_log;

3个节点都在hostgroup_id=10的组中。
现在,将刚才mysql_replication_hostgroups表的修改加载到RUNTIME生效。

load mysql servers to runtime;
save mysql servers to disk;


现在看结果

select hostgroup_id,hostname,port,status,weight from mysql_servers;


5)、配置Doris用户

上面的所有配置都是关于后端 Doris FE 节点的,现在可以配置关于 SQL 语句的,包括:发送 SQL 语句的用户、SQL
语句的路由规则、SQL 查询的缓存、SQL 语句的重写等等。
本小节是 SQL 请求所使用的用户配置,例如 root
用户。这要求我们需要先在后端 Doris FE 节点添加好相关用户。这里以 root 和 doris 两个用户名为例.

mysql -P9030 -uroot -h10.9.70.87 -p
create user 'doris'@'%' identified by 'Stwc.2wsx'; grant ADMIN_PRIV on *.*.* to 'doris'@'%';


然后回到mysql-proxy代理层节点,配置mysql_users表,将刚才的两个用户添加到该表中。

mysql -uadmin -padmin -P6032 -h127.0.0.1
insert into mysql_users(username,password,default_hostgroup) values('root','Stwc.2wsx',10);
insert into mysql_users(username,password,default_hostgroup) values('doris','Stwc.2wsx',10);


加载用户到运行环境中,并将用户信息保存到磁盘

load mysql users to runtime; save mysql users to disk;

mysql_users表有不少字段,最主要的三个字段为username、password和default_hostgroup:
-
username:前端连接ProxySQL,以及ProxySQL将SQL语句路由给MySQL所使用的用户名。
-
password:用户名对应的密码。可以是明文密码,也可以是hash密码。如果想使用hash密码,可以先在某个MySQL节点上执行select password(PASSWORD),然后将加密结果复制到该字段。
-
default_hostgroup:该用户名默认的路由目标。例如,指定root用户的该字段值为10时,则使用root用户发送的SQL语句默认情况下将路由到hostgroup_id=10组中的某个节点。

select * from mysql_users\G

虽然这里没有详细介绍mysql_users表,但只有active=1的用户才是有效的用户。

这样就可以通过sql客户端,使用doris的用户名密码去连接了ProxySQL了

load mysql users to runtime;
save mysql users to disk;

6)、通过 ProxySQL 连接 Doris 进行测试

下面,分别使用 root 用户和 doris 用户测试下它们是否能路由到默认的 hostgroup_id=10
(它是一个写组)读数据。下面是通过转发端口 6033 连接的,连接的是转发到后端真正的数据库!

mysql -uroot -p -P6033 -h10.9.70.172 -e "show databases;"

ERROR 9001 (HY000) at line 1: Max connect timeout reached while
reaching hostgroup 10 after 10000ms

这个时候发现出错,并没有转发到后端真正的doris fe上
通过日志看到有set autocommit=0 这样开启事务
检查配置发现:

mysql-forward_autocommit=false
mysql-autocommit_false_is_transaction=false

我们这里不需要读写分离,只需要将这两个参数通过下面语句直接搞成true就可以了

mysql -uadmin -padmin -P6032 -h127.0.0.1
UPDATE global_variables SET variable_value='true' WHERE variable_name='mysql-forward_autocommit';

UPDATE global_variables SET variable_value='true' WHERE variable_name='mysql-autocommit_false_is_transaction';

LOAD MYSQL VARIABLES TO RUNTIME;
SAVE MYSQL VARIABLES TO DISK;

然后我们在重新试一下,显示成功

mysql -uroot -p -P6033 -h10.9.70.172 -e "show databases;"

Warning: Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| doris_audit_db |
| information_schema |
| retail |
+--------------------+

  • 15
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值