intra-mart Accel Platform / Cassandra管理员指南

第8版 2014-04-01

«  8. Cassandra 的操作   ::   Contents   ::   10. Cassandra 的版本升级  »

9. Cassandra 的运行

在此,对 Cassandra 的运行方法进行说明。

9.1. 状态变化的时间点和风险

对 Cassandra 运行状态变化的时间点和该时间点的风险进行考察。

9.1.1. 计划停止

假想通过手动或服务在计划好的时间点停止的情况。
另外作为前提,需要在停止Cassandra的时间点上没有来自ApplicationServer的更新要求。

注解

应对例子

  • 在停止前先停止ApplicationServer。
  • 执行nodetool drain命令,切换到不接受写入要求的状态。
执行drain时,同时执行Flush操作。
  • Flush成功时
    通常期待的状态。由于执行了Flush,所以不会有数据损失,当然就不需要考虑对策。
  • Flush失败时
    通常按计划停止时可确保执行了Flush并停止时的数据正确,但停止时Flush有可能失败。
    由于Flush未能被正常执行,所以存在于内存上的数据会丢失。

9.1.2. 异常停止

设想出于某些原因,Cassandra出现了意想之外的停止时。

注解

设想以下状况。

  • Cassandra内发生了不可继续服务的异常(OutOfMemoryError)时
  • Cassandra的进程被强行停止时
  • Cassandra启动中OS停止时
  • 执行了Flush时
    异常停止前有可能执行Flush。
    由于执行了Flush,所以不会有数据损失,当然就不需要考虑对策。
  • 未执行Flush,或Flush失败时
    异常停止前通常不会执行Flush。因此,即使执行也可能会失败。
    由于Flush未能被正常执行,所以存在于内存上的数据会丢失。

注解

无论是计划停止还是异常停止,都会存在由于Flush失败带来的数据损失风险。

9.1.3. 网络切断

Cassandra节点被网络切断时,不会发生数据损失的情况。
但是,根据构成状态不同会发生无法使用服务的情况。
  • 用单一节点构筑时
    直到Cassandra恢复为止IMBox都无法使用。

    注解

    在单一节点上运行时,由于网络切断时无法进行读入/写入操作,所以不会发生数据损失。
  • 用集群构成的方式构筑时
    状况会随着由网络切断的节点数不同而发生变化。
    • 存在可继续服务的台数时
      例如“节点数是3台(复制因子是3)”时,在运行中有1台被切断后,服务可在其他两个节点正常进行。
      被切断的节点再次连接到网络时,缺少的数据会被Replicate(复制)并恢复到通常的运行状态。
    • 无法再继续服务的台数时
      直到Cassandra恢复为止IMBox都无法使用。
      例如“节点数是3台,复制因子是3”时,若有两台被切断,则无法再使用服务。
      由于服务无法使用后也无法进行读入/写入操作,所以不会发生数据损失。

9.2. 风险对策

根据前项的描述,基本上需要对Flush的失败或未实施Flush时采取对策。
关于应对措施,将对几个方案进行考察。

9.2.1. 计划停止前的Flush执行

计划停止前进行一次Flush处理。
这样就可回避在计划停止时执行Flush失败的风险。

9.2.2. 定期执行Flush

Cassandra启动时通过cron等定期执行Flush,即使发生了由于异常停止等造成数据损失的情况,也可确保到最后一次执行Flush时的内容。

注解

此对策总的来说是一个降低数据损失的概率和减少损失量的对策。
关于 快闪备份 ,请参照此处。

注解

需要在运行设计中根据被要求的条件来调整Flush的执行频率。
需要研讨的项目如下。
  • 数据损失可能性所容许的最长时间
  • 由于定期执行Flush而带来的I/O负荷增加对服务响应和服务器负荷的影响

9.2.3. 集群构成的构筑

通过构筑并运行Cassandra集群,可大幅减少数据损失及服务停止的可能性。
此时,强烈建议构成集群的节点数在3个以上。
  • 节点数是两台时
    构成集群的节点是2个时,任一节点停止后服务(数据的读入及写入)都无法继续。
    但是,由于在服务不可继续时也无法进行写入数据操作,所以不会发生数据损失。
  • 节点数是3台(或3台以上)时
    构成集群的节点有3个(以及复制因子是3)时,即使任一节点停止服务都可继续。
    停止了的节点恢复时,会复制停止节点所缺少的数据,在复制结束时恢复到通常的运行状态。
    3个节点中的2个同时停止时,服务无法再继续,所以需要在只有1个节点停止的阶段采取恢复措施。
    但是,由于在服务不可继续时也无法进行写入数据操作,所以不会发生数据损失。

9.2.4. 总结

在此,对各构成的有效对策进行总结。

9.2.4.1. 在单一节点上运行Cassandra时

在单一节点上运行Cassandra时,完全无法防止发生异常停止时的数据损失。
以下是异常停止发生时的有效对策。
  • 在停止前执行Flush
  • 定期执行Flush

注解

参考信息

在本公司的公司内系统中,Cassandra在单一节点上运行,每隔15分钟执行一次Flush。
已运行了大约两年,至今发生了4次左右最接近15分钟(最大)的提交数据损失的现象。
※ 由于本公司系统兼具运行试验环境的作用,使用了发行前(RC版)的版本,所以与通常使用相比发生错误的概率比较高。

9.2.4.2. 用集群构成方式运行Cassandra时

仅仅是采用集群构成方式来运行就可大大降低数据损失的发生率。
另外,由于维护等需要停止全部集群时,可采用以下对策来降低发生数据损失的风险。
  • 在停止前执行Flush

9.3. 数据的复原

发生了数据损失时,可复原的数据如下。

9.3.1. 可复原的数据

从IM通用主表同步写入的“用户”和“组织”信息

注解

可通过执行专用Job(JobNet)来复原。
详细内容请参照“IMBox式样 - Job Scheduler”。

9.3.2. 不可复原的数据

在IMBox上更新的“提交内容”和“新建生成的组别”等只保存在Cassandra上。
因此,发生了数据损失时无法复原。

注解

附件被保存在文件系统(PublicStorage)上,因此可由系统管理员来恢复。
关于附件的保存位置,请参照“ IMBox式样-动作-文件 ”。

9.4. 调整时间

存放在 Cassandra 中的全部数据都带有时间,此时间主要是用于解决集群环境中的数据矛盾问题。
因此,在运行 Cassandra 的服务器上进行了变更时钟等操作时,有可能发生数据不一致并导致数据损坏。
另外,存放于 Cassandra 数据中的时间并非执行 Cassandra 服务器上的时间,而是使用连接到 Cassandra 的应用程序侧上设定的时间。
因此, intra-mart Accel Platform 的动作环境以及运行 Cassandra 的服务器上时钟的全部时间都必须一致。
为了统一时间,请考虑用ntp服务器。

«  8. Cassandra 的操作   ::   Contents   ::   10. Cassandra 的版本升级  »