使用 Amazon Keyspaces 以熟悉的操作方式实现可扩展性

简介

在本课中,您将为应用程序创建 Users 服务。该服务处理应用程序的所有用户特定功能,包括注册和基本检索。该服务使用 Amazon Keyspaces(适用于 Apache Cassandra)来处理数据存储,它是一个兼容 Apache Cassandra 的全托管数据库。

您将通过本课学习如何在应用程序中使用全托管的 Amazon Keyspaces 表。首先,您将了解为什么要使用 Amazon Keyspaces。然后,您将按照步骤创建一个 Amazon Keyspaces 表,并在应用程序中使用它。在本课结束时,您应当能够在应用程序中自如使用 Amazon Keyspaces。

完成时间:30–45 分钟

Purpose-built Databases - Keyspaces (17:59)
为什么使用 Amazon Keyspaces?

Amazon Keyspaces 是一项全托管的服务,用于在 AWS 上运行兼容 Cassandra 的数据库。许多数据规模大、性能要求高的应用程序都会使用 Apache Cassandra。

Amazon Keyspaces 适用于需要高吞吐量的应用程序,其访问模式相对简单。许多开发人员在用户配置文件服务这类元数据使用场景中采用 Amazon Keyspaces,或者将其用于物联网 (IoT) 设备数据的存储、在消息服务中处理消息等涉及时间序列数据的场景。在本课程中,您将使用 Amazon Keyspaces 处理用户元数据,因为其中大部分访问模式都是简单的键值访问模式。

如果您现有一个使用 Cassandra 的应用程序,并希望使用全托管的服务来减轻操作负担,那么您可以选择 Amazon Keyspaces。借助 Amazon Keyspaces,您的数据库操作由 AWS 管理,使您的团队可以安心专注于创新。Amazon Keyspaces 处理集群扩展、实例故障转移、数据备份和软件更新。如果您想了解有关将现有 Cassandra 工作负载迁移到 Amazon Keyspaces 的更多信息,请参阅有关从自建 Cassandra 迁移到全托管的 Amazon Keyspaces 的课程。

若您熟悉其 API 和数据模型,您还可以选择使用 Amazon Keyspaces 构建全新的应用程序。Amazon Keyspaces 与 Apache Cassandra API 兼容,已经熟悉 Cassandra 的开发人员无需学习新的 API。借助 Amazon Keyspaces,他们可以利用熟悉的开源 API,同时使用全托管的数据库。

课程内容

