6.4 NDB 引擎配置

NDB 内存缓存引擎配置选项。  NDB 引擎支持以下用于memcache -e的配置选项(请参阅 第 6.3 节,“ memcached命令行选项”):

  • debug={true|false}

    启用将调试跟踪输出写入 stderr或写入 memcached 日志文件,如本例所示:

    $> memcached -E lib/ndb_engine.so -e "debug=true"

    因为调试输出可能非常大,所以您应该启用此选项仅作为诊断工具,而不是在生产中。

    默认情况下,此选项为false

  • connectstring=connect_string

    此选项将指向主 NDB Cluster的 NDB Cluster 连接字符串(请参阅NDB Cluster Connection Strings ) 作为其值 - 即ndbmemcache存储配置数据库的 NDB Cluster ,如下所示:

    shell > memcached -E lib/ndb_engine.so -e "connectstring=sam:1186;debug=true"

    默认值为localhost:1186

  • reconf={true|false}

    启用在线重新配置(重新加载存储在ndbmemcache信息数据库中的配置)。

    此选项true默认启用 ( )。

  • role=role_name

    设置此 memcached 服务器承担的角色。角色对应于 ndbmemcache配置数据库中描述的一组键前缀映射,由表role_name中的 found标识ndbmemcache.memcache_server_roles

    默认角色是default_role

    此处显示了一个示例:

    $> memcached -E lib/ndb_engine.so -e "role=db-only"
  • scheduler=scheduler_name:scheduler_options

    此选项控制 NDB 引擎如何将请求发送到 NDB Cluster 的一些高级方面。scheduler_name默认调度程序或S-scheduler的 是S. S-scheduler 选项采用单个字母后跟数字的形式;多个 S-scheduler 选项以逗号分隔。在大多数情况下,默认值S:c0,f0,t1就足够了。

    以下列表描述了这些 S-scheduler 选项:

    • c: 的连接数 NDB。可能的值在 0-4 范围内(含 0-4),0(默认值)会导致自动计算此数字。使用 1、2、3 或 4 会导致创建该数量的连接。

    • f: 可以是 0 或 1;设置为 1 启用强制发送。默认值为 0(禁用强制发送)。

    • t:将发送线程计时器设置为 1-10 毫秒(含)。默认值为 1。

初始配置。  当 NDB 引擎启动时,其最重要的命令行参数是集群连接字符串和服务器角色。连接字符串用于连接到特定集群,称为主集群,其中包含配置模式。读取配置模式中的表以检索给定服务器角色的一组键前缀映射(请参阅 ndbmemcache 配置模式)。这些映射指示服务器如何根据键的最左侧部分响应对特定键的内存缓存操作。例如,他们可能指定数据存储在某个表的特定列中。该表可以存储在与配置模式相同的集群中,也可以存储在不同的集群中。

ndbmemcache 配置模式。  当 memcache NDB 引擎启动时,它连接到一个集群,并在那里查找 ndbmemcache 配置模式。如果未找到模式,它将关闭。

该模式在文件 ndb_memcache_metadata.sql 中描述(带有完整注释)

模式的主要概念是键前缀映射。这采用内存缓存键的前缀,并将其映射到特定集群上具有特定缓存策略的特定容器表。

服务器角色定义为 memcached 服务器将实现的一组键前缀映射。

每当 memcached 服务器以特定服务器角色(来自命令行参数)启动时,该服务器角色必须存在于 ndbmemcache.server_roles 表中。

下表列出了属于ndbmemcache配置架构的表的表名和说明。

表 6.1 ndbmemcache 配置模式、表名和描述

表名 描述
meta 元表描述了 ndbmemcache 表的版本号。它应该被视为只读表。
ndb_clusters

对于每个集群,此表包含一个数字集群 ID 和一个连接字符串。microsec_rtt 列用于性能调整。建议使用该列的默认值。请参阅 自动调整

cache_policies

此表将策略名称映射到一组获取、设置、删除和刷新策略。该 policy_name列用作键(没有数字策略 ID)。

有关缓存策略的其他信息可以在表后的文本中找到。

containers

容器表描述了 memcached 服务器如何使用数据库表来存储数据。

有关容器的其他信息可以在表格后面的文本中找到。

memcache_server_roles

memcache_server_roles表将角色名称映射到数字 ID 和max_tps 说明符,用于性能调整。请参阅 自动调整。建议使用默认值。

该表还有一个 update_timestamp 列。可以更新此列以启用在线重新配置。请参阅联机重新配置

有关服务器角色的其他信息可以在表后的文本中找到。

key_prefixes

在此表中,内存缓存键的最左侧部分与集群 ID、容器和缓存策略配对以进行键前缀映射

有关键前缀映射的其他信息可以在表后的文本中找到。


缓存策略。  有四种策略类型:get_policyset_policydelete_policyflush_from_db。这些在以下段落中描述。

