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式样-动作-文件 ”。