1

1.ignite はクラスター化モードでスプリット ブレイン シナリオをどのように処理しますか?

2. putAll の場合、エントリごとに永続ストアにヒットしますか、それともすべてが一度にストアに入れられますか?

3.バッチ サイズを設定した場合、永続ストアに関して putAll はどのように機能しますか?

4.バックアップで分割された場合、データはどのような順序で移動しますか? primary->backup->persistence または primary->backup その間に非同期的に永続化しますか?

5.永続ストアで更新が行われた場合、リロードせずにキャッシュに反映するにはどうすればよいですか? (バックエンド更新の処理方法)

6. バックエンドで更新を実行し、loadCache を使用してキャッシュをリロードする場合にキャッシュの変更を反映するために、キャッシュで変更が更新されないか、そのまま get() を使用しても更新が反映されません。一度キャッシュをクリアしてから loadcache または get api を呼び出すと、更新が反映されます。これはキャッシュをリロードする正しい方法ですか?

 Person p1 = new Person(1, "Benakaraj", "KS", 11, 26, 1000);
    Person p2 = new Person(2, "Ashwin", "Konale", 13, 26, 10000);
    Connection con = null;
    Statement stmt = null;

    con = ds.getConnection();
    stmt = con.createStatement();
    String sql =
        "create table Person(per_id int,name varchar(20),last_name varchar(20),org_id int,age int,salary REAL,primary key(per_id))";
    stmt.executeUpdate(sql);

    ROCCacheConfiguration<Integer, Person> pesonConfig = new ROCCacheConfiguration<>();
    pesonConfig.setName("bkendupdtCache");
    pesonConfig.setCacheMode(CacheMode.PARTITIONED);
    JdbcType jdbcType = new JdbcType();

    jdbcType.setCacheName("bkendupdtCache");
    jdbcType.setDatabaseSchema("ROC4Test");
    jdbcType.setDatabaseTable("Person");
    jdbcType.setKeyType(Integer.class);
    jdbcType.setValueType(Person.class);
    // Key fields for PERSON.

    Collection<JdbcTypeField> keys = new ArrayList<>();
    keys.add(new JdbcTypeField(Types.INTEGER, "per_id", int.class, "perId"));
    jdbcType.setKeyFields(keys.toArray(new JdbcTypeField[keys.size()]));

    // Value fields for PERSON.
    Collection<JdbcTypeField> vals = new ArrayList<>();
    vals.add(new JdbcTypeField(Types.INTEGER, "per_id", int.class, "perId"));
    vals.add(new JdbcTypeField(Types.VARCHAR, "name", String.class, "name"));
    vals.add(new JdbcTypeField(Types.VARCHAR, "last_name", String.class, "lastName"));
    vals.add(new JdbcTypeField(Types.INTEGER, "org_id", int.class, "orgId"));
    vals.add(new JdbcTypeField(Types.INTEGER, "age", int.class, "age"));
    vals.add(new JdbcTypeField(Types.FLOAT, "salary", Float.class, "salary"));
    jdbcType.setValueFields(vals.toArray(new JdbcTypeField[vals.size()]));

    Collection<JdbcType> jdbcTypes = new ArrayList<>();

    jdbcTypes.add(jdbcType);

    CacheJdbcPojoStoreFactory<Integer, Organization> cacheJdbcdPojoStorefactory4 =
        context.getBean(CacheJdbcPojoStoreFactory.class);
    cacheJdbcdPojoStorefactory4.setTypes(jdbcTypes.toArray(new JdbcType[jdbcTypes.size()]));

    pesonConfig.setCacheStoreFactory((Factory<? extends CacheStore<Integer, Person>>) cacheJdbcdPojoStorefactory4);
    pesonConfig.setReadThrough(true);
    pesonConfig.setWriteThrough(true);
    ROCCache<Integer, Person> personCache2 = rocCachemanager.createCache(pesonConfig);
    personCache2.put(1, p1);
    personCache2.put(2, p2);
    assertEquals(personCache2.get(2).getName(), "Ashwin");
    sql = assertEquals(personCache2.get(2).getName(), "Abhi");

"update Person set name='Abhi' where per_id=2";
        stmt.execute(sql);

        //fails and asks for assertion with the stale value
        personCache.loadcache(null);
        assertEquals(personCache2.get(2).getName(), "Abhi");

        //works fine
        personCache2.clear(2);
        assertEquals(personCache2.get(2).getName(), "Abhi");

        //works fine
        personCache2.clear();
        personCache2.loadcache(null);
        assertEquals(personCache2.get(2).getName(), "Abhi");

        sql = "drop table Person";
        stmt.executeUpdate(sql);
        con.close();
        stmt.close();
        rocCachemanager.destroyCache("bkendupdtCache");
4

1 に答える 1

1
  1. デフォルトでは、互いに再び結合することのない 2 つの独立したクラスターを取得します (そうしないと、データの不整合が発生する可能性があります)。クラスタの 1 つを手動で停止し、ネットワークが復元された後に再起動する必要があります。ただし、自動解決はプラグインとして実装できます。たとえば、GridGain はすぐに使用できるこの機能を提供します: https://gridgain.readme.io/docs/network-segmentation

  2. Ignites は、永続ストアの呼び出しを可能な限り最小限に抑えようとします。loadAllストレージがバッチの読み取りと書き込みをサポートしている場合は、メソッドwriteAllとメソッドを実装するときにこれを利用することをお勧めしremoveAllます。

  3. バッチ更新操作は、ノード マッピングに基づいてバッチを分割します。バッチの各部分は、対応するプライマリ ノードで一度に永続化されます。

  4. ストアはプライマリ ノードでアトミックに更新されます (ストアへの書き込みが失敗した場合、キャッシュは更新されず、その逆も同様です)。デフォルトでは、バックアップはバックグラウンドで非同期に更新されます。

  5. 可能であれば、これを回避し、Ignite をバックエンドにオプションのストアを持つプライマリ データ ストレージとして扱う必要があります (つまり、常に Ignite API を介してデータにアクセスします)。DB の更新を Ignite に伝達する簡単な方法はありません。

  6. メソッドを使用してエントリを無効clear/clearAllにするか、メソッドを使用してエントリを再ロードできますloadAll。別のオプションは、有効期限を使用することです: https://apacheignite.readme.io/docs/expiry-policies

于 2016-03-18T02:30:25.023 に答える