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