8 ノードの小さな Titan0.5.0
クラスターがあります。すべてのノードは、Rexster2.5.0
と Cassandra で Titan を実行します。それらはすべて同じように構成されています。残念ながら、ほとんどの場合、そのうちの 1 つが開始できません。
ほとんどの場合、これはシード ノードの 1 つです。
ストレージ バックエンドとして使用cassandra
すると、Rexster/Titan ログに次のように表示されます。
WARN com.tinkerpop.rexster.config.GraphConfigurationContainer - Could
not open global configuration com.thinkaurelius.titan.core.TitanException:
Could not open global configuration
at com.thinkaurelius.titan.diskstorage.Backend.
getStandaloneGlobalConfiguration(Backend.java: 405)
...
Caused by: com.thinkaurelius.titan.diskstorage.TemporaryBackendException:
Temporary failure in storage backend
at com.thinkaurelius.titan.diskstorage.cassandra.astyanax.
AstyanaxStoreManager.ensureColumnFamilyExists(AstyanaxStoreManager.java:446)
...
Caused by: com.netflix.astyanax.connectionpool.exceptions.BadRequestException:
BadRequestException: [host=192.168.0.10(192.168.0.10):9160, latency=496(496),
attempts=1] InvalidRequestException(why:Cannot add already existing
column family "system_properties" to keyspace "titan")
at com.netflix.astyanax.thrift.ThriftConverter.ToConnectionPoolException(
ThriftConverter.java:159)
Rexster は起動に失敗したため、グラフをロードしませんでした。ただし、接続に失敗した Cassandra ノード Rexster は問題ないようnodetool
です。リングの一部としてノードをリストします。残りの Rexster インスタンスに対してリクエストを発行すると、すべてが機能しているように見えます。
ノードを起動する前に、すべてのデータを消去しました。
同様の例外が発生するように切り替えましcassandrathrift
た(TimeoutExceptionによって引き起こされたPermanentBackendExceptionによって引き起こされた同じTitanException)。Rexster のストレージ タイムアウトは 30 秒です。現時点ではすべてのノードを同時に起動しているため、これは低すぎる可能性がありますが、cassandra
.
ここで何がうまくいかないのですか?
編集:
私はタイタンを悪用していました。起動時のインデックス作成に対処する必要がないように (私の場合は頻繁に発生します)、Rexster 拡張機能でインデックスを作成しました。このコードは複数回呼び出されたと思います。複数のノードを同時に起動したときに、そのうちのいくつかがインデックスを作成しようとしたようです。
質問: 拡張機能がインデックスを安全に作成できる方法はありますか? このために別のスレッドを作成しました:インデックスを作成する方法は何ですか?
ストレージ タイムアウトを 60 秒に増やし、コードからインデックスの作成を削除した後、手順を再試行しました。すべてのノードを同時に起動します。ここでも 1 つの Rexstitan ノード (シード ノード #2) が起動に失敗します。
Cassandra ログには確かに例外が含まれています
java.lang.IllegalArgumentException: Unknown keyspace/cf pair (titan.txlog)
at org.apache.cassandra.db.Keyspace.getColumnFamilyStore(Keyspace.java:166)
at org.apache.cassandra.db.Keyspace.getRow(Keyspace.java:326)
at org.apache.cassandra.db.SliceFromReadCommand.getRow(SliceFromReadCommand.java:65)
at org.apache.cassandra.db.ReadVerbHandler.doVerb(ReadVerbHandler.java:47)
at org.apache.cassandra.net.MessageDeliveryTask.run(MessageDeliveryTask.java:60)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
両方のシード ノードで確認できます。1 つのシード ノードの Rexster は気にしないように見えますが、他の Rexster インスタンスは起動に失敗します。
Caused by: com.netflix.astyanax.connectionpool.exceptions.BadRequestException: BadRequestException: [host=192.168.0.10(192.168.0.10):9160, latency=66(66), attempts=1]InvalidRequestException(why:Cannot add already existing column family "graphindex_lock_" to keyspace "titan")
at com.netflix.astyanax.thrift.ThriftConverter.ToConnectionPoolException(ThriftConverter.java:159)
at com.netflix.astyanax.thrift.AbstractOperationImpl.execute(AbstractOperationImpl.java:65)
at com.netflix.astyanax.thrift.AbstractOperationImpl.execute(AbstractOperationImpl.java:28)
at com.netflix.astyanax.thrift.ThriftSyncConnectionFactoryImpl$ThriftConnection.execute(ThriftSyncConnectionFactoryImpl.java:151)
at com.netflix.astyanax.connectionpool.impl.AbstractExecuteWithFailoverImpl.tryOperation(AbstractExecuteWithFailoverImpl.java:119)
at com.netflix.astyanax.connectionpool.impl.AbstractHostPartitionConnectionPool.executeWithFailover(AbstractHostPartitionConnectionPool.java:338)
at com.netflix.astyanax.thrift.ThriftClusterImpl.executeSchemaChangeOperation(ThriftClusterImpl.java:146)
at com.netflix.astyanax.thrift.ThriftClusterImpl.internalCreateColumnFamily(ThriftClusterImpl.java:240)
でrexstitan.log
。以前に発生した例外と非常によく似ています。
明確にするために: 失敗とは、Rexster が開始され、クエリを実行できるが、Titan グラフ「グラフ」のロードに失敗したことを意味します。
これがクラスターサイズに関連しているかどうかを確認するには、サイズを最小限に抑える必要があるかもしれません。
編集#2:
クラスタ サイズとは関係ありません。そして、それは本当に迷惑になっています。BadRequestException
上記の場合もあれば、すでにキースペース「titan」があるためBadRequestException
です。またはそれはIllegalArgumentException
:
2646 [main] WARN com.tinkerpop.rexster.config.GraphConfigurationContainer -
Database has already been initialized but not frozen
java.lang.IllegalArgumentException: Database has already been initialized but not frozen
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:93)
at com.thinkaurelius.titan.graphdb.configuration.GraphDatabaseConfiguration.<init>(GraphDatabaseConfiguration.java:1294)
at com.thinkaurelius.titan.core.TitanFactory.open(TitanFactory.java:93)
at com.thinkaurelius.titan.core.TitanFactory.open(TitanFactory.java:73)
at com.thinkaurelius.titan.tinkerpop.rexster.TitanGraphConfiguration.configureGraphInstance(TitanGraphConfiguration.java:33)
at com.tinkerpop.rexster.config.GraphConfigurationContainer.getGraphFromConfiguration(GraphConfigurationContainer.java:124)
at com.tinkerpop.rexster.config.GraphConfigurationContainer.<init>(GraphConfigurationContainer.java:54)
at com.tinkerpop.rexster.server.XmlRexsterApplication.reconfigure(XmlRexsterApplication.java:99)
at com.tinkerpop.rexster.server.XmlRexsterApplication.<init>(XmlRexsterApplication.java:47)
at com.tinkerpop.rexster.Application.<init>(Application.java:97)
at com.tinkerpop.rexster.Application.main(Application.java:189)
一度に複数のノードを起動することはできませんか?それらは競合しますか? これが私が考えることができる唯一の理由です。例外が発生する可能性があり、場合によっては正常に機能するからです。