AWS的DynamoDB是一款非常受欢迎的Non-SQL数据库。DDB的实现应用了非常多的分布式系统的技术,例如SHARD,eventual consistency,consistency Hash等。我们通过模拟一个简单的DDB的实现,可以更好的理解这些技术是如何工作的。
在本文中我们首先用python实现DDB的最基本的API,包括table有关的API,和table本身的API。DDB作为Non-SQL数据库,是以key-value的方式存储数据的。也就是说每一行记录都有一个primary key(partition key + sort key)。DDB的所有操作都是基于key-value的存储方式建立的。我们在这里将value进行简化,只存储一个string类型。将key进行简化为一个string类型。首先我们先看DDB实现的第一个版本:
# class to provide DDB public APIs
class DDB:
def __init__(self):
self.tables = {}
def create_table(self, table_name):
self.tables[table_name] = self.Table(table_name)
def list_table(self):
for table in self.tables.values():
table.describe()
def delete_table(self, table_name):
self.tables.pop(table_name)
def get_table(self, table_name):
return self.tables[table_name]
class Table:
def __init__(self, name):
self.rows = {}
self.name = name
def put_item(self, key, value):
self.rows[key] = value
def update_item(self, key, value):
self.rows.update(key, value)
def get_item(self, key):
return self.rows[key]
def delete_item(self, key):
self.rows.pop(key)
def describe(self):
print("Table name: {}, item size: {}".format(self.name, len(self.rows)))
我们目前实现了DDB级别的如下API:
- create_table() - 创建table
- list_table() - 展示table列表
- delete_table() - 删除table
- get_table() - 获取table
实现了Table级别的如下API:
- put_item() - 创建记录
- update_item() - 更新记录
- get_item() - 获取记录
- delete_item() - 删除记录
- describe() - 给出table描述
Class diagram现在看起来是这个样子:
下面我们写一个简单的测试代码:
from ddb import DDB
ddb = DDB()
table_name = "test_table"
key = "test_key"
value = "test_value"
ddb.create_table(table_name)
ddb.list_table()
ddb_table = ddb.get_table(table_name)
ddb_table.put_item(key, value)
print(ddb_table.get_item(key))
ddb_table.update_item(key, "updated value")
print(ddb_table.get_item(key))
ddb_table.describe()
ddb_table.delete_item(key)
ddb_table.describe()
测试代码的输出:
Table name: test_table, item size: 0
test_value
updated value
Table name: test_table, item size: 1
Table name: test_table, item size: 0
现在的实现是建立在单一环境中的。我们会在下面的实现中先给table加入Shard。通过Shard,DDB的存在可以方便的scale out。敬请关注后续的文章。