searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

探讨doris高可用(一)

2024-05-28 03:26:36
28
0

前言

尽管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 后正常, 待深入测试。

0条评论
0 / 1000
冼****铭
4文章数
0粉丝数
冼****铭
4 文章 | 0 粉丝
冼****铭
4文章数
0粉丝数
冼****铭
4 文章 | 0 粉丝
原创

探讨doris高可用(一)

2024-05-28 03:26:36
28
0

前言

尽管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 后正常, 待深入测试。

文章来自个人专栏
大数据组件学习
4 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0