unistor 介绍 ( v1.0 )

69
Unistor 介介 V1.0 V1.0 介介介介介 .SINA @2012.2.20

Upload: tova

Post on 22-Jan-2016

149 views

Category:

Documents


1 download

DESCRIPTION

Unistor 介绍 ( V1.0 ). 新浪网研发 .SINA @2012.2.20. 总体介绍. 新浪网研发 .SINA @2012.2.20. Unistor 定位与思想. Unistor 是定位在 【memeche 、 redis】 与 【mysql】 间的一个 key/value 存储产品。 其遵循以下的原则: 数据的高可靠性 ---》 高效的持久化存储。 高可用性 ---》 通过 zookeeper 实现主、从切换,而且对外不分主从。但可以构建 master 与 slave 集群。 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Unistor   介绍 ( V1.0 )

Unistor 介绍(( V1.0V1.0))

新浪网研发 .SINA @2012.2.20

Page 2: Unistor   介绍 ( V1.0 )

总体介绍总体介绍

新浪网研发 .SINA @2012.2.20

Page 3: Unistor   介绍 ( V1.0 )

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定位与思想

Page 4: Unistor   介绍 ( V1.0 )

You are the oneCopyright © 1996-2011 SINA 4

通过开发不同的存储引擎,实现如下的应用场景:

前端高可用 cache系统:

cache的数据大于内存大小。

要求存储固定时间的存储系统:

如数据必须 cache一周、一月等指定的时间才能够实现。

要求存储固定数据量的存储需求如按照用户为单位,每个用户存储最新N条数据。

小文件的大文件存储如图片缩略图文件、用户 session。

高效计数器unistor的计数器支持max 、 min值,而且高效。可开发专门的计数器系统。

适应场景

Page 5: Unistor   介绍 ( V1.0 )

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进行操作。

不适应场景

Page 6: Unistor   介绍 ( V1.0 )

You are the oneCopyright © 1996-2011 SINA 6

总体架构图

说明:1 、集群可以分master 、 slave集群。每个集群可有自己独立的 zookeeper管理。2 、 Master集群的所有节点,都是可写的,其内部实现master转发。3 、 Slave集群的master,负责从配置的master集群同步数据,而其他的从master同步。4 、数据同步采用可配置的多条连接,以提高吞吐里。而且集群内部的同步为串行同步。

Page 7: Unistor   介绍 ( V1.0 )

You are the oneCopyright © 1996-2011 SINA 7

服务内部架构

Page 8: Unistor   介绍 ( V1.0 )

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的事件。并将这些事件通知相关的

线程。

服务内部架构说明

Page 9: Unistor   介绍 ( V1.0 )

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

Page 10: Unistor   介绍 ( V1.0 )

You are the oneCopyright © 1996-2011 SINA 10

支持基于 key范围或 key 的 hash值, export数据。

内部有基于 key的读、写 cache,以保证热点数据的高效读、写。

所有 key具有 32位的版本号,控制 key的更新。

通过存储引擎,可以实现对多种数据结构的存储支持。

功能说明 -2

Page 11: Unistor   介绍 ( V1.0 )

数据操作接口说明数据操作接口说明

新浪网研发 .SINA @2012.2.20

Page 12: Unistor   介绍 ( V1.0 )

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(存在则失败)

Page 13: Unistor   介绍 ( V1.0 )

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(不存在则添加)

Page 14: Unistor   介绍 ( V1.0 )

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(不存在则失败)

Page 15: Unistor   介绍 ( V1.0 )

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

Page 16: Unistor   介绍 ( V1.0 )

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(不存在则失败)

Page 17: Unistor   介绍 ( V1.0 )

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

Page 18: Unistor   介绍 ( V1.0 )

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

Page 19: Unistor   介绍 ( V1.0 )

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

Page 20: Unistor   介绍 ( V1.0 )

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

Page 21: Unistor   介绍 ( V1.0 )

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(直接覆盖)

Page 22: Unistor   介绍 ( V1.0 )

You are the oneCopyright © 1996-2011 SINA 22

接收:【消息类型: 21 】

u:用户名

p:口令

回复:【消息类型: 22 】

ret:接收状态( 0 :成功,其他:各种错误代码)

err:错误时的错误消息( ret为非 0 的错误描述)

操作接口—认证接口

Page 23: Unistor   介绍 ( V1.0 )

数据数据 ExportExport接口说明接口说明

新浪网研发 .SINA @2012.2.20

Page 24: Unistor   介绍 ( V1.0 )

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说明

Page 25: Unistor   介绍 ( V1.0 )

You are the oneCopyright © 1996-2011 SINA 25

接收:【消息类型: 109 】

ret:错误消息号。

err:错误的消息内容

回复:【消息类型: 110 】

无需回复,直接关闭连接。

此消息用于 export及数据同步过程中的错误通报。若收到此消息则连接会被 server关闭。