get_policy确定 memcached 服务器如何解释GET命令。可能的值及其含义如下表所示:

  • cache_only:服务器仅在其本地缓存中搜索。

  • ndb_only:服务器仅在 NDB Cluster 数据库中搜索。

  • caching:服务器首先搜索本地缓存,然后搜索 NDB Cluster 数据库。

  • disabled:GET命令是不允许的。

确定set_policymemcached 服务器如何解释SETINSERTREPLACE 命令。此处列出了可能set_policy的值及其含义:

  • cache_only:服务器仅更新其本地缓存中的值。

  • ndb_only:服务器仅更新存储在 NDB Cluster 中的值。

  • caching:服务器更新存储在 NDB Cluster 中的值,然后将该值的副本存储在其本地缓存中。

  • disabled: SETINSERTREPLACE 命令是不允许的。

delete_policy描述了 memcached 服务器如何解释DELETE命令。它可以采用以下列表中显示和描述的值:

  • cache_only:服务器仅从其本地缓存中删除该值。

  • ndb_only:服务器仅从 NDB Cluster 数据库中删除该值。

  • caching:服务器从数据库及其本地缓存中删除该值。

  • disabled:DELETE 不允许操作。

flush_from_db确定 memcached 服务器如何解释FLUSH_ALL关于存储在 NDB Cluster 数据库中的数据的命令,如下所示:

  • true:FLUSH_ALL命令导致数据从 NDB Cluster 数据库中删除。

  • false:FLUSH_ALL 命令不影响 NDB Cluster 数据库。

容器表列。  下表描述了containers表中的列:

  • name: 容器名称;表的主键。

  • db_schema:保存容器表的数据库(模式)名称。

  • db_table: 容器表的表名。

  • key_columns:映射到内存缓存键的列列表。大多数键都是单部分键,但一个键最多可以有四个部分,在这种情况下,会列出多列并用逗号分隔。

  • value_columns:映射到内存缓存值的列列表。它还可以包含最多 16 个值列的逗号分隔列表。

  • flags: 目前未实现;它旨在保存用作FLAGS整个容器的内存缓存值的数值,或用于存储该值的容器表的该列的名称。

  • increment_columnINCR: 容器表中的列名称,用于存储 memcached和DECR 操作中使用的数值。如果设置,这必须是一BIGINT UNSIGNED列。

  • cas_column容器表中存储内存缓存 CAS 值的列的名称。如果设置,它必须是一BIGINT UNSIGNED列。

  • expire_time_column: 目前未实现。

按键映射。 

  • server_role_id 是一个数字服务器角色标识符,它引用 memcache_server_roles 表

  • key_prefix 是一个字符串,对应于内存缓存键最左边的部分。如果此字符串为空,则定义的前缀将是“默认前缀”。默认前缀匹配任何不匹配某些更具体前缀的内存缓存键。

  • cluster_id 是一个引用 ndb_clusters 表的 int

  • policy 是引用 cache_policies 表中策略名称的字符串

  • 容器是引用容器表的容器名称

下表列出了非配置ndbmemcache日志记录和容器表的表名和说明。

表 6.2 不用于配置的 ndbmemcache 日志记录和容器表,以及描述

表名 描述
last_memcached_signon

该表不是配置模式的一部分,而是一个信息日志表。它记录了使用该配置的每个 memcached 服务器的最近一次登录时间。

  • ndb_node_id是一个int记录服务器的API节点id

  • hostname是 memcached 服务器的主机名

  • server_role是在登录时分配给服务器的角色

  • signon_time是记录memcached启动时间的时间戳

    在在线重配置的情况下,signon_time记录的是最近一次重配置的时间,不是启动的时间。这是一个意外的结果,可能被认为是一个错误。

demo_table demo_table 是在默认服务器角色中使用默认键前缀的容器表。它用于演示 SET 和 GET 操作以及 INCR、DECR 和 CAS,具有一个键列和一个值列。
demo_table_tabs demo_table_tabs 是“demo_tabs”容器的容器表,它在默认服务器角色中与键前缀“t:”一起使用。它用于演示具有多个值列的一个键列。在内存缓存操作中,值列表示为制表符分隔的值列表。

预定义配置对象

预定义的集群。  预定义单个 ndb_cluster 记录,将主集群(存储配置数据的集群)称为集群 id 0。应始终为主集群保留 id 0。

预定义缓存策略

  • "memcache-only" :所有内存缓存操作都只使用本地缓存的策略

  • "ndb-only" :所有内存缓存操作都使用 NDB Cluster 数据库的策略,FLUSH_ALL 除外,它被禁用

  • “缓存”:get_policy、set_policy 和 delete_policy 都设置为“缓存”的策略。FLUSH_ALL 被禁用。

  • “caching-with-local-deletes”:get_policy和set_policy设置为缓存的策略,delete_policy设置为“cache-only”,禁用FLUSH_ALL。

  • “ndb-read-only”:get_policy 设置为 ndb_only 的策略,以便 memcache GET 操作使用数据库,但禁用所有其他 memcache 操作

  • “ndb-test”:类似于“ndb-only”的策略,不同之处在于允许 FLUSH_ALL (flush_from_db) 为真。这是唯一启用了 flush_from_db 的预定义策略。默认服务器角色默认启用此策略,因此可以演示整个内存缓存命令集。

