-
Notifications
You must be signed in to change notification settings - Fork 172
Baikal Client Usage
Tao Liu edited this page Nov 16, 2020
·
1 revision
baikal-client是一个mysql连接池的lib,内部使用mariadb的异步接口client建立连接(业务代码运行在bthread中就不会阻塞pthread,运行在pthread中则无优化)。支持mysql实例故障识别和剔除。支持分库分表的配置和识别。
管理类:Manager,一般情况,全局应该只分配管理类,负责管理不同的数据源Service
数据源类:Service,一个Service代表一个物理数据源,对象通过name从Manager获取,用户可以从service拿到连接或者直接查询
连接池:BnsConnectionPool,一个Service有一个(无分片)或多个Pool(分片)
实例类:Instance,对应一个集群的一台实例,一个Pool里有多个Instance
连接:connection,一个Instance有多个connection
ResultSet:返回的结果集,内部封装了MYSQL_RES
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);
//...
}