Akka持久性Cassandra,数据库初始化



我想知道在Cassandra中初始化akka持久性数据库最有用的模式是什么

此时,我正在使用一个自定义Docker镜像,该镜像已经创建了数据库。然而,我不想依赖docker,并且希望使用独立/非容器化实例。

最简单的模式是连接到该数据库并在启动应用程序之前手动执行脚本。但我想使用一个更自动的解决方案,它也可以在本地环境中轻松工作,在本地环境下,数据库可以一天多次删除。

因此,我想使用一个初始化脚本/类,它将连接到数据库并执行脚本。遗憾的是,我找不到任何简单的方法从我的(Playframework(应用程序中获得Cassandra连接。

如何在akka持久性系统中初始化数据库?

首先要注意的是,Cassandra模式生成的自动化不应该在生产中进行,至少在可以从多台机器进行自动化的情况下不应该这样做。这是因为很有可能在具有不同模式UUID的Cassandra集群的多个节点(即使使用IF NOT EXISTS等(上同时创建密钥空间(如果也使用Akka Persistence Cassandra作为快照存储(。Cassandra最终会对它们进行协调,并确定不同的模式实际上是相同的,但与此同时,会出现不可预测的数据丢失。

AkkaPersistenceCassandra曾经自动创建密钥空间/表,但由于这个问题,它不再这样做了。但是,如果进行了配置(例如通过application.conf或JVM属性(,它将创建密钥空间/表。只需将akka.persistence.cassandra.journal.keyspace-autocreateakka.persistence.cassandra.snapshot.keyspace-autocreate设置为true即可。这设置了用于本地开发的模式(例如,复制因子为1(。

您可以使用akka.persistence.cassandra.journal.keyspace设置日志的密钥空间名称,以及使用akka.persistence.cassandra.journal.replication-factor自动创建时要使用的复制因子。

如果您可以确保一次只从应用程序的单个实例创建架构,并且在启动任何其他实例之前将使用nodetool describecluster来确定是否存在架构协议,那么您可以在生产中启用自动创建:如果这样做是为了正确设置replication-factor,请小心。

通过依赖Akka Persistence Cassandra,也可以构建一个仅用于创建模式的项目:最简单的方法是这样的:

def main(args: Array[String]): Unit = {
val actorSystem = ActorSystem("cassandra-tables")
import actorSystem.dispatcher
// check Cassandra docs on how to create a CqlSession:
val cqlSession = ???
val cassandraPluginSettings = akka.persistence.cassandra.PluginSettings(actorSystem)
val cassandraStatements = new akka.persistence.cassandra.CassandraStatements(cassandraPluginSettings)
val schemaCreationFuture =
cassandraStatements.executeAllCreateKeyspaceAndTables(cqlSession, akka.event.Logging(actorSystem, getClass))
schemaCreationFuture.foreach(_ => actorSystem.terminate())
Await.ready(system.whenTerminated, Duration.Inf)
}

因为这使用了两个private[akka]类,所以需要将此main方法放在akka层次结构中的包中,例如akka.gervaisb。做这种事情实际上是选择在升级APC时必须处理更改,尽管在升级APC的时候可能应该寻找模式更改。

最新更新