前言
尽管doris可部署多个fe节点进行高可用,避免单点故障,但当用户连接的fe节点宕机后,用户需切换连接ip,以继续使用doris集群。
在用户不切换连接ip的场景下,能否保证doris集群的高可用?
proxysql + keepalived
ProxySQL 是灵活强大的 MySQL 代理层,从1.4.2版本后支持集群模式,支持Query重写、缓存、路由,可用于FE节点的负载均衡。
集群模式原理为集群中的实例相互间同步配置。无论采用单例模式还是集群模式,当用户连接的实例宕机后,仍需用户切换ip进行连接实例的转移。
因此,增加keepalived组件,让节点故障时,虚拟ip能自动漂移到另一台可用节点,避免用户切换ip的操作。
部署参考:(容器方式部署)
1.准备工作
ip分配: 192.168.71.14
192.168.71.15
192.168.71.12
192.168.71.50(虚拟ip)
三实例组成proxysql集群
2.配置proxysql.cnf
ps: 配置文件中密码设置只在初始启动有效,后续将以db文件中为准) (cluster_user用于proxysql集群中的配置同步
# Config file contents referred to as "/path/to/proxysql.cnf"
datadir="/var/lib/proxysql"
#管理相关参数
admin_variables=
{
admin_credentials="admin:密码;cluster_user:密码" #第一个为管理员账号,第二个为集群间信息同步账号
mysql_ifaces="0.0.0.0:6032"
cluster_username="cluster_user" #集群间信息同步账号
cluster_password="密码" #集群间信息同步账号密码
cluster_check_interval_ms=200
cluster_check_status_frequency=100
cluster_mysql_query_rules_save_to_disk=true
cluster_mysql_servers_save_to_disk=true
cluster_mysql_users_save_to_disk=true
cluster_proxysql_servers_save_to_disk=true
cluster_mysql_query_rules_diffs_before_sync=3
cluster_mysql_servers_diffs_before_sync=3
cluster_mysql_users_diffs_before_sync=3
cluster_proxysql_servers_diffs_before_sync=3
}
#集群信息
proxysql_servers=
(
{
hostname="192.168.71.14"
port=6032
weight=1
comment="ProxySQL-node1"
},
{
hostname="192.168.71.15"
port=6032
weight=1
comment="ProxySQL-node2"
},
{
hostname="192.168.71.12"
port=6032
weight=1
comment="ProxySQL-node3"
}
)
#mysql相关参数
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:6033"
default_schema="information_schema"
stacksize=1048576
server_version="5.5.30"
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
}
3.启动容器
docker run -p 6032:6032 -p 6033:6033 -d -v /data/proxysql/conf/proxysql.cnf:/etc/proxysql.cnf -v /data/proxysql:/var/lib/proxysql proxysql/proxysql --name proxysql
4.配置负载均衡
4.1 登录某一实例,并验证用户,实例是否与配置一致
//登录
mysql -h192.168.71.14 -P6032 -uctls -p
//验证用户
查看`global_variables`表中`variable_name` = 'admin-admin_credentials'的信息
//验证集群实例
查看`proxysql_servers`表中信息
4.2 增加fe后端
//确认是否为空
确认mysql_servers表为空
在mysql_servers表中增加fe后端
hostgroup_id hostname port
1 'doris-fe1的ip' doris-fe1的端口;
1 'doris-fe2的ip' doris-fe2的端口;
1 'doris-fe3的ip' doris-fe3的端口;
//加载到runtime,使其生效
load mysql servers to runtime;
//持久化配置
save mysql servers to disk;
4.3 设置monitor账号
ps:需先在doris集群中增肌新账号,例子中为了方便,使用root
//在proxysql中配置
更新`global_variables`表,条件为variable_name='mysql-monitor_username',更新内容: variable_value='root'
更新`global_variables`表,条件为variable_name='mysql-monitor_password',更新内容: variable_value='密码'
//加载到runtime,使其生效
LOAD MYSQL VARIABLES TO RUNTIME;
//持久化配置
SAVE MYSQL VARIABLES TO DISK;
4.4 增加转发账号
ps: 按需增加,同样需要先在doris中增加,例子中为了方便,使用root
//在proxysql中配置
在mysql_users表中增加信息:
username password default_hostgroup
'root' '密码' 1
//加载到runtime,使其生效
load mysql users to runtime;
//持久化配置
save mysql users to disk;
4.5 连接proxysql,验证是否负载到fe节点
mysql -h192.168.71.15 -P6033 -uroot -p
5.配置keepalived
5.1 在已安装proxysql的宿主机上安装keepalived
yum -y install keepalived
5.2 配置keepalived,配置文件位置为/etc/keepalived/keepalived.conf,参考如下:
主keepalived配置: 抢占模式,state 配置为MASTER ,priority为100
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
script_user root
enable_script_security
}
#检查haproxy是否存活的脚本(配置时需把注释删掉)
vrrp_script chk_proxysql {
script "killall -0 proxysql"
interval 2
weight -20
fall 3
rise 1
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass xxxyyy(密码)
}
virtual_ipaddress {
192.168.71.50
}
track_script {
chk_proxysql
}
}
备keepalived配置: 抢占模式,state 配置为BACKUP,priority为90
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
script_user root
enable_script_security
}
#检查haproxy是否存活的脚本(配置时需把注释删掉)
vrrp_script chk_proxysql {
script "killall -0 proxysql"
interval 2
weight -20
fall 3
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass xxxyyy(密码)
}
virtual_ipaddress {
192.168.71.50
}
track_script {
chk_proxysql
}
}
5.3 机器启动keepalived
systemctl start keepalived
6.验证测试
使用proxysql+keepalived后,请求能通过虚拟ip负载到不同的fe节点上,并能避免调度到异常fe上。
当有proxysql实例宕机后,keepalived能使backup的实例变为master,从而使虚拟ip漂移到正常节点上。
并且,过proxysql,查询doris集群的整体时延无明显增加。
总结
1.proxysql集群模式原理为集群中的实例相互间同步配置。若想对外仅暴露一个ip,仍需keepalived支撑。
2.后端为doris时,proxysql无法监控主从复制情况,无法获取read_only情况,故无法自动进行读写分离,需手工指定规则。
3.新实例加入proxysql集群后,不会自动同步旧实例中的配置,需在旧实例中先执行load to runtime 后正常, 待深入测试。