1

ejabbered + riak クラスターをセットアップしています。ここでは、ファイルejabberd/src/ejabberd_riak.erlで基本的な riak (get、put、delete ..) 関数を使用する必要があります。

  1. put、get、get_by_indexなどの関数はうまく機能し、ファイル内のモジュールの使用法を使用して、何が何であるかを理解できました。

  2. とにかく、関数delete_by_indexと、delete_by_indexによって呼び出されるget_keys_by_indexの問題に直面しています。

これを行うとスローされるエラー->

ejabberd_riak:get_keys_by_index(game <<"language">>,       
term_to_binary("English")).
{error,<<"Phase 0: invalid module named in PhaseSpec function:\n must be a valid module name (failed to load ejabberd_r"...>>}
(ejabberd@172.43.12.133)57> 12:28:55.177 [error] database error:
** Function: get_keys_by_index
** Table: game
** Index = <<"language">>
** Key: <<131,107,0,7,69,110,103,108,105,115,104>>
** Error: Phase 0: invalid module named in PhaseSpec function:
must be a valid module name (failed to load ejabberd_riak: nofile)
4

1 に答える 1

1

ejabberd_riakおそらくri​​ak側でロードする必要があります

現在、riak を別個の erlang アプリケーションとして使用しており、protobuf によってデータベースと通信しています。この構成では、(互いに) 独立したモジュール セットが ejabbered および riak アプリケーションにロードされます。ejabberd_riakモジュールは ejabberd アプリケーションにロードされましたが、riak アプリケーションにはロードされませんでした。

ただしget_by_index、riak 側にロードされた ejabberd_riak を要求する mapred を使用します。

-spec get_keys_by_index(atom(), binary(),
                        any()) -> {ok, [any()]} | {error, any()}.
%% @doc Returns a list of primary keys of objects indexed by `Key'.
get_keys_by_index(Table, Index, Key) ->
    {NewIndex, NewKey} = encode_index_key(Index, Key),
    Bucket = make_bucket(Table),
    case catch riakc_pb_socket:mapred(
         get_random_pid(),
         {index, Bucket, NewIndex, NewKey},
         [{map, {modfun, ?MODULE, map_key}, none, true}]) of
         %%               ^^^^^^
         %%       here is the problem 
        {ok, [{_, Keys}]} ->
            {ok, Keys};
    {ok, []} ->
        {ok, []};
        {error, _} = Error ->
            log_error(Error, get_keys_by_index, [{table, Table},
                                                 {index, Index},
                                                 {key, Key}]),
            Error
    end.

riak をカスタマイズejabberd_riakして riak アプリケーションに追加できます (ただし、riak 側で ejabberd アプリケーション全体を起動する必要はありません)。

monckeypatching アプローチでは、ejabberd_riak.erl、ejabberd.hrl、logger.hrl をriak/deps/riak_kv/src. 次にriakを再構築します。mapフェーズは各クラスター ノードで実行されるため、クラスター全体にファイルを分散する必要があります。

于 2016-05-20T20:33:02.007 に答える