Riak 1.3 Release note translation
Riak 1.3の新機能です。 Riakは今回アクティブ・アンチエントロピー(AAE) サブシステムを組み込みました。これはRiakクラスター全体に渡るデータの検証と修復を行うものです。 AAEシステムはデータの欠落、不一致を確認するために、データレプリカ間で定期的に情報を交換します。不良レプリカが見つかると、これを直すためにAAEはread repairを実行します。AAEは完全に自動化されており、多くのデータ消失シナリオ(ディスク故障、古いバックアップからのリストア、bit不良など)を防ぐ新たなレイヤーとなります。
AAEはハッシュツリー交換を使って実装されています。これによりデータレプリカ間で交換されるデータ量は、Riakに保存された全データではなく、不整合となっているデータに比例します。すべてのデータが同期されている場合(通常の状態)、素早く、かつ極めて低いオーバーヘッドで情報を交換します。このためAAEは、クラスタへほぼ影響を与えることなく、1分間に複数回の交換を行えます。
AAEのハッシュツリーは通常のRiak K/Vデータとは分離されたLevelDBインスタンスに永続化されます。まっさらなRiak1.3クラスタを初めて起動すると(もしくは以前のリリースからアップグレードすると)各パーティションデータを参照することでハッシュツリー情報を生成します。デフォルトでRiakは各ノードで1時間毎にひとつのハッシュツリーを生成します。パーティションデータの参照に一時間以上かかる場合、Riakは必要に応じて次のハッシュツリー生成を開始します。ただしデフォルトでは同時に生成するハッシュツリーは2つまでです。
一度ハッシュツリーが作られると、Riakへ送られるwriteに従って最新の状態に保たれます。しかしK/Vデータとハッシュツリー間の乖離を防ぐために、ツリーは定期的に期限が切れて無効となり、再生成されます。ツリーの再生成はbit不良のような見えにくいデータ破損も防ぎます。デフォルトでツリーは1週間で期限が切れて再生成されます。
今まで述べた内容(およびその他の項目)は app.config
にて設定できます。AAEに関する設定項目は riak_kv
セクションにあり、どのようなオプションが選択可能かについてのコメントがついています。
AAEの動作状況を知るのに、Riakは riak-admin aae-status
コマンドを提供します。AAEのステータス出力は、エクスチェンジ、エントロピーツリー、そして修復した鍵の3項目に分かれます。
================================== Exchanges ==================================
Index Last (ago) All (ago)
-------------------------------------------------------------------------------
0 3.8 min 4.1 min
91343852333181432387730302044767688728495783936 3.3 min 7.8 min
182687704666362864775460604089535377456991567872 2.8 min 8.3 min
274031556999544297163190906134303066185487351808 2.3 min 6.3 min
365375409332725729550921208179070754913983135744 1.8 min 5.5 min
<snip>
エクスチェンジの項目では、各K/Vパーティション間のAAEによる情報の交換についての情報を示しています。 Last
の列は、パーティションとそのsiblingレプリカのどれかの間で、いつ最も新しい情報の交換が行われたかについて示しています。 All
の列では、パーティションがすべてのsiblingレプリカとやり取りを終えてからどれだけ経っているかについて示しています。簡単にいえば、All
の列はそれぞれのパーティションがどれだけ古くなっているかについての時間の上限を示しています。具体的には、パーティションの中のデータについて、そのデータのすべてのレプリカが無効になっていない限り、 All
で示された値よりも古いデータでは失われたり不整合が起こっていたりすることはないということです。
================================ Entropy Trees ================================
Index Built (ago)
-------------------------------------------------------------------------------
0 22.1 min
91343852333181432387730302044767688728495783936 22.6 min
182687704666362864775460604089535377456991567872 22.3 min
274031556999544297163190906134303066185487351808 22.9 min
365375409332725729550921208179070754913983135744 22.3 min
<snip>
エントロピーツリーの項目では、パーティション毎に、いつハッシュツリーが作られたかを示しています。AAEの情報の交換に参加する前に、各パーティションにはハッシュツリーが作られなければなりません。前述の通り、これらのツリーは作成後(デフォルトでは)1週間で無効となり再作成されます。
================================ Keys Repaired ================================
Index Last Mean Max
-------------------------------------------------------------------------------
0 0 0 0
91343852333181432387730302044767688728495783936 87 21 87
182687704666362864775460604089535377456991567872 0 0 0
274031556999544297163190906134303066185487351808 0 0 0
365375409332725729550921208179070754913983135744 0 0 0
<snip>
修復した鍵の項目では、AEによって成された修復についての情報を示しています。これには最新の情報の交換で修復された鍵の数、またすべての情報の交換でなされた修復についての平均値と最大値が含まれています。
注: すべてのAAEの状態情報はメモリ中にあり、ノードの再起動でリセットされます。ツリーの作成情報のみが永続的に残ります。これはツリー自身が永続的だからです。
AAEに関する注意事項:
-
ツリーは情報の交換が起こる前に作成されていなければなりません。ツリーはデフォルトでは1時間に1度作られるため、すべてのツリーが作られるまでには1.3について最初の起動またはアップグレードが起こってから 「
ring_size / number_of_nodes
時間」かかります。そしてこの時間がAAEがすべてのデータを保護するまでにかかる時間となります。 -
一般にツリーの作成にはCPU一つを可能ならば100%使用しますが、Riakの性能には最小限の影響で済みます。BitcaskをK/Vデータに使う際、ツリーの作成中は
list_keys
,list_buckets
, および Riak EEの fullsync 複製戦略にかかる遅延時間が増える可能性があります。一度ツリーができれば、1週間後にツリーが無効になり再作成されるまで、これらの問題は起こることはありません。 -
データの不整合や損失のない正常なクラスタでも、AAEでは時々少量(1つか2つ)の鍵を修復することがあります。これはあるノードに対しての書き込みが発生している際に、AAEがその同じノードに同時に情報の交換をする際に起こります。例えば、ある書き込みがノードAに到達済みでノードBへ向かっている途中にAAEが実行されると、ノードAへの書き込みは見えてもノードBに対するものは見えないため、強制的に修復を行います。AAEは読み込み修復のための読み込みしか要求しませんから、この振る舞いは全く安全です。
-
AAEはRiak K/Vの機能であり、Riak Searchのデータは保護しません。
- RiakKV - MapReduce Sink Backpressure, supported by RiakPipe - Sink Type FSM
MapReduce には Riak Pipe によりステージ間バックプレッシャーが導入されました。Riak 1.3 より前は sink まではバックプレッシャーは適用されませんでした。PB/HTTP エンドポイントは pipe の出力レートをすべて捌けると仮定されていたためです。Riak 1.3 では、 sink までバックプレッシャーを拡張し、エンドポイントでも処理あふれがなくなりました。バックプレッシャーは sink バッファのソフト上限と、ワーカによる上限チェック間隔にてチューニング可能です。これらは Riak コンソールから application 環境変数を設定するか、app.config ファイルの riak_kv セクションで設定できます (以下、デフォルトを示します):
{riak_kv,
...
%% Soft cap on the MapReduce sink's buffer,
%% expressed as a positive integer number of messages
%% (one message is used per MapReduce result)
%% MapReduce sink バッファのソフト上限。
%% メッセージ数を正整数で設定します。
%% (MapReduce 結果ひとつがメッセージひとつに対応します)
{mrc_sink_buffer, 1000},
%% Period at which a MapReduce worker must check
%% the sink's buffer cap, expressed as an integer
%% number of messages to send before waiting on
%% an clear-to-send acknowledgement
%% 0 = wait for acknowledgement of each message
%% 1 = wait every other message
%% 'infinity' = never wait for acknowledgements
%% MapReduce ワーカが sink のバッファ上限をチェックする間隔。
%% 送信可能確認応答を待つまでのメッセージ数を整数で指定します。
%% 0 = すべてのメッセージに対して確認応答をまちます
%% 1 = メッセージひとつおきに確認応答を待ちます
%% ‘infinity’ = 確認応答を待ちません
{mrc_sink_sync_period, 10}
}.
Riak Handoff と Protocol Buffers インターフェイスは IPv6 アドレスで待受可能になりました(HTTP インターフェイスはすでに IPv6 をサポートしています)。アドレスの指定は "::1"
(localhost を表します) のような文字列形式でも、{0,0,0,0,0,0,0,1}
(同じく localhost を表します) のような 8-タプルによる 16 バイトアドレスの指定でも可能です。IPv4 アドレスもどちらの形式でも表せます(ただし後者の形式は 4-タプルで 4 バイトです)。 注意: Riak ノード名には適用されません。クラスタメンバー管理の IPv6 サポートについては、 inet_dist_*
設定を参照ください。 Erlang documentation
Riak 1.2 リリースで廃止予定とされた luke application は、このリリースで取り除かれました。
riak stop
にバグ(修正されたバグ一覧に入っています)があり、修正の際に Riak 自身の PID 取得方法を変更しました。バグを修正しているとき、Riakで提供されていないスクリプトに頼りたくないシステム管理者にとっては、getpidはとても便利に思えたためです。 riak getpid
ではその名の通り実行中の Riak の PID を返すようにしました。失敗時には終了コード 1 で終了します。これは小さな機能ですが ps
や、 grep
, awk
を使う時間を節約してくれるでしょう。
Riaknostic が Riak パッケージに含まれるようになり、利用しやすくなりました。1.3 より前のバージョンでは、ユーザは riaknostic を別途ダウンロードする必要がありましたが、1.3 では riak-admin diag
がすぐに使えます。
SmartOS 1.6 に加え、1.8 向けのパッケージが利用できるようになりました。
Riak 1.3 で新規導入されました。Riak Core はヘルスチェックサブシステムを含むようになり、ノードを特定の条件で監視し、その条件に依ってサービスを無効化あるいは有効化します。
ヘルスチェックを有効化するには app.config
の riak_core
セクションに新しい設定を追加してください:
%% Health Checks
%% If disabled, health checks registered by an application will
%% be ignored. NOTE: this option cannot be changed at runtime.
%% To re-enable, the setting must be changed and the node restarted.
%% ヘルスチェック
%% 無効の場合、application が追加したヘルスチェックは無視されます。
%% 注意: このオプションは実行中に変更できません。
%% 有効化するには設定を変えた後にノード再起動が必要です。
{enable_health_checks, true},
Riak は KV vnode のメッセージキュー長をモニターするヘルスチェックを登録します。kv ヘルスチェックを設定するには app.config
の riak_kv
セクションに新しい設定を追加します:
%% This option configures the riak_kv health check that monitors
%% message queue lengths of riak_kv vnodes. The value is a 2-tuple,
%% {EnableThreshold, DisableThreshold}. If a riak_kv_vnode's message
%% queue length reaches DisableThreshold the riak_kv service is disabled
%% on this node. The service will not be re-enabled until the message queue
%% length drops below EnableThreshold.
%% このオプションで riak_kv vnode のメッセージキュー長のヘルスチェックを
%% 設定します。値は 2-タプルで {有効化しきい値、無効化しきい値}です。
%% riak_kv vnode のメッセージキュー長が無効化しきい値に達すると riak_kv
%% サービスが無効化されます。有効化しきい値より下に値が下がるまでは
%% サービスは再度有効化されません。
{vnode_mailbox_limit, {1, 5000}}
注意: kv ヘルスチェックは Riak Search や Riak Pipe vnode には適用されません。
HTTP インターフェイスを通じて、バケットプロパティをデフォルト設定へリセット出来るようになりました。バケットプロパティは、クラスタ内のゴシッププロトコルにより、 Riak のリング構造体として保存されます。すでに使われていないバケットのプロパティのリセットや、デフォルト設定で使われているバケットのリセットによりゴシップで転送されるデータを削減できます。
Riak 1.3 では syslog へのログ出力をサポートします。有効にするには riak の app.config で lager の下にある handlers
セクションへ次のような設定を追加します:
{lager_syslog_backend, ["riak", daemon, info]}
この設定では、info レベル以上のすべてのメッセージを、 daemon ファシリティへ向けて、 ‘riak’ アイデンティティでログ出力します。さらなる情報は lager_syslog ドキュメントをご覧ください。
https://github.com/basho/lager_syslog
RHEL/CentOS/Fedora ユーザは、RPM ツールが expect
への依存を追加したため、次のようなメッセージが出た場合には:
$ sudo rpm -i riak-1.3.0rc1-1.el5.x86_64.rpm
error: Failed dependencies:
/usr/bin/expect is needed by riak-1.3.0rc1-1.x86_64
Riak RPM を yum
からインストールすることで依存性を自動解決できます:
$ sudo yum -y install riak-1.3.0rc1-1.el5.x86_64.rpm
Preparing... ########################################### [100%]
1:expect ########################################### [100%]
2:riak ########################################### [100%]
- riak:
ulimit -n
warning message bumped from 1024 to 4096 - riak/192: Permissions not checked on $PIPE_DIR in riak script
- riak/266: Add libstdc++ library to LD_PRELOAD path to find proper symbols in SmartOS
- riak/261: Add 'riak-admin aae_status', plus add AAE options to app.config
- riak/259: remove legacy-mapred-only configs
- riak/253: Properly exit on
/etc/init.d/riak status
command - riak/251:
riak stop
does not behave properly on BSD systems - riak/274: Riak fails to start on a single CPU machine
- riak: Set riak_sysmon's gc_ms_limit default value to zero
- basho_stats/2: update rebar to 2.0.0
- bitcask/42: Disable merges on startup to prevent high disk io with heavy requests
- bitcask/45: remove arbitrary 120-char limit on log_needs_merge messages
- bitcask/46: Support rebar binary in system
- bitcask/49: update rebar to 2.0.0
- bitcask/54: Adds "grace period" to stop just-written files from expiring.
- bitcask/55: Change erlang:now() -> os:timestamp() when it is safe
- bitcask/56: remove -author attributes from source
- bitcask/58: merge process should write CRC to hintfiles
- bitcask/59: Dss timeshift crc
- bitcask/65: Iterator API
- bitcask/66: Fix log spam introduced by branch 'gh62-badrecord-mstate'
- bitcask/67: Add bitcask:is_empty_estimate
- bitcask/70: Clear all Dialyzer warnings
- bitcask/76: Make Bitcask I/O mode configurable: Erlang vs NIF
- bitcask/77: Change default Bitcask I/O mode to Erlang
- cluster_info/11: Remove Luke usage
- cluster_info/8: update rebar to 2.0.0
- ebloom/8: update rebar to 2.0.0
- leveldb/71: convert LRUCache from LRU to simple fifo
- eleveldb/37: raise bits per key from 10 to 16. reduces false positive rate.
- eleveldb/38: updated to rebar 2.0.0
- eleveldb/39: Export iterator/3 so users can iterate over just keys
- eleveldb/40: make bloom2 the default bloom filter
- eleveldb/42: Add Erlang VM reduction count 'bumps' to all NIF calls
- eleveldb/44: Mv thread direct
- eleveldb/45: Jfw return value rodeo
- eleveldb/48: Jdb mv iterate5
- eleveldb/49: Mv unordered close
- eleveldb/50: Address race condition between queue asking for help and a single worker...
- erlang_js/29: update rebar to 2.0
- erlang_js/30: Dss fix ejslog
- lager/53: adding css for edocs; also adding edoc pointer to README
- lager/56: Add support for a custom log truncation size compile time flag
- lager/67: Added CRs to the LFs in lager_console_backend
- lager/68: Direct the console logger output to user
- lager/69: update rebar to 2.0.0
- lager/70: Added lager:start() to the README
- lager/76: Add informtion about loggly backend
- lager/77: Use quickcheck to test for formatting equivalenve with io_lib
- lager_syslog/6: Lager 2.0 support
- lager_syslog/7: Use git:// rather than https:// so hosts don't need curl
- lager_syslog/8: convert_level(?EMERGENCY) -> emergency.
- merge_index/22: update rebar to 2.0.0
- merge_index/25: Change erlang:now() -> os:timestamp() when it is safe
- mochiweb/4: erlang:now() -> os:timestamp
- erlang_protobuffs/26: Issue 25
- erlang_protobuffs/34: Fixed defaults for decodes to handle camelCase feilds.
- erlang_protobuffs/36: Fixed warnings about unused functions and variables
- erlang_protobuffs/38: Performance improvements
- riak_api/10: Add deregistration of services
- riak_api/12: Restore stat mod registration
- riak_api/14: Allow multiple replies to be sent in the middle of a streaming operation.
- riak_api/17: Use riak_api_pb_sup active children count for pb active stat
- riak_api/18: Use folsom's
gauge
type to store the function needed to pbcconnects - riak_api/19: Performance improvements
- riak_control/26: Typo fix (no such function - gen_server:cast/3)
- riak_control/27: Re-export admin_ring:node_ring_details/2 back
- riak_control/37: Convert to Ember.js.
- riak_control/38: update rebar to 2.0.0
- riak_control/40: Deprecate unused resources.
- riak_control/42: Add new Riak Control theme.
- riak_control/44: Do not require secure only cookie.
- riak_control/48: Move formatting functions to riak_control_formatting.
- riak_control/53: style.css file missing from some packages
- riak_core/137: Change node to use claim_v1 when in legacy mode
- riak_core/188: Eunit cleanups
- riak_core/195: Change write_ringfile to create a temporary ring file, check and rename.
- riak_core/220: update rebar to 2.0.0
- riak_core/223: Change ticks from timer to more efficient erlang:send_after
- riak_core/224: erlang:now() -> os:timestamp() in all the places it is safe
- riak_core/225: remove -author attributes from source
- riak_core/230: Remove publish_capabilities race
- riak_core/232: Address high memory use by riak_core_sysmon_handler
- riak_core/235: No open source license specified
- riak_core/236: adding license file, closes #235
- riak_core/240: health check system
- riak_core/246: Vnode shutdown message severity should be info
- riak_core/249: Allow gen_nb_server to use IPv6 addresses.
- riak_core/250: Make vnode check for existing handoff before starting another
- riak_core/251: rewriting revised readme in .md and removing .org version.
- riak_core/254: Export path and stat_name types from riak_core_stat_q
- riak_core/255: upgrade legacy ring only if needed
- riak_core/257: Enable riak_core apps to provide a health_check callback
- riak_core/259: Adjust riak_core_sup child order for cleaner shutdown
- riak_core/261: Fix bug in riak_core_format:human_time + add test
- riak_core/262: Add ability to selectively disable incoming/outgoing handoff
- riak_core/264: Make vnode terminate backend for any exit reason
- riak_core/265: Fix bug in riak_core_util:rpc_every_member_ann
- riak_core/268: Fix riak_core_wm_urlmap
- riak_kv/290: timeout/forward_preflist MapReduce error.
- riak_kv/408: "fitting was gone before startup" errors.
- riak_kv/354: Add PB service deregistration on stop.
- riak_kv/360: Fix eunit failures
- riak_kv/366: Spurious #pipe_log messages in logs as "Unrecognized message"
- riak_kv/367: riak 1.2rc1 - memory backend issue with 2i & $key/$bucket
- riak_kv/379: Resolve 2I timeout error from case clause
- riak_kv/380: Improper match on w_val_unsatisfied error in HTTP
- riak_kv/382: Use regular logging on Travis for now so we can actually read the output
- riak_kv/390: erlang:now() -> os:timestamp() in all the places it is safe
- riak_kv/395: Add retry on eleveldb lock errors during open for up to 1 minute.
- riak_kv/399: 2I backpressure
- riak_kv/401: Quick fix to prevent mapred_test from hanging
- riak_kv/404: Spawn remote vnodes using start_link rather than start.
- riak_kv/405: Randoming kv_put forwardee node
- riak_kv/406: Make riak_client work on non-riak nodes after get/put FSM startup change
- riak_kv/415: Fix stats for r15b02
- riak_kv/419: add knob to disable referer check
- riak_kv/423: Riak KV vnodes can block in certain scenarios when using Bitcask
- riak_kv/424: Change riak_kv_bitcask_backend to use bitcask:is_empty_estimate
- riak_kv/426: Since "Try again" is not relevant to a self-join, make that error explicit
- riak_kv/429: Apply backpressure from the MR sink
- riak_kv/433: Remove Luke usage
- riak_kv/435: remove the unused 'mget' command from riak_kv_vnode
- riak_kv/438: get put stats -> 1.2-perf
- riak_kv/439: Fixing Dialyzer Complaints Near MapReduce Code
- riak_kv/440: Re-instate code from #415 that was lost in later changes
- riak_kv/442: Merge 1.2-perf into master
- riak_kv/447: Add basic health check to Riak KV
- riak_kv/449: Update stats in process
- riak_kv/451: Change AAE hashtree to buffer and batch write to LevelDB
- riak_kv/453: Avoid a badarg in crypto:rand_uniform when N=1
- riak_kv/454: Try to make KV shutdown cleaner
- riak_kv/456: Add AAE status subsystem + finalize AAE for Riak 1.3 release
- riak_kv/457: Correct usage of capabilities API in riak_kv_pb_object.
- riak_kv/458: Make index_hashtree process exit when related vnode exits
- riak_kv/459: Fix health check code to handle dead pids
- riak_kv/460: Fix AAE exchange bug for the N=1 case
- riak_kv/476: Take node liveness into account during contant hash choice for reduce phase - Thanks Gunin Alexander
- riak_kv/478: Improve interaction between AAE and K/V deletion
- riak_kv/482: Randomize the LevelDB write_buffer_size used for AAE
- riak_kv/483: Improve AAE backpressure on K/V vnode write-path
- riak_kv/486: Make AAE default to 'off' when not configured
- riak_pb/15: Maven build
- riak_pb/18: Add proto_cmd to MANIFEST.in
- riak_pb/19: Add OSGi Manifest headers to riak-pb jar file
- riak_pb/25: Java POM changes for OSGI
- riak_pb/26: Fix bug with protobuffs encoding tests
- riak_pb/27: Add protobuf to install_requires.
- riak_pb/29: Pin python package version and bump it.
- riak_pipe/52: update to rebar 2.0.0
- riak_pipe/53: erlang:now() -> os:timestamp()
- riak_pipe/59: "Sink type" that can provide backpressure
- riak_pipe/61: Clean up some dialyzer warnings
- riak_pipe/65: Quickchecking riak_pipe_fitting
- riak_search/116: Add PB service deregistration on stop.
- riak_search/127: update rebar to 2.0.0
- riak_search/128: Fix mis-reporting of fl=ID + sort field on PBC.
- riak_search/129: erlang:now() -> os:timestamp() when it is safe
- riak_search/133: Remove Luke usage
- riak_sysmon/7: update rebar to 2.0.0
- riaknostic/39: Added some reassuring output.
- riaknostic/41: added a first pass at machine-readable output
- riaknostic/50: Export command
- riaknostic/51: Pevm sysctl checks
- riaknostic/52: Update README.md
- webmachine/101: pass method,scheme,http vsn into rewrite
- webmachine/102: Update demo app: rebar deps, ensure inets is running, improve README
- webmachine/106: Store the dispatch_list in ETS, not application:set_env
- webmachine/113: Fix setup/teardown for etag EQC test
- webmachine/56: Strip whitespace from content-type (and others) parsed by webmachine_uti...
- webmachine/65: swap - to _ for app name.
- webmachine/73: Fix for trailing CRLF
- webmachine/75: Exposed get_routes() to the public.
- webmachine/77: Incorrect accept header in some blackberry devices.
- webmachine/81: remove code:clash call
- webmachine/83: update rebar to 2.0.0
- webmachine/86: Bump WMVSN to 1.9.2.
- webmachine/93: change parameterized modules to regular modules
- webmachine/97: Header Rewriting