预定义容器

  • “demo_table”:使用表ndbmemcache.demo_table作为容器表的容器

  • “demo_tabs”:使用表ndbmemcache.demo_table_tabs作为容器表的容器

预定义的内存缓存服务器角色及其键前缀

  • “默认角色”(角色 ID 0)

    "":空(默认)前缀使用 ndb-test 策略和 demo_table 容器

    "mc:" 以 "mc:" 开头的内存缓存键根据 memcache-only 缓存策略进行处理

    "t:" 以 "t:" 开头的内存缓存键使用 ndb-test 缓存策略和 demo_tabs 容器

  • “仅数据库”角色(角色 ID 1)

    “”:空(默认)前缀使用 ndb-only 角色和 demo_table 容器

    “t:”前缀使用 ndb-only 角色和 demo_tabs 容器

  • “mc-only”角色(角色 ID 2)

    “”:空(默认)前缀仅对所有键使用本地缓存

  • “ndb-caching”角色(角色 ID 3)

    “”:空(默认)前缀对所有键使用“缓存”缓存策略和“demo_table”容器

配置版本控制和升级。  配置模式是版本化的,版本号存储在 ndbmemcache.meta 表中。NDB 引擎通过从该表中读取模式版本号来开始配置过程。通常,新版本的 NDB 引擎将与旧版本的配置模式保持兼容。

稳定性说明:将此部分视为“不稳定”并且可能会发生变化

性能调优。  两个参数用于调整 NDB 内存缓存引擎的性能。参数存储在配置架构中:特定集群的“usec_rtt”值和内存缓存服务器角色的“max_tps”值。这些值目前以两种方式使用:配置每个集群的连接数,以及配置每个连接支持的特定固定数量的并发操作。

自动调节。  自动调整使用集群数据节点之间的估计往返时间和目标吞吐率来确定给定工作负载的理想集群连接数和每个连接的事务数。自动调谐参数在接下来的几段中描述。

  • usec_rtt:集群节点之间的往返时间,以微秒为单位。默认值为 250,这是本地交换以太网上 NDB Cluster 的典型值。要表示具有更高节点间延迟(更广区域)的集群,应使用更高的值。

  • max_tps:来自服务器的所需吞吐量。该值是一种试探法,并不以任何方式表示所获得的实际吞吐量的下限或上限。在大多数情况下,默认值 (100000) 是合理的。

如接下来的几段所述,这些值用于计算具有给定每秒事务处理能力的集群连接的最佳数量。

集群连接数。  NDB 引擎调度程序尝试每 50000 个事务每秒 (TPS) 打开 1 个集群连接。可以使用调度程序配置字符串来覆盖此行为(请参阅 第 6.4 节,“NDB 引擎配置”。)如果调度程序无法打开到集群的第二个或后续连接——例如,因为节点 ID 不可用——这不是致命错误;它将仅在实际打开的连接下运行。

每个连接的事务数。  我们假设一个事务需要 5 倍的集群往返时间才能完成。max_tps我们可以通过将服务器除以5 * rtt(以秒为单位)来获得进行中交易的总数 。这些进行中的事务对象均匀分布在集群连接中。

调整示例。  以下示例以默认值 usec_rtt= 250 和max_tps = 100000 开始,并假定一个具有 4 个工作线程的 memcached 服务器。

  • 100000 TPS 除以 50000 为 2,服务器打开两个 NDB 集群连接。

  • 以微秒为单位的交易时间 = 250 µs 往返时间 * 5 次往返 = 1250 µs。

  • 每秒每个连接的事务数 = 1000000 / tx_time_in_µsec = 1000000 / 1250 = 800。

  • Ndb 对象总数 = max_tps / tx_per_ndb_per_sec = 100000 / 800 = 125。

  • 125 个 Ndb 对象/2 个连接 = 每个连接 63 个 Ndb 对象(向上舍入)。

  • (再次向上舍入)4 个工作线程中的每一个都获得 32 个 Ndb 对象

在线重新配置。  可以在不重新启动 NDB 引擎的情况下重新配置正在运行的 NDB 引擎的键前缀映射。这是通过提交对配置模式的更改,然后更新update_timestamp内存缓存服务器角色表中特定服务器角色的列来完成的。时间戳的更新会触发事件触发器,以便内存缓存服务器收到事件通知。

可以使用-e reconf=false命令行上的选项禁用联机重新配置。

在线重新配置可用于连接到新集群并创建新的键前缀映射。但是,它不能用于重置现有连接上的自动调整值。

在线重新配置是一项有风险的操作,可能会导致内存缓存服务器崩溃或数据损坏,并在 mysql 测试套件中广泛使用。但是,不建议在负载下重新配置生产服务器。

stats reconf命令可以在在线重新配置之前和之后运行,以验证运行配置的版本号是否增加了。重新配置的验证也会写入 memcached 日志文件。