错误接口

Page 26: Unistor   介绍 ( V1.0 )

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 报告接口

Page 27: Unistor   介绍 ( V1.0 )

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接口—数据发送接口

Page 28: Unistor   介绍 ( V1.0 )

You are the oneCopyright © 1996-2011 SINA 28

接收:【消息类型: 53 】

sid:导出完毕时的 binlog 的 sid值,至少需要同步此部分 binlog 保证数据的完整性。

回复: 无需回复, unistor会主动关闭连接。

数据 Export接口—数据导出完毕接口

Page 29: Unistor   介绍 ( V1.0 )

数据同步接口说明数据同步接口说明

新浪网研发 .SINA @2012.2.20

Page 30: Unistor   介绍 ( V1.0 )

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值建立多条连接同步。

若认证或其他失败,则发送错误消息。随后开始同步数据。

数据同步接口—数据同步报告接口

Page 31: Unistor   介绍 ( V1.0 )

You are the oneCopyright © 1996-2011 SINA 31

接收:【消息类型: 103 】

Session:连接所属的同步 session。

回复:【消息类型: 104 】

不回复,若成功直接发送数据,否则发送错误消息。

数据同步接口—多连接同步的连接报告接口

Page 32: Unistor   介绍 ( V1.0 )

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 模式同步数据

Page 33: Unistor   介绍 ( V1.0 )

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 模式同步数据

Page 34: Unistor   介绍 ( V1.0 )

配置说明

新浪网研发 .SINA @2012.2.20

Page 35: Unistor   介绍 ( V1.0 )

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

Page 36: Unistor   介绍 ( V1.0 )

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

Page 37: Unistor   介绍 ( V1.0 )

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

Page 38: Unistor   介绍 ( V1.0 )

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

Page 39: Unistor   介绍 ( V1.0 )

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

Page 40: Unistor   介绍 ( V1.0 )

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

Page 41: Unistor   介绍 ( V1.0 )

编译安装

新浪网研发 .SINA @2012.2.20

Page 42: Unistor   介绍 ( V1.0 )

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的依赖

Page 43: Unistor   介绍 ( V1.0 )

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文件

编译安装—目录结构

Page 44: Unistor   介绍 ( V1.0 )

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的编译、安装(一)

Page 45: Unistor   介绍 ( V1.0 )

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的编译、安装(二)

Page 46: Unistor   介绍 ( V1.0 )

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的编译、安装

Page 47: Unistor   介绍 ( V1.0 )

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的编译、安装

Page 48: Unistor   介绍 ( V1.0 )

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为例)

Page 49: Unistor   介绍 ( V1.0 )

存储引擎

新浪网研发 .SINA @2012.2.20

Page 50: Unistor   介绍 ( V1.0 )

You are the oneCopyright © 1996-2011 SINA 50

Unistor的数据是通过外挂的存储引擎存储。

通过不同的存储引擎,可以实现不同类型数据的存储。

通过不同的存储引擎,可以实现不同类型数据结构的存储。

存储引擎可以是基于内存的。

通过 unistor.cnf 来设置存储引擎的配置信息。

其是在 unistor.cnf 中、名字为【具体存储引擎名字】的 section。

如,对于 bdb的存储引擎,在 unistor.cnf 中,有一个【 bdb】的 section 来配置 bdb引擎。

存储引擎 --说明

Page 51: Unistor   介绍 ( V1.0 )

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引擎

Page 52: Unistor   介绍 ( V1.0 )

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通用计数引擎

Page 53: Unistor   介绍 ( V1.0 )

运行信息

新浪网研发 .SINA @2012.2.20

Page 54: Unistor   介绍 ( V1.0 )

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 】

Page 55: Unistor   介绍 ( V1.0 )

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

Page 56: Unistor   介绍 ( V1.0 )

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

Page 57: Unistor   介绍 ( V1.0 )

工具介绍

新浪网研发 .SINA @2012.2.20

Page 58: Unistor   介绍 ( V1.0 )

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

Page 59: Unistor   介绍 ( V1.0 )

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

Page 60: Unistor   介绍 ( V1.0 )

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

Page 61: Unistor   介绍 ( V1.0 )

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

Page 62: Unistor   介绍 ( V1.0 )

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

Page 63: Unistor   介绍 ( V1.0 )

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

Page 64: Unistor   介绍 ( V1.0 )

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

Page 65: Unistor   介绍 ( V1.0 )

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

Page 66: Unistor   介绍 ( V1.0 )

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

Page 67: Unistor   介绍 ( V1.0 )

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

Page 68: Unistor   介绍 ( V1.0 )

You are the oneCopyright © 1996-2011 SINA 68

完善统计信息

同一个 IDC 的 master-slave采用同步复制。

引擎开发

日后的扩展

Page 69: Unistor   介绍 ( V1.0 )

You are the oneCopyright © 1996-2011 SINA

Thanks…

69