2017-04-20 60 views
1

将使用Akka + Akka集群分片的服务升级到新发布的Akka(2.5.0)后,我们开始遇到在Docker + Alpine Linux中启动系统时遇到的问题。根据我的推断,Akka Cluster分片配置为使用Akka分布式数据(从2.5.0开始不再是实验),它使用LMDB(它需要GCC + glibc,并且它在Alpine Linux中不可用)。Akka 2.5 Docker + Alpine Linux上的分布式数据

我的问题如下:

1)是否存在被阿卡,而不是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 

回答

1

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

因此,解决这个是通过添加以下配置

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

另一选项来禁用用于集群拆分耐用存储将是使用一个持久日志以用于存留分片状态,看到更多的文档: http://doc.akka.io/docs/akka/2.5.0/scala/cluster-sharding.html#persistence-mode – johanandren

+0

我确实考虑过这个选项,但由于我们没有使用'remember-entities',所以没有' t保持分片状态的任何值 – aseychell

+0

如果具有分片协调器的节点在启动时需要在新分片协调器上恢复状态(哪些分片位于哪些分片区域上)需要恢复。 – johanandren

相关问题