|
11.2 使用与运维0 }; H' u2 Y! J' {# U
OceanBase不是设计出来的,而是在使用过程中不断进化出来的。因此,系统使
5 w: X1 n! T0 X+ q6 W用以及运维的方便性至关重要。' f6 Y: k* ^3 \( c
OceanBase的使用者是业务系统开发人员,并交由专门的OceanBase DBA来运
4 r% }: y9 u5 t h- x9 K- ?9 g4 A维。为了方便业务使用,OceanBase实现了SQL接口且兼容MySQL协议,从而融入到# G5 A( C' e$ P: Z, A
MySQL开源生态圈。MySQL大部分管理工具,例如MySQL客户端,MySQL admin,* f0 l2 U5 a. i o6 Q; I
能够在OceanBase系统中直接使用。另外,OceanBase将系统运维、监控相关的内部1 |# W5 g( n, F7 _+ q% B2 \
信息存放到内部的系统表中,从而方便运维、监控系统获取。$ S" X! Y5 j8 h
11.2.1 使用
; m6 b0 D; R2 L) |, e- J9 x. i; g7 POceanBase早期版本只允许通过Java或者C API接口访问,新版本增加了SQL支: n" }# O4 T% a) c' U
持,且兼容MySQL客户端访问协议。OceanBase推荐用户使用SQL,但老应用仍然可$ z F4 s/ N. }7 R* B
以使用以前的Java API访问OceanBase。下面介绍几个访问与使用场景。
* L0 i7 s6 g8 j( q* Y0 w1.MySQL客户端连接; n3 X5 F1 D! S$ E: @. S
如图11-4所示,使用者采用MySQL客户端连接OceanBase。通过MySQL客户端可
' N! k; g7 _/ W z& t. d以查看系统已有的表格、表格schema,执行select、update、insert、delete等SQL语
1 V+ q) ? Q o3 _, i( ?& L0 \3 Y句,查看系统内部状态,以及发送OceanBase集群运维命令。图中首先通过create
# I8 e, B5 a7 Z. O5 g/ ptable命令创建一张名称为test的表格,表格包含两列:id和name,其中id为主键。接: ]& J, R& A/ R0 [& N
着,往表格中写入两行记录(1,"alice"),(2,"bob")。最后,通过select语句读
7 X# b* U7 }) G4 R. V+ |8 B取这两行数据。
* n! c( V5 d5 M6 i0 b图 11-4 采用MySQL客户端连接OceanBase5 H) d5 q# k: Y- W, A4 c
2.JDBC访问(JDBC template)
" K1 h% e* g+ \/ k1 v+ S( i$ D ZJava应用通过标准JDBC访问OceanBase,代码如下所示:
( O8 |& T( y+ a# q9 dObGroupDataSource groupSource=new OBGroupDataSource();
6 @& ~# ?' g1 Q) o- Z; v0 l4 [groupSource.setUserName("user");//设置用户名' e! S5 i4 \1 N9 A
groupSource.setPasswd("pass");//设置密码) Y1 c; q" {) Y }, K$ s3 j4 ]
groupSource.setDbName("test");//OceanBase不支持db,这里可以填任意值! s0 Y; N+ P# d7 G
groupSouorce.setConfigURL(ob_addr_url);//设置OceanBase集群的地址
0 K. L& v d9 M1 O: E! agroupSource.init();//初始化data source/ q% P F, J" e5 e1 w6 ?
JdbcTemplate jtp=new JdbcTemplate();, ?; @0 Z! j! R V- h7 L8 U
jtp.setDataSource(groupSource);//设置jdbc template依赖的data source
* t# Q5 [" v3 O& C- \String sql="select 1 from dual";+ O/ X0 c' ~# [) I4 W4 q
int ret=jtp.queryForInt(sql);//执行SQL查询
" u8 x L6 x. u% w3.Spring集成
: V, H0 _1 v6 _$ a7 |* M可以通过将OceanBase DataSource集成到Spring中,配置如下:5 ]2 t, N0 p2 o( l- V/ M
<bean id="groupDataSource"
* J. Q! W& ], K# O3 U6 e T/ Q( E/ Hclass="com.alipay.oceanbase.ObGroupDataSource"
/ p; s7 v" n7 u$ R8 Sinit-method="init">4 j2 D4 c6 {, @6 @6 X2 k
<property name="username"value="user"/>: \. J4 l0 E* f* y/ t
<property name="passwd"value="pass"/>
; B/ c2 z' |& D: M<property name="dbName"value="test"/>. r3 o% |8 [- S- ?
<property name="configURL"value=ob_addr_url/>
+ ^2 r8 _5 \9 {, C1 F4 E</bean>6 r1 c: F9 M, B% J3 l$ q6 A
4.C客户端& P7 R$ f7 o+ h G. I5 \
C应用通过OceanBase C客户端访问OceanBase,使用方式与MySQL C客户端完全
: I3 D7 i( Y/ S% F B! z一致,代码如下:4 \3 ^9 B8 \! u* v# z; I
MYSQL mysql;
2 {2 O* n6 _, P" }: f emysql_init(&mysql); //初始化
3 U, M6 D" m' c1 H t3 Zmysql_real_connect(&mysql,ob_url,ob_user,ob_pass,NULL,0,NULL,0); //连接
: x/ H$ G0 L. o& SOceanBase数据库
0 z: f# q3 w/ W* ]" smysql_real_query(&mysql,sql,strlen(sql)); //执行SQL查询/ v, o% I8 b' r7 l& |0 J- Y, {- f
MYSQL_RES*res=mysql_store_result(&mysql); //获取SQL查询结果集; p/ p3 o8 U2 }/ U; X
//处理SQL查询返回的结果集
. ]5 L0 d: K7 d$ @- D0 k/ w V6 u; Hwhile(MYSQL_ROW row=mysql_fetch_row(res)) //从结果集读取一行数据0 J0 b! ]& B* h% o. z$ D6 j* R
{. r/ f0 F! T9 t2 J* M. y
//处理结果集中的一行结果 B4 b$ ~8 H& [2 ^2 f
}
: J$ ^2 b" Y! ~7 r/ Q% xmysql_free_result(res); //释放结果集- G9 f$ Y# C# ^' {- D. P) ~# _* Z% S
mysql_close(&mysql); //关闭连接; h4 `# v$ g+ q; j
当然,应用可能会在客户端维护OceanBase连接池,Java应用还可能会使用其他
+ A3 [- e! A! R6 x& A持久层框架,例如iBatis。由于OceanBase兼容JDBC和MySQL C客户端,使用MySQL
* B u4 \# e& `+ i+ b的应用无须修改代码就能接入OceanBase。' Y1 R2 |5 C& H7 n
11.2.2 运维
7 [4 q: T2 G# NOceanBase内部实现了系统表机制,用于存储监控以及运维相关的信息。内部系* n8 @- {% N6 J j& _9 D
统表包含的内容如下:
" q* W0 B+ w- a2 E, c●数据字典:表格的定义以及表格之间的关系、用户以及权限信息;0 H$ b8 y/ K2 h
●服务器列表:集群中每种角色所在的服务器列表;
2 U3 V/ y" ], ^9 U) t9 t) E& n●配置信息:集群中每台服务器的配置信息;
# d: f# A5 k4 K) p1 T4 d, p●内部状态:每台服务器的读写次数、读写延时、缓存命中率、子表个数、内( }# O4 ?, C: o4 e
存、磁盘、CPU使用情况、请求关键路径时间消耗,每日合并状态等;
1 ~7 M& f9 ]# F; w5 b基于内部系统表,可以开发各种方便的OceanBase运维功能,如OceanBase数据
8 i8 J) C4 s! `3 l5 z$ O9 n* E库会话(Session)管理,读写性能实时监控工具、监控平台等。4 R4 e4 {9 ~; E5 z& s9 f
图11-5是OceanBase某线上应用平均读取延时的监控图,包括单行读取平均延时
; D3 Y( ^' M- x ^. P* |# S(average_succ_get_time)以及多行扫描平均延时(average_succ_scan_time)两个指7 D- f7 N i4 X/ j% n) a3 O
标,且单位均为微秒。监控图包含三种数据:当前数据(currval),昨天数据
7 i3 X9 l+ N! z(lastval)以及上周数据(baseval),便于对比。由于监控、运维工具变化较快,这
6 v5 k( ~3 @2 Y2 l5 n- Z里不做太多介绍。
% N8 a! W# ~# d$ ]/ g/ p图 11-5 OceanBase某线上应用读取延时5 U |8 P$ H/ S2 a
7 M' k( O+ C1 W& m5 P# m7 _7 x* } w
# ~7 h) ~3 p9 e. s |
|