|
11.2 使用与运维7 R& }, m5 P" Q. C t' ^
OceanBase不是设计出来的,而是在使用过程中不断进化出来的。因此,系统使
0 M7 t% c! H2 w9 \! \5 L2 q J用以及运维的方便性至关重要。
' O4 W$ Z' y `' l8 X6 MOceanBase的使用者是业务系统开发人员,并交由专门的OceanBase DBA来运; n& Y$ s! y8 W- g
维。为了方便业务使用,OceanBase实现了SQL接口且兼容MySQL协议,从而融入到
' a6 E* i+ P: tMySQL开源生态圈。MySQL大部分管理工具,例如MySQL客户端,MySQL admin,
5 X% n: T! K4 w能够在OceanBase系统中直接使用。另外,OceanBase将系统运维、监控相关的内部5 x3 {6 E7 ^2 t4 ?# x8 t
信息存放到内部的系统表中,从而方便运维、监控系统获取。 `! U" S+ `6 A& Z
11.2.1 使用! K$ S( Z* i" t- m) m- n6 R& A
OceanBase早期版本只允许通过Java或者C API接口访问,新版本增加了SQL支. X. y ~9 S; c" I0 h* t, q
持,且兼容MySQL客户端访问协议。OceanBase推荐用户使用SQL,但老应用仍然可
+ Y/ |# `3 n1 m以使用以前的Java API访问OceanBase。下面介绍几个访问与使用场景。* y$ `3 Y. u' R
1.MySQL客户端连接& y0 l! x, o4 P
如图11-4所示,使用者采用MySQL客户端连接OceanBase。通过MySQL客户端可
( F" J! c) n2 i! r以查看系统已有的表格、表格schema,执行select、update、insert、delete等SQL语* Q& p6 U7 w$ [
句,查看系统内部状态,以及发送OceanBase集群运维命令。图中首先通过create- A$ ]5 V( q8 J: p
table命令创建一张名称为test的表格,表格包含两列:id和name,其中id为主键。接0 L K9 O; N8 I6 ?
着,往表格中写入两行记录(1,"alice"),(2,"bob")。最后,通过select语句读/ l s' n$ k! `- p! A+ U
取这两行数据。
3 M( M) L0 [. h9 H图 11-4 采用MySQL客户端连接OceanBase" O& p, G) n9 c! \6 w
2.JDBC访问(JDBC template)2 k7 C2 G5 P9 E6 ~9 j
Java应用通过标准JDBC访问OceanBase,代码如下所示:+ K, i5 M; J6 e0 V L# Z8 Z
ObGroupDataSource groupSource=new OBGroupDataSource();7 Y, G$ n( r0 V$ a; y' T d
groupSource.setUserName("user");//设置用户名
& R' K3 k9 T+ h4 F+ wgroupSource.setPasswd("pass");//设置密码' k$ C9 d4 f8 B3 X1 M2 |" |
groupSource.setDbName("test");//OceanBase不支持db,这里可以填任意值
" ?2 ~) I: l; j$ m' K! y' egroupSouorce.setConfigURL(ob_addr_url);//设置OceanBase集群的地址
0 `3 f, Y. r; y/ Y/ XgroupSource.init();//初始化data source
9 H. c ^5 l$ \& }* H9 A# F1 B; ZJdbcTemplate jtp=new JdbcTemplate(); y# H( I0 o# e" Z+ z' N5 `
jtp.setDataSource(groupSource);//设置jdbc template依赖的data source0 o" P5 h& q D$ Z) T4 e; s
String sql="select 1 from dual";
. M6 K$ j2 J* R5 J6 E; C1 C) hint ret=jtp.queryForInt(sql);//执行SQL查询5 ?4 l4 G; Z' w) x& C( F" h R0 y
3.Spring集成
# B t2 V$ G3 `可以通过将OceanBase DataSource集成到Spring中,配置如下:. R& [: i8 N8 D( N$ c& I* c
<bean id="groupDataSource"
1 ]( S0 L! b4 `% Q! U jclass="com.alipay.oceanbase.ObGroupDataSource"
0 v2 K; F5 S8 l% N0 D$ uinit-method="init">8 Q1 c3 i) X2 a2 k( }. \
<property name="username"value="user"/>
" k7 z; s. Q# J* Z7 q0 L& Z+ Q<property name="passwd"value="pass"/>
5 P! c# k$ J8 q" Q<property name="dbName"value="test"/>4 G. P N4 s5 P; E+ E0 ]
<property name="configURL"value=ob_addr_url/>) y+ E4 h4 p$ p& X9 r7 g9 O7 r
</bean>, `% n* o% g. W: \5 |! B) L# o
4.C客户端" s# o8 b3 ]) p; f* i' r8 ?
C应用通过OceanBase C客户端访问OceanBase,使用方式与MySQL C客户端完全3 d4 R2 \* G7 \6 s$ P# W
一致,代码如下:% |$ H) j/ d$ O' e
MYSQL mysql;( {, \& E' f$ ?# W. F) u4 ?
mysql_init(&mysql); //初始化/ `3 g9 j1 _# X1 k2 b
mysql_real_connect(&mysql,ob_url,ob_user,ob_pass,NULL,0,NULL,0); //连接$ j/ j! \: N- } C2 J$ A7 ]
OceanBase数据库: _6 m) I/ `9 h- ?& S" I2 h! W
mysql_real_query(&mysql,sql,strlen(sql)); //执行SQL查询
; y! Z" I' d4 s7 TMYSQL_RES*res=mysql_store_result(&mysql); //获取SQL查询结果集
- W$ F; w3 q$ Y3 ^4 l1 ~//处理SQL查询返回的结果集
; f' \* `/ P+ c( G9 N6 Xwhile(MYSQL_ROW row=mysql_fetch_row(res)) //从结果集读取一行数据% V9 |% O/ q' b+ d: G- p: R1 K
{
* Q9 t3 m/ S5 X& M8 i//处理结果集中的一行结果) {6 ^* f. | P, ^* n5 }
}
2 [0 \! s0 |/ y6 a5 bmysql_free_result(res); //释放结果集5 s' a, ?. d) l
mysql_close(&mysql); //关闭连接
- `& A( r1 U% P( K& X. w: O4 y当然,应用可能会在客户端维护OceanBase连接池,Java应用还可能会使用其他
* y' X+ a& m) D' }6 N持久层框架,例如iBatis。由于OceanBase兼容JDBC和MySQL C客户端,使用MySQL5 y" W p( ?3 T6 q2 y; a
的应用无须修改代码就能接入OceanBase。
, z* K. ]& ~3 _4 }6 {11.2.2 运维' p6 b+ Y5 p& s$ B
OceanBase内部实现了系统表机制,用于存储监控以及运维相关的信息。内部系
H" a; t7 E! s- o+ g统表包含的内容如下: j3 m* |. W) n2 l0 ?: p
●数据字典:表格的定义以及表格之间的关系、用户以及权限信息;0 a* d8 j# Z* h# g6 t, E- ]3 W
●服务器列表:集群中每种角色所在的服务器列表;
% f; t* n& S7 O% j" D$ u- Y●配置信息:集群中每台服务器的配置信息;% N/ B5 @/ F# H) V
●内部状态:每台服务器的读写次数、读写延时、缓存命中率、子表个数、内) x6 m7 ?! x3 k# D+ R# O
存、磁盘、CPU使用情况、请求关键路径时间消耗,每日合并状态等;. G5 n( T) F' q! O8 k% p0 m f( u
基于内部系统表,可以开发各种方便的OceanBase运维功能,如OceanBase数据! I0 ?, U- p5 d* q% e
库会话(Session)管理,读写性能实时监控工具、监控平台等。
" K8 R- [& F, _ K" Z% m图11-5是OceanBase某线上应用平均读取延时的监控图,包括单行读取平均延时: h/ ]+ a* p1 ~7 z
(average_succ_get_time)以及多行扫描平均延时(average_succ_scan_time)两个指% Q( S8 i. o1 R2 l1 F, E- I+ {4 ?/ @
标,且单位均为微秒。监控图包含三种数据:当前数据(currval),昨天数据
9 _2 j4 C o5 \; g- W9 e(lastval)以及上周数据(baseval),便于对比。由于监控、运维工具变化较快,这
; f# q4 Y3 d& A- w8 I% O0 D8 q( q里不做太多介绍。
: V7 a F! K' g" r0 d7 A图 11-5 OceanBase某线上应用读取延时
3 |8 n7 W7 I% b1 y' ?% ?# }. _: J7 q8 r
+ k/ x/ V7 `6 h* b8 B2 l% \4 B/ o s+ Y% _0 D
|
|