Skip to content

Baikal Client Usage

Tao Liu edited this page Nov 16, 2020 · 1 revision

概述

baikal-client是一个mysql连接池的lib,内部使用mariadb的异步接口client建立连接(业务代码运行在bthread中就不会阻塞pthread,运行在pthread中则无优化)。支持mysql实例故障识别和剔除。支持分库分表的配置和识别。

内部架构

client-arch

管理类:Manager,一般情况,全局应该只分配管理类,负责管理不同的数据源Service

数据源类:Service,一个Service代表一个物理数据源,对象通过name从Manager获取,用户可以从service拿到连接或者直接查询

连接池:BnsConnectionPool,一个Service有一个(无分片)或多个Pool(分片)

实例类:Instance,对应一个集群的一台实例,一个Pool里有多个Instance

连接:connection,一个Instance有多个connection

ResultSet:返回的结果集,内部封装了MYSQL_RES

Option解释

Manager::Option
struct Option {
        int healthy_check_secs = 10;//
        bool use_epoll = false; //已废弃,下次取消
        bool hang_check = true; //检测instance是否卡住,与超时时间无关,内部会统计9999分位值,多个连接超过该值会判断instance卡住,适用于平响稳定的sql(扫描量可控的)
        bool faulty_exit = true; //重启时,如果有service完全连不上,或者连上的连接数达不到预期,默认返回错误;false则忽略
        bool async = false; //已废弃,下次取消
        int no_permission_wait_s = 1800; //mysql无权限时,重试等待时间
        std::vector<Service::Option> services; //每个service的配置
    };
 
Service::Option
    struct TableSplitOption {
        std::string name;
        std::string function;
        int count;
    };
    struct LogicDbOption {
        std::string name;
        std::vector<TableSplitOption> table_splits;
    };
    struct DbShardOption {
        int id; //从0开始
        int read_timeout;//以下配置和service级一致,如果配置则覆盖service的配置
        int write_timeout;
        int connect_timeout;
        std::string charset;
        std::string username;
        std::string password;//
        std::string ip_list; // form like 127.0.0.1:1111,127.0.0.2:2222
    };
    struct Option {
        std::string service_name; //唯一名字
        std::string comment_format;
        bool hang_check = true;
        bool connect_all = false;
        int connection_num = 10; //整个连接池默认配置的连接数,默认连接数不够会自动增加
        int max_connection_per_instance = 20; //单个instance上最大连接数,
        int select_algorithm = ROLLING; //LOCAL_AWARE、ROLLING、RANDOM;负载均衡机制,多机房情况下可以配置LOCAL_AWARE
        int read_timeout = DEFAULT_READ_TIMEOUT; //超时单位是秒
        int write_timeout = DEFAULT_WRITE_TIMEOUT;
        int connect_timeout = DEFAULT_CONNECT_TIMEOUT;
        std::string charset = DEFAULT_CHARSET;
        std::string username;
        std::string password;
        std::string db_split_function; //分库公式,有分库的可以配置,类似: (($/256%2)<<3)+($%8),$是接口传的partition_key
        std::vector<DbShardOption> db_shards; //分库配置,无分库可以只填一个
        std::vector<LogicDbOption> logic_dbs; //分表配置,不分表可以不配
    };

使用说明

baikal::client::Manager::Option opt;
//设置option
baikal::client::Manager mgr;
mgr.init(opt);
baikal::client::Service* baikaldb = mgr.get_service("baikaldb");
if (read_service == nullptr) {
//error
}
string sql = "select * from test.t1";
baikal::client::ResultSet result_set;
ret = baikaldb->query(0, sql, &result_set);
if (ret < 0) {
	//error
}
//顺序遍历sql执行结果
while (result_set.next()) {
uint32_t id = 0;
result_set.get_uint32(0, &id);
//...
}