中文 TPCC驱动在Domino HBase上的移植 - domino-succ/tpcc-hbase GitHub Wiki
概要
TPC-C是对OLTP系统进行测试的标准,而HBase作为新型NoSQL数据库,数据以及操作模型都是KeyValue风格的,所以HBase本身并不具备直接使用TPC-C进行测试的条件,比如它没有数据规约、没有二级索引、没有数据类型等。因此,我们针对HBase对TPC-C的一些标准进行了修改,设计并开发了一套HBase风格的TPC-C驱动。
数据规约
由于TPC-C对数据规约并没有太大需求,因此我们忽略了HBase上的数据规约设计,对于一些关联外键,直接使用RowKey进行关联。
数据类型
- 对于字符串型数据,使用Unicode编码后的二进制数据进行存储。
- 对于整型、浮点型以及日期时间型数据,统一采用8字节长整型数进行保存,转换协议采用HBase自带的Bytes工具类。
- 对于RowKey,使用整型ID转化为定长字符串,不足长度在左边补‘0’,具体长度根据库表而定。
库表设计
WAREHOUSE表,RowKey由5个字节组成,由W_ID直接进行赋值,其他字段对应于TPC-C的WAREHOUSE表。
DISTRICT表,RowKey由5个字节的W_ID及2个字节的D_ID拼接组成,其他字段对应于TPC-C的DISTRICT表。
ITEM表,RowKey由5个字节组成,由I_ID直接进行赋值,其他字段对应于TPC-C的ITEM表。
STOCK表,RowKey由5个字节的W_ID以及5个字节的I_ID拼接而成,其他字段对应于TPC-C的STOCK表。
CUSTOMER表,RowKey由5个字节的W_ID、2个字节的D_ID及5个字节的C_ID拼接而成,其他字段对应于TPC-C的CUSTOMER表。
ORDER表,RowKey由5个字节的W_ID、2个字节的D_ID及7个字节的O_ID拼接而成,其他字段对应于TPC-C的ORDER表。
NEW-ORDER表,RowKey由5个字节的W_ID、2个字节的D_ID及7个字节的O_ID拼接而成,其他字段对应于TPC-C的NEW-ORDER表。
ORDER-LINE表,RowKey由5个字节的W_ID、2个字节的D_ID、7个字节的O_ID及2个字节的OL_ID拼接而成,其他字段对应于TPC-C的ORDER-LINE表。
HISTORY表,由于本身无主键,所以设计RowKey由5个字节的W_ID、2个字节的D_ID、5个字节的C_ID和8个字节的时间戳组成,其他字段对应于TPC-C的HISTORY表。
另外,除了TPC-C中的数据表,根据TPC-C几类事务的查询特点,我们还在HBase中增加了两个索引表:
CUSTOMER-INDEX-LAST表,用来对客户的C_LAST建立索引,处理Payment以及OrderStatus事务中以C_LAST作为查询条件的操作,RowKey由5个字节的W_ID、2个字节的D_ID、C_LAST、分隔符以及C_FIRST拼接而成,在进行查询时只需填充好W_ID、D_ID、C_LAST,就可以很自然地利用HBase的数据模型得到按C_FIRST排序的C_ID了。
ORDER-INDEX-CUSTOMER表,用来对客户的C_ID以及O_ID建立倒序索引,处理OrderStatus事务中对用户最近订单的查询。由于HBase不支持对数据的倒序扫描,我们对该表的RowKey进行了这样的处理:5字节W_ID + 2字节D_ID + 5字节C_ID + (O_ID上界99999 – O_ID),这样在扫描时,指定好W_ID、D_ID、C_ID以后,第一条即为用户最近的订单O_ID。当新订单生成时,TPC-C HBase驱动将自动写入一条对应的ORDER-INDEX-CUSTOMER记录。
读写操作的转化
OLTP系统大都使用SQL作为数据存取的接口,对于HBase而言,只要有合适的库表设计,就可以使用Get、Put、Scan以及Delete完成大部分SQL的功能,根据3)中的库表设计,我们已经完全可以使用这些基本操作来处理所有的事务了。