unistor 介绍 ( v1.0 )
DESCRIPTION
Unistor 介绍 ( V1.0 ). 新浪网研发 .SINA @2012.2.20. 总体介绍. 新浪网研发 .SINA @2012.2.20. Unistor 定位与思想. Unistor 是定位在 【memeche 、 redis】 与 【mysql】 间的一个 key/value 存储产品。 其遵循以下的原则: 数据的高可靠性 ---》 高效的持久化存储。 高可用性 ---》 通过 zookeeper 实现主、从切换,而且对外不分主从。但可以构建 master 与 slave 集群。 - PowerPoint PPT PresentationTRANSCRIPT
Unistor 介绍(( V1.0V1.0))
新浪网研发 .SINA @2012.2.20
总体介绍总体介绍
新浪网研发 .SINA @2012.2.20
You are the oneCopyright © 1996-2011 SINA 3
① Unistor是定位在【 memeche 、 redis】与【 mysql】间的一个 key/value存储
产品。
② 其遵循以下的原则:a. 数据的高可靠性 ---》高效的持久化存储。
b. 高可用性 ---》通过 zookeeper实现主、从切换,而且对外不分主从。但可以构建master 与 slave集群。
c. 存储高效性 ---》针对热点数据,提供了基于 key的读、写 cache,有独立的 dirty数据 flush线程。
d. 基于引擎的多数据结构支持 ---》与 redis不同, unistor通过为不同数据结构提供不同的存储引擎以实现高效。但对外
具有一致的接口(通过 extra参数实现引擎特殊功能支持),此如同 OO的重载。
e. 数据的定量存储支持 ---》由于不是海量存储系统,可以通过引擎控制数据失效规则。
f. 跨 IDC高效数据同步 --->无论 IDC内或 IDC间,都采用可配置的多条连接进行数据同步。
g. Data 是 object----》可以对 object 的 field进行操作。
③ 不做分组:
为了简单, unistor不做分组支持。但提供数据 export 、 import工具方便用户进行分组变更。此类分组既可以通过 key
的范围,也可以通过 key 的 hash值。而且 key的大小比较及 key 的 hash有引擎自己定义。因此, key不仅仅是字符串,而
且可以是字符化表示的数据结构。
Unistor定位与思想
You are the oneCopyright © 1996-2011 SINA 4
通过开发不同的存储引擎,实现如下的应用场景:
前端高可用 cache系统:
cache的数据大于内存大小。
要求存储固定时间的存储系统:
如数据必须 cache一周、一月等指定的时间才能够实现。
要求存储固定数据量的存储需求如按照用户为单位,每个用户存储最新N条数据。
小文件的大文件存储如图片缩略图文件、用户 session。
高效计数器unistor的计数器支持max 、 min值,而且高效。可开发专门的计数器系统。
适应场景
You are the oneCopyright © 1996-2011 SINA 5
海量数据存储:
unistor不会做自动分组,因此不会做海量数据。但会提供数据导出、导入工具,支持用户自己分
组安排。
关系管理:
unistor从结构上支持按照存储引擎(用户)定义的 key的范围或 key 的 hash值进行数据管理。
但这种管理都是基于 Key的。平台不提供基于 key外的其他自动的关系管理,除非存储引擎自己处理。
Key为非 ascii场景 unistor对于 key是不做解释的,但其必须为 ascii字符,对于非 ascii字符的场景不支持。但,
在引擎内部可以使 binary的数据结构,用户可以通过存储引擎定义此结构【等于】【小于】、
【 hash】的操作。而且内存 cache也使用用户定义的此些函数对 key进行操作。
不适应场景
You are the oneCopyright © 1996-2011 SINA 6
总体架构图
说明:1 、集群可以分master 、 slave集群。每个集群可有自己独立的 zookeeper管理。2 、 Master集群的所有节点,都是可写的,其内部实现master转发。3 、 Slave集群的master,负责从配置的master集群同步数据,而其他的从master同步。4 、数据同步采用可配置的多条连接,以提高吞吐里。而且集群内部的同步为串行同步。
You are the oneCopyright © 1996-2011 SINA 7
服务内部架构
You are the oneCopyright © 1996-2011 SINA 8
存储引擎采用动态加载,可以扩展,当前实现了 bdb 的 btree引擎,支持 expire。
内部有基于 key 的 read cache。有write cache及独立的write cache 的 flush线程。
有独立的转发线程,实现master集群内部【写】及【 master 读】的 master转发。
数据转发采用可配置的多条连接以提高转发效率。
Binlog的数据分发,分为集群内部、外部两个分发接口,由独立的线程运行。
两种分发都采用可配置的多条连接、而且支持压缩、 chunk以提高分发效率。
数据读是多线程的,线程的数量可以配置。
数据写是单线程的。
有独立的 checkpoint线程,以完成数据的 checkpoint,同时担负 expire时间的检测。
有独立的 zookeeper事件接收线程,以处理 zookeeper的事件。并将这些事件通知相关的
线程。
服务内部架构说明
You are the oneCopyright © 1996-2011 SINA 9
高可用性,Master失效后,从master同步数据的 slave会自动变为master。
支持Master 、 slave的集群。
集群内的数据转发、数据同步及集群间的数据同步,才用可配置的多条连接。
Key/value 的 value,可以是multi-field结构,类似于数据库 table 的 column,可单独 get/set。
支持版本控制、支持用户认证。
支持如下的接口:
add:可 add一个 key 或 key的一个、多个 field。
set:可以 set一个 key 或 key的一个、多个 field。
update:可 update一个 key 或 key的一个、多个 field。支持版本控制。
inc:可 inc一个 key 或 key的一个 field。支持版本控制。
del:可 del一个 key 或 key的一个 field。支持版本控制。
exist:检测指定的 key 或 field是否存在。
get:可 get一个 key 或 key的一个、多个 field。可控制是否从master 获取数据。
multi-Get:可 get多个 key或多个 key的一个、多个 field。可控制是否从master 获取数据。
list:查询指定范围的 key ;可以 asc 、 desc ;可指定输出的 field ;可控制是否从master 获取数据。
功能说明 -1
You are the oneCopyright © 1996-2011 SINA 10
支持基于 key范围或 key 的 hash值, export数据。
内部有基于 key的读、写 cache,以保证热点数据的高效读、写。
所有 key具有 32位的版本号,控制 key的更新。
通过存储引擎,可以实现对多种数据结构的存储支持。
功能说明 -2
数据操作接口说明数据操作接口说明
新浪网研发 .SINA @2012.2.20
You are the oneCopyright © 1996-2011 SINA 12
接收:【消息类型: 1 】
k : key的名字。
f:添加的 field。
x :引擎扩展字符串。
d:消息的数据(任意内容,最长为 2M)
e : key的超时时间,单位为 second。只有创建 key的时候才使用。
v :版本号,若指定则新加的数据的版本号为指定值;否则若添加 key 为 1 ,若存在则为当前版本号 +1。
sign:添加规则。 0 :添加 key ; 1 :添加 field , key必须存在; 2 :添加 field , key可不存在。缺省为 0 。
c:是否 cache 。 1 : cache ; 0 :不 cache。缺省为 1.
u:用户名
p:口令
回复:【消息类型: 2 】
ret:接收状态( 0 :成功,其他:各种错误代码)
v :成功后的数据版本号。
fn : key 的 field数量。
err:错误时的错误消息( ret为非 0 的错误描述)
操作接口— add(存在则失败)
You are the oneCopyright © 1996-2011 SINA 13
接收:【消息类型: 3 】
k : key的名字
f : set 的 field。
x :引擎扩展字符串。
d:消息的数据(任意内容,最长为 2M)
e : key的超时时间,单位为 second。只有创建 key的时候才使用。
sign : set 标记。 0 :更新整个 key ; 1 :更新 key 的 field。缺省为 0 。
v :版本号,若指定则新加的数据的版本号为指定值;否则若添加 key 为 1 ,存在则为当前版本号 +1。
c:是否 cache 。 1 : cache ; 0 :不 cache。缺省为 1 。
u:用户名
p:口令
回复:【消息类型: 4 】
ret:接收状态( 0 :成功,其他:各种错误代码)
v :成功后的数据版本号。
fn : key 的 field数量
err:错误时的错误消息( ret为非 0 的错误描述)
操作接口— set(不存在则添加)
You are the oneCopyright © 1996-2011 SINA 14
接收:【消息类型: 5 】
k : key的名字
f : update 的 field。
x :引擎扩展字符串。
d:消息的数据(任意内容,最长为 2M)
e : key的超时时间,单位为 second。只有创建 key的时候才使用。
sign : update 标记。 0 :更新整个 key ; 1 :更新指定的 field,而且 field必须存在; 2 :更新 field,允许 field
不存在,若不存在则添加。缺省为 0 。
v :若指定,则更新是 key的版本号必须为此值。
u:用户名
p:口令
回复:【消息类型 6 】
ret:接收状态( 0 :成功,其他:各种错误代码)
v :成功后的数据版本号。
fn : key 的 field的数量。
err:错误时的错误消息( ret为非 0 的错误描述)
操作接口— update(不存在则失败)
You are the oneCopyright © 1996-2011 SINA 15
接收:【消息类型: 7 】 k : key的名字
f : inc 的 field。
x :引擎扩展字符串。
n: inc的值,可为负值。
max:计数的最大值
min:计数的最小值。
e :若是创建 key而且指定此值,则设置 key 的 expire值。只有创建 key的时候才使用。
sign : inc的规则。 0 :计数器必须存在; 1 :若计数器为 field,则计数器对应的 key必须存在,而 field可以不存在。 2 :计
数器可以不存在,系统自动创建。缺省值为 0
v :若指定,则更新是 key的版本号必须为此值。
u:用户名
p:口令
回复:【消息类型: 8 】 ret:接收状态( 0 :成功,其他:各种错误代码)
v :成功后的数据版本号。
n:计数后的值。
err:错误时的错误消息( ret为非 0 的错误描述)
操作接口— inc
You are the oneCopyright © 1996-2011 SINA 16
接收:【消息类型: 9 】
k : key的名字
f : delete 的 field。
x :引擎扩展字符串。
v :若指定,则更新是 key的版本号必须为此值。
u:用户名
p:口令
回复:【消息类型】
ret:接收状态( 0 :成功,其他:各种错误代码)
v :成功后的数据版本号。
fn : key 剩余 field的数量。
err:错误时的错误消息( ret为非 0 的错误描述)
操作接口— delete(不存在则失败)
You are the oneCopyright © 1996-2011 SINA 17
接收:【消息类型: 11 】
k : key的名字
f:检测的 field。若不指定则检测 key。
x :引擎扩展字符串。
v :若指定则返回 key的版本号。
mt:是否从master 获取。此为消息头的 attr 的 bit0 标志位。 1 :是; 0 :不是。
u:用户名
p:口令
回复:【消息类型: 12 】
ret:接收状态( 0 :成功,其他:各种错误代码)
fn : key 的 field的数量。
v :若获取版本号,则返回数据版本号。
err:错误时的错误消息( ret为非 0 的错误描述)
操作接口— exist
You are the oneCopyright © 1996-2011 SINA 18
接收:【消息类型: 13 】
k : key的名字
f : get 的 field,多个 field 以【 \n】分割。
x :引擎扩展字符串。
i:返回 key的定义。 0 : key 的 data ; 1 : key 的 info ; 2 :系统 key。若返回的统计信息,则为【 expire ,
version , data length 、 version】。
v :若指定则返回 key的版本号。
mt:是否从master 获取。此为消息头的 attr 的 bit0 标志位。 1 :是; 0 :不是。
u:用户名
p:口令
回复:【消息类型: 14 】
ret:接收状态( 0 :成功,其他:各种错误代码)
d:若成功,为 key的数据。
v :若获取版本号,则返回数据版本号。
fn : key 的 field数量。
err:错误时的错误消息( ret为非 0 的错误描述)
操作接口— get
You are the oneCopyright © 1996-2011 SINA 19
接收:【消息类型: 15 】
k:多个 key的名字,为 key/value的格式。
f : get 的 field,多个 field 以【 \n】分割。
x :引擎扩展字符串。
i:返回 key的定义。 0 : key 的 data ; 1 : key 的 info ; 2 :系统 key。若返回的统计信息,则为
【 expire , version , data length 、 version】。
mt:是否从master 获取。此为消息头的 attr 的 bit0 标志位。 1 :是; 0 :不是。
u:用户名
p:口令
回复:【消息类型: 16 】
ret:接收状态( 0 :成功,其他:各种错误代码)
d:若成功,为 key的数据。其为 key/value结构,每个 key 就是参数中的 key。若 key不存在则表示 key不存在。
err:错误时的错误消息( ret为非 0 的错误描述)
操作接口— gets
You are the oneCopyright © 1996-2011 SINA 20
接收:【消息类型: 17 】
begin:开始的 key,若不指定则从开始获取。
end:结束的 key,若不存在则不限制。不包含最后的 key。
n:获取的数量,缺省 50,最大 1000
f : get 的 field,多个 field 以【 \n】分割。
x :引擎扩展字符串。
asc:是否升序
ib:是否包含 begin 的 key
i:是否返回 key的统计信息。 1 :是; 0 :不是,缺省为 0 。若返回的统计信息,则为【 expire , version , data
length 、 version】。
mt:是否从master 获取。此为消息头的 attr 的 bit0 标志位。 1 :是; 0 :不是。
u:用户名
p:口令
回复:【消息类型 18 】
ret:接收状态( 0 :成功,其他:各种错误代码)
d:若成功,为 key的数据。为 key/value结构,每个 key 就是参数中的 key。
err:错误时的错误消息( ret为非 0 的错误描述)
操作接口— list
You are the oneCopyright © 1996-2011 SINA 21
接收:【消息类型: 19 】
k : key的名字
x :引擎扩展字符串。
d:消息的数据(任意内容,最长为 2M)
e : key的超时时间,单位为 second。只有创建 key的时候才使用。
v :版本号,若指定则新加的数据的版本号为指定值;否则若添加 key 为 1 ,存在则为当前版本号 +1。
c:是否 cache 。 1 : cache ; 0 :不 cache。缺省为 1 。
u:用户名
p:口令
回复:【消息类型: 20 】
ret:接收状态( 0 :成功,其他:各种错误代码)
v :成功后的数据版本号。
fn : key 的 field数量。返回值恒为 0 。
err:错误时的错误消息( ret为非 0 的错误描述)
操作接口— import(直接覆盖)
You are the oneCopyright © 1996-2011 SINA 22
接收:【消息类型: 21 】
u:用户名
p:口令
回复:【消息类型: 22 】
ret:接收状态( 0 :成功,其他:各种错误代码)
err:错误时的错误消息( ret为非 0 的错误描述)
操作接口—认证接口
数据数据 ExportExport接口说明接口说明
新浪网研发 .SINA @2012.2.20
You are the oneCopyright © 1996-2011 SINA 24
Subscribe 是 export 及 binlog同步时,用来描述 export 或 binlog的数据规则的。具体说明如下:
表达式为: type:group_express或者为 *、空、 all。
type分为:mod 、 range 、 key 三种类型。
*、空、 all表示订阅全部
mod 订阅规则 --基于 group求余。
group_express内容为 [mod : index1,index2....],表示对 group 以 mod求余,余数为
index1 、 index2等。mod 为 0 表示不求余
range 订阅规则:基于 group求余后的范围。
group_express内容为 [mod:begin-end,begin-end,...]表示对 group%mod的值后的
group范围,多个范围可以以【 ,】分割,若 begin==end,则只写 begin 就可以了。mod 为 0 表示不
求余。
Key 订阅规则:基于 key范围的获取。
内容为 [key1-key2,key3-key4...],表示 key[key1,key2) 、 [key3,key4) 半开半闭区间。若 key
中出现【 ,】或【 -】,则用 ,, 或 --表示。若前一个为空,则表示最小,若后一个为空,则表示最大
Subscribe说明
You are the oneCopyright © 1996-2011 SINA 25
接收:【消息类型: 109 】
ret:错误消息号。
err:错误的消息内容
回复:【消息类型: 110 】
无需回复,直接关闭连接。
此消息用于 export及数据同步过程中的错误通报。若收到此消息则连接会被 server关闭。
错误接口
You are the oneCopyright © 1996-2011 SINA 26
接收:【消息类型: 51 】
u:用户名
p:口令
chunk : chunk 传送的数据包的大小,单位为 KBYTE。缺省 64KByte。
subscribe : key 的 export规则。具体见订阅规则说明。
k:开始的 key,若为空表示从开始导出。
回复:【消息类型: 52 】
sid:开始 export时的 sid值,需要从此值后同步 binlog。
session:数据发送的 session值。当前没用。
若失败,则返回错误的消息类型,并描述具体的错误。
数据 Export接口— Export 报告接口
You are the oneCopyright © 1996-2011 SINA 27
接收:【消息类型: 51 】
seq:数据包的序列号,此为 64位的网络字节序的整数。
k:多个 key 名字为 k 的 key/value。每个 value的内容如下
k : key的名字
d : key的值。
v : key的版本号。
e : key的失效时间。
x :引擎的扩展
回复:【消息类型: 52 】
seq:接收到的数据包的序列号,此为 64位的网络字节序的整数。
数据 Export接口—数据发送接口
You are the oneCopyright © 1996-2011 SINA 28
接收:【消息类型: 53 】
sid:导出完毕时的 binlog 的 sid值,至少需要同步此部分 binlog 保证数据的完整性。
回复: 无需回复, unistor会主动关闭连接。
数据 Export接口—数据导出完毕接口
数据同步接口说明数据同步接口说明
新浪网研发 .SINA @2012.2.20
You are the oneCopyright © 1996-2011 SINA 30
接收:【消息类型: 101 】
sid:同步开始点。
u:用户名
p:口令
chunk : chunk 传送的数据包的大小。单位为 KBYTE。缺省为 0 表示不按照 chunk发送。
subscribe:传送消息的过滤定义。具体见 subscribe的说明。
sign:数据传送的签名。支持 crc32 与 md5,缺省不签名。
zip:是否压缩。 1 :压缩; 0 :不压缩。缺省不压缩。
回复:【消息类型: 102 】
session:数据发送的 session值。可以基于此 session值建立多条连接同步。
若认证或其他失败,则发送错误消息。随后开始同步数据。
数据同步接口—数据同步报告接口
You are the oneCopyright © 1996-2011 SINA 31
接收:【消息类型: 103 】
Session:连接所属的同步 session。
回复:【消息类型: 104 】
不回复,若成功直接发送数据,否则发送错误消息。
数据同步接口—多连接同步的连接报告接口
You are the oneCopyright © 1996-2011 SINA 32
接收:【消息类型: 105 】
seq:同步消息的序列号。消息数据的开头为 64位的网络字节序整数,表示消息的序列号。
sid:数据变更的 sid值。
t:数据变更的时间戳
d:数据
g :数据的分组
type:消息的类型,对应于 add 、 set 、 update 、 delete 、 inc。
v :数据的版本号。
md5:若 md5 签名,则传送 md5 签名值。
crc32:若 crc32 签名,则传送 crc32的签名值。
回复:【消息类型: 106 】
seq:同步数据的 seq值。
数据同步接口—非 chunk 模式同步数据
You are the oneCopyright © 1996-2011 SINA 33
接收:【消息类型: 107 】
seq:同步消息的序列号。消息数据的开头为 64位的网络字节序整数,表示消息的序列号。
m : key/value结构的多个数据变更。内部的每个数据都是【非 chunk】模式的一个数据消息。
md5:若 md5 签名,则传送 md5 签名值。
crc32:若 crc32 签名,则传送 crc32的签名值。
回复:【消息类型: 108 】
seq:同步数据的 seq值。
数据同步接口— chunk 模式同步数据
配置说明
新浪网研发 .SINA @2012.2.20
You are the oneCopyright © 1996-2011 SINA 35
[common]
home=运行目录
thread_num=数据接收线程的数据
store_type=数据引擎类型,如 bdb等,配置中应该有【 bdb】的配置项
sock_buf_kbyte=数据分发的 socket buf
max_chunk_kbyte=数据分发的 chunk 包大小
store_flush_num=多少条数据变更,需要 flush 到 store_type指定的存储中。否则在write cache。
host=主机标示,如 172.16.42.63
idc= 机房名字
group=分组 id
monitor= 监控地址及端口号,如: *:9666
trans_conn_num=内部消息转发的 connection数量
sync_conn_num=内部数据同步的 connection数量。
max_write_queue_messge=写队列允许排队等待的最多写消息数量,超过此数量则拒绝新写。
max_trans_message=并发转发允许的最多等待的消息数量,超过此数量则拒绝转发,此包括转给 master的写、读。
Unistor配置文件 -1
You are the oneCopyright © 1996-2011 SINA 36
write_cache_mbyte= 写 cache的大小
read_cache_mbyte= 读 cache的大小
read_cache_max_key_num= 读 cache 的 hash的桶数量
master_lost_binlog= 若 slave切换为master,则运行丢失的最大 binlog数量,否则禁止切换为master
enable_expire=yes/no,是否支持 expire
expire_default= 缺省的超时值。
expire_concurrent= 超时检测的并发数量。
[zk] ---zookeeper的配置
server=zookeeper的连接地址,如 172.16.42.63:2181,多个以【,】分割。
auth=连接鉴权信息
root=配置在 zookeeper 中的根目录
[inner_dispatch] ---内部分发信息
user=分发的用户名
passwd=分发的用户口令
listen=内部分发的监听地址,如: *:9667
Unistor配置文件 -2
You are the oneCopyright © 1996-2011 SINA 37
[outer_dispatch]---外部分发配置
user=外部分发的用户名
passwd=外部分发的用户口令
listen=外部分发的监听地址,如: *:9668
[recv] ----数据增、删、改、查询的配置
user=用户名
passwd=用户口令
listen= 监听地址,如: *:9669
[binlog] ---binlog的配置
path=binlog的目录
file_prefix=binlog的文件前缀
file_max_mbyte=binlog文件的大小
max_file_num=最大的 binlog文件数量
Unistor配置文件 -3
You are the oneCopyright © 1996-2011 SINA 38
del_out_file=对于超过管理范围的 binlog,是否删除
cache=是否 cache
flush_log_num=收到多少条 binlog必须 flush 磁盘
flush_log_second=多少时间必须 flush 磁盘
[bdb] ----store-type指定的 bdb的配置
env_home=bdb 的 env-home的路径
db_path=bdb数据文件的路基
compress=是否压缩
cache_msize=bdb 的 cache大小
page_ksize=bdb的文件 page的大小
Unistor配置文件 -4
You are the oneCopyright © 1996-2011 SINA 39
-----/
|----idc 名字
| |----分组 1
| | |----master:存放当前的master 信息。【 master-ip 】 :【新 master最小 sid 】 :【最新 sid 值】 :【最新时间
戳】
| | |----host
| | | |----ip1:此分组下的服务器 ip 地址,内容为【最新变更 sid 值】 :【最新变更的时间戳】
| | | |----ip2
| | | ----lock:集群主机的 lock 目录
| | | |----172.16.42.62-0135a30661b81a1e-0000001354 格式为【 ip 】 - 【 zk session 】 - 【 zk seq 】
| | | |----172.16.42.63-0135a30661b81a1d-0000001353
| | | ----conf:集群配置,内容如下
Zookeeper的配置信息 -1
You are the oneCopyright © 1996-2011 SINA 40
[common]
master_idc=yf :集群的master idc
[sync] :若是 slave集群,需要配置其从哪个集群同步数据(可以是master,也可以是 slav
e )。
ip=172.16.42.62,172.16.42.63 :同步集群的服务器列表,多个以【 ,】分割。
port=9668 :同步的端口号。
user=dwb1 :用户名
passwd=dwb1 :同步的用户口令
zip=1 :同步时,是否压缩。
sign=crc :同步是的签名方式,可以为空、md5 、 crc32
sync_conn_num=20:同步的并发连接数量
max_chunk_kbyte=64 :同步时的 chunk大小。
Zookeeper的配置信息 -2
编译安装
新浪网研发 .SINA @2012.2.20
You are the oneCopyright © 1996-2011 SINA 42
依赖的库: cwinux
需要 cwinux V2.3.2 版本。
Expat
最新版本即可。
zookeeper C 库
最新版本即可
以上的库全部都是通过 configure 、 make 、 make install的方式编译、安装。
需要注意的是,安装后,其 header文件及 lib文件,必须分别位于安装目录下的 include 及 lib 目录下。
在 unistor 编译指定路径的时候,需要指定安装目录。
编译安装— unistor的依赖
You are the oneCopyright © 1996-2011 SINA 43
-- unistor:此目录下有独立的 configure,用于形成【 unistor】及【 unistor_bench】下的服务
|-- doc :文档目录
|-- common :公共 source 目录
|`-- zk : zookeeper的接口 source
|-- unistor : unistor服务的 source 目录
|-- bench : unistor_bench 的 source 目录,
| |-- counter_bench:计数器的专用压力测试工具。
| |-- unistor_bench:通用压力测试工具。
|-- tool:工具目录,有独立的 configure文件形成各种工具
| |-- binlog.cpp : binlog的查看工具
| |-- kv_add.cpp : kv_add的工具
| |-- kv_set.cpp : kv_set的工具
| |-- kv_update.cpp : kv_update的工具
| |-- kv_inc.cpp : kv_inc的工具
| |-- kv_del.cpp : kv_del的工具
| |-- kv_exist.cpp : kv_exist的工具
| |-- kv_get.cpp : kv_get的工具
| |-- kv_list.cpp : kv_list的工具
| |-- kv_export.cpp : kv_export的工具
|-- driver :存储引擎的目录
|-- bdb : bdb存储引擎的目录。有独立的 configure文件
编译安装—目录结构
You are the oneCopyright © 1996-2011 SINA 44
编译 tar xvfz unistor.tar.gz
cd unistor
./configure --prex=安装目录 --with-cwinux=cwinux安装目录 – with-zk=zk的安装目录 – with-
openssl=openssl安装目录
make && make install
安装目录结构安装目录
|-- unistor : unistor的执行程序
|-- unistor.cnf : unistor的默认配置文件,需要在配置文件的【 common:home】设置此【安装目录】。子文
件需要自己形成。
|-- log : unistor 的 log 目录, unistor会默认创建此目录
|-- engine:存储引擎目录,此必须在安装目录下,而且名字为 engine。
`|-- libuni_bdb.so : bdb存储引擎,其格式为【 libuni_存储引擎名字 .so 】
编译安装— unistor的编译、安装(一)
You are the oneCopyright © 1996-2011 SINA 45
Zookeeper配置:创建以下的目录结构---/unistor 的 zk 根目录
|--idc 名字
| |----分组 1
| | |----master
| | |----host
| | |----lock
| | |----conf
安装配置文件说明,修改配置文件: unistor.cnf
运行 启动: ./unistor [-f 配置文件 ] >/dev/null ## 若配置文件不是 unistor.cnf,则需要通过【 -f】参数指定。
停止: ./unistor –stop
编译安装— unistor的编译、安装(二)
You are the oneCopyright © 1996-2011 SINA 46
功能: unistor的压力测试服务
编译
进入 bench 目录,执行:
./configure --with-cwinux=cwinux安装目录 && make
安装目录结构(以 unistor-bench为例)
安装目录
|-- unistor_bench : unistor_bench的执行程序
|-- unistor_bench.cnf : unistor_bench的默认配置文件,需要在配置文件的【 common:home 】
| 设置此【安装目录】。子文件需要自己形成。
|-- log : unistor_bench 的 log 目录, unistor_bench会默认创建此目录。
修改 unistor_bench的配置文件: unistor_bench.cnf
运行 启动: ./unistor_bench [-f 配置文件 ] >/dev/null ## 若配置文件不是 unistor_bench.cnf,则需要通过【 -f】
参数指定。
停止: ./unistor –stop
编译安装— bench的编译、安装
You are the oneCopyright © 1996-2011 SINA 47
功能: Unistor的工具集
编译 cd unistor/tool
./configure --prex=安装目录 --with-cwinux=cwinux安装目录 – with-expat=xml expat 库的安装目录
make && make install
安装目录结构 binlog : binlog的查看工具
kv_add: key add的工具
kv_set : key set的工具
kv_update: key update的工具
kv_inc : key inc的工具
kv_del : key delete的工具
kv_exist: 检查 key是否存在的工具
kv_get:获取一个或多个 key的工具
kv_list:获取指定范围 key 列表的工具
kv_export:数据导出工具
编译安装— Tool的编译、安装
You are the oneCopyright © 1996-2011 SINA 48
功能: unistor的存储引擎。由于各库的依赖关系不一致,下面以 bdb为例说明。
编译
cd unistor/driver/bdb
./configure --prex=安装目录 --with-cwinux=cwinux安装目录 --with-bdb=bdb的安装目录
make && make install
安装目录结构
安装完成后,会在【安装目录】下形成一个【 libuni_XXX.so】的库文件。 XXX为存储引擎的名字,对
于 bdb 来说就叫 bdb。
编译安装—存储引擎的安装( bdb为例)
存储引擎
新浪网研发 .SINA @2012.2.20
You are the oneCopyright © 1996-2011 SINA 50
Unistor的数据是通过外挂的存储引擎存储。
通过不同的存储引擎,可以实现不同类型数据的存储。
通过不同的存储引擎,可以实现不同类型数据结构的存储。
存储引擎可以是基于内存的。
通过 unistor.cnf 来设置存储引擎的配置信息。
其是在 unistor.cnf 中、名字为【具体存储引擎名字】的 section。
如,对于 bdb的存储引擎,在 unistor.cnf 中,有一个【 bdb】的 section 来配置 bdb引擎。
存储引擎 --说明
You are the oneCopyright © 1996-2011 SINA 51
特性: 通过 Bdb 的 bree存储数据,其 key必须为字符串。
支持 key 的 expire。有专门的库存放 key 的 expire 索引。
存储引擎的数据库:
unistor.bdb:数据的库, key为数据的 key , data 为 key 的 data 。 data 后面是【 4 字节 expire 】 + 【 4 字节版
本号】 + 【 1 字节 Value字段标志, 1 : data 由 field组成; 0 : data不是 field 格式】标示。
expire_unistor.db : expire 索引库。 Key 为【 4 字节 expire 】 + 【 key字符串】, data为空。
sys_unistor.db:系统库,只包含两个 key : sid(当前 commit 的 sid)及 e ( expire,引擎是否支持超时)
配置: 其配置位于 unistor 的 unistor.cnf配置文件中。[bdb]
env_home=/data3/bdb_home : bdb 的 env_home的目录,用于存放 achieve log文件。
db_path=/data4/bdb_data : bdb的库的目录
compress=no:是否对数据进行压缩
cache_msize=8192 : bdb 的 enviroment 级的内存 cache大小。
page_ksize=32 : bdb 的 btree 的 page大小。
存储引擎— bdb引擎
You are the oneCopyright © 1996-2011 SINA 52
特性: 通过多个 Bdb文件存储计数器。
每个 key最多可有 255个计数值。
计数值采用压缩格式存储,没有计数值的计数器不存储。
若一个 key的计数值为 0 ,则 key不存储但在访问的时候会形成 read-cache。
存储引擎的数据库:
bdbc.xx-yy-zz.dat : xx为开始的位号, yyy为分组的数量; zz为当前 bdb数据库文件所属的分组号。
.bdbc.sys :系统库。
配置: 其配置位于 unistor 的 unistor.cnf配置文件中。[bdb]
env_home=/data3/bdb_home : bdb 的 env_home的目录,用于存放 achieve log文件。
db_path=/data4/bdb_data : bdb的库的目录
compress=no:是否对数据进行压缩
cache_msize=8192 : bdb 的 enviroment 级的内存 cache大小。
page_ksize=32 : bdb 的 btree 的 page大小。
key_type=int64 : key的类型,可为 int32 、 int64 、 int128 、 int256 、 char
int32_hex=no:对于 int32 返回的 key是否采用 16进制表示
int64_hex=yes:对于 int64 返回的 key是否采用 16进制表示
hex_upper=true:返回的 key 的 16进制是否大写
group_start_time_bit =0 : bdb文件分组的 key 的 group值的开始位号。
group_end_time_bit=5 : bdb文件分组的 key 的 group值的结束位号。
counter_def_file=/usr/home/wenbo/jpool/src/unistor/trunk/unistor/unistor/bin/counter_def.dat :计数器的配置文件
存储引擎— bdbc通用计数引擎
运行信息
新浪网研发 .SINA @2012.2.20
You are the oneCopyright © 1996-2011 SINA 54
Unistor 的 monitor端口,支持memcache 协议的 stats,输出内容如下: STAT pid 8271 ///进程 PID
STAT ppid 8269 /// 父进程 PID
STAT version 1.0 /// 版本号
STAT modify 20120508142500 ///unistor的代码修改实际
STAT compile 2012-05-08 ///unistor的编译时间
STAT start 20120508194639 ///unistor的启动时间
STAT store_engine bdb ///存储引擎类型
STAT store_engine version 1.0 ///存储引擎版本
STAT store_state valid ///存储引擎状态,若 invalid会输出错误信息
STAT binlog_state valid ///binlog 日志的状态,若 invalid会输出错误信息
STAT binlog_error ///binlog的错误信息
STAT min_sid 1000001 ///binlog当前最小的 sid
STAT min_sid_time 20120508135315 ///binlog最小 sid的时间戳
STAT min_binlog_file /data2/kv_data/data/binlog/binlog/binlog.0000000001.20120508.log ///最小 binlog文件
STAT max_sid 27030228 ///最大 sid
运行信息— stats 【全部可通过 get/gets接口获取, i=2 】
You are the oneCopyright © 1996-2011 SINA 55
STAT max_sid_time 20120508233440 ///最大 sid的时间戳
STAT max_binlog_file /data2/kv_data/data/binlog/binlog/binlog.0000000001.20120508.log ///最大 binlog文件
STAT read_thread_num 4 ///receive数据操作的线程数量
STAT read_thread_queue0 0 /// 第 1 个 receive线程滞留的消息数量
STAT read_thread_connect0 0 /// 第 1 个 receive线程管理的连接数
STAT read_thread_queue1 0 /// 第 2 个 receive线程滞留的消息数量
STAT read_thread_connect1 0 /// 第 2 个 receive线程管理的连接数
STAT read_thread_queue2 0 /// 第 3 个 receive线程滞留的消息数量
STAT read_thread_connect2 0 /// 第 3 个 receive线程管理的连接数
STAT read_thread_queue3 0 /// 第 4 个 receive线程滞留的消息数量
STAT read_thread_connect4 0 /// 第 4 个 receive线程管理的连接数
STAT write_thread_queue 0 ///写线程滞留的待处理消息的数量
STAT trans_thread_queue 0 ///master转发线程滞留的转发消息数量
STAT checkpoint_thread_queue 0 ///checkpoint线程滞留的消息数量
STAT zk_thread_queue 0 ///zk线程滞留的消息数量
STAT inner_sync_thread_queue 0 ///内部 binlog分发线程滞留的消息数量
运行信息— stats
You are the oneCopyright © 1996-2011 SINA 56
STAT outer_sync_thread_queue 0 ///外部分发线程滞留的消息数量
STAT master_trans_msg_num 0 ///当前 slave并发的往 master转发读、写的消息数量
STAT zk_state valid ///zookeeper 连接是否正常,若有问题则会输出错误信息
STAT cache_state valid ///cache 系统是否正常
STAT write_cache_key 111706 /// 写 cache 中 key的数量
STAT write_cache_space 468240 /// 写 cache 中脏数据占用的空间
STAT read_cache_max_size 4294967297 /// 读 cache的最大空间
STAT read_cache_max_key 200000000 /// 读 cache 中 key的最大数量
STAT read_cache_used_size 3783149248 /// 读 cache使用的空间
STAT read_cache_used_capacity 1300457554 /// 读 cache有效的空间
STAT read_cache_used_data_size 1064010726 /// 读 cache有效的数据
STAT read_cache_free_size 0 /// 空闲的读 cache 空间
STAT read_cache_free_capacity 0 /// 空闲的读 cache的有效空间
STAT read_cache_key_num 59111707 /// 读 cache 中 cache的数量
STAT read_cache_used_element 59111707 ///cache 使用的存储单元
STAT read_cache_free_element 0 /// 空闲的存储单元
运行信息— stats
工具介绍
新浪网研发 .SINA @2012.2.20
You are the oneCopyright © 1996-2011 SINA 58
功能: 添加一个 key 或 key 的 field,存在则失败。
命令 : kv_add 参数
参数:
-H : Unistor 的 Server host。
-P : Unistor 的 Server port。
-k:添加的 key的名字。
-f:若是添加 key的一个 field,则指定 field的名字,若不指定则为添加一个 key。
-X:引擎的扩展字符串。
-d : key 或 field的值。
-x : key 或 field的值的 xml文件。系统将其转化为 key/value结构。若是添加一个 key,则 xml 第一级节点为 field。
-t : key的超时时间。若 t<365*24*3600,则表示相对超时,否则为绝对超时时间。只有创建 key的时候才使用。
-v : key的版本号。若指定,则添加成功的 key采用此版本号。若不指定,系统按照自己的版本规则维护。
-c:在 read cache 中,不对 key进行 cache。
-u:用户的名字。
-p:用户的口令。
-S:添加标记。 0 :添加 key 。 1 :添加 field而且 key必须存在; 2 :添加 field , key可以不存在。其他值为 0 。
-h : help
工具— kv_add
You are the oneCopyright © 1996-2011 SINA 59
功能: Set一个 key 或 key 的 field。若存在则修改,否则添加
命令 : kv_set 参数
参数:
-H : Unistor 的 Server host。
-P : Unistor 的 Server port。
-k : Set 的 key的名字。
-f:若是 Set key的一个 field,则指定 field的名字,若不指定则为 Set一个 key。
-X:引擎的扩展字符串。
-d : key 或 field的值。
-x : key 或 field的值的 xml文件。系统将其转化为 key/value结构。若是 Set一个 key,则 xml 第一级节点为 field。
-t : key的超时时间。若 t<365*24*3600,则表示相对超时,否则为绝对超时时间。只有创建 key的时候才使用。
-v : key的版本号。若指定,则 Set成功的 key采用此版本号。若不指定,系统按照自己的版本规则维护。
-c:在 read cache 中,不对 key进行 cache。
-u:用户的名字。
-p:用户的口令。
-S : Set 标记。 0 :更新整个 key 。 1 :只对指定的 field进行更新,存在更新,不存在添加。其他值为 0 。
-h : help
工具— kv_set
You are the oneCopyright © 1996-2011 SINA 60
功能: update一个 key 或 key 的 field。若不存在则失败
命令 : kv_update 参数
参数:
-H : Unistor 的 Server host。
-P : Unistor 的 Server port。
-k : Update 的 key的名字。
-f:若是 Update key的一个 field,则指定 field的名字,若不指定则为 Update一个 key。
-X:引擎的扩展字符串。
-d : key 或 field的值。
-x : key 或 field的值的 xml文件。系统将其转化为 key/value结构。若是 Set一个 key,则 xml 第一级节点为 field。
-t : key的超时时间。若 t<365*24*3600,则表示相对超时,否则为绝对超时时间。只有创建 key的时候才使用。
-v : key的版本号。若版本号不一致则更新失败。
-u:用户的名字。
-p:用户的口令。
-S : update 标记。 0 :更新整个 key 。 1 :更新 field而且必须存在。 2 :更新 field,若 field不存在则添加。其他值
为 0 。
-h : help
工具— kv_update
You are the oneCopyright © 1996-2011 SINA 61
功能: inc 或 dec一个 key 或 key 的 field。此时 key 或 key 的 field为计数器。
命令 : kv_inc 参数
参数:
-H : Unistor 的 Server host。
-P : Unistor 的 Server port。
-k:计数器的 key的名字。
-f:若指定,则 field是一个计数器,否则 key是计数器。
-X:引擎的扩展字符串。
-i:计数器增加的数值。
-d:计数器减去的数值。
-t:若是创建 key而且指定此值,则设置 key 的 expire时间。
-v : key的版本号。若版本号不一致则计数失败。
-m:对于 inc操作,限定计数器的最大值。
-l:对于 dec操作,限定计数器的最小值。
-u:用户的名字。
-p:用户的口令。
-S : inc 标记。 0 :计数器必须存在。 1 : key必须存在, field计数器可以不存在。 2 : key可以不存在。其他值为 0 。
-h : help
工具— kv_inc
You are the oneCopyright © 1996-2011 SINA 62
功能: 删除一个 key 或 key 的 field
命令 : kv_del 参数
参数:
-H : Unistor 的 Server host。
-P : Unistor 的 Server port。
-k:删除的 key的名字。
-f: 若指定,则是删除 key的一个 field,否则删除整个 key。
-X:引擎的扩展字符串。
-v : key的版本号。若版本号不一致则删除失败。
-u:用户的名字。
-p:用户的口令。
-h : help
工具— kv_del
You are the oneCopyright © 1996-2011 SINA 63
功能: 获取一个 key或多个 key,并可以筛选返回的 field
命令 : kv_get 参数
参数:
-H : Unistor 的 Server host。
-P : Unistor 的 Server port。
-k : get 的 key的名字。此参数可以重复表示 get多个 key。
-f: 若指定则获取 key的指定 field,否则返回整个 key。此参数可以重复以返回多个 field。
-X:引擎的扩展字符串。
-v:返回 key的版本号。此只对 get一个 key的时候有效。
-u:用户的名字。
-p:用户的口令。
-m:从master 获取 key。
-i:返回 key的定义。 0 : key 的 data ; 1 : key 的 info ; 2 :系统 key。若返回的统计信息,则为
【 expire , version , data length 、 version】。
-h : help
工具— kv_get
You are the oneCopyright © 1996-2011 SINA 64
功能: 获取指定范围的 key,并可以筛选返回的 field
命令 : kv_list 参数
参数:
-H : Unistor 的 Server host。
-P : Unistor 的 Server port。
-s:若指定则限定 list的开始 key。
-e:若指定则限定 list的结束 key。结束 key一定不包含。
-n: 获取的数量,最大 1024,缺省 50。
-f:返回的 key,可以有多个 -f参数。若不指定则返回整个 key。
-X:引擎的扩展字符串。
-o : desc排序,缺省为 asc排序。
-u:用户的名字。
-p:用户的口令。
-m:从master 获取 key。
-b:不返回 -s指定的开始 key,否则返回。
-i:只返回 key的信息。返回内容格式为【 expire-time, 版本号, data 长度 , data是否包含 field】。各部分以【,】分割。
-h : help
工具— kv_list
You are the oneCopyright © 1996-2011 SINA 65
功能: 检测指定的 key 或 field是否存在
命令 : kv_exist 参数
参数:
-H : Unistor 的 Server host。
-P : Unistor 的 Server port。
-k : key的名字。
-f : field的名字。若不指定则检测 key是否存在,否则检测 field。
-X:引擎的扩展字符串。
-v:是否同时返回 key的版本。
-u:用户的名字。
-p:用户的口令。
-m:从master 获取 key。
-h : help
工具— kv_exist
You are the oneCopyright © 1996-2011 SINA 66
功能: 数据导出工具,形成新的存储数据。
命令 : kv_export 参数
参数:
-H : Unistor 的 Server host。
-P : Unistor 的 Server port。
-C:导出数据存储的 unistor对应的配置文件。
-c:数据导出时的 chunk大小,单位为 KByte。默认 64。
-k:开始导出 key的位置。
-X:引擎的扩展字符串。
-S:数据导出的 subscribe规则。可以按照 group求余、 group范围及 key范围指定。
-t:若指定,则重新设置 key 的 expire时间。
-B:若导出数据中间中断,在继续执行时需要通过 -B参数指定上一次导出的开始 sid值。
-E:当 key导出完毕时,会返回当时的最大 sid值。若在导出 binlog时中断,可通过指定此值从此点往外导出 binlog。
-N:是否重置 binlog 的 sid,若是同一个分组的则不能指定。
-u:用户的名字。
-p:用户的口令。
-o:输出的日志文件。
-h : help
工具— kv_export
You are the oneCopyright © 1996-2011 SINA 67
功能: unistor的性能 base-bench测试工具。
配置文件: unistor_bench.cnf
[unistor_bench]
home=/usr/home/test/jpool/src/unistor/trunk/unistor/unistor_bench ///运行目录
listen=172.16.42.1:9669 ///unistor的数据 receive端口号
conn_num=500 ///并发连接的数量
conn_lasting=1 ///是否为持久连接
expire=10 ///导入 key 的 expire时间
data_opr=get ///测试的数据操作类型,可以为 get 、 set 、 update 、 add 、 delete 五种
data_size=128 ///测试的 key/value 的 value字节数
data_key_in_order=yes ///key是佛顺序插入
data_get_order=yes ///key 获取的时候,是否顺序获取
data_base=10000000 ///<key是通过数字做md5 签名形成的,此是指定数字的起始值。
data_mod=0 ///<可以测试一个范围的 key的反复操作模拟热点。此就是对形成 key的数字进行mod求余。若为 0 表示不求余。
data_master=yes ///<数据操作必须对master
data_group=1 ///<可以设置多个 bench服务进行压测。此时 bench压测实例的数量。
data_group_index=0 ///<当前 bench是第几个实例。
cache=yes ///<unistor接收到 add 、 set的数据是否 cache
user=dwb2 ///unistor接收数据的用户名
passwd=dwb2 ///unistor接收数据的用户口令。
工具— unistor_bench
You are the oneCopyright © 1996-2011 SINA 68
完善统计信息
同一个 IDC 的 master-slave采用同步复制。
引擎开发
日后的扩展
You are the oneCopyright © 1996-2011 SINA
Thanks…
69