docker - Docker + Alpine Linux上的Akka 2.5分布式数据

标签 docker akka akka-cluster alpine lmdb

将使用Akka + Akka群集分片的服务升级到新发布的Akka(2.5.0)之后,我们开始遇到在Docker + Alpine Linux中启动系统的问题。据我所知,Akka群集分片配置为使用Akka分布式数据(从2.5.0版开始不再试验),并且正在使用LMDB(需要GCC + glibc,并且在Alpine Linux中不可用)。

我的问题如下:

1)Akka是否有替代LMDB的标准替代品?

2)有什么方法可以使LMDB在Alpine Linux中工作?

堆栈跟踪:

[ERROR] [04/20/2017 13:42:19.014] [lotus-akka.actor.default-dispatcher-5] [akka://lotus/system/sharding/replicator/durableStore] Error relocating /tmp/lmdbjava-native-library-5972006786989102785.so: __fprintf_chk: symbol not found
akka.actor.ActorInitializationException: akka://lotus/system/sharding/replicator/durableStore: exception during creation
       at akka.actor.ActorInitializationException$.apply(Actor.scala:191)
       at akka.actor.ActorCell.create(ActorCell.scala:600)
       at akka.actor.ActorCell.invokeAll$1(ActorCell.scala:454)
       at akka.actor.ActorCell.systemInvoke(ActorCell.scala:476)
       at akka.dispatch.Mailbox.processAllSystemMessages(Mailbox.scala:282)
       at akka.dispatch.Mailbox.run(Mailbox.scala:223)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
       at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.reflect.InvocationTargetException
       at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
       at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
       at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
       at akka.util.Reflect$.instantiate(Reflect.scala:65)
       at akka.actor.ArgsReflectConstructor.produce(IndirectActorProducer.scala:96)
       at akka.actor.Props.newActor(Props.scala:213)
       at akka.actor.ActorCell.newActor(ActorCell.scala:555)
       at akka.actor.ActorCell.create(ActorCell.scala:581)
       ... 7 more
Caused by: java.lang.UnsatisfiedLinkError: Error relocating /tmp/lmdbjava-native-library-5972006786989102785.so: __fprintf_chk: symbol not found
       at jnr.ffi.provider.jffi.NativeLibrary.loadNativeLibraries(NativeLibrary.java:87)
       at jnr.ffi.provider.jffi.NativeLibrary.getNativeLibraries(NativeLibrary.java:70)
       at jnr.ffi.provider.jffi.NativeLibrary.getSymbolAddress(NativeLibrary.java:49)
       at jnr.ffi.provider.jffi.NativeLibrary.findSymbolAddress(NativeLibrary.java:59)
       at jnr.ffi.provider.jffi.AsmLibraryLoader.generateInterfaceImpl(AsmLibraryLoader.java:158)
       at jnr.ffi.provider.jffi.AsmLibraryLoader.loadLibrary(AsmLibraryLoader.java:89)
       at jnr.ffi.provider.jffi.NativeLibraryLoader.loadLibrary(NativeLibraryLoader.java:43)
       at jnr.ffi.LibraryLoader.load(LibraryLoader.java:325)
       at jnr.ffi.LibraryLoader.load(LibraryLoader.java:304)
       at org.lmdbjava.Library.<clinit>(Library.java:95)
       at org.lmdbjava.Env$Builder.open(Env.java:406)
       at org.lmdbjava.Env$Builder.open(Env.java:430)
       at akka.cluster.ddata.LmdbDurableStore.<init>(DurableStore.scala:131)
       ... 16 more

最佳答案

终于设法解决了这个问题。群集分片默认尝试使用持久性存储(默认为LMDB)。对于不使用remember-entities的集群分片,不需要持久存储。

因此,解决方案是通过添加以下配置来禁用持久性存储以进行集群分片

akka.cluster.sharding.distributed-data.durable.keys = []

关于docker - Docker + Alpine Linux上的Akka 2.5分布式数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43524304/

相关文章:

akka - 您是否使用 Akka Cluster 在分布式系统中的每个主机上运行单独的 Actor 系统?

docker - ElasticBeanstalk中Docker中的Akka集群

java - 在 docker 实例上使用 akka 远程处理与 artere 时出错

python - 如何为自定义 python 项目编写 Dockerfile?

mysql - 有没有办法在 mysql docker 中创建模式和表,而无需为 mysql 构建新镜像?

docker - 使用Docker安装Perl

scala - Keep组合的含义?

scala - Akka 远程: trying to connect two machines

scala - MergeLatest 的默认值

java - Akka-http Java API 示例代码/文档