简介
继我们在高级JDBC(Java数据库连接)封装驱动器方面的工作之后,我们继续增强使用Python构建的现代应用程序的可扩展性和弹性。可扩展性对于按需处理数百万用户至关重要,对于电子商务、金融服务和游戏等有状态应用程序而言,这意味着拥有高可用性的数据库。
Amazon Aurora的发布
2015年发布Amazon Aurora时,客户可以在由一个写入节点和多达15个低延迟读取节点组成的Aurora集群中运行关系型数据库。这使应用程序能够扩展读取量并在副本之间进行负载均衡。然而,与支持多个实例的任何数据库一样,开发人员构建了复杂的应用程序逻辑来处理诸如切换或故障转移等特殊事件。
高级Python封装驱动器的功能
高级Python封装驱动器现在提供了处理诸如切换或故障转移等功能,而不需要将复杂的端点逻辑编写到应用程序中。此外,该驱动器还集成了使用AWS Secrets Manager或AWS身份和访问管理(IAM)进行身份验证的处理。高级Python封装驱动器已作为开源项目在Apache 2.0许可下发布。您可以在GitHub上找到该项目。
驱动器的特点
高级Python封装驱动器封装了原生的Psycopg或MySQL Connector/Python驱动器,在将函数调用委托给底层驱动器之前,增加了故障转移和身份验证功能。使用原生驱动器执行API减少了代码的复杂性,只关注额外的功能。
Aurora集群的连接挑战
Aurora提供了一个数据库实例集群,而不是单个实例。每个连接由特定的数据库实例处理。当您连接到Aurora集群时,您指定的主机名和端口指向一个中间处理器,称为端点。Aurora使用端点机制来抽象这些连接。
驱动器缓解的一些挑战
切换(Switchover)
切换是将Aurora副本提升为写入者时发生的情况。
IAM集成
使用IAM,您可以指定哪个用户可以访问AWS中的服务和资源,集中管理细粒度权限,并分析访问以完善跨AWS的权限。
Secrets Manager集成
Secrets Manager能够集中存储和管理凭据。集中存储凭据提供了根据安全要求轮换它们的能力。
解决方案概述
没有高级Python驱动器的情况下,典型的Python代码连接并查询数据库如下所示:
with psycopg.connect("host=database.cluster-xyz.us-east-1.rds.amazonaws.com dbname=postgres user=john password=pwd") as conn:
with conn.cursor() as cur:
cur.execute("SELECT aurora_db_instance_identifier()")
cur.fetchone()
for record in cur:
print(record)
conn.commit()
当连接由于切换失败时,获取连接的尝试将失败,直到新的写入者上线。有了高级驱动器,重连会自动处理。
安装和使用高级Python封装驱动器
先决条件
高级Python封装器使用PEP 249 - Python数据库API规范2.0模式实现。这意味着需要将原生Psycopg或MySQL Connector/Python驱动器作为依赖项添加。
安装驱动器
使用pip安装驱动器:
pip install aws-advanced-python-wrapper
创建使用高级Python封装驱动器的应用程序
以下是创建使用高级Python封装驱动器的应用程序所需的步骤概述。
获取高级Python封装驱动器
安装高级Python驱动器使用pip:
pip install aws-advanced-python-wrapper
更新代码
在拥有正确的依赖项后,需要对应用程序进行一些更改以使用高级Python驱动器。
指定驱动器特性
确定您想要使用的驱动器特性。AWS高级Python驱动器使用插件来运行数据库方法。
Secrets Manager集成
AWS提供了一个存储秘密的服务。AWS高级Python封装驱动器提供了一个插件,方便地将用户名和密码的值存储在秘密中,并访问它以提供用于身份验证的USER和PASSWORD的值。
IAM身份验证集成
AWS高级Python驱动器支持IAM身份验证。使用IAM数据库身份验证时,主机URL必须是有效的Amazon终端节点。
配置IAM身份验证
完成以下步骤以设置IAM身份验证:
- 在Amazon RDS控制台中启用现有数据库的IAM数据库身份验证或创建具有IAM数据库身份验证的新数据库。
- 设置IAM策略以进行IAM数据库身份验证。
- 使用主登录名连接到您选择的数据库。
使用IAM身份验证与高级Python封装驱动器
以下是如何使用驱动器进行IAM身份验证的示例代码:
with AwsWrapperConnection.connect(
psycopg.Connection.connect,
host="database.cluster-xyz.us-east-1.rds.amazonaws.com",
dbname="postgres",
user="john",
plugins="iam"
) as awsconn, awsconn.cursor() as awscursor:
awscursor.execute("CREATE TABLE IF NOT EXISTS bank_test (name varchar(40), account_balance int)")
cursor.execute("SELECT aurora_db_instance_identifier()")
for record in res:
print(record)
清理
如果您在遵循本文时创建了任何Aurora集群、IAM凭据或Secrets Manager凭据,请确保删除它们。
总结
AWS高级Python驱动器使用AWS的IAM或Secrets Manager和Aurora提供的集群配置,提供身份验证和故障转移解决方案。此外,通过利用Aurora的功能,驱动器将故障转移时间从30秒减少到7秒或更短。我们将在未来的文章中探索驱动器的更多功能。敬请关注!与此同时,请在本文下分享您的评论,并访问GitHub项目以获取更多详情和示例。
关于作者
Dave Cramer是Amazon Web Services的高级软件工程师。他还是PostgreSQL JDBC驱动器的维护者,是PostgreSQL的主要贡献者。他对客户端接口和与客户端合作充满热情。




