连接实用程序
nydus的Python项目详细描述
通用数据库实用程序,包括连接群集和路由,因此您可以像pro一样进行扩展。
下面的示例创建一个redis连接集群,该集群将基于哈希键的简单模数查找来分发读写操作:
fromnydus.dbimportcreate_clusterredis=create_cluster({'backend':'nydus.db.backends.redis.Redis','router':'nydus.db.routers.keyvalue.PartitionRouter','hosts':{0:{'db':0},1:{'db':1},2:{'db':2},}})res=redis.incr('foo')assertres==1
nydus.db.创建群集
create_cluster函数是一个基于简单dict配置配置Cluster的简单助手。
有两个必需的关键字参数:
backend:后端类的完整路径,它应该扩展nydus.db.backends.BaseConnection。
hosts:一个字典,其中键是有序的数值,结果是连接选项的dict。
(这些键是数值,只是为了便于配置时的可读性)
defaults:所有主机的默认设置字典。
或者,您也可以为router指定一个值,它是路由器类的完整路径, 必须扩展nydus.db.routers.BaseRouter。
分布式查询
在某些情况下,您可能希望在多个节点上执行查询(并行)。NYDUS有内置的支持,当任何路由功能 返回一组节点:
fromnydus.dbimportcreate_cluster>>># by not specifying a router all queries are executed on all hostsredis=create_cluster({'backend':'nydus.db.backends.redis.Redis','hosts':{0:{'db':0},1:{'db':1},2:{'db':2},}})>>># map the query over all connections returned by the default routerres=redis.incr('foo')>>>asserttype(res)==listassertlen(res)==3
您还可以通过连接(同样,由路由器返回)映射许多查询(利用内部队列):
withredis.map()asconn:results=[conn.incr(k)forkinkeys]
从0.5.0版开始,map()函数现在支持管道,包含的redis后端将管道命令 只要可能。
redis
nydus最初是作为一个工具包设计的,用于在disfs中扩展redis的使用。尽管它确实提供了 一个用于构建不是redis的集群的框架,大部分的支持都用于提供实用程序 用于在redis集群上路由和查询。
您可以通过指定连接的完整路径来配置redis客户端:
redis=create_cluster({'backend':'nydus.db.backends.redis.Redis','hosts':{0:{'db':0},},})
可用的主机选项有:
- 主持人
- 端口
- 分贝
- 超时
- 密码
- 标识符
redis客户端还通过map命令支持管道。这意味着所有命令最多都会命中服务器 从一次起:
withredis.map()asconn:conn.set('a',1)conn.incr('a')results=[conn.get('a'),conn.get('b')]results['a']==2results['b']==None
简单分区路由器
还有几个内置路由选项。最简单的是一个简单的分区路由器,它只是一个简单的 散列键:
redis=create_cluster({'backend':'nydus.db.backends.redis.Redis','router':'nydus.db.routers.keyvalue.PartitionRouter','hosts':{0:{'db':0},},})
一致哈希路由器
作为对哈希的改进,nydus提供了一个基于ketama的一致哈希路由器:
redis=create_cluster({'backend':'nydus.db.backends.redis.Redis','router':'nydus.db.routers.keyvalue.ConsistentHashingRouter','hosts':{0:{'db':0},},})
循环路由器
分发查询的另一个选项是循环路由器:
redis=create_cluster({'backend':'nydus.db.backends.redis.Redis','router':'nydus.db.routers.RoundRobinRouter','hosts':{0:{'db':0},},})
皮卡萨
支持pycassa(cassandra)集群的基本连接管理,但我们使用非标准语法 在这种情况下,将群集创建为路由行为和每个连接选项是不有用的:
pycassa=create_cluster({'backend':'nydus.db.backends.pycassa.Pycassa','hosts':['localhost'],'keyspace':'test',})
注意
pycassa在内部处理主机的路由,这意味着像map这样的东西没有影响。