- 快召唤伙伴们来围观吧
- 微博 QQ QQ空间 贴吧
- 文档嵌入链接
- 复制
- 微信扫一扫分享
- 已成功复制到剪贴板
VOLTDB管理员手册
前言
本书解释了如何管理VoltDB数据库和托管数据库的集群。它面向数据库管理员和操作人员,涉及数据库基础设施的持续管理和维护。
本书结构
本书包括7个章节和两个附录
第一章,管理VoltDB数据库
第二章,准备服务器
第三章,启动和停止数据库
第四章,维护和升级
第五章,监控VoltDB数据库
第六章,记录和分析VoltDB数据库中的活动
第七章,当问题出现时该怎么做
附录A,服务器配置选项
附录B,快照实用程序
展开查看详情
1 . 目录 前言..................................................................................................................................................... 6 1.本书结构.......................................................................................................................... 6 2.相关文档......................................................................................................................... 6 1. 管理 VOLTDB 数据库............................................................................................................... 7 1.1. 开始之前............................................................................................................ 7 1.2. 理解 voltdb........................................................................................................ 9 1.3. 管理任务........................................................................................................... 10 2. 环境准备.................................................................................................................................... 11 2.1. 检查项................................................................................................................11 2.2. 安装要求........................................................................................................... 12 2.3. 内存设置........................................................................................................... 13 2.3.1. 禁用 Swapping........................................................................................ 13 2.3.2. 禁用透明大页面.......................................................................................14 2.3.3. 启用虚拟内存映射和 Overcommit....................................................... 15 2.4. 关闭 TCP segmentation................................................................................ 16 2.5. 配置 NTP.......................................................................................................... 16 2.6. 配置网络........................................................................................................... 17 2.7. 分配网络端口................................................................................................... 18 3. 启动和停止数据库................................................................................................................... 18 3.1. 配置数据库和集群环境...................................................................................19 3.2. 初始化数据库................................................................................................... 21
2 . 3.3. 启动数据库...................................................................................................... 22 3.4. 加载数据库定义.............................................................................................. 23 3.5. 停止数据库...................................................................................................... 24 3.6. 重新启动数据.................................................................................................. 25 3.7. 启动和停止单个数据库.................................................................................. 25 4. 维护和升级.............................................................................................................................. 26 4.1. 数据库备份...................................................................................................... 27 4.2. 更新数据库对象.............................................................................................. 28 4.2.1. 在线更新.................................................................................................. 28 4.2.2. 离线更新.................................................................................................. 29 4.3. 集群升级.......................................................................................................... 30 4.3.1. 单服务器升级........................................................................................... 31 4.3.2. 在 K-safe 集群中滚动升级.....................................................................32 4.3.3. 集群弹性伸缩.......................................................................................... 33 4.3.4. 集群配置更新.......................................................................................... 34 4.4. VoltDB 软件升级.............................................................................................35 4.4.1. 使用 Save 和 Restore 升级 VoltDB...................................................... 36 4.4.2. 手动升级老版本的 VoltDB.................................................................... 36 4.4.3. 使用 DR 副本升级 VoltDB..................................................................... 37 4.4.4. 使用 XDCR 集群执行在线升级.............................................................. 41 4.4.5. 使用有限的硬件执行在线升级..............................................................43 4.4.6. 降级或回退 VoltDB................................................................................ 47
3 .5. 数据库监控.............................................................................................................................. 48 5.1. 监控数据库运行.............................................................................................. 48 5.1.1. VoltDB Management Center...............................................................48 5.1.2. 系统存储过程.......................................................................................... 49 5.1.3. SNMP 警告............................................................................................. 52 5.2. 资源超限设置.................................................................................................. 55 5.2.1. 监视内存使用率...................................................................................... 57 5.2.2. 监视磁盘使用率...................................................................................... 58 5.3. 接入监测系统.................................................................................................. 60 5.3.1. 接入 Nagios............................................................................................ 60 5.3.2. 接入 New Relic........................................................................................ 61 6. 日志记录定义.......................................................................................................................... 62 6.1. 日志介绍.......................................................................................................... 63 6.2. 创建日志配置文件.......................................................................................... 63 6.3. 修改 Log 记录中的时区................................................................................. 66 6.4. 在运行时修改 Logging 配置......................................................................... 67 7. 数据库故障.............................................................................................................................. 68 7.1. 故障分析.......................................................................................................... 68 7.2. 处理数据库恢复错误...................................................................................... 69 7.2.1. 记录违反约束的行为.............................................................................. 70 7.2.2. 在安全模式下恢复数据...........................................................................71 7.3. 收集日志文件................................................................................................... 71
4 .附录 A 服务器配置选项.................................................................................................................72 A.1 服务器配置............................................................................................................... 73 A.1.1 网络配置(DNS)........................................................................................ 73 A.1.2 时间配置........................................................................................................ 74 A.2 进程配置.................................................................................................................. 74 A.2.1 最大堆大小....................................................................................................74 A.2.2 其他 java 选项(VOLTDB_OPTS)................................................................ 75 A.3 数据库配置............................................................................................................... 76 A.3.1 Sites per Host................................................................................................76 A.3.2 K-Safety......................................................................................................... 77 A.3.3 网络分区保护............................................................................................... 77 A.3.4 自动快照....................................................................................................... 77 A.3.5 数据导入导出............................................................................................... 78 A.3.6 Command logging...................................................................................... 78 A.3.7 心跳检测....................................................................................................... 78 A.3.8 临时表大小................................................................................................... 79 A.3.9 查询超时....................................................................................................... 79 A.3.10 慢进程告警.................................................................................................. 81 A.4 路径配置................................................................................................................... 81 A.4.1 VoltDB 根....................................................................................................... 82 A.4.2 快照路径....................................................................................................... 82 A4.3 导出溢出路径................................................................................................ 82
5 . A4.4 Command Log 路径.................................................................................... 82 A4.5 Command Log Snapshots 路径................................................................ 83 A.5 网络端口................................................................................................................... 83 A5.1 客户端端口.....................................................................................................84 A5.2 管理端口........................................................................................................ 85 A.5.3 Web 端口(httpd).................................................................................... 86 A.5.4 JSON 接口..................................................................................................... 86 A.5.5 Internal Server 端口.................................................................................... 87 A.5.6 复制端口....................................................................................................... 87 A.5.7 Zookeeper 端口.......................................................................................... 88 A.5.8 TLS/SSL 加密................................................................................................89 附录 B Snapshot............................................................................................................................. 90
6 . 前言 本书解释了如何管理 VoltDB 数据库和托管数据库的集群。它面向数据库管理员和操作 人员,涉及数据库基础设施的持续管理和维护。 1.本书结构 本书包括 7 个章节和两个附录 第一章,管理 VoltDB 数据库 第二章,准备服务器 第三章,启动和停止数据库 第四章,维护和升级 第五章,监控 VoltDB 数据库 第六章,记录和分析 VoltDB 数据库中的活动 第七章,当问题出现时该怎么做 附录 A,服务器配置选项 附录 B,快照实用程序 2.相关文档 本书没有描述如何设计或开发 VoltDB 数据库。有关 VoltDB 的开发过程及其所有特性 的完整描述,请参阅附带的 Using VoltDB。对于新用户,请参阅 VoltDB Tutorial。这些和 其他描述 VoltDB 的书籍可以在 web 上从 http://docs.voltdb.com/获得。
7 .1. 管理 VOLTDB 数据库 VoltDB 是一个分布式内存数据库,引入全新的设计,以便在普通服务器上最大化吞吐 量性能。与传统数据库产品相比,VoltDB 架构提供了许多优点,同时避免了 NoSQL 解决 方案的缺陷: 通过对数据和存储过程进行分区,VoltDB 可以并行处理多个查询,而不会牺牲数据库 的一致性或持久性,符合 ACID 原则。 通过为每个分区使用一个线程管理内存中的所有数据,VoltDB 避免了传统基于磁盘的 数据库中固有的 lock、latching 和设备争用等开销。 只需向集群添加更多节点,VoltDB 数据库就可以扩展以满足新的容量或性能需求。 分区是自动的,基于数据对象定义的,所以不需要手动切分或重新划分 最后,VoltDB Enterprise Edition 提供了一些特性,通过命令日志记录、本地复制分区 (K-safety)和广域数据库复制来确保持久性和高可用性。 在 Using VoltDB 这本书中详细描述了这些特性。本书从数据库管理员的角度解释了如 何使用这些和其他特性来管理和维护 VoltDB 数据库集群。 1.1. 开始之前 在将 VoltDB 设置为生产环境中使用之前,需要做四个决定 要使用哪些数据库特性--可以在配置文件中定义所需要的特性,并使用 voltdb init 命令 进行数据库初始化。 集群的物理结构--集群中节点的数量和地址,在使用 voltdb start 命令启动集群时指定。
8 . 数据库的逻辑结构--数据库表和视图的逻辑结构,也称为模式,在标准 SQL 语句中定 义,使用 sqlcmd 命令行执行标准的 DDL 语句。 存储过程--通过 DDL 语句声明存储过程。存储过程中的逻辑视为一个事务,满足原子 性要求,存储过程可以使用 Java 语言来编写,编译并打包成 jar 文件。最终使用 sql 命 令将 JAR 文件加载到数据库中。 要初始化一个 VoltDB 数据库集群,需要一个配置文件。配置文件允许您启用和配置各 种数据库选项,包括可用性、持久性和安全性。配置文件还定义了当前服务器上数据库的某 些属性,特别是数据库创建的基于磁盘的文件的路径,如命令日志和快照。当集群中的所有 节点使用 voltdb init 命令初始化数据库根目录时,必须指定相同的集群配置文件。 在实际启动数据库集群时,通过在 voltdb start 命令中添加集群数量和集群节点机器名 或 ip 地址的方式来定义集群规模。VoltDB 选择指定的节点之一作为协调启动的“leader”。 在使用 VoltDB 企业版时,还需要一个许可证文件,通常称为 license.xml。 VoltDB 自动在用户当前工作目录、主目录或产品安装目录下的 VoltDB /子文件夹中查 找许可文件。如果您将许可证文件保存在不同的目录中或以不同的名称保存,您可以在 voltdb start 命令上添加 -license 参数来指定许可证文件的位置。 最后,要为特定的应用程序准备数据库,需要数据库模式,包括描述数据库逻辑结构的 DDL 语句,以及包含存储过程的 JAR 文件。通常,数据库模式和存储过程是作为数据库开 发过程的一部分生成的,使用 VoltDB 手册对此进行了描述。 本书假设已经创建了模式和存储过程。另一方面,配置文件定义集群的运行时配置。为 配置文件建立正确的设置并对数据库集群进行物理管理是数据库管理员的职责。本书是为数 据库管理员编写的,涵盖了与数据库管理相关的标准过程。
9 .1.2. 理解 voltdb VoltDB 提供了几个命令行实用程序,每个命令行都具有不同的功能。熟悉这些实用程 序及其用法可以使管理 VoltDB 数据库变得更容易。用于创建、管理和测试 VoltDB 数据库 的三个主要命令行工具是: 启动 VoltDB 数据库进程。voltdb 命令还可以收集日志文件来分析可 voldb 能的系统错误(详细信息请参阅第 7.3 节“收集日志文件”)。 voltdb 命令在本地运行,不需要运行数据库。 向正在运行的 VoltDB 数据库发出管理命令。您可以使用 voltadmin 保存和恢复快照、暂停和恢复管理模式,以及关闭数据库等任务。 voltadmin voltadmin 命令可以远程运行,执行集群范围的操作,并且需要连接 到正在运行的数据库。 允许您交互式地发出 SQL 查询和调用存储过程。sqlcmd 命令对于测 sqlcmd 试数据库访问非常方便,而不需要编写客户机应用程序。 sqlcmd 命令可以远程运行,并且需要连接到正在运行的数据库。 除了上述通用工具外,VoltDB 还为特定任务提供了其他一些工具: csvloader, 这些实用程序将来自外部源的数据加载到现有的 VoltDB jdbcloader, 数据库中。 kafkaloader 它们允许您从 CSV 等基于文本的数据文件、JDBC 数据 源或 Apache Kafka 流中导入数据。这些命令可以远程运行, 并且需要连接到正在运行的数据库。 snapshotconvert 将本机快照文件转换为 csv 或以指定符合分隔字段值的
10 . 文本文件。snapshotconvert 命令在将本机格式的快照导出到 文本文件以便导入到另一个数据实用程序时非常有用。 该命令在本地运行,不要求数据库运行。 snapshotverify 验证一组数据快照文件是否完整有效。 该命令在本地运行,不要求数据库运行。 最后,VoltDB 包括一个基于浏览器的管理控制台--VoltDB 管理中心--用于实时监控数 据库。有关使用管理中心的更多信息,请参见第 5.1.1 节“VoltDB 数据库管理中心”。 1.3. 管理任务 数据库管理职责分为五大类,如表 1.1“数据库管理任务”中所述。以下章节按类别进 行组织,并解释如何在 VoltDB 中执行每个任务。 表 1.1“数据库管理任务” 环境准备 在启动数据库之前,必须确保服务器硬件和软件配置正确。 本章提供了启动 VoltDB 之前要执行的任务清单 基础操作 初始化、启动和停止数据库的基本操作。本章描述处理这些 基本任务所需的过程。 维护和升级 随着时间的推移,数据库本身和集群环境都可能需要维护, 不管是计划的或紧急的。本文中相应章节中解释了执行硬件和软 件维护以及标准维护(如备份数据库和升级硬件、软件和数据库模 式)的过程。 性能监控 许多数据库管理员的另一个重要角色是监视数据库性能。监 测的重要性有以下几个原因:
11 . •性能分析 •负载平衡 •故障检测 这个章节描述数据库监控工具 故障报告和分析 如果确实发生了错误,并且部分或全部数据库集群失败,那 么不仅要重新启动和运行数据库,而且要诊断问题的原因并采取 纠正措施。VoltDB 生成许多日志文件,可以帮助解决问题。本章 描述可用的不同日志,以及如何使用它们诊断数据库问题。 2. 环境准备 VoltDB 被设计用于在普通服务器上运行,大大减少了运行高性能数据库所需的投资。 然而,开箱即用的机器并不一定是专为某款应用定制的,这种情况下无法发挥服务器的最佳 性能,在使用基于云的服务时尤其如此。本章提供了配置服务器的最佳实践,以最大限度地 提高 VoltDB 安装的性能和稳定性。 2.1. 检查项 配置服务器的第一步是确保有足够的内存、计算能力和系统资源(如磁盘空间)来处理预 期的工作负载。VoltDB Planning Guide 提供了关于如何调整服务器需求大小的详细信息。 下一步是配置服务器并为 VoltDB 任务分配适当的资源。必须为 VoltDB 配置特定的服 务器功能,以使其性能最佳: 安装所需软件 配置内存管理
12 . 关闭 TCP 分段 配置 NTP(时间服务) 为集群中的所有节点定义网络地址 分配网络端口 2.2. 安装要求 首先,VoltDB 需要 Linux 操作系统的最新版本。运行生产 VoltDB 数据库的支持操作系 统有: CentOS V6.6 or later. Including CentOS 7.0 and later Red Hat (RHEL) V6.6 or later, including Red Hat 7.0 and later Ubuntu 14.04 and 16.04 也可以在其他版本的 Linux 上运行 VoltDB。另外,Macintosh OS X 10.9 及更高版本的 官方发布版是为了开发目的而提供的。然而,之前的操作系统版本是在生产环境中运行 VoltDB 的唯一经过充分测试和支持的基础平台。 除了基本的操作系统,VoltDB 至少需要以下软件: Java 8 NTP Python 2.6 及以上 (推荐使用 2.7) 推荐使用 Sun Java SDK 8,但也支持 OpenJDK 8。注意,尽管 VoltDB 服务器需要 Java 8,但是 Java 客户机也兼容 Java 7。 当所有集群节点上的系统时钟同步到 100 毫秒或更少时,VoltDB 工作得最好。如果时 钟相差大于 200 毫秒,VoltDB 将无法启动。建议使用网络时间协议 NTP 来实现必要的同步。
13 .NTP 在许多操作系统上默认安装并启用。然而,配置可能需要调整(详细信息请参阅 2.5 节“配 置 NTP”),并且在虚拟环境中运行托管服务器的云实例中,默认情况下并不总是安装或启用 NTP。 最后,VoltDB 通过 Python 实现其命令行接口。使用 VoltDB shell 命令需要 Python 2.6 或更高版本。 2.3. 内存设置 由于 VoltDB 是内存数据库,因此正确的内存管理对于 VoltDB 数据库的有效运行至关 重要。内存管理的三个重要方面是: Swapping 内存映射(透明大页面) 虚拟内存 下面几节将解释如何最好地配置这些特性,以获得 VoltDB 的最佳性能。 2.3.1. 禁用 Swapping Swapping 是一个操作系统特性,当运行多个进程时,通过交替的将内存中的进程调出 和调入来优化内存使用。但是,任何内存争用(包括 Swapping)都会对 VoltDB 的性能和功能 产生非常负面的影响。当使用 VoltDB 数据库时,应该禁用 Swapping。 要禁用 Linux 系统上的 Swapping 功能,请使用 swapoff 命令。如果由于任何原因不能 禁用交换,您可以通过设置内核参数 vm.swappiness 为零来降低调出 VoltDB 的可能性。
14 .2.3.2. 禁用透明大页面 透明大页(THP)是另一个操作系统特性,它可以为具有大量内存的系统优化内存使用。 THP 更改内存映射以使用更大的物理页面。这对于运行多个进程的通用计算很有帮助。然 而,对于内存密集型应用程序,如 VoltDB, THP 实际上会对性能产生负面影响。因此,在运 行 VoltDB 的服务器上禁用透明大页面非常重要。运行以下命令,禁用 THP: $ echo never >/sys/kernel/mm/transparent_hugepage/enabled $ echo never >/sys/kernel/mm/transparent_hugepage/defrag Or: $ echo madvise >/sys/kernel/mm/transparent_hugepage/enabled $ echo madvise >/sys/kernel/mm/transparent_hugepage/defrag 在 RHEL 操 作 系 统 ( 包 括 CentOS ) , 使 用 "redhat_transparent_hugepage" 替 换 ” transparent_hugepage”。 但是请注意,这些命令只在服务器运行时禁用 THP。服务器重新启动后,THP 会再启 用。因此,我们建议您在启动过程中永久禁用 THP。例如,您可以将以下命令添加到服务 器启动脚本(例如/ etc/rc.local): #!/bin/bash for f in /sys/kernel/mm/*transparent_hugepage/enabled; do if test -f $f; then echo never > $f; fi done for f in /sys/kernel/mm/*transparent_hugepage/defrag; do if test -f $f; then echo never > $f; fi done
15 . THP 在 Ubuntu 14.04 和更高版本以及 RHEL 6.x 7.x 中默认启用。若要查看当前系统是 否启用了这些命令,请使用以下命令之一: $ cat /sys/kernel/mm/transparent_hugepage/enabled $ cat /sys/kernel/mm/transparent_hugepage/defrag $ cat /sys/kernel/mm/redhat_transparent_hugepage/enabled $ cat /sys/kernel/mm/redhat_transparent_hugepage/defrag 如果 THP 被禁用,前面命令的输出应该是“always madvise [never]”或“always [madvise] never”。 2.3.3. 启用虚拟内存映射和 Overcommit 虽然 Swapping 对于内存密集型应用程序(如 VoltDB)是不好的,但是服务器确实使用了 虚拟内存(VM),并且有一些设置可以帮助 VoltDB 有效地使用这些内存。首先,启用 VM 的 Overcommit 是一个好主意。这避免了 VoltDB 数据库在管理虚拟内存时遇到不必要的限制。 这是在 Linux 上通过设置系统参数 vm 来完成的。overcommit_memory 的值为“1”。 $ sysctl -w vm.overcommit_memory=1 其次,对于大型内存系统,增加 VM 内存映射限制也是一个好主意。因此,对于具有 64GB 或更多内存的服务器,建议将 VM 内存映射数增加到 1048576 或更高。在 Linux 上使 用系统参数 max_map_count 执行此操作。例如: $ sysctl -w vm.max_map_count=1048576 请记住,对于 overcommit 和内存映射计,参数仅在系统运行时是活动的,并且在重启 时将重置为默认值。所以一定要将您的新设置添加到文件中/etc/sysctl.conf,以确保在重新 启动系统时它们是有效的。
16 .2.4. 关闭 TCP segmentation 在一定条件下,使用 TCP segmentation offload (TSO)和 generic receive offload (GRO) 会导致节点随机退出集群。这些设置允许系统对网络数据包进行批处理,从而产生不必要的 延迟,并干扰 VoltDB 数据库集群节点之间的必要通信。这个问题的症状是节点超时--也就 是说,集群的其余部分认为它们失败了--尽管节点仍在运行,并且没有其他网络问题(例如 网络分区)是原因。 对于任何经历这种不稳定性的 VoltDB 集群,建议禁用 TSO 和 GRO。禁用卸载的命令 如下,其中 N 替换为以太网卡的数量: ethtool -K ethN tso off ethtool -K ethN gro off 注意,这些命令同样只是暂时禁用。您必须在每次节点重新引导时发出这些命令,或者 最好将它们放在启动配置文件中。 检查 TCP_RETRIES2 是否没有被更改也是一个好主意。设置 TCP_RETRIES2 过低 (低于 8)可能导致类似的不可预测超时。有关 VoltDB 心跳超时设置的详细信息,请参阅 A.3.7 节中的“心跳”。 2.5. 配置 NTP 为了协调集群节点之间的活动,VoltDB 依赖于同步的系统时钟。VoltDB 中的许多函数 (比如集群启动、节点重新连接和模式更新等)对集群中节点之间的时间值的变化很敏感。因 此,在集群中保持时钟同步是很重要的。具体地说: 当集群启动时,集群中的服务器时钟必须彼此同步到 200 毫秒以内。(理想情况下,节 点之间的差异应保持在 10 毫秒以内。)
17 . 时间绝不能倒退 实现这些目标的最简单方法是安装和配置 NTP(网络时间协议)服务,以使用公共的时钟 服务器来同步服务器。NTP 通常是默认安装的,但是可能需要额外的配置才能实现可接受 的同步。比如,定义集群中的所有节点都使用相同的时间服务器,可以确保服务器之间的倾 斜最小。您甚至可以建立自己的时间服务器。集群中的所有节点也应该彼此作为对等节点。 例如,使用以下 NTP 配置文件: server myntpsvr burst iburst minpoll 4 maxpoll 4 peer voltsvr1 burst iburst minpoll 4 maxpoll 4 peer voltsvr2 burst iburst minpoll 4 maxpoll 4 peer voltsvr3 burst iburst minpoll 4 maxpoll 4 server 127.127.0.1 有关设置 NTP 的详细信息,请参阅 Guide to Performance and Customization 中关于 配置 NTP 的章节。 2.6. 配置网络 同样重要的是,要确保网络配置正确,以便 VoltDB 集群中的所有节点都能相互识别。 如果 DNS 服务器不包含集群中所有服务器的条目,则另一种方法是为集群中的每个服务器 本地添加/etc/hosts 文件中的条目。例如: 12.24.48.101 voltsvr1 12.24.48.102 voltsvr2 12.24.48.103 voltsvr3 12.24.48.104 voltsvr4
18 . 12.24.48.105 voltsvr5 2.7. 分配网络端口 VoltDB 使用许多网络端口来实现功能,比如内部通信、客户机连接、重新连接、数据 库复制等等。要使这些特性正确地执行,端口必须是打开的和可用的。检查以下端口列表, 以确保它们是开放的和可用的(即,当前没有使用)。 端口名称 默认端口号 客户端连接端口 21212 管理端口 21211 Web 端口 3021 复制端口 5555 Zookeeper 端口 7181 或者,您可以重新分配 VoltDB 使用的端口号。有关端口和如何重新分配端口的描述, 请参见附录 a .5 节“网络端口”。 3. 启动和停止数据库 数据库管理的基本操作是启动和停止数据库。但是在启动数据库之前,您需要确定希望 启用哪些数据库特性以及它们应该如何工作。这些特性包括一些属性,比如在服务器发生故 障时,您希望指定多少个副本以提高可用性,以及在数据库本身停止的情况下,需要什么级 别的持久性。这些设置和其他设置都在配置文件中定义,在为每个服务器上的数据库初始化 根目录时,您可以在命令行中指定该文件。
19 . 本章将解释如何在配置文件中配置集群的物理结构和特性,以及如何初始化根目录并启 动和停止数据库。 3.1. 配置数据库和集群环境 您可以指定集群配置以及配置文件中使用的特性,配置文件是一个可以手动创建和编辑 的 XML 文件。在最简单的情况下,配置文件指定在每个服务器上创建多少分区,以及使用 什么级别的可用性(K-safety)。例如: <?xml version="1.0"?> <deployment> <cluster sitesperhost="12"kfactor="1"/> </deployment> sitesperhost 属性指定要在每个服务器上创建的分区(或“站点”)的数量。默认设置为 8, 可以根据每台机器的处理器数量优化每台主机的站点数量。最佳数量是通过对预期工作 负载进行性能测试来确定的。有关详细信息,请参阅 VoltDB Planning Guide 中的“基 准测试”一章。 kfactor 属性指定要使用的 K-safety 值。K-safety 值越高,集群在不影响数据库可用性 的情况下能够承受的节点故障越多。但是,增加 K-safety 值会增加每个惟一分区的副 本数量。高可用性是在防止节点故障的复制和惟一分区的数量之间进行权衡,从而获得 吞吐量性能。有关确定最佳 k -安全值的更多信息,请参阅 Using VoltDB 中的可用性 一章 除了每个主机的站点和 K-safety 之外,还可以使用配置文件启用和配置特定的数据库 特性,比如导出、命令日志记录等等。下表总结了配置文件中可设置的一些关键特性。
20 . 功能 样例 Command Logging -- Command Logging <commandlog enabled="true" synchronous="false"> 命令日志记录通过将事务记录到磁盘来提 <frequency time="300" transactions="1000"/> 供持久性,以便在恢复期间重放它们。您可 </commandlog> 以配置命令日志记录的类型(同步或异步), 日志大小,和日志持久化频率(以毫秒或事 物数来表示) <snapshot enabled="true" Snapshots --自动快照通过创建数据库内 frequency="30m" prefix="mydb" 容的快照提供了另一种形式的持久性,稍后 retain="3" /> 可以恢复这些快照。您可以配置快照的频 率、惟一的文件前缀以及在任何给定时间保 存多少快照。 <export> Export -- 导出允许您将选择的记录从数 <configuration enabled="true" type="file"> <property name="type">csv</property> 据库写到一个或多个外部目标,这些目标可 <property name="nonce">mydb</property> 以是文件、另一个数据库或另一个服务。 </configuration> </export> VoltDB 为每个协议提供了不同的导出连接 器。 您可以为每个流以及其他特定于连接 器类型的属性配置导出的类型。例如,文件 连接器需要文件的特定类型(或格式)和称为 “nonce”的惟一标识符。 <security enabled="true"/> Security & Accounts -- 安 全 性 允 许 您 要 <users> <user name="admin"
21 . password="superman" 求所有连接根据已知的用户名和密码进行 roles="dev,ops"/> <user name="mitty" 身份验证,来保护数据库免受不必要的访 password="thurber" roles="user"/> 问。在部署文件中,您可以定义用户帐户和 </users> 密码,以及每个用户履行的角色。角色定义 帐户具有什么权限。角色定义帐户具有什么 权限。角色在数据库模式中定义。 <paths> File Paths -- 路径定义了 VoltDB 写入任 <exportoverflow path="/tmp/overflow" /> <snapshots path="/opt/archive" /> 何文件或其他基于磁盘的内容的位置。 </paths> 您可以为每种服务类型配置特定的路 径,例如快照、命令日志、导出溢出等。 3.2. 初始化数据库 创建配置文件之后,就可以使用 voltdb init 命令初始化数据库根目录了。在集群的每个 节点上发出这个命令,指定配置文件和根目录的位置。例如: $ voltdb init --dir=~/database ① --config=deployment.xml ② 在命令行上,指定两个参数: ①将要创建根目录的位置 ②配置文件,它支持并设置特定 VoltDB 数据库特性的属性 当初始化数据库根目录时,VoltDB 将: 1. 创建根目录(voltdbroot)作为指定父目录的子文件夹 2. 将配置选项保存在新的根目录中
22 . 注意,您只需要初始化根目录一次。初始化根目录之后,可以根据需要启动和停止数据 库。command log 和 snapshots 默认被持久化到数据库根目录中 (如果选择了这些特性)。 如果根目录已经存在或之前已经初始化,则不能重新初始化该目录,除非包含--force 参数。这是为了防止意外删除前一个数据库会话中的数据。 3.3. 启动数据库 初始化根目录之后,就可以使用 voltdb start 命令启动数据库了。您可以指定根目录的 位置、所需的服务器数量,以及一个或多个用作“主机”的服务器地址,以管理集群的初始 形成。在集群中的每个节点上发出相同的命令。例如: $ voltdb start --dir=~/database \ ① --count=5 \ ② --host=svr1,svr2 \ ③ --license=~/license.xml ④ 上面的命令中包含几个参数 1 数据库根目录 2 集群成员数量 3 集群成员的名称或 ip 列表 4 数据 licence 您必须在集群的所有节点上指定相同数量的服务器和主机(以完全相同的顺序列出)。您 可以选择在--host 参数中指定集群的所有节点。在这种情况下,可以省略--count 参数,而 VoltDB 假设主机的数量是服务器的总数。 启动数据库时,所有节点从主机列表中选择一个服务器作为“主机”,之后主机会:
23 . 1. 等待连接到所需的服务器数量(由 count 参数指定) 2. 创建服务器之间的网络连接 3.验证配置选项是否匹配所有节点 之后,集群完成初始化,“主机”结束其特殊角色,成为所有其他节点的对等节点。如果 数据库是在之前运行的,并且存在命令日志或自动快照,那么集群现在将从前一个会话中恢 复数据。最后集群中的所有节点向控制台写入一条信息消息,可以用于验证数据库是否准备 好: Server completed initialization. 3.4. 加载数据库定义 加载数据库模式和存储过程的责任因公司而异。在某些情况下,操作员和管理员只负责 启动数据库;开发人员定义和修改数据库对象。在其他情况下,管理员还负责启动集群和加 载正确的数据库模式。 如果您负责建立正确的模式,下一步是加载 Java 存储过程和模式定义。存储过程被编 译成类,然后打包成 JAR 文件,如 Using VoltDB 手册中安装存储过程一节所述。要完全加 载数据库定义,您需要存储过程类的 JAR 和包含声明数据库模式的数据定义语言(DDL)语句 的文本文件。 下面的示例假设这两个文件是 storedproc .jar 和 dbschema.sql。一旦数据库集群启动, 就可以使用 sqlcmd 实用程序加载模式和存储过程。要在 sqlcmd 提示符下加载它们,可以 使用 sqlcmd 加载类和文件指令: $ sqlcmd 1> load classes storedprocs.jar;
24 . 2> file dbschema.sql; 注意, 在加载模 式时,应 该总是先 加载存储 过程,这 样,模式 中的任何 CREATE PROCEDURE 语句都可以使用类文件。 3.5. 停止数据库 如何停止 VoltDB 数据库取决于启用了哪些特性。如果您使用了 command logging(企 业版本默认启用该选项),执行有序的关闭是一个好主意,它可以确保所有活动的客户端查询 在数据库关闭之前有机会完成并返回结果。 要执行有序关机,您可以使用 voltamdin shutdown 命令: $ voltadmin shutdown 与所有的 voltadmin 命令一样,您可以通过在命令行上指定一个集群服务器,通过远程 使用它们: $ voltadmin shutdown --host=voltsvr2 如果启用了安全性,还需要为具有管理权限的用户指定用户名和密码: $ voltadmin shutdown --host=voltsvr2 -u root -p Suda51 如 果 不 使 用 command logging , 则 需 要 确 保 在 关 闭 之 前 执 行 快 照 。 您 可 以 使 用 voltadmin save 命令手动执行此操作。或者您可以简单地将--save 参数添加到 voltadmin shutdown 命令中: $ voltadmin shutdown –save 通过 voltadmin save 命令或以自动方式保存的快照,将由下一个 voltdb start 命令自动 进行恢复。
25 .3.6. 重新启动数据 重新启动 VoltDB 数据库的方法与第一次启动数据库的方法相同,只是不需要初始化根 目录。您只需发出与第一次启动时相同的 voltdb start 命令。例如: $ voltdb start --dir=~/database \ --count=5 \ --host=svr1,svr2 \ --license=~/license.xml 如果正在使用 command logging,或者在默认快照目录中创建快照,那么一旦集群建 立,VoltDB 将自动恢复数据。加载模式并恢复所有数据之后,数据库即可被客户机访问。 3.7. 启动和停止单个数据库 在使用 K-safety 时,集群中的一个或多个节点可以在不中断对外服务的情况下停止。(有 关 K-safety 的完整描述,请参阅 Using VoltDB 手册中关于可用性的章节。) 如果服务器停止(有意或无意),您可以启动服务器,并使用与启动集群相同的 voltdb start 命令让它重新加入集群。例如: $ voltdb start --dir=~/database \ --count=5 \ --host=svr1,svr2 \ --license=~/license.xml start 命令将根据--host 参数中的服务器列表检查集群是否仍在运行。如果是,服务器 将重新加入集群。
26 . 注意,如果--host 参数中列出了多个服务器,即使宕机的服务器是列出的主机之一,服 务器也可以重新连接。如果您只列出一台主机,而这台主机就是停止运行的服务器,那么您 需要在--host 参数中列出另一台服务器,即正在运行的集群中的任何成员服务器。(这就是 为什么在--host 参数中列出多个节点是有益的您可以在多种情况下使用完全相同的 start 命 令。) 如果想要停止 K-safe 集群中的单个节点(例如,对硬件执行维护),可以使用 voltadmin stop 命令。只要集群具有足够的 K-safety,使节点停止后仍然可行,那么 voltadmin 停止命 令将停止单个节点。(如果没有,则拒绝 stop 命令。)例如,要停止 svr2,可以发出以下命 令: $ voltadmin stop --host=svr1 svr2 注意,stop 命令不必在正在停止的服务器上发出。您可以在集群中的任何活动服务器 上发出该命令。有关执行维护任务的更多信息,请参见第 4 章,维护和升级。 4. 维护和升级 数据库运行后,管理员的职责是保持它运行。本章讲解如何执行常见的维护和升级任务, 包括: •数据库备份 •模式和存储过程更新 •软件和硬件升级
27 .4.1. 数据库备份 备份所有与计算机系统相关的数据,并在发生系统故障或其他意外事件时存储副本,这 是一种常见的安全预防措施。备份通常是在计划的基础上进行的(每天、每周或任何被认为 足够的时间)。 VoltDB 为备份数据库内容提供了几个选项。最简单的选择是保存一个本地快照,然后 将生成的快照文件备份到可移动媒体以便存档。这种方法的优点是,本机快照同时包含数据 和模式的完整副本。因此,如果出现故障,可以使用单个 voltadmin 还原命令将快照恢复到 当前集群或另一个集群 在使用本机快照进行备份时,要记住的关键一点是,每个服务器都将其数据库的一部分 保存在本地。因此,您必须获取所有服务器的快照文件,以确保您拥有完整的文件集。下面 的示例在 5 个节点集群上执行手动快照,然后使用 scp 远程地将文件从每个服务器复制到 一个位置以便存档。 $ voltadmin save --blocking --host=voltsvr3 \ /tmp/voltdb backup $ scp -l 100 'voltsvr1:/tmp/voltdb/backup*' /tmp/archive/ $ scp -l 100 'voltsvr2:/tmp/voltdb/backup*' /tmp/archive/ $ scp -l 100 'voltsvr3:/tmp/voltdb/backup*' /tmp/archive/ $ scp -l 100 'voltsvr4:/tmp/voltdb/backup*' /tmp/archive/ $ scp -l 100 'voltsvr5:/tmp/voltdb/backup*' /tmp/archive/ 注意,如果使用自动快照或 command logging(command logging 也创建快照),可以 使用自动快照作为备份源。但是,自动快照使用编程生成的文件前缀,因此您的备份脚本将 需要一些额外的智能来标识最近的快照及其前缀。
28 . 前面的示例还使用 scp limit 标志(- l 100)将 copy 命令使用的带宽限制为 100kbits/秒。 建议使用-l 标志,以避免复制操作阻塞 VoltDB 服务器进程和影响数据库性能。 最后,如果希望以非专有格式备份数据,可以使用 voltadmin save --format=csv 命令, 以逗号分隔值(csv)格式的文本文件创建数据快照。这样做的好处是,生成的文件可以被更多 的系统使用,而不仅仅是 VoltDB。缺点是 CSV 文件只包含数据,而不包含模式。这些文件 不能像本地快照那样直接读入 VoltDB。您需要初始化并启动一个新数据库,加载模式,然 后使用 csvloader 实用程序将单个文件加载到每个表中,以完全恢复数据库。 4.2. 更新数据库对象 随着应用程序的发展,数据库模式经常需要更改。在开发和测试的早期阶段尤其如此, 但在已建立的应用程序中也会定期发生这种情况,因为数据库会根据性能进行调优或调整以 满足新的需求。对于 VoltDB,这些更新可能涉及对表定义、索引或存储过程的更改。以下 各节解释如何: •执行实时模式更新 •使用 save 和 restore 更改惟一索引和分区 4.2.1. 在线更新 有两种方法可以更新 VoltDB 的数据库模式:实时更新和保存/恢复更新。对于大多数更 新,您可以在数据库运行时更新模式。要执行这种实时更新,可以使用 DDL CREATE、ALTER 和 DROP 语句交互地修改模式,如 Using VoltDB 手册中修改模式一节所述。 只要修改的表不包含任何数据,就可以对模式进行任何更改。执行实时模式更改的唯一 限制是您不能:
29 . 在已有数据的表上添加或扩展惟一约束(如索引或主键) 将数据类型改成一个更小 size 的(例如,将数据类型从 INTEGER 更改为 TINYINT) 设置这些限制是为了确保模式更改能够成功,而不会有任何预先存在的数据违反约束。 如果您知道数据库中的数据没有违反新的约束,您可以使用 save 和 restore 命令进行这些 更改,如下一节所述。 4.2.2. 离线更新 如果需要向数据库表添加惟一索引或减小列长度,则必须使用 voltadmin save 和 restore 命令执行模式更新。这需要关闭和重新启动数据库,以便允许 VoltDB 根据新的约束 验证现有数据。 要使用 save 和 restore 执行模式更新,请使用以下步骤: 1. 创建一个包含更新的 DDL 语句的新模式文件。 2. 暂停数据库(voltadmin pause)。 3. 将数据库内容的快照保存到特定位置(voltadmin Save --blocking {path}{file-prefix})。 4. 关闭数据库(voltadmin shutdown)。 5. 重新初始化并以管理模式启动数据库(voltdb init --force 和 voltdb start --pause)。 6. 加载存储过程和新模式(使用 sqlcmd LOAD CLASSES 和 FILE 指令) 7. 还原步骤 3 中创建的快照(voltadmin restore {path} {file-prefix})。 8. 恢复数据库到开放状态(voltadmin resume) $ # Issue once $ voltadmin pause $ voltadmin save --blocking /opt/archive/ mydb