在本课中,您将学习如何使用 Amazon Keyspaces 存储数据,进而构建 Users 服务。本课分为四个部分。

  • 在本模块中,您将创建和准备 AWS Cloud9 环境。AWS Cloud9 是基于云的集成开发环境 (IDE)。可以为您快速搭建一致的开发环境,让您在其中快速构建 AWS 应用程序。


    首先,请前往 AWS Cloud9 控制台。点击 Create environmen(创建环境)启动 AWS Cloud9 环境创建向导。

    (点击放大)

    在向导的第一页,为您的环境命名和提供描述。然后点击 Next step(下一步)。

    (点击放大)

    在下一步中,您可以配置环境设置(如环境中的实例类型、平台和网络设置)。

    在本课中保留默认设置,因此滚动到底部并点击 Next step(下一步)。

    (点击放大)

    最后一步显示您的设置以供审查。滚动到底部并点击 Create environment(创建环境)。

    (点击放大)

    配置 AWS Cloud9 环境应当需要几分钟时间。如果系统正在创建环境,则会显示以下屏幕。

    (点击放大)

    几分钟后,您应当会看到 AWS Cloud9 环境。如以下屏幕截图所示,AWS Cloud9 控制台有三个区域需要了解:

    • 文件资源管理器:文件资源管理器位于 IDE 的左侧区域,会显示您目录中的文件列表。
    • 文件编辑器:文件编辑器位于 IDE 的右上区域,您可以在其中查看和编辑在文件资源管理器中选择的文件。
    • 终端:终端位于 IDE 的右下区域,您可以在其中运行用来执行代码示例的命令。
    (点击放大)

    在本课中,您将使用 Python 与 Amazon Keyspaces 表进行交互。在 AWS Cloud9 终端运行以下命令来下载并解压缩模块代码。

    cd ~/environment
    curl -sL https://s3.amazonaws.com/aws-data-labs/keyspaces.tar | tar -xv

    在 AWS Cloud9 终端运行以下命令来查看您的目录内容。

    ls

    在 AWS Cloud9 终端,您应当会看到七个文件:

    • create_user.py
    • delete_user.py 
    • entities.py 
    • get_user.py
    • requirements.txt
    • test_connection.py
    • utils.py

    在终端运行以下命令来安装应用程序的依赖项。

    sudo pip install -r requirements.txt

    另外,请在环境文件中设置 AWS 区域。

    echo "export AWS_REGION=us-east-1" >> env.sh && source env.sh

    此示例使用 us-east-1 区域,但您可以输入想要在本课程中使用的任何 AWS 区域。

    使用 env.sh 文件存储本课程中所需资源的环境变量和其他参数。如果您在本课程中休息了一段时间并在 AWS Cloud9 环境中启动了一个新会话,请务必在终端执行以下命令来重新加载您的环境变量。

    source env.sh


    在本模块中,您配置了一个用于开发的 AWS Cloud9 实例。在下一个模块中,您将创建一个 Amazon Keyspaces 表。

  • 在本模块中,您将创建一个 Amazon Keyspaces 表。这张表将用作应用程序中 Users 服务的主数据库。


    首先,前往 Amazon Keyspaces 控制台。在 Amazon Keyspaces 页面上,点击 Create keyspace(创建键空间),创建一个新的键空间。

    (点击放大)

    在键空间创建向导中,将您的键空间命名为 users

    (点击放大)

    您可以向键空间添加标签,以便控制访问权限或跟踪计费。然后,点击 Create keyspace(创建键空间),创建您的键空间。

    (点击放大)

    现在您应当能在 Amazon Keyspaces 控制台上看到您的键空间。点击您的键空间,查看其详细信息。

    (点击放大)

    当前,您的键空间中还没有任何表。在您的键空间中创建首个用于存放应用程序用户数据的表。

    点击 Create table (创建表),打开创建表向导。

    (点击放大)

    首先,您需要为表命名。该表会存储用户信息,因此将其命名为 users。

    (点击放大)

    然后,您需要声明表结构。向您的表中添加如下五列:

    • username
    • name
    • email
    • address
    • birthdate

    除了 birthdate 列是 timestamp 类型,所有列都应当是 ASCII 类型。

    在 Amazon Keyspaces 创建表向导中,您的结构应当如下所示。

    (click to zoom)

    接下来,为您的表选择分区键和任意聚类列。使用分区键,您可以唯一标识表中的特定项。

    选择 username 为分区键,因为用户名可唯一标识每个用户。

    (点击放大)

    最后,选择计费模式并添加所需标签。采用 Amazon Keyspaces 的按需容量模式时,您无需规划表的容量。Amazon Keyspaces 直接根据您所用的读写量来计费。采用预置容量模式时,您需要声明想预置的读写量。

    (点击放大)

     

    创建表向导将向您展示一条 Apache Cassandra 命令,执行该命令即可创建表。

    当您准备好后,可点击 Create table(创建表)来创建您的表。

    (点击放大)

    Amazon Keyspaces 控制台显示您的表正在创建过程中。在创建表时,表的 Status(状态)会显示为 Creating(创建中)。

    当表准备就绪时,表的 Status(状态)将变为 Active(可用)。

    (点击放大)
    (点击放大)

     

    为了连接到您的 Amazon Keyspaces 表,请创建特定服务的凭据。对 Amazon Keyspaces 表进行身份验证有两种方式,使用这些凭据是其中之一。

    特定服务的凭据是与某一特定的 AWS Identity and Access Management (IAM) 用户绑定的凭据,用于服务的身份验证。

    若要创建特定服务的凭据,请前往 AWS 管理控制台的 IAM 用户页面。找到您想要授予特定服务凭据的 IAM 用户并选择该用户。

    (点击放大)

    在该 IAM 用户页面上,选择 Security credentials(安全凭据)页签。

    (点击放大)

    接着前往页面底部。在 Amazon Keyspaces 部分中,点击 Generate credentials(生成凭据),创建该 IAM 用户的 Amazon Keyspaces 凭据。

    (点击放大)

    页面将显示一个窗口,其中展示刚刚创建的特定服务的凭据。下载这些凭据,确保将其存储在随时可用的地方,以便您在本课程后续步骤中使用它们。

    (点击放大)

    下载特定服务的凭据之后,在您的 AWS Cloud9 终端输入以下命令,将凭据保存到 env.sh 文件中。

    echo "export CASSANDRA_USERNAME=<username>" >> env.sh && source env.sh
    echo "export CASSANDRA_PASSWORD=<password>" >> env.sh && source env.sh

    请务必使用您下载的凭据文件中的 username(用户名)和 password(密码)。

    接下来,将 Amazon 数字证书下载到 AWS Cloud9 环境中。

    curl https://www.amazontrust.com/repository/AmazonRootCA1.pem -O

    在您下载的 .zip 文件中,有一个名为 test_connection.py 的脚本文件。该文件确保您可以连接到 Amazon Keyspaces 表。在文件编辑器中打开此文件,查看其内容。您应当会看到以下内容。

    from entities import User
    from utils import cluster
    
    session = cluster.connect()
    r = session.execute("SELECT * FROM users.users LIMIT 5")
    print(
        f"Connected to Amazon Keyspaces table. There are {len(r.current_rows)} rows in the results."
    )
    for row in r.current_rows:
        print(User(**row))

    该文件从 utils.py 模块中导入一个集群,然后使用该集群创建一个会话并查询名为 users 的表。然后,它会打印出一些有关结果的信息。

    我们来看看 utils.py 模块,了解一下如何创建集群。在 AWS Cloud9 文件编辑器中打开 utils.py 模块。您应当会看到以下内容。

    import os
    
    from cassandra.cluster import Cluster, ExecutionProfile, EXEC_PROFILE_DEFAULT
    from cassandra import ConsistencyLevel
    from cassandra.query import dict_factory
    from ssl import SSLContext, PROTOCOL_TLSv1, CERT_REQUIRED
    from cassandra.auth import PlainTextAuthProvider
    
    USERNAME = os.environ["CASSANDRA_USERNAME"]
    PASSWORD = os.environ["CASSANDRA_PASSWORD"]
    REGION = os.environ["AWS_REGION"]
    
    ssl_context = SSLContext(PROTOCOL_TLSv1)
    ssl_context.load_verify_locations("./AmazonRootCA1.pem")
    ssl_context.verify_mode = CERT_REQUIRED
    auth_provider = PlainTextAuthProvider(username=USERNAME, password=PASSWORD)
    profile = ExecutionProfile(
        consistency_level=ConsistencyLevel.LOCAL_QUORUM, row_factory=dict_factory
    )
    cluster = Cluster(
        [f"cassandra.{REGION}.amazonaws.com"],
        ssl_context=ssl_context,
        auth_provider=auth_provider,
        port=9142,
        execution_profiles={EXEC_PROFILE_DEFAULT: profile},
    )

    该模块使用适用于 Python 的标准 Cassandra 驱动程序来连接到 Amazon Keyspaces 并运行查询。这与连接到 Apache Cassandra 数据库集群大体相似,但有三个主要区别:

    1. 创建连接时,您创建和使用的是 SSLContext 对象,该对象需要使用 Amazon 数字证书。
    2. 您可以使用基于服务的凭据中的用户名和密码来创建 PlainTextAuthProvider,用于执行对 Amazon Keyspaces 表的身份验证。
    3. 您可以更新默认执行配置文件的一部分设置,以便使用 LOCAL_QUORUM 这种 Amazon Keyspaces 所支持的一致性等级。

    像这样,将这个连接创建逻辑放在一个实用程序模块中是有帮助的,这样您就不需要在每个连接到数据库的模块中都完整执行创建 Amazon Keyspaces 连接的步骤。


    在这个模块中,您在 Amazon Keyspaces 中创建了一个键空间和一个表。这个表是全托管的,并且与 Apache Cassandra 兼容。然后,您创建了一些用于 Amazon Keyspaces 身份验证的特定服务的凭据。最后,您了解了如何与 Amazon Keyspaces 进行连接,以及如何通过运行脚本来测试连接情况。

    在下一个模块中,您将学习如何使用 Amazon Keyspaces 实现一些关于用户创建的数据访问逻辑。

  • 在本模块中,您学习如何使用 Amazon Keyspaces 插入、读取和删除数据。这与您在 Users 服务中执行的数据操作类似。


    首先,在 Amazon Keyspaces 表中插入第一个用户。在您下载到 AWS Cloud9 环境的文件中,有一个名为 create_user.py 的文件。在文件编辑器中打开此文件。您应当会看到以下内容。

    from entities import User
    from utils import cluster
    
    session = cluster.connect()
    
    
    def create_user(user):
        print(f"Creating {user.username}...")
        command = f"INSERT INTO users.users (username, name, email, address, birthdate) VALUES ('{user.username}', '{user.name}', '{user.email}', '{user.address}', '{user.birthdate}') IF NOT EXISTS"
        r = session.execute(command)
        results = r.one()
        applied = results["[applied]"]
        if not applied:
            raise Exception(f"User {user.username} already exists")
        print(f"User {user.username} created successfully!")
        return user
    
    
    user = User(
        username="michelle72",
        name="Thomas Davis",
        email="jake74@hotmail.com",
        address="136 Ryan Knolls, East Tiffany, AL 29438",
        birthdate="1986-07-14",
    )
    
    create_user(user)

    我们仔细研读一下这个模块的代码。导入库的代码段后,有一个名为 create_user 的函数。这个函数和您将在 Users 服务中编写的函数类似。它可以接收一个 user(用户)对象作为参数并将此用户存储到您的 Amazon Keyspaces 表中。

     INSERT 查询中,它会将用户插入表中,但前提是其用户名没有重复。这就保证了给定用户名唯一对应一个用户。收到查询结果后,如果该用户名已经存在,函数就会报错。否则,它将返回已保存的用户。

    定义 create_user 函数后,该模块会在您的应用程序中创建一个 user(用户)对象实例,然后调用 create_user 函数尝试保存该实例。

    请尝试执行函数来保存第一个用户。在 AWS Cloud9 终端运行以下命令来执行该脚本。

    python create_user.py

    您应当会在终端看到以下输出结果。

    $ python create_user.py
    Creating michelle72...
    User michelle72 created successfully!

    太棒了!用户创建成功。

    若要测试有关用户名唯一性要求的逻辑,请再次执行脚本,尝试重新创建该用户。

    python create_user.py

    这次,终端将会报错。

    $ python create_user.py
    Creating michelle72...
    Traceback (most recent call last):
    File "create_user.py", line 27, in <module>
    create_user(user)
    File "create_user.py", line 14, in create_user
    raise Exception(f"User {user.username} already exists")
    Exception: User michelle72 already exists

    您可以看到,由于数据库中已存在该用户,所以函数会报错。

    现在,从数据库检索该用户。在文件编辑器中打开 get_user.py 文件。您应当会看到以下内容。

    from entities import User
    from utils import cluster
    
    session = cluster.connect()
    
    
    def get_user(username):
        print(f"Retrieving {username}...")
        command = f"SELECT * FROM users.users WHERE username = '{username}'"
        r = session.execute(command)
        results = r.one()
        if not results:
            raise Exception(f"User {username} does not exist")
        user = User(**results)
        print(user)
        return user
    
    
    user = get_user("michelle72")

    其内容和 create_user.py 文件类似。其中有一个名为 get_user 的函数,它可以通过给定用户名从 Amazon Keyspaces 表中检索某个用户。这与您将在 Users 服务中使用的函数类似。在文件的末尾,有一条调用 get_user 函数的语句,它使用您创建的用户的用户名作为参数。

    使用以下命令执行该文件。

    python get_user.py

    您应当会看到以下输出结果。

    $ python get_user.py
    Retrieving michelle72...
    User<michelle72 -- Thomas Davis>

    成功了!您已从 Amazon Keyspaces 中检索到该用户,并在您的应用程序中构建了一个 user(用户)对象。

    最后,从数据库中删除您的记录。在文件编辑器中打开 delete_user.py 文件。您应当会看到以下内容。

    from entities import User
    from utils import cluster
    
    session = cluster.connect()
    
    
    def delete_user(username):
        print(f"Deleting {username}...")
        command = f"DELETE FROM users.users WHERE username = '{username}'"
        r = session.execute(command)
        results = r.one()
        print(f"User {username} deleted.")
    
    
    delete_user("michelle72")

    该文件和前两个文件类似。其中有一个 delete_user 函数,它与您将在应用程序代码中使用的函数类似。它可以接收一个 username(用户名)作为参数并将对应用户从 Amazon Keyspaces 表中删除。此外,文件末尾还有一条语句用于执行该函数,删除用户。

    使用以下命令执行该文件。

    python delete_user.py

    您应当会看到以下输出结果。

    $ python delete_user.py
    Deleting michelle72...
    User michelle72 deleted.

    成功了!您从 Amazon Keyspaces 删除了您的用户。

    请尝试再次执行 get_user.py 文件。您现在应当会收到报错,因为在 Amazon Keyspaces 表中此用户已不存在。

    $ python get_user.py
    Retrieving michelle72...
    Traceback (most recent call last):
    File "get_user.py", line 19, in <module>
    user = get_user("michelle72")
    File "get_user.py", line 13, in get_user
    raise Exception(f"User {username} does not exist")
    Exception: User michelle72 does not exist


    在本模块中,您学习了如何在 Amazon Keyspaces 中插入、读取和删除数据。在这一过程中,您了解了一些示例函数,这些函数将包含在 Users 服务的应用程序代码中。

    在下一个模块中,您将清除已在本课中创建的资源。

  • 在本课中,您创建了一个 Amazon Keyspaces 表,将其用作您应用程序中 Users 服务的主数据库。Amazon Keyspaces 非常适合用于用户个人资料等元数据服务。Amazon Keyspaces 提供快速可靠的性能表现,并且可以随应用程序规模而扩展。它与开源的 Apache Cassandra API 兼容,为之前使用过 Cassandra 的开发人员提供一致的体验。

    在本模块中,您将清除在本课中创建的资源,以免产生额外费用。


    首先,删除 Amazon Keyspaces 表和键空间。为此,请前往 Amazon Keyspaces 控制台。选择您创建的键空间,然后点击 Delete(删除)。

    (点击放大)

    在确认删除页面上,在文本框中输入 Delete,然后点击 Delete keyspace(删除键空间)来删除您创建的键空间。

    (点击放大)

    Amazon Keyspaces 页面将显示您的键空间正在删除中。需要注意的是,您的表存储在键空间中,因此会与键空间一同被删除。

    (点击放大)

    此外,您需要删除 AWS Cloud9 开发环境。为此,请前往 AWS Cloud9 控制台。选择您为本课创建的环境,然后点击 Delete(删除)。

    (点击放大)

    在本模块中,您学习了如何清除在本课中创建的 Amazon Keyspaces 资源和 AWS Cloud9 环境。

在本课中,您学习了如何在应用程序中创建和使用 Amazon Keyspaces 表。首先,您创建了 Amazon Keyspaces 表并指定了表中的列。然后,您学习了如何进行身份验证并连接到 Amazon Keyspaces 表。最后,您学习了如何创建、读取和删除 Amazon Keyspaces 表中的数据。当您使用 Amazon Keyspaces 构建应用程序时,可以使用这些模式。

此页内容对您是否有帮助?