Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/ReadMe.txt

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1038 - (show annotations) (download)
Thu Sep 19 10:17:47 2013 UTC (10 years, 6 months ago) by okuyamaoo
File MIME type: text/plain
File size: 138238 byte(s)
ReadMeへコメン追加。ListテストによりバグFix
1 ====== 分散Key-Valueストア 「okuyama」=====================================================
2 Javaで実装された、永続化型分散Key-Valueストア「okuyama」を
3 ダウンロード頂きありがとうございます。
4
5 ※起動方法はhttp://thinkit.co.jp/story/2011/02/17/2010をご覧頂くか、
6 本テキストの「■機能説明とサンプルの実行方法」をご覧ください。
7 blog:http://d.hatena.ne.jp/okuyamaoo/
8
9 ・okuyamaに関する執筆記事
10 [Think IT] "分散KVS「okuyama」の全貌"
11 第1回 NOSQLは「知る時代」から「使う時代」へ http://thinkit.co.jp/story/2011/02/03/1990
12 第2回 NOSQLの新顔、分散KVS「okuyama」の機能 http://thinkit.co.jp/story/2011/02/10/2002
13 第3回 分散KVS「okuyama」のインストール http://thinkit.co.jp/story/2011/02/17/2010
14 第4回 分散KVS「okuyama」の活用ノウハウ http://thinkit.co.jp/story/2011/02/24/2026
15
16 [Think IT] "分散KVS「okuyama」実践TIPS"
17 第1回 okuyamaを導入するまでに知っておきたいサーバリソースとの4つの関係 http://thinkit.co.jp/story/2011/10/12/2303
18 第2回 okuyamaを運用するために知っておきたい基本的な操作 http://thinkit.co.jp/story/2011/10/26/2316
19 第3回 okuyamaでのアプリ開発で押さえておきたい機能 http://thinkit.co.jp/story/2011/11/10/2325
20
21
22 ・改修履歴
23 ========================================================================================================
24 [New - 新機能追加、不具合対応]
25 [[リリース Ver 0.9.5 - (2013/09/20)]]
26
27 ■各DataNodeが保存しているKeyの一覧を取得する機能を追加
28 DataNodeが持つ全てのKeyとTagの一覧を取得する機能をUtilClientに追加しました。
29 各DataNodeに接続し、当該機能を実行することでKeyの一覧が改行区切りで標準出力に出力される。
30 利用方法は以下
31 使い方)
32 $ java -classpath ./:./lib/javamail-1.4.1.jar:./okuyama-0.9.5.jar okuyama.imdst.client.UtilClient keylist datanodeip:5553
33 引数説明
34 1)keylist : 命令(固定)
35 2)datanodeip:5553 : Keyを確認したい、DataNodeのIPアドレスとポート番号を"IP:Port番号"のフォーマットで指定
36 ※注意:Tag名及び、List内のデータは出力されない。
37
38 ■List型を追加
39 文字型を要素とする双方向型リストの機能を追加。先頭(左側)及び、末尾(右側)への値の追加が常に一定時間となり、先頭及び、末尾から値を削除しながら取り出すことが出来る
40 この操作もList内の要素数に関係なく常に同じ処理時間=O(1)となる。
41 また、List内の要素番号(Index)指定での任意の位置からの値の取り出しが可能である。この命令の処理時間はリストの要素数に対して線形的に時間コスト=O(n)がかかる。
42 Listの現在の要素数を取得することも可能でありこの命令の時間は要素数に関係なく常に一定=O(1)である。
43 Listの要素数の最大は(2の63乗-1)である
44 以下はOkuyamaClient上のそれぞれのメソッドのインターフェースである。
45
46 ・String[] createListStruct(String listName)
47 ->リスト作成メソッド。ここで指定したList名にて以降のメソッドはListへアクセスする
48
49 ・String[] listLPush(String listName, String pushData)
50 ->指定したリストの先頭(左端)へ値を追加する。
51 listNameへはcreateListStructメソッドにて作成したリスト名を指定
52 pushDataのサイズ上限はokuyamaのValueのMaxサイズである
53
54 ・String[] listRPush(String listName, String pushData)
55 ->指定したリストの末尾(右端)へ値を追加する。
56 listNameへはcreateListStructメソッドにて作成したリスト名を指定
57 pushDataのサイズ上限はokuyamaのValueのMaxサイズである
58
59 ・String[] listIndex(String listName, long index)
60 ->指定したリストの指定した位置から要素を取得する。
61 listNameへはcreateListStructメソッドにて作成したリスト名を指定
62 indexへは取得したい位置を指定。indexは0起算である。要素数<index、リスト作成前の場合結果無しが返る。
63
64 ・String[] listLPop(String listName)
65 ->指定したリストの先頭(左端)から値を取得後、削除を行う。
66 リストは左に1つ詰めらる。
67 本メソッドはokuyama中でアトミックに実行されるため、
68 同一要素が複数のクライアントへ返ることはない。
69 listNameへはcreateListStructメソッドにて作成したリスト名を指定
70 要素がない場合、リスト作成前の場合結果無しが返る。
71
72 ・String[] listRPop(String listName)
73 ->指定したリストの末尾(右端)から値を取得後、削除を行う。
74 リストは右に1つ詰めらる。
75 本メソッドはokuyama中でアトミックに実行されるため、
76 同一要素が複数のクライアントへ返ることはない。
77 listNameへはcreateListStructメソッドにて作成したリスト名を指定
78 要素がない場合、リスト作成前の場合結果無しが返る。
79
80 ・Object[] listLen(String listName)
81 ->指定したリストの要素数を返す。
82 listNameへはcreateListStructメソッドにて作成したリスト名を指定
83 リスト作成前の場合結果無しが返る。
84
85
86 ■リカバリ機能を強化
87 従来リカバリ中にMainMasterNodeが停止するとDataNodeのリカバリ処理が中途半端に終了してしまう問題が報告されました。
88 その問題への対処として、リカバリ途中のDataNodeを判断し再度切り離す機能を追加。また、リカバリが必要なDataNodeを起動する際に
89 起動引数として"-rr true"として起動することで、起動前が障害で停止したことに関係なくリカバリが行わるようになった。
90 例えばMasterNodeを起動する前にDataNodeを起動してしまうと、そのDataNodeはデータリカバリ対象にならなかった。
91 それがこのオプションを指定することで必ずリカバリされる。
92 DataNode起動引数に以下を追加
93
94 引数名 -rr
95 記述:true/false
96 意味:true=かならずリカバリ対象となる/ false=リカバリを自動判断する
97 省略時:false
98 設定例: -rr true
99
100
101 ■MasterNodeがデータ復旧を行わないオプションを追加
102 MasterNodeはMainMasterNodeに昇格した場合、停止中のDataNodeが復旧すると必ずリカバリを行なっていた。
103 本オプションを指定するとMainMasterNodeに昇格した場合もリカバリを行わなくなる。
104 NWが断絶し、スプリットブレインが発生した際に、一時的にMainMasterNodeが2台になりNW復旧時にリカバリを双方のMasterNodeが
105 実行するのを防ぐのに有効である。
106 そのためにはokuyama環境作成時に決めたMainMasterNodeとそのMasterNodeと強いNWで結ばれている、MasterNode以外はこの
107 オプションを指定して起動することで実現できる。
108 MasterNode起動引数に以下を追加
109
110 引数名 -npmmns
111 記述:true/false
112 意味:true=リカバリを行わないMasterNode / false=リカバリを行うMasterNode
113 省略時:false
114 設定例: -npmmns true
115
116
117 ■MasterNodeの孤立チェック機能追加
118 icmpで指定されたアドレスにpingを行い全てに通らない場合は自身をshutdownする。
119 本機能はNW分断等により、MasterNodeと一部のDataNodeが孤立してしまった場合に
120 処理を受け付けなくするための処置を行うことを可能とする。
121 設定方法はMasterNodeの起動時オプションで指定する。
122 MasterNode起動引数に以下を追加
123
124 引数名 -smnca
125 記述:確認アドレス記述。複数個の場合はカンマ(,)区切りで記述
126 意味:記述された全てのアドレスにicmpで到達出来ない場合に自身をshutdownする
127 省略時:チェックを行わない(デフォルト)
128 設定例: -smnca 192.168.1.100,192.168.2.101
129
130
131 ■起動時に指定されて起動オプションを起動ログに出力する機能を追加
132 以下のフォーマットで出力される。
133 ----------------
134 Boot arguments
135 {パラメータ}
136 ----------------
137
138 ■性能向上及び、バグ修正
139
140
141 ========================================================================================================
142 [New - 新機能追加、不具合対応]
143 [[リリース Ver 0.9.4 - (2012/12/05)]]
144 ■okuyamaFuseを追加
145 ※ベータ版のため、予期せぬエラーなどが起こる可能性があります!!
146 テスト時は仮想環境等での利用を推奨します。
147
148 okuyamaFuseディレクトリに追加
149 okuyamaをストレージとして動くファイルシステムです。
150 ファイル、ディレクトリの新規作成、追記、参照、部分追記、部分参照、削除といった一般的な操作に対応しています、
151 また、所有ユーザ、権限にも対応しています。
152 ※シンボリックリンク、a-timeのみの変更は対応していません。
153
154 okuyamaをストレージとして動くためokuyama側の特性を引き継ぎます。
155 そのため、okuyama側をメモリモードで高速なストレージや、
156 ファイルモードで大容量のファイルサーバが作成可能です
157
158 ファイルのデータを1ファイル1Valueとして管理するのではなく、1ファイルをブロックに分解し、
159 okuyama上で管理します。そのため、ランダムリード、ライトなどファイルの一部を操作する処理に
160 性能を発揮します。また、複数の処理からの同時参照にも高い処理性能を発揮します。
161 また、1ファイルの上限も実質存在しないため、テラバイト以上の巨大なファイルも作成可能です。
162 その際もファイルの一部分へのアクセス速度は落ちません。
163
164 その反面、ファイルのシーケンシャルなアクセスではそこまで性能はでません。
165 また、現状ではrmによるファイル削除に時間がかかります。これは1ファイルを構成するブロックである
166 okuyamaのKey-Valueを全てremoveしていることに起因します。
167
168 作者はMySQLのデータファイル置き場やVirtualBoxの仮想イメージ置き場としてテストしています。
169 MySQLのデータ置き場として利用した場合、検索や更新などの処理が混在した場合性能の向上が見られました。
170
171 ストレージの性能や容量はokuyamaに依存するため、okuyama側をスケールアウトすることで
172 okuyamaFuseもスケールアウトします。
173 その際もokuyama側が無停止であるため、okuyamaFuseも停止する必要はありません。
174
175 ファイルシステムを構成する全てのデータ(メタデータ、ファイルのブロックデータ)は全てokuyamaで
176 管理されるため、あるサーバにマウントしファイルを作成すれば同じokuyamaを利用してmountしている
177 okuyamaFuseは全てのデータは同期されています。
178 そのため、mountしているサーバがダウンした際など別サーバでmountを行えばサーバダウン前までの
179 データにアクセスできます。
180 その反面、同一のファイルを複数サーバから更新するとファイルのデータを壊してしまいます。
181
182 詳しい利用方法等はokuyamaFuse/ReadMe-UTF.txtをご覧ください。
183
184
185 ■sendMultiByteValueをJava版のOkuyamaClientに追加
186 一度に複数のKeyとbyte型のValueを登録する機能
187 通信回数の節約になる。ただし一度にokuyamaに大量のデータを送ることになるので、
188 okuyama自体のメモリを枯渇させないように注意する必要がある。
189 引数はMap型となり値はKeyとValueのセットとなる。
190 戻り値はMap型となり値は引数で渡されたKeyとそのKeyの登録結果をBoolean型で格納したMap
191
192 [OkuyamaClientでのメソッド]
193 public Map sendMultiByteValue(Map<String, byte[]> requestData) throws OkuyamaClientException;
194
195
196 ■getTagObjectValues追加
197 Tagを指定してValueを取得する際にそのValueをObject型に復元して返す。
198 getTagValuesのValue取得部分をgetObjectValueとしたバージョンである
199 そのため、紐付くValueが全てsetObjectValueで登録した値でないといけない
200 指定したTag内にsetObjectValueで登録した値以外が含まれるとエラーとなる
201
202 [OkuyamaClientでのメソッド]
203 public Map getTagObjectValues(String tagStr) throws OkuyamaClientException;
204
205
206 ■MasterNoed.propertiesのMyNodeInfoを設定していなくても、自身のHost名を利用して設定を補填するように機能追加
207 正しく各サーバのHost名を設定していないMasterNodeの冗長構成が正しく機能しない可能性があるため、注意が必要である。
208 本機能はMasterNoed.propertiesのMyNodeInfoの設定を省略することで機能する。
209
210 ■Valueがディスクモード時にスナップショットオブジェクトからデータを復元した場合は-s起動オプションで指定した
211 バイト数もしくは12888バイトを超えるデータを取得出来ないバグを修正。このバグが発生した場合は
212 スナップショットオブジェクトを消し、操作記録ログもしくはバックアップで作成したファイルから復元すると
213 完全にデータが復元できる。
214
215
216 ■バックアップ用のスナップショットObjectを出力するかの有無
217 keymapfile配下に出力されるスナップショット機能によるバックアップファイル(1.key.obj等)の出力有無を
218 選択できるように起動引数を追加。okuyama起動時にデータ復元が全く必要ない場合は、この設定を利用することで
219 スナップショットファイルが作成されなくなる。
220
221 引数名 -efsmo
222 記述:true/false
223 意味:true=スナップショットファイルが作成される/ false=作成されない
224 省略時:true
225 設定例: -efsmo false
226
227
228 ■DataNodeを動かすサーバがリカバリ時、DataNode追加時のデータ再配置時に高負荷になる
229 場合に設定する起動パラメータを追加。この設定はデータを出力する側のサーバに設定する。
230 リカバリ時の場合は正常に稼働している側のDataNode。追加時は元から稼働してる側のDataNode
231 [注意!!]本設定を行うと設定前に比べてデータノードのリカバリ、データの再配置処理に余分に時間がかかる
232
233 負荷を掛けたくないことを指定
234 引数名 -lsdn
235 記述:true/false
236 意味:true=負荷を掛けたくないことを指示/ false=負荷を指定をしない
237 省略時:false
238 設定例: -lsdn true
239
240 負荷を掛けたくないことを指定
241 引数名 -lsdnsdc
242 記述:整数
243 意味:一度にリカバリ対象or再配置対象に転送するデータ数
244 本値は-lsdnを指定しない場合50000〜100000が利用される
245 省略時:2000
246 設定例: -lsdnsdc 4000
247
248
249 ■検索Index作成時にダブルバイト文字の1文字の場合作成されない問題を修正
250
251 ■バグフィックスと性能向上を実施
252
253 ========================================================================================================
254 [New - 新機能追加、不具合対応]
255 [[リリース Ver 0.9.3 - (2012/03/10)]]
256 バグ報告をいただいた為、急遽リリースを行います。
257 ■バグ内容
258 1.完全ファイルモード時に、DataNode.propertiesの'KeyManagerJob1.keySize='に大きな値を設定し(1000万など)
259 少ない登録数の場合にバックアップコマンドや、DataNodeのリカバリが失敗する事象
260
261 2.DataNode追加時のデータ移行中のごく短い一定期間の間、getMultiValueで一部のデータを取得出来ない事象
262
263 3.PHP版のOkuyamaClientにvar_dumpの記述があった為、削除
264
265
266 ■追加機能
267
268 ■incrValue及び、decrValueに値の初期化機能を追加
269 incrValue及び、decrValueは存在しないKey-Valueに対して処理を行うと失敗するが、新たに初期化指定を追加
270 初期化指定引数にtrueを渡して実行すると値が存在しない場合、
271 「Key=指定されたKey値:Value=0」
272 というセットで登録をおこなった後に指定された加算、減算を行うようになる。
273
274 追加されたメソッドは以下(PHP版のOkuyamaClient.class.phpも同様)
275 /**
276 * MasterNodeへデータの加算を要求する.<br>
277 *
278 * @param keyStr Key値
279 * @param value 加算値
280 * @param initCalcValue あたいの初期化指定 true=計算対象のKey-Valueがokuyama上に存在しない場合、0の値を作成してから、計算を行う false=存在しない場合は計算失敗
281 * @return Object[] 要素1(処理成否):Boolean true/false,要素2(演算後の結果):Long 数値
282 * @throws OkuyamaClientException
283 */
284 public Object[] incrValue(String keyStr, long value, boolean initCalcValue) throws OkuyamaClientException;
285
286 /**
287 * MasterNodeへデータの減算を要求する.<br>
288 *
289 * @param keyStr Key値
290 * @param value 減算値
291 * @param initCalcValue あたいの初期化指定 true=計算対象のKey-Valueがokuyama上に存在しない場合、0の値を作成してから、計算を行う false=存在しない場合は計算失敗
292 * @return Object[] 要素1(処理成否):Boolean true/false,要素2(演算後の結果):Long 数値
293 * @throws OkuyamaClientException
294 */
295 public Object[] decrValue(String keyStr, long value, boolean initCalcValue) throws OkuyamaClientException;
296
297
298 (例) Java版のOkuyamaClientの場合は以下の構文になる。
299 ----------------------------------------------------------
300 // 存在しない値に加算を実行
301 Object[] incrRet = okuyamaClient.incrValue("NO_DATA_KEY", 10, true); // 第三引数にtrueを指定
302
303 if (incrRet[0].equals("true")) {
304 System.out.println("ResultValue=" + (Long)incrRet[1]);
305 }
306 ----------------------------------------------------------
307
308 ■MasterNodeを追加する機能をUtilClientに追加
309 従来MasterNodeを追加する場合はWebベースのマネージャを起動し、そこから行うしかなかったが、
310 UtilClientに追加する機能を追加
311 使い方)
312 $ java -classpath ./:./lib/javamail-1.4.1.jar:./okuyama-0.9.3.jar okuyama.imdst.client.UtilClient addmasternode masternode:8888 masternode2:8889
313 引数説明
314 1)addmasternode : 追加命令
315 2)masternode:8888 : 追加を依頼するMasterNodeのアドレスとPort番号(フォーマット "アドレス:ポート番号")
316 3)masternode2:8889 : 追加するMasterNodeのアドレスとPort番号(フォーマット "アドレス:ポート番号")
317
318
319
320 ========================================================================================================
321 [New - 新機能追加、不具合対応]
322 [[リリース Ver 0.9.2 - (2012/03/03)]]
323 ■メモリオブジェクトの自動スナップショット機能を追加
324 メモリオブジェクトのスナップショット機能により、今までDataNode復帰時に操作記録ログから復旧していたのに対して、
325 高速に停止前の状態に復元されるようになった。
326
327 メモリオブジェクトのスナップショットは通常25分に一度作成される。作成されたログはDataNodeの標準出力に
328 開始時間と終了時間が表示される。作成される場所及びファイルの名前は、DataNodeの設定ファイルである
329 DataNode.propertiesの以下の設定値の第一設定値の名前に拡張子に「.obj」が付加されて作成される。
330 "KeyManagerJob1.Option="
331 例)
332 "KeyManagerJob1.Option=./keymapfile/1.key,./keymapfile/1.work.key"
333 ※上記の設定の場合はkeymapfileディレクトリ内に「1.key.obj」として作成される。
334
335 また、一度作成され、その後25分が経過した場合は同じファイルに上書きとして作成される。
336 そのため、履歴管理などは行われない。
337 DataNodeのストレージモードとこのメモリオブジェクトにストアされるデータの関係は以下となる
338 1.Key=メモリ、Value=メモリ
339 ->メモリオブジェクトにKeyとValueの両方がストアされる。
340 2.Key=メモリ、Value=ディスク
341 ->メモリオブジェクトにKeyとValueのディスク上の位置がストアされる。
342 3.Key=ディスク、Value=ディスク
343 ->メモリオブジェクトは作成されない
344
345 「1.」、「2.」それぞれのDataNode再起動時のデータ復元の挙動は以下となる。
346 1.メモリオブジェクトが存在した場合はメモリオブジェクトを読み込む。その後、操作記録ログが存在した場合は、
347 操作記録ログからメモリオブジェクト作成開始直前からの操作がトレースされ、DataNode停止直前の完全な状態が
348 復元される。
349 2.メモリオブジェクトが存在した場合はメモリオブジェクトを読み込む。その後、Valueを保存しているディスク上の
350 ファイルの損傷チェックを行い、損傷が発生している場合はそのデータを削除する。そして、操作記録ログが存在
351 した場合は、操作記録ログからメモリオブジェクト作成開始直前からの操作がトレースされ、DataNode停止直前の
352 状態に復元される。
353 メモリオブジェクトは存在するが、Valueを保存しているディスク上のファイルが存在しない、サイズが0である
354 場合などは、操作記録ログに残されているデータのみが復元される。
355
356
357
358 ■完全ファイルモード時にDataNodeを停止後、再起動した際に操作記録ログがなくても
359 停止直前の状態に復元されるように起動時の挙動を変更。
360
361 従来のバージョンでは完全ファイルモード(Key=ディスク、Value=ディスク)で合っても
362 再起動時は操作記録ログから全てのデータを復元するしかデータを前回停止前の状態にす
363 方法はなかった。そのため、大量のデータを保存している場合は起動時に大量の操作記録ログを
364 読み出す必要があり非常に時間がかかってしまう場合があった。
365
366 そこで本機能はDataNode停止時のKey用、Value用のディスク上のファイル群がディスク上に
367 残っていれば、再起動時にそのファイル群を再度利用するように変更し、起動時間の短縮をおこなった。
368 なお、Key用、Value用のディスク上のファイルが損傷している場合は可能な範囲で修復され、
369 そもそもディスク上にデータがが残されていない場合は従来取り、操作記録ログから復元するプロセスとなる。
370
371 ※本機能により、完全ファイルモード時はローテーション済みの操作記録ログ(1.work.key1など最後に数値のついたファイル)を
372 残す必要はなくなるが、定期的にバックアップをUtilClientによって取得することで保全性を高めることが出来る。
373 利用方法は特に意識する必要なく、本機能は有効となる。
374
375
376
377 ■ディスクキャッシュ機能を追加
378 本機能はValueをディスクに保存している場合のみ有効となる。
379
380 okuyamaはValueの場所をディスクにした場合は、一定までのサイズのValueを全て1つの
381 ファイルで集中的に管理している。
382
383 ここに保存している1Valueのデータはブロックデータと呼ばれる。
384 getなどの取得処理の場合は、このファイル上をシークしブロックデータを取り出している。
385 SSDのようなシーク処理を必要としないディスクの場合は高速に稼働するが、HDDなどの場合は
386 アクセスが集中しかつ、ValueのファイルがOSのバッファサイズを超えるようになると、
387 アクセス速度が低速化する。
388
389 そこで本機能では、一度読みだしたブロックデータをHDDよりもランダムリードが高速な
390 デバイスに一時的にキャッシュすることでget処理を高速化するものである。
391
392 一時的にキャッシュされるValueはレコード数で指定可能である。Defaultは1DataNode当たり、
393 10000件となる。キャッシュに利用するディスクサイズの算出は、ブロックデータのサイズを
394 利用して計算することが可能であり。そのブロックサイズはDefaultでは12888byteとなる。
395 そのため、利用されるディスクサイズは、以下の計算式で求める
396 --------------------------------------------------------------------
397 [12888byte × 10000件 = 128880000byte]
398 --------------------------------------------------------------------
399 このブロックサイズはDataNodeの起動引数である「-s]を利用して「-s 8192」のように変更が可能である。
400
401 キャッシュの有効化及び、キャシュファイルの作成場所指定は、DataNode.propertiesの「KeyManagerJob*.cacheFilePath=」
402 要素を指定し、ファイルパスを記述することで有効化される。利用しない場合はこの要素そのものを消すか、ファイル指定を
403 消すことで無効化かされる。
404 --------------------------------------------------------------------
405 [DataNode.propertiesでの設定例]
406 例) "KeyManagerJob1.cacheFilePath=/usbdisk/cachedata/cache1.data"
407 --------------------------------------------------------------------
408 キャッシュされるValueの件数はDataNodeの起動引数である「-mdcs」を利用して「-mdcs 50000」のように
409 キャッシュしたい件数を指定して変更可能である。デフォルトは前述の通り、10000件
410
411 利用中にUSBフラッシュメモリが壊れた場合は、キャッシュの利用が停止されるだけとなり、DataNodeの停止は
412 発生しない。壊れた場合は、USBをサーバから引き抜き、新しいUSBディスクを故障前と同じ名前でマウントすれば、
413 自動的に再認識され、利用される。その際DataNodeの停止は伴わない。
414
415
416
417 ■Java&PHPのOkuyamaClientにObjectの新規登録を保証するsetNewObjectValueメソッドを追加
418 setNewValueはValueにString型しか対応していなかったが、ValueをObjectとするバージョンを追加。
419 利用方法はsetNewValueと同様
420 利用例)※Java版
421 ------------------------------------------------------
422 OkuyamaClient client = new OkuyamaClient();
423 client.connect("127.0.0.1", 8888);
424
425 Map objectValue = new HashMap();
426 objectValue.put("Key_XXX", "Value_XXX");
427 objectValue.put("Key_YYY", "Value_YYY");
428 objectValue.put("Key_ZZZ", "Value_ZZZ");
429
430 String[] setResult = client.setNewObjectValue("Object_Key", objectValue); // 新規登録
431
432 if (setResult[0].equals("true")) { // 登録を確認
433 System.out.println("登録成功");
434 } else {
435 System.out.println("登録失敗 Message=[" + setResult[1] + "]");
436 }
437 ------------------------------------------------------
438
439
440
441 ■UtilClientを利用したバックアップ機能でのokuyamaの負荷軽減機能を追加
442 UtilClientを利用したバックアップを行った場合okuyama側はリソースの限界まで利用して
443 バックアップ作成をおこなっていたが、バックアップの指定引き数をあたえることで、低速で徐々にバックアップを
444 作成する機能を追加。これによりバックアップ作成時にokuyama側がbusyにならないようにすることが可能
445 従来から2つ引き数を追加
446 第4引き数:クライアントがなんだかの理由でアボートした場合にokuyama側がそれを検知する時間(ミリ秒)
447 第5引き数:okuyama側データを出力する際に一定量排出した後にここで指定したミリ秒だけ停止する。大きくすると負荷は下がるが時間がかかる
448
449 利用方法)
450 java -classpath ./:./okuyama-0.9.2.jar:./lib/javamail-1.4.1.jar okuyama.imdst.client.UtilClient bkup 127.0.0.1 5553 10 20 > bkupFor5553.dump
451
452
453
454 ■起動パラメータを以下の通り追加
455 DataNode用の起動パラメータ
456 -crcm 記述:true/false
457 説明:MasterNodeとDataNode間の処理に失敗した場合に強制的に1度だけ再処理を行うようにするかの設定
458 Networkが不安定な場合や遅い場合はtrueにするとよいことがある
459 true/再接続する, false/再接続は自動
460 デフィルトはfalse
461 設定例: -crcm true
462
463 -dcmuc 記述:整数(利用回数)
464 説明:MasterNodeとDataNode間のSockeの最大再利用回数 (整数) 少ない値にすると接続コストがかかる
465 デフィルトは50000
466 設定例: -dcmuc 10000
467
468 -smbsmf 記述:整数(格納数)
469 説明:SerializeMapのBucketサイズのJVMへのメモリ割当1MB単位への格納係数(整数)
470 デフィルトは400(レスポンスを向上したい場合は小さな値にすると良いが、メモリ当たりの格納数は減る)
471 設定例: -smbsmf 200
472
473 -red 記述:true/false
474 説明:完全ファイルモード時に既に存在するデータを再利用する設定
475 デフィルトはtrue。
476 falseにすることで停止前のデータを全て削除してトランザクションログからの起動を選択する
477 設定例: -red false
478
479 -wfsrf 記述:true/false
480 説明:DataNode起動時に操作記録ログ(トランザクションログ)を読み込む設定
481 trueの場合は読み込む(デフォルト)
482 falseの場合は読みこまない.この場合はデータは常に0件からの起動になる
483 設定例: -wfsrf false
484
485 -udt 記述:1/2
486 説明:データファイルを保存するディスクのタイプを指定することで、ディスクへのアクセスが最適化される
487 1=HDD(デフォルト) 2=SSD
488 設定例: -udt 2
489
490 -mdcs 記述:整数(格納数)
491 説明:ディスクキャッシュ利用時に、どれだけの件数をキャッシュに乗せるかを件数で指定する
492 「■ディスクキャッシュ機能を追加」も参照
493 デフォルトでは10000件
494 設定例: -mdcs 50000
495
496
497
498 ■PHP版のOkuyamaClient.class.phpで未実装だった以下のメソッドを実装。挙動はJava版と同様である
499 1.getTagValues
500 2.getMultiTagValues
501 3.getMultiTagKeys
502
503 ※以下のメソッドは未実装
504 getTagKeysResult
505 getMultiTagKeysResult
506
507
508 ■Linux用のサービス化スクリプトを試験的に作成。install/配下に
509 MasterNode用[okuyamaMasterNodeServiceScript]
510 DataNode用[okuyamaDataNodeServiceScript]
511 として配置
512
513
514 ■有効期限を30日以上に設定出来ないバグを修正
515 ■ノード追加に伴うデータ移行中にTagデータを新規登録すると、正しく取得出来ないバグを修正
516 ■DataNodeのリカバリー処理、ノード追加時のデータ再配置処理の堅牢性を向上
517 ■getMultiValuesメソッドで特定の条件下で応答が返ってこないバグを修正
518 ■いくつかの性能向上
519
520 ========================================================================================================
521 [New - 新機能追加、不具合対応]
522 [[リリース Ver 0.9.1 - (2011/12/19)]]
523
524 ・PHP版のOkuyamaClientの不具合対応
525 ・Key、Value、Tagの登録前サイズチェック周りの修正
526 登録可能なKeyおよび、Tagのバイト長を320byteに固定
527 PhpTestSock.phpにテストコードを追加
528 テスト名はsize-trueとsize-falseとなる
529 ・OkuyamaClient.class.phpの前回バージョンの71行目の構文が不要なため削除
530 ・OkuyamaClient.class.phpの前回バージョンの113行目unset済み変数への参照の構文を修正
531 isset関数に置き換え
532
533
534 ・Java用のOkuyamaClientをプーリングするコネクションプールを追加
535 本機能を利用すると接続処理、接続済みOkuyamaClientのプール、クローズ処理の管理を行うことが出来る
536 接続済みのコネクションを即利用可能なため、接続処理のコスト削減、接続処理の共通化を行うことが可能
537 該当クラスは以下
538 ・okuyama.imdst.client.OkuyamaClientFactory
539 (利用方法)
540 -------------------------------------------------------------------------------------------------------
541 // MasterNodeの接続情報を作成して、OkuyamaClientFactory.getFactoryに渡すことでコネクションプールを取得
542 // ここで取得されるインスタンスはシングルトンとなり全てのスレッドで唯一となる
543 // スレッド毎に新しいFactoryを利用したい場合はgetNewFactoryメソッドを利用する
544 String[] masterNodes = {"192.168.1.1:8888","192.168.1.2:8888"};
545 OkuyamaClientFactory factory = OkuyamaClientFactory.getFactory(masterNodes, 20);
546
547 // プールからClientを取得
548 OkuyamaClient okuyamaClient = factory.getClient();
549
550 // 以降は通常のOkuyamaClientの利用方法と同様
551 String[] getResult = okuyamaClient.getValue("Key-XXXX");
552 if (getResult[0].equals("true")) {
553 System.out.println(getResult[1]);
554 }
555
556 // close()を呼び出すことでコネクションプールに返却される
557 okuyamaClient.close();
558
559 // アプリケーションそのものを終了する際は以下でFactoryを終了させて全てのコネクションを破棄する
560 // 終了後も再度getFactoryを呼び出せば新たにfactoryが再生成される
561 factory.shutdown();
562 -------------------------------------------------------------------------------------------------------
563
564
565 ・UtilClientにadddatanodeを追加
566 DataNodeを追加する際に従来はWebの管理画面からしか追加できなかったが、
567 UtilClientから追加する機能を追加
568 ※本機能によるokuyamaのサーバ側の変更は必要ありません。
569 使い方)
570 $ java -classpath ./:./lib/javamail-1.4.1.jar:./okuyama-0.9.1.jar okuyama.imdst.client.UtilClient adddatanode masternode:8888 datanode02:5555 slavedatanode:02:6555 thirddatanode:7555
571 引数説明
572 1)adddatanode : 追加命令
573 2)masternode:8888 : 追加を依頼するMasterNodeのアドレスとPort番号
574 3)datanode02:5555 : 追加を依頼するDataNodeのアドレスとPort番号(MasterNode.propertiesのKeyMapNodesInfoの設定に該当)
575 4)slavedatanode:6555 : 追加を依頼するDataNodeのアドレスとPort番号(MasterNode.propertiesのSubKeyMapNodesInfoの設定に該当。設定を行っていない場合は省略)
576 5)thirddatanode:7555 : 追加を依頼するDataNodeのアドレスとPort番号(MasterNode.propertiesのThirdKeyMapNodesInfoの設定に該当。設定を行っていない場合は省略)
577
578
579 ・DataNodeの完全ディスクモードの性能を向上
580 ファイルへの書き出しにメモリでのバッファリング領域を設けそちらへの書き出しが完了した時点でユーザ処理を
581 完了とすることで応答速度向上。実際の書き出し処理は別スレッドで順次行われる。
582
583
584 ・MasterNodeのIsolation機能(パーティション機能)利用時にgetTagKeysResult、getMultiTagKeysResultで発生する
585 不具合に対応
586
587
588 ・起動パラメータを以下の通り追加
589 DataNode用の起動パラメータ
590 -vidf 記述:true/false
591 説明:有効期限切れのデータのクリーニングを行うかどうかの設定 true=行う false=行わない
592 有効期限付きのデータを登録しない場合はfalseにすることでクリーニングデータのチェックで
593 発生する負荷を減らすことが出来る
594 true=リーニングを行う、false=リーニングを行わない
595 デフィルトはValueがメモリの場合はtrue、Valueがディスクの場合はfalse
596 ※trueを指定するとファイルをストレージに使っている場合も実行される
597 設定例: -vidf false
598
599 -svic 記述:整数(分/単位)
600 説明:有効期限切れのデータのクリーニングを行う時間間隔。短い間隔を指定すると、クリーニングデータのチェックが
601 頻繁に発生するため負荷がかかる。大きすぎる値を指定すると有効期限切れのデータがいつまでもアクセス
602 不可の状態で保持されるためストレージ領域を無駄にしてしまいます。
603 デフィルトは30分
604 設定例: -svic 60
605
606 -csf 記述:true/false
607 説明:保存データの合計サイズを計算するかどうかの指定
608 保存容量を計算する必要がない場合はfalseにすることで登録・削除時の負荷を軽減できる。
609 保存容量とはMasterNodeのKeyNodeWatchHelper.logなどで出力されている、"Save Data Size"項目などに当たります。
610 true=計算する、false=計算しない
611 デフィルトはtrue
612 設定例: -csf false
613
614 -rdvp 記述:true/false
615 説明:Key、Value共にディスクを利用した際にValueの更新時に更新前のデータファイル上のValueの場所を再利用して
616 再保存するかの設定。
617 再利用する場合は登録済みValueの再保存を行うと更新前のディスク上の場所を利用するため、更新によるディスク使用量の
618 増加はありません。しかしディスクへのアクセスは既存のValueの位置へディスクをシークしてから保存を行うためディスクへの
619 負荷が高くなります。
620 再利用しない場合は既存のValueであっても常に最新のValueをディスクの最後尾に書き足すため、ディスクへのアクセスは
621 シーケンシャル(一方向)なアクセスになりディスク負荷は少なくなります。しかし既存のValueへの更新であっても
622 ディスク使用量が増加します。
623 デフィルトはtrue
624 設定例: -rdvp false
625
626 -dwmqs 記述:整数(バッファリング件数/単位)
627 説明:DataNodeの完全ディスクモード時にメモリのバッファリング空間の蓄積できる件数。最大値は20億。
628 最大ここで設定した件数分のKey長+10byte分のメモリ容量を利用するため、大きな値にする場合は注意が
629 必要となる。Defaultの値は7000。
630 設定例: -dwmqs 15000
631
632
633 ・DataNode.propertiesのDataSaveTransactionFileEveryCommit=false時の不具合を対応
634
635 ========================================================================================================
636 [New - 新機能追加、不具合対応]
637 [[リリース Ver 0.9.0 - (2011/10/21)]]
638 ■Hadoop対応
639 !!! [注意] 本機能はベータ機能である !!!
640 Hadoopの持つFormatインターフェースを利用してMapReduce内でokuyamaに登録されているデータを取り出して
641 利用できるようにしました。
642 詳しくはhadoopディレクトリ配下のReadMe.txtを参照してください。
643
644
645 ■OkuyamaClientへのgetMultiTagKeysメソッドの追加
646 複数のTagを指定して、該当するKeyのみ取得可能なメソッドを追加しました。
647 Keyのみ取得できるので、クライアント側のメモリ利用量の削減が可能です。
648 またgetMultiTagValuesに比べて高速に応答を返します。
649 [OkuyamaClientでのメソッド]
650 public String[] getMultiTagKeys(String[] tagList) throws OkuyamaClientException;
651 public String[] getMultiTagKeys(String[] tagList, boolean margeType) throws OkuyamaClientException;
652 public String[] getMultiTagKeys(String[] tagList, boolean margeType, boolean noExistsData) throws OkuyamaClientException;
653
654
655 ■OkuyamaClientへのgetTagKeysResultメソッドの追加
656 本メソッドの挙動はgetTagKeysと同様にTagを指定することで、紐付く全てのKeyを取得する。しかし、getTagKeysが
657 一度にString型の配列で紐付く全てのKey値を返してくるのに対して、本メソッドはokuyama.imdst.client.OkuyamaResultSetを
658 返却してくる。OkuyamaResultSetはjava.sql.ResultSetのように順次データを取り出せるようになっており、
659 従来のgetTagKeysでは扱えないような大量のKey値を処理する場合に利用する。
660 以下の実装例はTagに紐付く全てのKeyとValueを出力している例である。
661 例) "Tag1"に紐付く全てのKeyとValueを出力
662 ----------------------------------------------------------------------
663 OkuyamaResultSet resultSet = client.getTagKeysResult("Tag1"); // OkuyamaResultSetインターフェースで結果を受け取る
664
665 while(resultSet.next()) { // カーソルを移動しながら値の有無を確認 trueを返して来た場合は終端ではない、falseは終端
666 System.out.println("Key=" + (Object)resultSet.getKey()); // getKeyメソッドにて現在のカーソル位置のKey値を取得
667 System.out.println("Value=" + (Object)resultSet.getValue()); // getValueメソッドにて現在のカーソル位置のValue値を取得
668 }
669 resultSet.close();
670 ----------------------------------------------------------------------
671 なお、getTagKeysResultは取得するKeyとValueに対してフィルタリングを設定することが可能である。
672 フィルタリングは
673 1.数値でのKeyとValueに対しての範囲指定
674 2.正規表現でのKeyとValueに対しての一致指定
675 3.ユーザ実行クラスによる独自フィルタリング(フィルタリングクラスは、okuyama.imdst.client.UserDataFilterインターフェースを実装する)
676 が可能である。
677 [OkuyamaClientでのメソッド]
678 public OkuyamaResultSet getTagKeysResult(String tagStr) throws OkuyamaClientException;
679 public OkuyamaResultSet getTagKeysResult(String tagStr, String encoding) throws OkuyamaClientException;
680 public OkuyamaResultSet getTagKeysResult(String tagStr, String matchPattern, int cehckType) throws OkuyamaClientException;
681 public OkuyamaResultSet getTagKeysResult(String tagStr, String matchPattern, int cehckType, String encoding) throws OkuyamaClientException;
682 public OkuyamaResultSet getTagKeysResult(String tagStr, double[] targetRange, int cehckType) throws OkuyamaClientException;
683 public OkuyamaResultSet getTagKeysResult(String tagStr, double[] targetRange, int cehckType, String encoding) throws OkuyamaClientException;
684 public OkuyamaResultSet getTagKeysResult(String tagStr, UserDataFilter filter) throws OkuyamaClientException;
685 public OkuyamaResultSet getTagKeysResult(String tagStr, UserDataFilter filter, String encoding) throws OkuyamaClientException;
686 ※!!注意!! 1.PHPのクライアントは未対応
687 2.本メソッドを利用するためには、okuyamaのMasterNode、DataNode共に、Version-0.9.0以上である必要がある
688 3.OkuyamaResultSetの詳しい利用方法は、JavaDocのokuyama.imdst.client.OkuyamaResultSetの部分を参照してください
689
690
691 ■OkuyamaClientへのgetMultiTagKeysResultメソッドの追加
692 本メソッドの挙動はgetMultiTagKeysと同様に複数Tagを指定することで、紐付く全てのKeyを取得することが可能であるが、
693 getTagKeysResultと同様に、okuyama.imdst.client.OkuyamaResultSetからデータを取り出すことが可能であるため、大量の
694 データ取得に利用する。getTagKeysResultと違い、値のフィルタリングをすることは出来ない。
695 [OkuyamaClientでのメソッド]
696 public OkuyamaResultSet getMultiTagKeysResult(String[] tagList) throws OkuyamaClientException;
697 public OkuyamaResultSet getMultiTagKeysResult(String[] tagList, boolean margeType) throws OkuyamaClientException;
698 ※!!注意!! 1.PHPのクライアントは未対応
699 2.本メソッドを利用するためには、okuyamaのMasterNode、DataNode共に、Version-0.9.0以上である必要がある
700 3.OkuyamaResultSetの詳しい利用方法は、JavaDocのokuyama.imdst.client.OkuyamaResultSetの部分を参照してください
701
702
703 ■PHP版のOkuyamaClient.class.phpで未実装だった以下のメソッドを実装。挙動はJava版と同様である
704 1.getMultiValue
705 2.removeSearchIndex
706 3.getValueAndUpdateExpireTime
707 4.setValueとsetNewValueへの有効期限(ExpireTime)対応
708 5.setObjectValue
709 6.getObjectValue
710 7.getObjectValueAndUpdateExpireTime
711 8.getOkuyamaVersion
712
713 ※以下のメソッドは未実装
714 getTagValues
715 getMultiTagValues
716 getMultiTagKeys
717 getTagKeysResult
718 getMultiTagKeysResult
719
720
721 ■OkuyamaQueueClientの実装
722 !!! [注意] 本機能はベータ機能である !!!
723 okuyamaをキューとして利用できる専用のJavaクライアントを追加
724 クライアント名:okuyama.imdst.client.OkuyamaQueueClient
725 キューとして利用する場合もokuyamaのサーバ側は特に設定は必要なく、通常と同じように起動するだけで良い。
726 OkuyamaQueueClientの利用手順は
727 1.MasterNodeへ接続
728 2.createQueueSpaceメソッドで任意の名前でQueue領域を作成(既に作成済みのQueue領域を利用する場合は作成不要)
729 3.putメソッドにてデータを登録、もしくはtakeメソッドにて取り出し
730 4.利用終了後closeを呼び出す
731 となる。詳しくはJavaDocのokuyama.imdst.client.OkuyamaQueueClientの部分を参照してください。
732
733
734 ■OkuyamaClientへのgetObjectValueAndUpdateExpireTimeメソッドの追加
735 getValueAndUpdateExpireTimeのObject版になる。取得と同時に有効期限が設定されている場合は設定した有効期限
736 秒数だけ有効期限が延長される。Webでのsessionオブジェクトなどの、アクセスする度に有効期限を延ばしたい
737 値に利用すると便利である。
738 [OkuyamaClientでのメソッド]
739 public Object[] getObjectValueAndUpdateExpireTime(String keyStr) throws OkuyamaClientException;
740 ※PHP版のクライアントも対応済み。
741
742
743 ■いくつかの処理性能向上と不具合の修正
744
745
746 ========================================================================================================
747 [New - 新機能追加、不具合対応]
748 [[リリース Ver 0.8.9 - (2011/08/31)]]
749
750 ■OkuyamaClientにsetObjectValueとgetObjectValueメソッドを追加
751 JavaでクラスでSerializableをimplementsしているクラスのオブジェクトをそのまま登録、
752 取得出来るメソッドを追加
753 メソッドは以下
754 ・Setメソッド
755 boolean setObjectValue(String keyStr, Object objValue)
756 boolean setObjectValue(String keyStr, String[] tagStrs, Object objValue)
757 boolean setObjectValue(String keyStr, Object objValue, Integer expireTime)
758 boolean setObjectValue(String keyStr, String[] tagStrs, Object objValue, Integer expireTime)
759 返却値のbooleanはtrueの場合は登録成功、falseの場合は登録失敗
760
761 ・Getメソッド
762 Object[] getObjectValue(String keyStr)
763 返却値のObject配列の要素は
764 Object[0] = 要素1 データ有無(String型) : "true"=データ有 or "false"=データ無
765 Object[1] = 要素2 取得データ(Object型) : データ有無が"false"の場合のみエラーメッセージ文字列(String型固定))それ以外は、登録したObject
766
767
768 ■トランザクションログ(WALログ)のディスクへのfsyncの頻度を調整可能に
769 トランザクションログのディスクへのfsyncは従来OS任せだったが、頻度を調整可能に変更
770 ImdstDefine.transactionLogFsyncTypeの値を変更するか、DataNodeの起動引数に"tlft"付加し係数を
771 指定することで変更可能。係数の説明は以下
772 0=OS任せ
773 1=fsync頻度小
774 2=fsync頻度中
775 3=fsync頻度高
776 4=トランザクションログ書き込み毎にfsync(データへの変更毎に)
777
778 DataNode起動例)
779 java -cp ./classes;./lib/log4j-1.2.14.jar;./lib/javamail-1.4.1.jar;./lib/commons-codec-1.4.jar -Xmx128m -Xms128m okuyama.base.JavaMain /Main.properties /DataNode.properties -tlft 4
780
781 ■memcachedでいうところのflush_allに対応
782 UtilClientによりデータの全削除を行うことができたが、これをmemcachedクライアントのflush_allへ紐付け
783 memcahcedクライアントが接続しているMasterNodeの担当するIsolationのデータを全削除できる。
784 Isolationを持っていないMasterNodeの場合は失敗する
785
786
787 ■Dataファイルへのアクセスを効率化。
788 既存データのUpdateに対する効率化を実施
789
790
791 ■いくつかの処理性能向上と不具合の修正
792 ・内部コード見直しによる処理速度向上
793 ・memcachedモードでMasterNodeを起動した場合にdeleteメソッドで特定のクライアントがkey以外にパラメータを
794 転送してくるため、その際エラーになっていたため修正
795 ・ノード動的追加時にMainMasterNode以外でMasterNodeで発生するデータが取得出来ない不具合に対応
796 ・全文検索時に、Isolation利用したMasterNodeに対して、2文字などの短い文字列で検索Indexを作成した場合に
797 検索対象にならない不具合に対応
798
799
800 ========================================================================================================
801 [New - 新機能追加、不具合対応]
802 [[リリース Ver 0.8.8 - (2011/07/3)]]
803
804 ■ストレージ機能にSerializeMapを追加
805 データ格納時にメモリ空間を有効利用するSerializeMapという機能を追加。
806 データを格納するMapに登録するKeyとValueを(デ)シリアライザ外部から自由に指定できるように機能追加
807 詳しくは以下のBlogを参照
808 http://d.hatena.ne.jp/okuyamaoo/20110616
809 http://d.hatena.ne.jp/okuyamaoo/20110623
810
811 設定はDataNode.propertiesに以下の項目が追加された
812 "DataSaveMapType"
813 "SerializerClassName"
814
815 "DataSaveMapType"はSerializeMapの利用を指定
816 "SerializerClassName"は(デ)シリアライザのクラスを指定
817 SerializerClassNameで指定するクラスはokuyama.imdst.util.serializemap.ISerializerをインプリメンツする
818 設定なしは、ConcurrentHashMapを利用する。DefaultはConcurrentHashMap
819
820 設定方法)
821 DataSaveMapType=serialize
822 SerializerClassName=okuyama.imdst.util.serializemap.ObjectStreamSerializer
823 ObjectStreamSerializerは現在実装済みの(デ)シリアライザクラス。リリース物に同梱。
824 ※上記でSerializeMapを内部で利用
825
826 DataSaveMapType=
827 SerializerClassName=
828 ※上記で通常のConcurrentHashMapを内部で利用
829
830
831
832 ■okuyamaクライアントからも有効期限を設定可能に
833 OkuyamaClientのsetValue及び、setNewValueにexpireTimeを渡すことで有効期限(単位は秒)を設定可能
834 上限時間は、Integerの限界値
835 例)
836 okuyamaClient.setValue("Key_XXX", "Value_YYY", new Integer(300));
837 上記の場合有効期限は300秒
838
839
840 ■データ取得と同時にそのデータに設定されている有効期限を登録時に設定した期限分延長するメソッドを
841 okuyamaクライアントに追加。
842 メソッド名はgetValueAndUpdateExpireTime
843 ※有効期限が設定させていないデータは何も起こらない
844 例)
845 okuyamaClient.setValue("Key_XXX", "Value_YYY", new Integer(300));
846 String[] getResult = okuyamaClient.getValueAndUpdateExpireTime("Key_XXX");
847 ※上記のsetValue時に設定された300秒という有効期限が、getValueAndUpdateExpireTime呼び出し時に再度300秒で
848 自動的に延長される。
849
850
851 ■複数Tagを指定して紐付くKeyとValueを取得する機能を追加
852 okuyamaクライアントでは、getMultiTagValues
853
854 取得方法を複数のTagが全てに紐付いているANDと、どれかにだけ紐付くORを指定できる。
855 返却される形式はMapとなり、KeyとValueのセットになる。
856 そのため、複数のTagに紐付いているKeyは束ねられる。
857 例)
858 String[] getTags = {"Tag1","Tag2","Tag3"};
859 Map retAndMap = okuyamaClient.getMultiTagValues(getTags, true) //<=AND指定
860 Map retOrMap = okuyamaClient.getMultiTagValues(getTags, false) //<=OR指定
861
862
863 ■データ一括削除機能を追加
864 Isolation単位もしくは全てのデータを一括で削除する機能をokuyama.imdst.client.UtilClientに追加
865 利用方法は以下
866 利用方法)
867 java -classpath ./:./classes okuyama.imdst.client.UtilClient truncatedata 192.168.1.1 8888 all
868 第1引数 = 'truncatedata' <=固定
869 第2引数 = '192.168.1.1' <=MainMasterNodeのIPアドレス
870 第3引数 = '8888' <=MainMasterNodeの起動ポート番号
871 第4引数 = 'all' <=全ての削除を指定する'all'もしくは削除するIsolationPrefix名
872
873
874 ■現在のMasterNodeを指定してそのMasterNodeが現在どのような設定情報で稼働しているかを取得する機能をUtilClientに追加
875 利用方法)
876 java -classpath ./:./classes okuyama.imdst.client.UtilClient masterconfig 192.168.1.1 8888
877 第1引数 = 'masterconfig' <=固定
878 第2引数 = '192.168.1.1' <=MainMasterNodeのIPアドレス
879 第3引数 = '8888' <=MainMasterNodeの起動ポート番号
880 ※出力例)
881 998,true,MainMasterNode=[true]- MyInfo=[127.0.0.1:8888]- MainMasterNodeInfo=[127.0.0.1:8888]- AllMasterNodeInfo=[127.0.0.1:8888 127.0.0.1:8889 127.0.0.1:11211]-
882 CheckMasterNodeTargetInfo=[]- Algorithm [0]:mod [1]:consistenthash=[1]- AllDataNodeInfo=[{third=[localhost:7553 localhost:7554] sub=[localhost:6553 localhost:6554]
883 main=[localhost:5553 localhost:5554]}]
884
885
886 ■いくつかの処理性能向上と不具合の修正
887 1.Key-Valueの両方もしくはどちらかをメモリに展開する場合にデータを登録し続けるとメモリを使いすぎる現象を改善。
888 2.MasterNodeの不正な呼び出し番号(プロトコルの先頭)を渡した場合に応答がなくなってしまう問題を解決
889
890 ========================================================================================================
891 [New - 新機能追加、不具合対応]
892 [[リリース Ver 0.8.8 - (2011/07/3)]]
893
894 ■okuyamaクライアントからも有効期限を設定可能に
895 OkuyamaClientのsetValue及び、setNewValueにexpireTimeを渡すことで有効期限(単位は秒)を設定可能
896 上限時間は、Integerの限界値
897 例)
898 okuyamaClient.setValue("Key_XXX", "Value_YYY", new Integer(300));
899 上記の場合有効期限は300秒
900
901
902 ■データ取得と同時にそのデータに設定されている有効期限を登録時に設定した期限分延長するメソッドを
903 okuyamaクライアントに追加。メソッド名はgetValueAndUpdateExpireTime
904 ※有効期限が設定させていないデータは何も起こらない
905 例)
906 okuyamaClient.setValue("Key_XXX", "Value_YYY", new Integer(300));
907 String[] getResult = okuyamaClient.getValueAndUpdateExpireTime("Key_XXX");
908 ※上記のsetValue時に設定された300秒という有効期限が、getValueAndUpdateExpireTime呼び出し時に再度300秒で
909 自動的に延長される。
910
911 ■ストレージ機能にSerializeMapを追加
912 データ格納時にメモリ空間を有効利用するSerializeMapという機能を追加。
913 アクセスレスポンスは低下するがメモリ上に格納できるデータ量は向上する。
914 詳しくは以下のBlogを参照
915 http://d.hatena.ne.jp/okuyamaoo/20110616
916 http://d.hatena.ne.jp/okuyamaoo/20110623
917
918 設定はDataNode.propertiesに以下の項目が追加された
919 "DataSaveMapType"
920
921 設定なしは、ConcurrentHashMapを利用する。DefaultはConcurrentHashMap
922
923 設定方法)
924 DataSaveMapType=serialize
925 ※上記でSerializeMapを内部で利用
926
927 DataSaveMapType=
928 ※上記で通常のConcurrentHashMapを内部で利用
929
930 ■いくつかの処理性能向上と不具合の修正
931
932 ========================================================================================================
933 [New - リリースファイル不備]
934 [[リリース Ver 0.8.7.2 - (2011/05/12)]]
935 ■リリース物に空のkeymapfileディレクトリを同梱し忘れたため、追加
936 antで実行した場合などにエラーになるため。
937
938 ■installディレクトリ内のbinディレクトリに配置されている起動スクリプトのokuyama内の記述が誤っているために修正
939 修正内容はクラスパスを通しているokuyamaのjarファイルが、okuyama-0.8.6.jarになっていたため、これを
940 okuyama-0.8.7.jarに変更
941
942 ========================================================================================================
943 [New - 新機能追加、不具合対応]
944 [[リリース Ver 0.8.7 - (2011/04/20)]]
945
946 ・改修履歴
947 ■メモリへのデータ保存時に圧縮を行う
948 この設定はDataNode.propertiesの"dataMemory=true"の場合のみ有効
949 true=圧縮、false=非圧縮
950 圧縮を行えばCPU資源を利用するため圧縮効果が望めないデータを保存する場合はfalseが有効
951 設定しない場合のデフォルトはtrue
952 SaveDataCompressTypeは圧縮指定 1 or 9のどちらかを指定
953 1=高速で低圧縮
954 9=低速で高圧縮
955 設定しない場合のデフォルトは1
956
957 DataNode.propertiesでの設定は、以下の項目
958 SaveDataCompress=true
959 SaveDataCompressType=1
960
961
962 ■データトランザクションログファイル遅延書き込み機能
963 この設定はDataNode.propertiesの"memoryMode=false"の場合のみ有効
964 !!falseに設定した場合は常に書き込まれないため、不意の障害時にデータをロストする可能性が上がる!!
965 設定値は"true"遅延しない(常に書き込み)
966 設定値は"false"遅延する
967 設定しない場合のデフォルトはtrue
968 この設定は本設定ファイル上で定義されているDataNode全てに反映される
969
970 DataNode.propertiesでの設定は、以下の項目
971 DataSaveTransactionFileEveryCommit=true
972
973
974 ■共有データファイルへの変更書き込みのタイミング設定 ###
975 この設定は"dataMemory=false"の場合のみ有効
976 trueにした場合は共有データファイルへの変更(ディスク書き込み)を即時ディスクに反映するのではなく別スレッドで随時行う
977 書き込みが行われるまでメモリ上に保持されるのでメモリを消費する。その最大書き込みプール数(データ数)を設定するのが、
978 ShareDataFileMaxDelayCount(数値を指定する)であるここで設定した数値の最大12888倍のバイト数分メモリを消費する
979 最大遅延保持数は999999(この数だけ蓄積する前にメモリが足りなくなる場合もある)
980 設定しない場合のデフォルトはfalse
981
982 DataNode.propertiesでの設定は、以下の項目
983 ShareDataFileWriteDelayFlg=true
984 ShareDataFileMaxDelayCount=
985
986
987 ■ServerControllerにコマンドの種類追加
988 サーバコントロールコマンドを追加
989
990 追加した機能は以下
991 "-help" : 全コマンド一覧出力
992 "netdebug" : debug出力を現在のコンソールに出力する。改行送信で停止
993 "fullgc" : gc指示
994
995
996 ■仮想メモリの効率化
997 仮想メモリの1ブロック当たりのサイズを複数の種類にして、保存されるサイズに合わせて使い分けるように変更
998
999
1000 ■Valueをメモリに保存する場合に設定したサイズ以上のValueを仮想メモリ空間に保存する機能を追加
1001 大きなValue値をメモリに保持したくない場合に有効
1002 DataNode.propertiesの以下の設定値(SaveDataMemoryStoreLimitSize)
1003 デフォルトは"0"無効(サイズ制限なしにメモリに保持する)
1004
1005 DataNode.propertiesでの設定は、以下の項目
1006 SaveDataMemoryStoreLimitSize=0
1007
1008 ※設定するサイズはバイト値
1009 例)以下の場合は128KB以上
1010 SaveDataMemoryStoreLimitSize=131072
1011
1012
1013 ■データバックアップ機能を追加
1014 okuyama.imdst.client.UtilClientを作成し、実行時点でのDataNodeのデータをバックアップできるように機能追加
1015 この機能で作成したファイルをDataNode.propertiesのKeyManagerJob1.Option=の2個目の引数のファイルとして
1016 DataNodeを起動するとデータが復元される
1017 使い方)
1018 java -classpath ./:./classes okuyama.imdst.client.UtilClient bkup 127.0.0.1 5554 > bkupFor5554.dump
1019
1020
1021 ■Key値に紐付くTagを削除するメソッドを追加
1022 Key値とTag値の両方を指定することでKey値からTagの紐付きを削除する
1023
1024 OkuyamaClientではremoveTagFromKey(Key, Tag)メソッド
1025
1026
1027 ■転置インデックス作成機能と全文検索機能を追加(検索Indexの全削除も含む)
1028 !!! 本機能はベータ機能である !!!
1029 転置インデックスはN-gram方式とし、OkuyamaClientのsetValueAndCreateIndexでインデックス作成
1030 (ユニグラム、バイグラム、ヒストグラム方式。もしくはIndexの長さを指定)
1031 全文検索はOkuyamaClientのsearchValueを利用する。一度に複数の検索Wordを渡してAND検索とOR検索を指定できる。
1032 登録時に作成するIndexにPrefixを付加することが出来る。
1033 これにより、同じIndexを登録するデータ単位で別のものとして扱うことが出来る。
1034 検索時にPrefixを指定することで、同様のPrefixを指定してIndexを作成したデータのみ取得可能となる
1035 ※Index作成、検索時両方とも文字コードはUTF-8のみ対応
1036
1037 OkuyamaClientでは以下のメソッドで操作する
1038 ・Index作成 複数の引数違いのメソッドが存在するので、OkuyamaClientのJavaDocを参照してください。(ant javadoc で作成可能)
1039 setValueAndCreateIndex
1040
1041 ・Index検索メソッド 複数の引数違いのメソッドが存在するので、OkuyamaClientのJavaDocを参照してください。(ant javadoc で作成可能)
1042 searchValue
1043
1044 ・作成したIndexのみ削除
1045 removeSearchIndex 複数の引数違いのメソッドが存在するので、OkuyamaClientのJavaDocを参照してください。(ant javadoc で作成可能)
1046
1047
1048 ■いくつかの処理性能向上と不具合の修正
1049
1050
1051 ========================================================================================================
1052 [New - 新機能追加、不具合対応]
1053 [[リリース Ver 0.8.6 - (2011/02/11)]]
1054 ■複数Value一括取得機能を追加(memcachedのgetに複数のKey値を並べるのと同等)
1055 複数の取得したいKeyを配列で渡すことでまとめてValueを取得可能。返却される値はKeyとValueのMapで返される
1056 同様のKeyを複数指定した場合は束ねて返される。
1057 OkuyamaClientでは<Map>getMultiValue(String[])メソッドになる。
1058 memcachedプロトコルではgetの後にkey値を並べる
1059 !!注意!!:PHPクライアントは未対応。
1060
1061
1062 ■Tagを指定するとそれに紐付くValueを同時に返却する機能を追加
1063 Tagを指定することで従来はKeyの配列を取得可能だったが、KeyとValueのMapを取得する機能を追加。
1064 Tagを指定する意外は、<Map>getMultiValue(String[])と同様の挙動となる。
1065 OkuyamaClientでは、<Map>getTagValues(String tag)メソッドになる。
1066 !!注意!!:PHPクライアントは未対応。
1067
1068
1069 ■Tagを登録、更新する際の処理性能を向上
1070
1071
1072 ■値の演算機能を追加。演算できる種類はインクリメント、デクリメントであ(memcachedのincr、decr、append相当)
1073 =>インクリメント処理
1074 =>OkuyamaClientではincrValue(String key, long val)
1075 =>memcachedプロトコルではincr
1076
1077 =>デクリメント処理
1078 =>OkuyamaClientではdecrValue(String key, long val)
1079 =>memcachedプロトコルではdecr
1080
1081 !!注意!!:PHPクライアントは未対応。
1082
1083
1084 ■ServerControllerにコマンドの種類追加
1085 1.1. サーバコントロールコマンドを追加
1086 追加した機能は以下
1087 "cname" : okuyamaのDNS機能を設定する => DataNodeの設定上の名前と実際の名前のMappingを変えることが出来る
1088 >datanode001=datanodeserver01
1089 上記のように指定すると、okuyamaは"datanode001"という名前のDataNode設定を"datanodeserver01"と読み変えてアクセスする
1090 ※関係を変更したい場合は再度実行すれば上書きされる
1091
1092 "rname" : okuyamaのDNSMappingを削除する
1093 rname改行後、現在の設定名を入力
1094 >datanode001
1095
1096 "jobs" : 時間別の総アクセス数を返す
1097 >jobs
1098
1099 "allsize" : すべてのIsolation別の保存データサイズを返す
1100 単位はバイトになる
1101 >allsize
1102
1103 "size" : Isolation名を指定することで個別のサイズを返す
1104 >size
1105 >IsolationPrefix
1106
1107
1108 ■レプリケーション登録未確認機能追加
1109 DataNodeのレプリケーション先を設定している場合に、レプリケーションのデータを転送後、データノードで登録が正しく完了しているかを確認
1110 せずにクラインとには成功として返す。
1111 レプリケーション先の書き込み速度に依存しないので、書き込み処理が高速化される反面、ノードダウン時にデータ整合性が失われる可能性が高い。
1112 MasterNode.propertiesの以下の項目を変更する
1113 --------------------------------
1114 #書き込み完了確認をしない
1115 KeyMapDelayWrite=true
1116
1117 #書き込み完了確認をする
1118 KeyMapDelayWrite=false
1119  --------------------------------
1120
1121
1122 ■いくつかの処理性能向上と不具合の修正
1123
1124 ========================================================================================================
1125 [New - 新機能追加、不具合対応]
1126 [[リリース Ver 0.8.5 - (2011/01/18)]]
1127 ■MasterNode単位でのIsolation機能を追加
1128 Isolation機能とはokuyamaのマルチテナント化を実現する機能である。
1129 今までのokuyamaは保存するKeyはすべてのDataNode内でユニークな値であった(レプリケーションは除く)
1130 そのため、DataNodeを複数のアプリケーションや、複数のユーザが利用する場合は、Key値にプレフィックスを
1131 付加するなど工夫が必要であった。
1132 本機能は、DataNodeを共有して、独立したデータ空間を作成する機能となる。
1133 独立単位は、MasterNodeの設定で指定する。
1134 MasterNode.propertiesの"IsolationMode"と"IsolationPrefix"を利用する。
1135 以下の設定をMasterNode.propertiesに設定し、起動すると同様の設定をして
1136 起動したMasterNodeは値を共有できるが、設定をしていないMasterNodeからは取得出来なくなる。
1137 ------------ MasterNode.properties --------------------
1138 IsolationMode=true
1139 IsolationPrefix=XC45G
1140 -------------------------------------------------------
1141
1142 IsolationMode=falseを指定すると、共有的な領域にアクセスすることになる。ただし、別のMasterNodeが
1143 指定しているIsolation空間にはアクセスできない。
1144
1145
1146 ■有効期限切れデータ自動削除
1147 memcachedクライアントによってexpire Timeを指定され、有効期限が切れたデータを自動的に削除する機能を追加
1148 実行される前提条件は"ImdstDefine.java"の"vacuumInvalidDataFlg"変数が"true"で(デフォルト"true")
1149 Key、Value両方がメモリの場合のみ実行される。
1150 ●DataNode.propertiesの設定が以下の場合のみである
1151 -------------- DataNode.properties --------------
1152 KeyManagerJob1.memoryMode=true
1153 KeyManagerJob1.dataMemory=true
1154 KeyManagerJob1.keyMemory=true
1155
1156 or
1157
1158 -------------- DataNode.properties --------------
1159 KeyManagerJob1.memoryMode=false
1160 KeyManagerJob1.dataMemory=true
1161 KeyManagerJob1.keyMemory=true
1162
1163 or
1164
1165 -------------- DataNode.properties --------------
1166 KeyManagerJob1.memoryMode=false
1167 KeyManagerJob1.dataMemory=true
1168 KeyManagerJob1.keyMemory=true
1169
1170 ※有効期限切れ自動パージは30分に1回実行され、かつチェック時に有効期限を5分切れているデータが物理削除対象
1171
1172
1173 ■保存データサイズ(DataNodeが保存しているサイズ)を取得する機能を追加
1174 DataNodeが保存している値の合計バイトサイズを取得できる機能を追加
1175 1.1. DataNodeに接続
1176 "60,all"と送信:そのDataNodeが保有する全値の合計サイズが取得できる
1177 "60,"#" + Isolationの5文字Prefix"と送信:Isolation単位で取得できる
1178 ※試験的に実装しているため、DataNodeに直接接続する必要がある
1179
1180
1181 ■デバッグオプションを追加。通信ログを標準出力に出力するように機能追加
1182 DataNdoe、MasterNode共にすべての通信内容を標準出力にダンプする機能を追加
1183 1.1. 起動方法
1184 DataNode、MasterNodeともに起動時の第3引数に"-debug"を付加して起動すると、標準出力に通信内容が出力される
1185 例)DataNode
1186 java -cp ./classes;./lib/log4j-1.2.14.jar;./lib/javamail-1.4.1.jar;./lib/commons-codec-1.4.jar -Xmx128m -Xms128m okuyama.base.JavaMain /Main.properties /DataNode.properties -debug
1187 例)MasterNode
1188 java -cp ./classes;./lib/log4j-1.2.14.jar;./lib/javamail-1.4.1.jar;./lib/commons-codec-1.4.jar -Xmx256m -Xms128m okuyama.base.JavaMain /Main.properties /MasterNode.properties -debug
1189
1190 ※性能は落ちるので注意
1191
1192
1193 ■ServerControllerにコマンドの種類追加
1194 1.1. サーバコントロールコマンドを追加
1195 従来はMasterNode.propertiesおよび、MasterNode.propertiesの"ServerControllerHelper.Init="で
1196 定義されているポートに接続すると即Shutdownだったが、変更し種類を追加
1197
1198 追加した機能は以下
1199 "shutdown" : サーバ停止
1200 "debug" : デバッグオプションtrueに動的に変更
1201 "nodebug" : デバッグオプションfalseに動的に変更
1202
1203
1204 ■データ全削除機能を追加
1205 1.1. データ削除機能として、Isolation単位および、全体を一度に消す機能を追加
1206 DataNodeの通常ポート(添付の設定ファイルでは5553や5554)に接続
1207 ・"61,#all"と送信:DataNodeのすべてが消える
1208 ・"61,"#"+IoslationPrefix文字列"と送信:DataNodeからIsolation単位で消える
1209
1210 ※一度消したデータは復旧できないので注意が必要
1211 ※試験的に実装しているため、DataNodeに直接接続する必要がある
1212
1213 ■Tagデータに関係する不具合修正
1214
1215
1216 ========================================================================================================
1217 [New - 新機能追加、不具合対応]
1218 [[リリース Ver 0.8.4 - (2010/12/16)]]
1219 ■データ有効期限を設定できる機能を追加
1220 memcachedでいうところのexpireTimeを設定可能に
1221 現在この設定はmemcachedクライアントからのみ設定可能である。
1222 つまりokuyamaのクライアントから登録した値の有効期限は無期限となる
1223 これによりmemcachedクライアントの登録時のすべてのOptionカラムの値が使用可能となった。
1224
1225 ■排他的更新機能を追加
1226 memcachedでいうところのgets、cas操作に対応
1227 okuyama専用クライアントではそれぞれ以下のメソッドになります
1228
1229 >gets => getValueVersionCheck
1230 >cas => setValueVersionCheck
1231
1232 ■メモリを使用してデータを保持するストレージモードのうち
1233 Keyをメモリ及び、Valueをメモリのどちらかのモードで稼動した際に
1234 あらかじめ設定したメモリ使用量を超えた場合に、自動的にディスクにストアするように改修
1235 =>OutOfMemory発生の予防により、より安定して稼動するように変更。
1236 DataNode.propertiesの以下の項目で許容メモリ使用量の上限を指定
1237
1238 >KeyManagerJob1.memoryLimitSize=85 <-使用上限のパーセント
1239 >KeyManagerJob1.virtualStoreDirs=./keymapfile/virtualdata1/ <-ストアするファイルディレクトリ指定
1240
1241
1242 ■Valueをディスクに保持するモード時のディスク使用率を効率化
1243 =>従来はValueをディスクに保持する場合は固定長として保存していたため、
1244 ValueのMaxサイズ以内の値を固定長でデータファイルに保存されていたい、
1245 そのためValueのMaxサイズを大きく設定した場合は、小さいなデータであっても
1246 デイスクを無駄に消費していた。
1247 この部分を最適化し、Maxサイズとは別に良く使用するサイズを設定できるように変更
1248 こちらの値を最適な値にしておくと、ディスク使用率の効率化とレスポンスの向上が狙える。
1249
1250 >okuyama.imdst.util.ImdstDefineのdataFileWriteMaxSize変数の値(単位はバイト)を変更して再コンパイル
1251
1252 ■完全ディスクモード時にディスクへの書く込み処理を非同期に変更
1253 =>非同期書き込みによりデータ登録、削除性能が向上
1254 =>書き込み完了まではメモリ領域を使用することで整合性を確保
1255
1256 ■サーバ間のデータ復旧処理のバグを修正
1257 =>データ復旧対象のデータ数が多い場合(数百万件以上など)に、OutOfMemoryが発生するバグを修正
1258
1259 ■ネットワーク越しに停止できるように変更
1260 =>従来は起動プロセスをkillコマンド等で停止するしかなかったが、あらかじめ設定したポートにアクセスすることで
1261 停止するように機能追加
1262 MasterNode.properties、DataNode.propertiesの以下の部分でポートを指定する
1263
1264 >ServerControllerHelper.Init=15553
1265
1266 ■Linux環境用のインストール用パッケージ同梱
1267 =>簡単に起動できるスクリプトを同梱
1268 =>リリース物のinstallディレクトリ配下にある、ReadMe.txtを参照
1269
1270 ■幾つかのバグ修正と処理の効率化
1271
1272 ========================================================================================================
1273 ========================================================================================================
1274 [New - 新ストレージモードを追加、package構成変更、TagからKeyを取得する際に存在しないkeyか返さないOption引数を追加、Tag登録時のロックアルゴリズムを見直し、不具合対応]
1275 [[リリース Ver 0.8.3 - (2010/11/5)]]
1276 ■ストレージモードに完全ディスクモードを追加
1277 このモードを使用することで、少ないメモリのサーバでもディスクの上限までデータを管理することができる。
1278 DataNode.propertiesに新たにパラメータが追加された
1279
1280 DataNode.propertiesファイル内
1281 ---------------------------------------
1282 KeyManagerJob1.dataMemory=false
1283 KeyManagerJob1.keyMemory=false
1284 KeyManagerJob1.keyStoreDirs=./keymapfile/THdata1/,./keymapfile/THdata2/
1285 ----------------------------------------
1286
1287 ※上記の状態で完全ディスクモードになる
1288 keyStoreDirsは保存するディレクトリになる。場所指定はカンマ区切りで定義する。
1289 指定ディレクトリをそれぞれ別々のディスクにするとレスポンスが向上する。
1290
1291
1292 ■パッケージ構造は大幅に変更
1293 前回まで使用していたパッケージ名は既にURLが別の方が取得済みでしたので、変更。
1294 従来のパッケージ構造から
1295 okuyama.imdst
1296 okuyama.base
1297 に変更
1298 申し訳ありませんが、この変更によりImdstKeyValueClientのimport文の変更が必要になります。
1299 以下となります
1300 import okuyama.imdst.client.ImdstKeyValueClient
1301
1302
1303 ■TagからKeyを取得する際にすでに削除されたKey値を返さないOption引数を追加
1304 ImdstKeyValueClientのgetTagKeysメソッドの第2引数にfalseを指定する
1305
1306 使用例)
1307 imdstKeyValueClient.getTagKeys("Tag", false);
1308
1309 ※PHPクライアントも同様です。
1310
1311
1312 ■Tag登録時のロックアルゴリズムを見直し
1313 Tag登録時のロックアルゴリズムを見直したことにより複数クライアントからの同時Tag登録のレスポンスを向上
1314
1315 ■不具合対応
1316 いくつかのバグを修正
1317
1318 ========================================================================================================
1319 [New -リリース不具合、antタスク作成]
1320 [[リリース Ver 0.8.2 - (2010/09/22)]]
1321 ■Version-0.8.1にてlibフォルダにmemcached.jarを配置せずにリリースしてしまいました。
1322 正しくlibフォルダにmemcached.jarを配置。
1323 これによる影響は、testフォルダのテストプログラムです。
1324
1325
1326 ■antタスクを作成
1327 antタスクにて、compile、jarファイル作成、サーバ起動、テストコマンド実行等が実行できるように作成
1328 いかがantコマンドへの引数とそれぞれの実行内容となる。
1329 引数 | 内容
1330 ------------------------------------------------------------------------------------------------
1331 compile | コンパイルを実行
1332 jar | okuyamaのjarファイルを作成
1333 |
1334 datanode | DataNodeServer起動
1335 slavedatanode | SlaveDataNodeServer起動
1336 thirddatanode | ThirdDataNodeServer起動
1337 masternode | MasterNodeServer起動
1338 masternodelock | MasterNodeServerをロック使用可能な状態で起動
1339 slavemasternode | SlaveMasterNodeServer起動
1340 memcachedmasternode | MemcachedプロトコルMasterNodeServer起動
1341 transactionnode | 分散ロック管理NodeServer起動
1342 webmgr | Web管理コンソール用Webサーバ起動(ポート10088番)
1343 |
1344 serverrun | datanode、slavedatanode、thirddatanode、masternode実行(本実行を行うとokuyamaの稼動テストは可能です)
1345 serverrun-slave | datanode、slavedatanode、thirddatanode、masternode、slavemasternode実行(MasterNodeを冗長化構成で起動します)
1346 serverrun-memcached | datanode、slavedatanode、thirddatanode、masternode、memcachedmasternode実行(MasterNodeをMemcachedプロトコル用のMasterNodeで冗長化構成にします)
1347 serverrun-transaction | datanode、slavedatanode、thirddatanode、masternodelock、transactionnode実行(トランザクション管理ノードも起動し分散ロックを使用可能な状態にします)
1348 serverrun-webmgr | datanode、slavedatanode、thirddatanode、masternode、webmgr実行(Web管理画面も合わせて起動します)
1349 |
1350 testset | setコマンドを1000回実行する
1351 set | 任意のKeyとValueを登録(ant set -Dkey=key123 -Dvalue=value123)
1352 testget | getコマンドを1000回実行する(testsetで登録されたデータを取得する)
1353 get | 任意のKeyでValueを取得(ant get -Dkey=key123)
1354 testsettag | Tagをセットするコマンドを500回実行する
1355 testgettag | TagからKeyとValueをGetするコマンドをtestsettagで登録したTagの種類全てに実行する(tag1、tag2、tag3、tag4の4種類)
1356 testremove | removeコマンドをtestsetで登録したKeyのうち500件に実行する
1357 testadd | addコマンドをテストする(Key1=Value1という組み合わせで登録する)
1358 testlock | ロック機構を使用してデータのロック、ロック中の登録、削除、ロック開放を実行する(serverrun-transactionを別コンソールで実行している場合のみ利用可能)
1359
1360 ●例1(2つのコンソールをbuild.xmlと同じ場所で開く)
1361 コンソール1:ant serverrun
1362 コンソール2:ant testset
1363 ant testget
1364 ※上記でコンソール1でokuyamaのサーバ構成を起動し、コンソール2でsetコマンド実行し、完了後getコマンドを実行している。
1365 実際には、コンソール1でokuyamaが起動完了まで環境によるが20秒から30秒ほどかかります。
1366 そのため、30秒ほど経過後、コンソール2でのテスト実行してください。
1367
1368 ●例2(2つのコンソールをbuild.xmlと同じ場所で開く)
1369 コンソール1:ant serverrun-transaction
1370 コンソール2:ant testlock
1371 ※上記でコンソール1でokuyamaのロック使用可能状態でサーバ構成を起動し、コンソール2でLock機能のテストを実行している
1372 実際には、コンソール1でokuyamaが起動完了まで環境によるが20秒から30秒ほどかかります。
1373 そのため、30秒ほど経過後、コンソール2でのテスト実行してください。
1374
1375 ●例3(2つのコンソールをbuild.xmlと同じ場所で開く)
1376 コンソール1:ant serverrun-webmgr
1377 コンソール2:ant testset
1378 ant set -Dkey=key123 -Dvalue=value123
1379 ant testget
1380 ant get -Dkey=key123
1381 ant testsettag
1382 ant testgettag
1383 ant testremove
1384 ※上記でコンソール1でokuyamaのサーバ構成とWeb管理コンソールを起動し、コンソール2でsetコマンド実行し、任意のKey=key123,Value=value123を登録、
1385 完了後getコマンドを実行、完了後任意のKey=key123でValueを取得、完了後Tagを使ってKeyとValueをset、完了後TagでKeyとValueを取得、完了後データを削除している。
1386 実際には、コンソール1でokuyamaが起動完了まで環境によるが20秒から30秒ほどかかります。
1387 そのため、30秒ほど経過後、コンソール2でのテスト実行してください。
1388 一連の動作中同サーバの以下のURLにアクセスするとWeb画面で状況を確認できる
1389 http://実行サーバIP:10088/okuyamamgr
1390
1391
1392 ■SlaveDataNode.propertiesでのDataNode起動ポート番号を6553と6554に変更
1393
1394 ■直下のtestディレクトリ配下のファイルのJavaファイルの文字コードが一部Shift-JisだったためUTF-8に変更(同ディレクトリのclassファイルも修正後コンパイル済み)
1395
1396 ■次回リリース以降、直下の大半のbatファイルや、shファイルはexecutecommandディレクトリに移動します。
1397
1398
1399 ========================================================================================================
1400 ========================================================================================================
1401 [New - 機能改善]
1402 [[リリース Ver 0.8.1 - (2010/09/21)]]
1403 ■トランザクションログファイルを一定サイズで自動的にローテーションするように変更
1404 DataNode.propertiesの"memoryMode=false"としている場合に作成される、トランザクションログファイル
1405 (データ操作履歴ファイル)が従来は永遠に追記されるため、いずれ肥大化し問題になるためサイズが1.8GBに
1406 達した時点で自動的に新しいファイルを作成し旧ファイルはファイル名の末尾に数字を付加しリネームするように
1407 変更。再起動時は末尾の数字が小さいもの(基本的には0から)から取り込んで最後に数字の付かないファイルを
1408 読み込むように変更。
1409
1410
1411
1412 ■JavaScriptでデータ更新も行えるように変更
1413 従来JavaScriptはValueへの値検索や、返却時の加工にしか使えなかったが、新たにJavaScriptでデータノードに実際に
1414 保存されている値も更新出来るように機能拡張。
1415 値を更新するには、JavaScript本文中の変数値"execRet"の値を2にする。
1416 こうすることで最終的にJavaScript本文中の変数値"retValue"の値が実際にデータノードに再保存される。
1417 また、新たに"dataKey"というJavaScript変数が追加され、これにはKey値が格納されてJavaScript内から参照出来るように
1418 なった。
1419 !!注意!!:値を更新する場合はImdstKeyValueClientのgetValueScriptForUpdateメソッドを使用すること。
1420
1421 JavaScript 例) 以下はKey値が"key1"の場合は文字列置換したValue値を更新後、クライアントへValueを返却し、"key1"ではない場合は更新せずに返却している。
1422 "var dataValue; var dataKey; var retValue = dataValue.replace('value', 'dummy'); if(dataKey == 'key1') {var execRet = '2'} else {var execRet = '1'}";
1423
1424 ●以下のテストコードで試せる
1425 java -cp ./;./classes;./lib\mail.jar TestSock 1.1 127.0.0.1 8888 key1 value1
1426 java -cp ./;./classes;./lib\mail.jar TestSock 2.4 127.0.0.1 8888 key1 "var dataValue; var dataKey; var retValue = dataValue.replace('value', 'dummy'); if(dataKey == 'key1') {var execRet = '2'} else {var execRet = '1'}"
1427 java -cp ./;./classes;./lib\mail.jar TestSock 2.1 127.0.0.1 8888 key1
1428 ↑クライアントに返却されるValue値で更新されている
1429
1430 java -cp ./;./classes;./lib\mail.jar TestSock 1.1 127.0.0.1 8888 key2 value2
1431 java -cp ./;./classes;./lib\mail.jar TestSock 2.4 127.0.0.1 8888 key2 "var dataValue; var dataKey; var retValue = dataValue.replace('value', 'dummy'); if(dataKey == 'key1') {var execRet = '2'} else {var execRet = '1'}"
1432 java -cp ./;./classes;./lib\mail.jar TestSock 2.1 127.0.0.1 8888 key2
1433 ↑クライアントに返却されるValue値で更新されていない
1434
1435
1436
1437 ■完全ファイルモード時にデータの一定量をメモリにキャッシュするように機能追加
1438 完全ファイルモード(Keyがメモリ、Valueはデータファイル)時にデータファイルがメモリに乗らないサイズになった際に発生する
1439 レスポンス低下を抑制するために、一定量(JVMに割り当てているメモリの10%に相当)をメモリにキャッシュする機能を追加。
1440 このキャッシュ機構はLRUアルゴリズムを採用しており、利用頻度の高いデータほどキャッシュされるようになり、利用頻度の
1441 低いデータは自動的にパージされる。
1442 ※現在このキャッシュをOffにすることは出来ない。
1443
1444
1445
1446 ■データノードのメモリ活用方法を効率化し、従来よりも大量のデータをメモリ保持できるように修正
1447 従来のKeyとValueのメモリ上での扱い方を変更、最適化しメモリ利用効率を向上した。
1448 これにより従来よりも1.3〜1.4倍程度のデータが扱えるように向上。
1449
1450
1451
1452 ■データノード内でのKey値探索方式に工夫を行い、取得効率を向上
1453 特定のパターンでのKey値探索時の効率を向上。
1454 Key値の先頭や、末尾をプレフィックス的に変更してデータを保存するような場合に性能向上が期待できる。
1455
1456
1457 ========================================================================================================
1458 ========================================================================================================
1459 [New - 機能改善]
1460 [[リリース Ver 0.8.0 - (2010/09/07)]]
1461 ■振り分けモードにConsistentHashを追加
1462 データ分散アルゴリズムを従来はModのみだったが、新たにConsistentHashを追加。
1463 ノード追加時の自動データ移行も実装
1464 ConsistentHashアルゴリズム時はexecOkuyamaManager.batを起動しhttp://localhost:10088/okuyamamgrにアクセスし、
1465 "Add Main DataNode"に追加したいノードのIP:PORTを記述しUPDATEボタンを押下すると自動的にデータ移行が行われる
1466 ※Subデータノード、Thirdデータノードも運用している場合は一度に"Add Sub DataNode"、"Add Third DataNode"も
1467 IP:PORTを記述してUPDATEボタンを押下しないと更新に失敗する
1468 つまり、MainDataNodeだけ増やすとかは出来ない。
1469 ※MasterNodeの設定は全ノードModもしくはConsistentHashのどちらかに統一されている必要がある。
1470 従来のModアルゴリズムで保存したデータはConsistentHashに移行は出来ない。
1471 ※Modアルゴリズム時は従来通りの各ノードテキストBoxの最後に追加したいノードの"IP:PORT"を記述しUPDATEボタンを押下する
1472
1473 MasterNode.propertiesの以下の設定項目で制御可能
1474 ●DistributionAlgorithm
1475 設定値) "mod"=Modアルゴリズム
1476 "consistenthash"=ConsistentHashアルゴリズム
1477 記述例)
1478 DistributionAlgorithm=mod
1479
1480
1481 ■DataNodeのレプリケーション先を2ノードに変更
1482 従来はKeyMapNodesInfoに対してSubKeyMapNodesInfoがレプリケーション先となり2ノードでデータをレプリケーション
1483 していたが、新たにThirdKeyMapNodesInfoを設けた。
1484 ThirdKeyMapNodesInfoを記述すると、レプリケーションが行われ3ノードで1組のDataNodeとして機能する。
1485 3ノード全てが停止しなければ稼動可能である。
1486 ※3つ目のノードに対するget系のアクセスはMain、Subどちらかのノードが停止しない限りは行わない。
1487 get系のアクセスは正しく稼動している2ノードに限定される。
1488
1489 MasterNode.propertiesの以下の設定項目で制御可能
1490 ●ThirdKeyMapNodesInfo
1491 設定値) "IP:PORT"
1492
1493 記述例)
1494 ThirdKeyMapNodesInfo=localhost:7553,localhost:7554
1495
1496
1497 ■データ取得時の一貫性モードを追加
1498 データ取得時にレプリケーション先の状態に合わせて取得データの一貫性を意識した取得が可能。
1499 モードは3種類となる。
1500 ・弱一貫性:ランダムにメイン、レプリケーション先のどこかから取得する(同じClient接続を使用している間は1ノードに固定される)
1501 ・中一貫性:必ず最後に保存されるレプリケーションノードから取得する
1502 ・強一貫性:メイン、レプリケーションの値を検証し、新しいデータを返す(片側が削除されていた場合はデータ有りが返る)
1503
1504 MasterNode.propertiesの以下の設定項目で制御可能
1505 ※3つ目のノードに対するget系のアクセスはMain、Subどちらかのノードが停止しない限りは行わない。
1506 get系のアクセスは正しく稼動している2ノードに限定される。
1507 ●DataConsistencyMode
1508 設定値) "0"
1509 "1"
1510 "2"
1511
1512 記述例)
1513 DataConsistencyMode=1
1514
1515
1516 ■ロードバランス時の振る分けの割合を設定可能に
1517 ロードバランス設定がtrueの場合に従来は交互にメインとレプリケーションノードにアクセスするように
1518 振り分けていたが、振り分ける割合を設定できるように変更
1519
1520 MasterNode.propertiesの以下の設定項目で制御可能
1521 ※3つ目のノードに対するget系のアクセスはMain、Subどちらかのノードが停止しない限りは行わない。
1522 get系のアクセスは正しく稼動している2ノードに限定される。
1523 ●BalanceRatio
1524 設定値) "7:3"=振り分ける割合(メインノード:レプリケーションノード)
1525 ※上記の場合は7対3の割合
1526
1527 記述例)
1528 BalanceRatio=7:3
1529
1530
1531 ■通信部分を大幅見直し
1532 クライアント<->MasterNode、MasterNode<->DataNode間の通信処理を改修
1533 Xeon3430(2.4GHz)×1、メモリ4GB程度のマシン(CentOS5.4 64bit)で10秒程度に間に順次
1534 10000クライアントまで接続し接続完了コネクションset,get処理を開始する同時接続テストで確認。
1535 (C10K問題に対応)
1536 ※クライアントは無操作の場合は60秒で自動的に切断される
1537 これに伴い以下の設定項目で通信部分のパラメータを変更しチューニング可能
1538
1539 MasterNode.propertiesの以下の設定項目で制御可能
1540 ●MasterNodeMaxConnectParallelExecution
1541 設定値) 数値=同時接続時に接続直後に行うSocketラップ処理の並列数
1542
1543 記述例)
1544 MasterNodeMaxConnectParallelExecution=10
1545
1546
1547 ●MasterNodeMaxConnectParallelQueue
1548 設定値) 数値=MasterNodeMaxConnectParallelExecutionで設定した並列処理への引数が設定されるキュー数
1549
1550 記述例)
1551 MasterNodeMaxConnectParallelQueue=5
1552
1553
1554 ●MasterNodeMaxAcceptParallelExecution
1555 設定値) 数値=クライアントからデータ転送が始っていないかを確認する。並列数
1556
1557 記述例)
1558 MasterNodeMaxAcceptParallelExecution=15
1559
1560 ●MasterNodeMaxAcceptParallelQueue
1561 設定値) 数値=MasterNodeMaxAcceptParallelExecutionで設定した並列処理への引数を設定するキュー数
1562
1563 記述例)
1564 MasterNodeMaxAcceptParallelQueue=5
1565
1566
1567 ●MasterNodeMaxWorkerParallelExecution
1568 設定値) 数値=データ転送開始状態のSocket登録に対して処理する並列処理数。
1569
1570 記述例)
1571 MasterNodeMaxWorkerParallelExecution=15
1572
1573
1574 ●MasterNodeMaxWorkerParallelQueue
1575 設定値) 数値=MasterNodeMaxWorkerParallelExecutionで設定した並列処理への引数を設定するキュー数
1576
1577 記述例)
1578 MasterNodeMaxWorkerParallelQueue=5
1579
1580
1581 DataNode.propertiesの以下の設定項目で制御可能
1582 ●KeyNodeMaxConnectParallelExecution
1583 MasterNodeMaxConnectParallelExecutionと同様
1584
1585 ●KeyNodeMaxConnectParallelQueue=5
1586 MasterNodeMaxConnectParallelQueueと同様
1587
1588 ●KeyNodeMaxAcceptParallelExecution=20
1589 MasterNodeMaxAcceptParallelExecutionと同様
1590
1591 ●KeyNodeMaxAcceptParallelQueue=5
1592 MasterNodeMaxAcceptParallelQueueと同様
1593
1594 ●KeyNodeMaxWorkerParallelExecution=15
1595 MasterNodeMaxWorkerParallelExecutionと同様
1596
1597 ●KeyNodeMaxWorkerParallelQueue=5
1598 MasterNodeMaxWorkerParallelQueueと同様
1599
1600
1601 ■テストケースを追加
1602 リリース物直下のexecTest.batを実行するとget、setのメソッドテストと、DataNode再起動のテストが実行される
1603 このツールはWindowsにCygwinがインストールされ、CygwinのbinにPATHが通っている想定である。
1604 特殊な環境ですいません。
1605 リリース物内のclasses\Test.propertiesないのパスを適当な値に書き換えてください。
1606
1607 ========================================================================================================
1608 ========================================================================================================
1609 [New - 機能改善]
1610 [[リリース Ver 0.7.0 - (2010/06/27)]]
1611 ■MasterNodeを複数起動し冗長化した場合の自動エスカレーション機能を追加
1612 従来からMasterNodeを複数で冗長化は出来たが、その場合MasterNode内にメインとなるノードが存在し、
1613 残りのマスターノードはスレーブという扱いだった。
1614 メインのノードがダウンした場合は、スレーブノードにアクセスすればデータの取得、登録、削除等全ての
1615 クライアント操作は実行できたが、DataNodeの監視、データノードダウン後の起動時のデータリカバーは
1616 スレーブMasterNodeだけでは実行されなかった。
1617 その場合は、スレーブMasterNodeの内の1インスタンスのMasterNode.properties内の設定値
1618 "MainMasterNodeMode"を"true"に変える必要があった。
1619 今回の改修でメインMasterNodeがダウンした場合はスレーブMasterNode内から自動的に1インスタンスが
1620 メインMasterNodeに昇格するように改修。
1621 この改修によりMasterNode.propertiesに設定項目が追加され、従来の設定項目が使用可能ではあるが、推奨されなくなった。
1622
1623 ●追加された項目は以下
1624 ・SystemConfigMode
1625 説明) 設定情報を取得する場所(file or node)
1626 設定情報を本ファイルを起動後も参照し続けるか、起動後は本ファイルを一度だけ参照し、
1627 以後は、DataNodeに登録されている設定情報を参照するかを決定する
1628 "file"の場合は本ファイルを参照する
1629 "node"の場合はDataNodeを参照する
1630 設定をしない場合は"node"となる
1631 記述例)
1632 SystemConfigMode=node
1633
1634
1635 ・MyNodeInfo=127.0.0.1:8888
1636 説明) 自身の情報
1637 自身のIPと起動ポート番号を":"区切りで記述
1638 ※使用を推奨
1639 ※この設定がない場合はメインMasterNodeの自動昇格機能が機能しない
1640 記述例)
1641 MyNodeInfo=127.0.0.1:8888
1642
1643
1644 ・MainMasterNodeInfo
1645 説明) メインマスターノードの情報
1646 起動時にメインMasterNodeとして認識するノードのIPとポート番号
1647 自身がメインMasterNodeの場合は自身の情報を記述
1648 ※使用を推奨
1649 記述例)
1650 MainMasterNodeInfo=127.0.0.1:8888
1651
1652
1653 ・AllMasterNodeInfo
1654 説明) 全てのマスターノードの情報
1655 全てのマスターノードの情報"IP:PORT番号"フォーマットで","区切りで記述
1656 自身の情報はMyNodeInfo設定の内容と同じであること
1657 ここでの記述順でメインMasterNodeとして機能する
1658 ※使用を推奨
1659 ※この設定がない場合はメインMasterNodeの自動昇格機能が機能しない
1660 記述例)
1661 AllMasterNodeInfo=127.0.0.1:8888,127.0.0.1:8889,127.0.0.1:11211
1662
1663 ●使用が推奨されなくなった項目
1664 ・MainMasterNodeMode
1665 ・SlaveMasterNodes
1666
1667
1668 ■MasterNodeが使用する設定情報をMasterNode.propertiesから参照するだけでなく、
1669 DataNodeに設定情報を格納しそちらか参照するように改修
1670 従来設定情報はMasterNode.propertiesからつねに参照していたが、設定情報をDataNodeに格納する
1671 ように改修し、全MasterNodeが情報を共有するよに改修
1672 ただし、起動時はDataNodeの情報が分からないため、MasterNode.propertiesから参照する
1673 従来通り、MasterNode.propertiesのみで運用することも可能
1674 この設定を変更するにはMasterNode.propertiesの以下の設定項目で変更出来る。
1675 ●追加された項目
1676 ・SystemConfigMode
1677 説明) 設定情報を取得する場所(file or node)
1678 設定情報を本ファイルを起動後も参照し続けるか、起動後は本ファイルを一度だけ参照し、
1679 以後は、DataNodeに登録されている設定情報を参照するかを決定する
1680 "file"の場合は本ファイルを参照する
1681 "node"の場合はDataNodeを参照する
1682 設定をしない場合は"node"となる
1683 記述例)
1684 SystemConfigMode=node
1685
1686
1687
1688 ■okuyama管理Webコンソールアプリケーションを追加
1689 稼働中のokuyamaの状況確認と設定の変更が出来るできるWebアプリを作成。
1690 リリース物のexecOkuyamaManager.batを実行すると管理Webアプリが起動する。
1691
1692 URL : http://起動マシンのIP:10088/okuyamamgr
1693 でアクセスできる。
1694
1695 ※execOkuyamaManager.bat内で起動ポート番号(10088番)とWebアプリが情報を参照するMasterNodeのIP:PORTを","区切りで渡しています。
1696 MasterNodeの情報はMasterNode.propertiesの設定情報"AllMasterNodeInfo"の内容と同様にしてください。
1697
1698
1699 ========================================================================================================
1700 ========================================================================================================
1701 [New - 機能改善]
1702 [[リリース Ver 0.6.6 - (2010/06/08)]]
1703 ■データノードリカバー中の取得、登録、削除の処理の待ち時間を軽減
1704 データノード、スレーブデータノードの構成で稼動している場合、片方のノードがダウンし、
1705 起動してくると、片側のノードのデータから復元するリカバー処理が行われる。従来この処理中はクライアントから
1706 当該ノードのデータにアクセスするとキューイングされていたため、待ちに状態になっていた。
1707 この部分を見直し、リカバー処理中の待ちとなるタイミングを大幅に軽減した。
1708 このことによりokuyamaの総使用時間に対する、スループットが向上された。
1709 同時に、従来復旧後のノードのデータはokuyamaが内部で使用しているデータMapをシリアライズして
1710 書き出していたが、この部分をトランザクションログと統合しログに書き出すように変更した。
1711 このことでリカバー処理の総所要時間を低減された。
1712 ※この改善はデータノード、スレーブデータノード両方を使用して稼動している場合に有効である。
1713
1714 ========================================================================================================
1715 ========================================================================================================
1716 [New - 機能改善]
1717 [[リリース Ver 0.6.5 - (2010/05/30)]]
1718 ■Vacuum処理中の取得、登録、削除の処理を継続できる用に改修
1719 従来Vacuum中は取得、登録、削除処理は処理がブロックされるようになっていた(処理は待ち状態になる)が
1720 このブロック時間を大幅に削減するように改修。
1721 従来ならVacuumが始まると終始ブロックされていたが、処理を継続出来るように(待ちが発生しない)なり
1722 okuyamaの総使用時間に対する、スループットが向上される。
1723 ※VacuumはDataNode.propertiesの"KeyManagerJob1.dataMemory=true"の用にvalueをファイルに保存している
1724 場合のみ有効となる。
1725
1726 ■各propertiesファイルにコメントを追加
1727 MasterNode.properties、DataNode.properties、TransactionNode.propertiesにコメントを大幅に追記
1728 ※今までコメントが少なくて申し訳ありませんでした。
1729
1730 ■ReadMe.txt、ReadMe-UTF.txtの[■機能説明とサンプルの実行方法]、[サンプルの実行方法]部分を追記
1731 TransactionNodeの使用方法、Memcached互換での起動方法、クライアントの使用可能メソッド部分を修正
1732 分散Lock、setNewValue(memcacheのadd相当)の使用サンプルを追記
1733
1734 ========================================================================================================
1735 ========================================================================================================
1736 [New - 機能改善]
1737 [[リリース Ver 0.6.4 - (2010/05/21)]]
1738 ■データの保存時にKey値も保存するように変更
1739 従来はKey値から生成したHash値を保存していたが限りなく低い可能性ではあるが衝突を起こす可能性がある為、
1740 大量のデータ保存に向かないので、Key値も文字列として保存するように変更。
1741 同時にKey値にも長さの制限を付加。(2048byte)
1742 ※この変更により大変申し訳ありませんが、従来バージョンでのデータは使用できなくなります。
1743
1744 ■同期処理部分を見直し、処理効率を向上。
1745
1746
1747 ========================================================================================================
1748 ========================================================================================================
1749 [New - 機能追加]
1750 [[リリース Ver 0.6.3 - (2010/05/19)]]
1751 ■データノードをmemcacheのノードとして利用可能に
1752 マスターノードを起動せずに直接データノードをmemcacheのノードとして利用可能。
1753 以下のように設定を変更しexecDataNode.batを実行するとmemcacheクライアントでアクセスできる。
1754
1755 設定ファイルDataNode.propertiesの25行目
1756 ----------------------------------
1757 KeyManagerHelper.Init=
1758 ↓上記を下記内容に変更
1759 KeyManagerHelper.Init=memcache
1760 ----------------------------------
1761 として起動するとmemcacheプロトコルで会話が可能となる。
1762 対応メソッドはマスターノードをmemcacheモードとして起動した場合と同様となる。
1763 (・set, ・get, ・add, ・delete)(flagに対応)
1764
1765 ファイルへのデータ永続化が可能
1766 設定ファイルDataNode.propertiesの30行目、31行目
1767 ----------------------------------
1768 KeyManagerJob1.memoryMode=false
1769 KeyManagerJob1.dataMemory=true
1770 ----------------------------------
1771 上記の設定でトランザクションログは残し、登録されたデータはメモリに保持する
1772 両方はtrueにすると完全メモリモード(最も高速に稼動)(単体でmemcacheとほぼ同程度の処理速度が出る)
1773 両方はfalseにすると完全ファイルモード(最も大量のデータ(Valueのサイズ)を保持可能)
1774
1775 デフォルトでは2560バイトがvalueサイズの最大値となるので、src\org\imdst\util\ImdstDefine.javaの150行目を
1776 変更しcompile.batを実行しコンパイルすると許容できるデータサイズが変更できる。
1777
1778
1779 ■Key値からHash値を求めるロジックを変更
1780 okuyamaでは登録されたKey値はハッシュ値を求めてその値を実際の登録に使用しているが、
1781 その値の生成ロジックを見直し、よりハッシュ値が分散するように変更
1782 この変更により、今まで登録したデータは全て破棄する必要があります。
1783 この変更が受け入れられない場合はsrc\org\imdst\helper\MasterManagerHelper.javaの2660行目、2661行目を
1784 以下のように変更し、compile.batを実行し再コンパイルを実行。
1785 --------------------------------------------------------------------
1786 private int hashCodeCnv(String str) {
1787 return new HashCodeBuilder(17,37).append(str).toHashCode();
1788 //return str.hashCode();
1789 }
1790 ↓↓↓↓変更(コメントアウトを入れ替え)
1791 private int hashCodeCnv(String str) {
1792 //return new HashCodeBuilder(17,37).append(str).toHashCode();
1793 return str.hashCode();
1794 }
1795 --------------------------------------------------------------------
1796
1797
1798 ■データ登録メソッドsetValue時の処理速度を20%向上
1799 データノード、スレーブデータノード起動時にsetValueを実行した際の処理速度を
1800 20%向上。データノードへの登録リクエスト送信中にスレーブデータノードへの送信準備をするように修正。
1801
1802
1803 ■バグFix
1804
1805
1806 ========================================================================================================
1807 ========================================================================================================
1808 [New - 機能追加]
1809 [[リリース Ver 0.6.2 - (2010/05/09)]]
1810 ■Memcaheプロトコルモード時の以下の処理を対応
1811 1.memcacheのメソッドであるaddに対応
1812 未登録データの場合のみ登録可能なmemcacheのaddコマンドに対応
1813
1814 2.memcacheのメソッドであるdeleteに対応
1815 memcacheコマンドであるデータ削除用コマンドdeleteに対応
1816
1817 3.memcacheのflag登録に対応
1818 memcacheコマンドでset、add時に指定するflagに対応
1819 get時に登録flagを返却
1820
1821 ■データノード間のデータリカバー時のデータ転送方式を一部変更
1822 従来はノードダウンからのリカバー時にレプリケーションノードからの1通信で全ての登録データ取得していたいが、
1823 これでは大きなデータが登録されている場合に、送信側、受信側でメモリにのりきらずにリカバーに失敗する場合が
1824 あったため、使用可能なメモリの残量を確認しながら、データを分割して転送しリカバリーするように変更
1825 ※データの保存方式をメモリではなくファイルにしている場合は、特にこの問題は発生する可能性があった。
1826
1827 ■PHP用クライアント(OkuyamaClient.class.php)にgetByteValueメソッドを追加
1828 Java用クライアントで登録したバイトデータ(setByteValueで登録したデータ)を取得する際に使用
1829
1830 ■バグFix
1831
1832 ========================================================================================================
1833 ========================================================================================================
1834 [New - 機能追加]
1835 [[リリース Ver 0.6.1 - (2010/04/21)]]
1836 ■データが存在しない場合のみ保存できるメソッドを追加
1837 +未登録のキー値である場合のみ登録可能となり、既に登録済みの場合は登録できない。
1838
1839 *未登録の場合のみ登録可能なメソッドは以下である。
1840 ・クライアントのメソッド名:setNewValue
1841 ・引数1:Key値
1842 ・引数2:Value値
1843 ・戻り値:String[] 要素1(データ有無):"true" or "false",要素2(失敗時はメッセージ):"メッセージ"
1844
1845 ・クライアントのメソッド名:setNewValue
1846 ・引数1:String Key値
1847 ・引数2:String[] tag値配列
1848 ・引数3:String Value値
1849 ・戻り値:String[] 要素1(データ有無):"true" or "false",要素2(失敗時はメッセージ):"メッセージ"
1850
1851 ■クライアントから接続時に保存出来る最大データサイズをMasterNodeから取得するように変更
1852
1853 ■バグFix
1854
1855 ========================================================================================================
1856 ========================================================================================================
1857 [New - 機能追加]
1858 [[リリース Ver 0.6.0 - (2010/04/08)]]
1859 ■分散ロック機能を追加
1860 +任意のデータをロックする機能を追加。
1861 +分散ロック機能はマスターノード用設定ファイルである、MasterNode.propertiesの9行目の"TransactionMode=true"で
1862 ロック機能が使用可能となる。
1863 また、72行目の"TransactionManagerInfo=127.0.0.1:6655"でTransactionManagerノードを指定する必要がある
1864 そして、TransactionManagerノードが起動している必要があるため、同梱のexecTransactionNode.batで起動する。
1865 分散ロック機能を使用する場合は、全てのマスターノードが"TransactionMode=true"で起動している必要がある。
1866 同梱の設定ファイルは全て分散ロック機能で起動する設定となる。
1867 ※execMasterNodeMemcached.batは分散ロック機能あり、memcacheプロトコルモードで起動する。
1868 また、従来の分散ロック機能なしで起動する場合は、"TransactionMode=false"としてexecMasterNode.batを実行する。
1869
1870 +仕組みとしては、Clientからロック取得依頼を行った場合、TransactionManagerノードに指定したKey値で
1871 ロック情報を作り上げる。この際、すでに別Clientから同一のKey値でロックが取得されている場合は、
1872 指定した時間の間、ロックが解除されるのを待ち、取得を試みる。
1873 ロックされた値に対して、set,remove系のアクセスを行った場合は、TransactionManagerノードに対して該当の
1874 Key値が、リクエストを発行したClient以外からロックされているかを問い合わせて、別クライアントがロック
1875 している場合は、ロックが解除されるのを待ち続ける。
1876 同クライアントがロックしているもしくは、ロックがない場合は、そのまま処理を続行する。
1877 ロックのリリースも同じ動きである。
1878 なお、分散ロック機能を有効にした場合は、無効時と比べ1回通信が多く発生するため、処理速度は落ちる。
1879 また、TransactionManagerノードがSPOFとなるが、機能していない場合は無視して稼動するが、
1880 処理速度は極端に劣化する。
1881 今後、SPOFとならないように改善予定である。
1882
1883 +以下は説明となる
1884 *ロックを実施したデータの挙動は以下となる。
1885 ・ロック可能なKey値(データ)は現在登録済みであっても、登録されていなくても可能である。
1886 ・1クライアントから同時に複数のデータをロック可能である
1887 ・ロックしたデータはロックを実施したクライアントからのみロック解除可能である。
1888 ・ロック中のデータはロックを実施したクライアントからのみ登録可能である。
1889 ・ロック中のデータはロックを実施したクライアントからのみ変更可能である。
1890 ・ロック中のデータはロックを実施したクライアントからのみ削除可能である。
1891 ・ロック中のデータは全クライアントから参照可能である。
1892
1893 *ロック機能使用開始メソッドは以下である。
1894 ・クライアントのメソッド名:startTransaction
1895 ・引数なし
1896 ・戻り値:boolean true:スタート成功 false:スタート失敗
1897 ※ロック機能有りでTransactionManagerノードを起動していない場合は、スタートに失敗する。
1898
1899 *ロックメソッドへの引数と戻り値は以下である。
1900 ・クライアントのメソッド名:lockData
1901 ・引数1:ロック対象Key値
1902 引数2:ロック継続時間
1903 (ロック解除を行わない場合でも、ここでの設定時間が経過すると自動的に解除される。
1904 単位は秒。
1905 0を設定するとロックを実施したクライアントが解除するまで永久にロックされる。
1906 ※0指定は推奨しない)
1907 引数3:ロック取得待ち時間
1908 (既に別クライアントがロック中のデータへロックを実施した場合に、設定時間の間ロック取得をリトライする。
1909 単位は秒。
1910 0を設定すると1回ロックを試みる)
1911
1912 ・戻り値:String配列
1913 String配列[0]:Lock成否 "true"=Lock成功 or "false"=Lock失敗
1914
1915 *ロック開放への引数と戻り値は以下である。
1916 ・クライアントのメソッド名:releaseLockData
1917 ・引数1:ロック対象Key値
1918
1919 ・戻り値:String配列
1920 String配列[0]:開放成否 "true"=開放成功 or "false"=開放失敗
1921
1922 *ロック機構使用終了メソッドは以下である。
1923 ・クライアントのメソッド名:endTransaction
1924 ・引数なし
1925 ・戻り値なし
1926
1927 +Java版、PHP版のクライアントからは、ロック、リリース両方が可能
1928 Memchacheクライアントはロック、リリース機能は利用できないが、Lock中のデータにsetを実行した場合は"待ち状態"に入る。
1929
1930 │※ImdstKeyValueClientを使用した実装例)─────────────────────────────────┐
1931 │ │
1932 │ // クライアントインスタンス作成 │
1933 │ ImdstKeyValueClient client = new ImdstKeyValueClient(); │
1934 │ // 接続 │
1935 │ imdstKeyValueClient.connect("127.0.0.1", 8888); │
1936 │ // Transactionを開始してデータをLock後、データを更新、取得し、Lockを解除 │
1937 │ │
1938 │ // 引数はLock対象のKey値, Lock維持時間(秒)(0は無制限), Lockが既に取得されている場合の │
1939 │ // 取得リトライし続ける時間(秒)(0は1回取得を試みる) │
1940 │ ImdstKeyValueClient imdstKeyValueClient = new ImdstKeyValueClient(); │
1941 │ imdstKeyValueClient.connect(args[1], port); │
1942 │ String[] ret = null; │
1943 │ │
1944 │ // Lock準備 │
1945 │ if(!imdstKeyValueClient.startTransaction()) throw new Exception("Transaction Start Error!!"); │
1946 │ │
1947 │ long start = new Date().getTime(); │
1948 │ │
1949 │ // Lock実行 │
1950 │ // "DataKey"というKey値で10秒間維持するロックを作成。もし既にロックされている場合は、5秒間ロック取得を │
1951 │ // 繰り返す │
1952 │ ret = imdstKeyValueClient.lockData("DataKey", 10, 5); │
1953 │ if (ret[0].equals("true")) { │
1954 │ System.out.println("Lock成功"); │
1955 │ } else if (ret[0].equals("false")) { │
1956 │ System.out.println("Lock失敗"); │
1957 │ } │
1958 │ │
1959 │ │
1960 │ // 以下のコメントアウトをはずして、コンパイルし、 │
1961 │ // 別のクライアントから更新を実行すると、更新できないのがわかる │
1962 │ //Thread.sleep(5000); │
1963 │ │
1964 │ // 自身でロックしているので更新可能 │
1965 │ if (!imdstKeyValueClient.setValue(args[3], "LockDataValue")) { │
1966 │ System.out.println("登録失敗"); │
1967 │ } │
1968 │ │
1969 │ // 取得 │
1970 │ ret = imdstKeyValueClient.getValue(args[3]); │
1971 │ if (ret[0].equals("true")) { │
1972 │ // データ有り │
1973 │ System.out.println("Lock中に登録したデータ[" + ret[1] + "]"); │
1974 │ } else if (ret[0].equals("false")) { │
1975 │ System.out.println("データなし"); │
1976 │ } else if (ret[0].equals("error")) { │
1977 │ System.out.println(ret[1]); │
1978 │ } │
1979 │ │
1980 │ // 自身でロックしているので削除可能 │
1981 │ ret = imdstKeyValueClient.removeValue(args[3]); │
1982 │ │
1983 │ if (ret[0].equals("true")) { │
1984 │ // データ有り │
1985 │ System.out.println("Lock中に削除したデータ[" + ret[1] + "]"); │
1986 │ } else if (ret[0].equals("false")) { │
1987 │ System.out.println("データなし"); │
1988 │ } else if (ret[0].equals("error")) { │
1989 │ System.out.println(ret[1]); │
1990 │ } │
1991 │ │
1992 │ // Lock開放 │
1993 │ ret = imdstKeyValueClient.releaseLockData(args[3]); │
1994 │ if (ret[0].equals("true")) { │
1995 │ System.out.println("Lock開放成功"); │
1996 │ } else if (ret[0].equals("false")) { │
1997 │ System.out.println("Lock開放失敗"); │
1998 │ } │
1999 │ │
2000 │ long end = new Date().getTime(); │
2001 │ System.out.println((end - start) + "milli second"); │
2002 │ │
2003 │ // トランザクション開放 │
2004 │ imdstKeyValueClient.endTransaction(); │
2005 │ // 接続切断 │
2006 │ imdstKeyValueClient.close(); │
2007 └────────────────────────────────────────────────────┘
2008
2009 ■いくつかのバグを修正
2010
2011 ※今後は、分散トランザクションを実現するように実装を進める。
2012 ========================================================================================================
2013 ========================================================================================================
2014 [New - 機能追加]
2015 [[リリース Ver 0.5.2 - (2010/03/28)]]
2016 ■Memcacheプロトコルに一部対応
2017 KVSの標準プロトコルになりつつある、memcacheのプロトコルに対応するモードを追加
2018 MasterNode.propertiesの14行目"MasterManagerJob.Option="を"MasterManagerJob.Option=memcache"とすると
2019 memcacheプロトコルでアクセス可能である。
2020 MasterNode2.propertiesがmemcache用の設定ファイルになっている。
2021 execMasterNodeMemcached.batを実行するとmemcacheプロトコルで立ち上がる。
2022 対応メソッドはsetとgetである。またset,getのflagは0のみ対応している。
2023 今後対応範囲を増やす予定。
2024
2025 ■データ保存形式をファイル(DataNode.properties30行目、33行目をfalseとした場合)にした場合に、
2026 追記型で記憶しているため、ファイルが永遠に肥大化するため、vacuum機能を追加。
2027 自動的に実行される。
2028
2029 ■documetディレクトリを追加
2030 性能評価を実施した資料と、構成図を配置
2031
2032 ========================================================================================================
2033 ========================================================================================================
2034 [New - 機能追加]
2035 [[リリース Ver 0.5.1 - (2010/03/17)]]
2036 ■PHP用のクライアントを作成
2037 PHPでMasterServerへアクセス出来るようにクライアントを作成。
2038 Javaのコードを焼きなおしました。
2039 バイトデータを登録(setByteValue)、取得(getByteValue)するメソッドのみ未実装。
2040 リリース物etc_client\OkuyamaClient.class.phpになります。
2041 サンプル実行コードetc_client\PhpTestSock.phpと、実行用batファイルetc_client\PhpAutoTest.batを同梱しました。
2042
2043 ■ReadMe.txt、ReadMe-UTF.txtを最新の状態に更新
2044
2045 ■ReadMe.txt、ReadMe-UTF.txtの"[[リリース Ver 0.5.0 - (2010/03/17)]]"の記述ミスを訂正
2046 訂正箇所は以下
2047 -------------------------------------------------------------------------------------------------------------------------------------------
2048 ■TestSockサンプルにScript実行モードのバージョンを追加(引数 "2.3" Script実行)
2049 ・取得、実行サンプル起動方法
2050 java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 2.3 127.0.0.1:8888 20000 "var dataValue; var retValue = dataValue.replace('data', 'dummy'); var execRet = '1';"
2051 ^^^
2052 正しくは 127.0.0.1 8888
2053 -------------------------------------------------------------------------------------------------------------------------------------------
2054
2055 ========================================================================================================
2056 ========================================================================================================
2057 [New - 機能追加]
2058 [[リリース Ver 0.5.0 - (2010/03/17)]]
2059 ■データ取得時にJavaScriptを実行可能なインターフェースを追加
2060 ImdstKeyValueClientのgetValueScriptメソッドで実行可能。
2061 データ取得時にJavaScriptで記述したスクリプトをKey値と同時に渡し、Key値でValue値が取得出来た場合、
2062 その値にスクリプトを実行しその結果を取得できる。
2063 スクリプト内で、返却有無の決定及び、返却値(Value)を設定することが出来る。
2064 スクリプトはデータノードで実行されるため、今まで取得したデータに対して何だかの処理で加工or値の妥当性
2065 検証などを行っていた場合は、スクリプトで処理を代行し、取得マシンのリソースの節約や、取得マシンの
2066 スペックを越えるような大規模なデータもデータノードのパワーを使用して処理可能である。
2067
2068 【スクリプト記述制約】
2069 スクリプトの制約は以下の名前の変数を宣言する必要がある。
2070 ・ "dataValue" = key値で取得出来たvalue値が設定される。スクリプト内ではこの変数がvalue値となる。
2071 ・ "execRet" = 実行結果(retValue変数)をクライアントに返すことを指定
2072 (1を代入すると返却される 0を代入すると返却されない)
2073 ・ "retValue" = 実行結果を格納する。クライアントに返される値
2074
2075 │※ImdstKeyValueClientを使用した実装例)─────────────────────────────────┐
2076 │ │
2077 │ StringBuffer scriptBuf = new StringBuffer(); │
2078 │ // スクリプトを作成 │
2079 │ scriptBuf.append("var dataValue;"); │
2080 │ scriptBuf.append("var execRet;"); │
2081 │ scriptBuf.append("var retValue;"); │
2082 │ // 取得したValue値に"data"という文字がある場合は"dummy"に置換する │
2083 │ scriptBuf.append("retValue = dataValue.replace('data', 'dummy');"); │
2084 │ // 返却指定 │
2085 │ scriptBuf.append("execRet = '1';"); │
2086 │ │
2087 │ // クライアントインスタンス作成 │
2088 │ ImdstKeyValueClient client = new ImdstKeyValueClient(); │
2089 │ // 接続 │
2090 │ imdstKeyValueClient.connect("127.0.0.1", 8888); │
2091 │ // Value取得及び、スクリプト実行を依頼 │
2092 │ String[] retValue = imdstKeyValueClient.getValueScript("key1", scriptBuf.toString()); │
2093 │ │
2094 │ // 結果を表示 │
2095 │ // 実行結果が存在する場合は"true"が存在しない場合は"false"が、エラーの場合は"error"が返却される │
2096 │ System.out.println(retValue[0]); │
2097 │ // retValue[0]が"true"の場合はスクリプトからの返却値が返却される。"error"の場合はエラーメッセージが返却│
2098 │ System.out.println(retValue[1]); │
2099 └────────────────────────────────────────────────────┘
2100
2101 ■TestSockサンプルにScript実行モードのバージョンを追加(引数 "2.3" Script実行)
2102 ・取得、実行サンプル起動方法
2103 java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 2.3 127.0.0.1 8888 20000 "var dataValue; var retValue = dataValue.replace('data', 'dummy'); var execRet = '1';"
2104
2105 ■クライアントにマスターノードの自動バラランシングモード及び、ダウン時の再接続機能を追加
2106 ImdstKeyValueClientのsetConnectionInfosメソッドに接続対象となるマスターノードの接続文字列を配列で
2107 セット(フォーマット"IP:PORT番号"のString配列)し、autoConnectメソッドで接続すると、ノードへの接続が
2108 出来ない場合、接続後処理途中で切断された場合なども、自動的に再接続し稼動し続けることが出来る。
2109
2110
2111 ■TestSockサンプルに自動接続モードのバージョンを追加(引数 "1.2"自動接続で登録 "2.2"自動接続で取得)
2112 ・登録サンプル起動方法
2113 java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 1.2 "127.0.0.1:8888,127.0.0.1:8889" 20000
2114 ・取得サンプル起動方法
2115 java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 2.2 "127.0.0.1:8888,127.0.0.1:8889" 20000
2116
2117 ※execMasterNode.batとexecMasterNode2.batを同時に実行した状態で上記を実行して、片側ずつ停止しては、
2118 再実行を繰り返しても、正しく稼動し続けることが確認できます。
2119
2120 ========================================================================================================
2121 ========================================================================================================
2122 [New - 機能追加]
2123 [[リリース Ver 0.4.0 - (2010/03/15)]]
2124 ■データノードの動的追加をサポート
2125 マスターノード、データノード起動中にMasterNode.propertiesのKeyMapNodesRule、KeyMapNodesInfo、
2126 SubKeyMapNodesInfoに新たなノードの記述を追記し保存すると、自動的にファイルが再読み込みされ、
2127 データ、スレーブ両ノードが追加される。
2128 設定ファイルは再保存されるとほぼリアルタイムに反映されるため、保存前に該当ノードを起動しておく必要がある。
2129 ※元設定 ※ノード追加
2130 ┌─ MasterNode.properties─────────────┐ ┌─ MasterNode.properties────────────────────────────┐
2131 │KeyMapNodesRule=2 │ │KeyMapNodesRule=4,2 │
2132 │ │ │ │
2133 │KeyMapNodesInfo=localhost:5553,localhost:5554 │=>│KeyMapNodesInfo=localhost:5553,localhost:5554,localhost:6553,localhost:6554 │
2134 │ │保│ │
2135 │SubKeyMapNodesInfo=localhost:5556,localhost:5557 │存│SubKeyMapNodesInfo=localhost:5556,localhost:5557,localhost:6556,localhost:6557 │ │
2136 │ │ │ │
2137 └─────────────────────────┘ └────────────────────────────────────────┘
2138
2139 ■データノード追加後に新しいノードへデータの移行を行う機能を追加
2140 データノード追加後に過去データノード台数運用時のデータにアクセスしたタイミングで追加後ノードの
2141 メインデータノード、スレーブデータノードへデータを自動的に保存するようにし、以後過去のデータ保存ノードへ
2142 アクセスを行わないように機能を追加。
2143 ※ノード追加を行うと自動的にデータアクセス時に行われる。
2144
2145 ■データノードへのアクセスをメインデータノード、スレーブデータノード間でバランシング出来るモードを追加
2146 MasterNode.propertiesのLoadBalanceModeの設定をtrueにするとバランシングを行う。
2147 メインと、スレーブで性能が大きく異なる場合はバランシングを行わないほうが良い場合もある。
2148 振り分けは単純なラウンドロビン方式である。
2149
2150 ■マスターノードを複数台稼動させ、負荷分散、冗長化出来る機能を追加
2151 今までは、マスターノードは1台構成だったが、SPOFとなっていた為、複数台起動出来るように機能追加。
2152 マスターノードは1〜n台での構成が可能だが、1台は必ずマスターノード内でのメインにならなければならない。
2153 理由は、データノードの生存監視と復旧時のリカバリー処理の為である。
2154 リカバリー処理時は、全てのマスターノードが同調して稼動するため、不整合は発生しない構成となっている。
2155 MasterNode.propertiesのMainMasterNodeModeをメインの場合はtrueとし、スレーブの場合はfalseとする。
2156 また、スレーブのマスターノードのネットワーク上の名前と稼動ポート番号をSlaveMasterNodesにカンマ区切りで列挙する。
2157 ※冗長化しない場合はMainMasterNodeMode=trueとするだけでよい。
2158
2159 リリース物\(src or classes)\MasterNode.properties(メイン用) リリース物\(src or classes)\MasterNode2.properties(スレーブ用)
2160 ┌─ MasterNode.properties─────────────┐ ┌─ MasterNode2.properties ────────────┐
2161 │MainMasterNodeMode=true │ │MainMasterNodeMode=false │
2162 │ │ │ │
2163 │SlaveMasterNodes=127.0.0.1:8889 │ │SlaveMasterNodes= │
2164 │ │ │ │
2165 └─────────────────────────┘ └─────────────────────────┘
2166
2167 メインのマスターノードで、データノードの監視、復旧を行うが、メインのマスターノードが稼動出来ない状態に
2168 なった場合は、スレーブのマスターノードの設定ファイルを以下のように書き換えて再保存すると、
2169 スレーブのマスターノードがメインのマスターノードに変更されて稼動し始める。
2170 ┌─ MasterNode2.properties ─────────────┐
2171 │MainMasterNodeMode=true │
2172 │ │
2173 │SlaveMasterNodes=(別のマスターノードがある場合は記述) │
2174 │ │
2175 └───────────────────────────┘
2176 ※SlaveMasterNodesに列挙したノードが稼動していなくても、メインノード正しく稼動する。
2177 ※自動的にスレーブがメインに昇格するように後ほど実装予定。
2178 ※ImdstKeyValueClientに複数のマスターノードを設定できるようにし、
2179 バランシングや、接続できない場合の自動別ノード再接続機能などを後ほど実装予定。
2180
2181 ■起動batファイル追加
2182 execMasterNode2.bat <=スレーブマスターノード起動コマンド
2183 execMasterNode.batのみでの稼動は従来と同じように可能
2184 ========================================================================================================
2185 ========================================================================================================
2186 [New - 機能改善]
2187 [[リリース Ver 0.3.3 - (2010/03/12)]]
2188 ■データノード同士のデータリカバリ時に従来は起動中のノードのデータを再起動してきたノードに
2189 無条件でリカバリしていたいが、データの登録、削除に実施時刻の要素を追加し、リカバリ時に実施時刻を
2190 確認し、新しいノードのデータを適応するように改善。
2191
2192 ========================================================================================================
2193 ========================================================================================================
2194 [New - 不具合修正&サンプルコード追加]
2195 [[リリース Ver 0.3.2 - (2010/03/10)]]
2196 ■一定数のKey-Valueを同じTagに紐付けて保存すると正しく取り出せない不具合を修正
2197
2198 ■TestSockにキー値を指定して削除するモードを追加(引数"8")
2199 java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 8 127.0.0.1 8888 KeyName1
2200 上記で127.0.0.1のポート8888番で起動しているマスターノードに接続し、"keyName1"というKey値で保存されて
2201 いるデータを削除する。
2202 ========================================================================================================
2203 ========================================================================================================
2204 [New - 削除メソッドを実装&データ保存をメモリ上とファイルを選択できるように機能追加]
2205 [[リリース Ver 0.3.0 - (2010/03/4)]]
2206 ■削除メソッドを追加
2207 ImdstKeyValueClientのremoveValueメソッドにて呼び出し可能
2208 リターン値はgetValueと同様で結果文字列("true" or "false")と削除できた場合は対象の値が格納された配列
2209 TestSockの"7"番指定で呼び出し可能
2210 ---------------------------------------------------------------------------------------------------
2211 java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 1 127.0.0.1 8888 100 <= 100件登録
2212 java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 7 127.0.0.1 8888 50 <= 50件削除
2213
2214 ■データ保存形式をメモリとファイルを選択可能
2215 今までのバージョンでは稼動中はデータは常にKeyとValueの関係でメモリ上に保持されていた。
2216 登録毎のトランザクション記録ファイルと、定期的なメモリ情報のファイル書き出しで永続性を保っていたが、
2217 ファイル書き出しモードではKeyのみメモリ上に保持しデータはファイルにレストアすることを実現。
2218 これによりメモリ情報上での情報を少なくすることが可能であり、テストではJVMオプションで-Xmx256mとした
2219 DataNodeで400万件以上のデータを格納出来た。
2220 (※Key値の長さはDataNode格納時は影響がないが、参考に"datasavekey_1"〜"datasavekey_4000000"というKey値)
2221 しかし、今まで制約を設けていなかった格納データ長に制約が出来た。
2222 現在格納できるValueのサイズは、512byteである。
2223 これ以上のデータ長を格納する場合は、ImdstKeyValueClientのsetByteValueメソッドを使用することとなる。
2224 ※512の指定を変更する場合は一度全てのデータファイル(サンプルでは.\keymapfileディレクトリのファイル)を
2225 全て削除してから、ImdstDefineのsaveDataMaxSizeを変更することで対応可能。
2226 ※データファイル保存方法は追記型となるので、今後バキュームメソッドを実装予定。
2227 ※メモリとファイルの切り替えはDataNode.propertiesの
2228 "KeyManagerJob1.dataMemory=false" <=ファイル
2229 "KeyManagerJob1.dataMemory=true" <=メモリ
2230 で切り替え可能
2231
2232 ========================================================================================================
2233 ========================================================================================================
2234 [New - MasterNode処理部分を最適化&性能評価のテキストを添付]
2235 [[リリース Ver 0.2.2 - (2010/02/24)]]
2236 ■MasterNodeのロジックを最適化。
2237 最適化残箇所はまだ残っている。
2238
2239 ■最適化前と後で、簡単に性能を測定。測定結果をテキストとして添付
2240 ========================================================================================================
2241 ========================================================================================================
2242 [New - 不具合修正]
2243 [[リリース Ver 0.2.1 - (2010/02/11)]]
2244 ■自動リカバー時の挙動を修正。
2245 停止ノード起動時のタイミングによって正しくデータがリカバリーされない不具合を修正。
2246
2247 ■src\MasterNode.propertiesにコメントを追加。
2248 ========================================================================================================
2249 ========================================================================================================
2250 [New - 機能追加]
2251 [[リリース Ver 0.2.0 - (2010/02/08)]]
2252 ■自動レプリケーション及び、自動リカバリー機能を追加
2253 データノードクラッシュ時もシステムの機能停止を防止。
2254
2255 [追加機能詳細]
2256 1. 1つのデータを複数のデータノードに登録するよう機能を追加(自動レプリケーション)
2257 分散登録を行うことで、自動的にデータの複製が行われ、より安全性の高い分散KVSへと進化しました。
2258
2259 2. 自動リカバリー機能
2260 1.の機能を使用している場合、メインデータノードがクラッシュした場合も、メインデータノード復帰後、
2261 スレーブノード(レプリケーションノード)から自動的にデータを復元します。
2262 ※スレーブノードがクラッシュした場合も、復帰後自動的にメインデータノードから復元されます。
2263
2264 3. 上記2つの機能を使用している場合はノード停止時もシステムの停止なしに使用可能
2265 データノードクラッシュ時もスレーブノード(レプリケーションノード)への自動移行が行われるため、
2266 使用システムの停止がありません。
2267
2268 ※上記の使用方法は、src\MasterNode.propertiesを参照してください。
2269 ※execMasterNode.batはマスターノードを起動します。
2270 ※execDataNode.batはメインデータノードを起動します。
2271 ※execSlaveDataNode.batはスレーブデータノードを起動します。
2272 ========================================================================================================
2273
2274
2275 スペック
2276 実装言語:Java(jdk1.6にて開発)
2277 ソースエンコーディング:UTF-8
2278 動作検証OS:WinsowsXp SP3、CentOS 5.3(final)
2279 必要ライブラリ:log4j-1.2.14.jar、javamail-1.4.1.jar(JavaMail Ver1.4.1)
2280 Version:0.6.5(2010/05/30)
2281
2282
2283 ■機能説明とサンプルの実行方法
2284 [機能説明]
2285 1.Key-Valueストア
2286 Key-Valueストアを実現します。
2287 Keyは文字列、Valueは文字列と、byteデータの両方を登録可能です。
2288
2289 2.Tag機能
2290 Keyの他にTagを登録できます。
2291 Tagは文字列となります。
2292 ストアではKeyはユニークな値として扱われますが、Tagは複数のデータに紐付ける
2293 ことが出来ます。
2294 複数データにあらかじめ任意のTagを付けることで、Tag指定により
2295 一度に関連データを取得可能となります。
2296 ※現在はTag指定で関連するデータのKey配列が取得できます。
2297
2298
2299 4.オンメモリであり、永続化されたデータ
2300 データの登録をクライアントが命令し、完了するとそのデータは2台のデータノードに登録されます
2301 登録のされかたは、Key値はメモリ(※1)とファイル(※2)に、Value値はファイル(※3)にのみ登録されます。
2302 Value値をメモリ(※1,4)にのみ登録することも可能です。
2303 上記2つ以外にトランザクションログも同時にファイルに登録しています。
2304 データノードがダウンしても正しく保存されたKey値をファイル情報から復元するか、
2305 Key値のファイルへの反映は定期的であるため、その間で保存前にダウンしたもしくは破損している場合は、
2306 トランザクションログから復旧されます。
2307
2308 ※1.登録データは各データノード上で1つのConcurrentHashMapに格納されます。
2309 データの登録、取り出しは全てここから行われます。
2310 ※2.ファイルシステムに保存されるデータは、定期的に保存されるConcurrentHashMapを
2311 シリアライズ化したデータと、データ登録時のログ情報となります。
2312 シリアライズデータの登録はデータ登録、取得処理とは非同期にて実行されます。
2313 ※3.Value値は固定長でLF改行の1ファイルに書き込まれます。
2314 記録方式は追記型となります。
2315 Key値はこのValue値の最新の位置を持っています。
2316 ※4.DataNode.propertiesの"KeyManagerJob1.dataMemory"の値で変更可能
2317 trueでメモリ保持、falseでファイル保存
2318 どちらの場合もトランザクションログは保存されるので、不慮のダウンによるデータの復元には影響はありません。
2319 ※KeyManagerJob1.memoryMode=trueの場合は復元されません
2320
2321
2322 5.分散型
2323 「okuyama」はマスタノード、データノード、トランザクションノード、クライアントの4つで構成されます。
2324 それぞれの役目は以下です。
2325 マスタノード:・設定されたアルゴリズム(※1)に従って、クライアントからのデータ操作依頼を適切な
2326 データノードに依頼します。
2327 ・1つのデータを2台のデータノードにレプリケーションします
2328 取得時に該当データノードがダウンしてる場合も、レプリケーション先のデータノードから取得します。
2329 また、データノードが2台とも稼動している場合は、処理を分散し負荷分散を行います。
2330 データ登録時に1台のデータノードがダウンしている場合ももう一台のノードに保存し処理を続行します。
2331 ・複数台での冗長化が可能である。
2332 複数台で稼動する場合は、MasterNode内でのMainノードを決定する必要がある。
2333 ・停止なしでの動的なデータノードの追加を実現します。
2334 データノードを追加した場合も、それまでに登録したデータへのアクセスは同じように可能です。
2335 ・常にDataNodeの生死を監視し、ダウンからの復旧時にデータを稼動ノードから自動リカバーさせます。
2336 リカバー中はデータの不整合が発生しないように同期化を実現します。
2337 ※1.管理するデータノードの数に依存する簡単なアルゴリズムです。
2338 ・設定ファイルはsrc\MasterNode.properties
2339
2340
2341 データノード:・複数台での構成が可能
2342 ・キーとデータの組み合わせでデータを保存します。
2343 データの登録、抽出、削除インターフェースを持ちます。
2344 ・自身では他ノードへのデータの振り分けなどは行ないません。
2345 ・設定ファイルはsrc\DataNode.properties
2346
2347 トランザクションノード:・分散Lock(TransactionMode)を使用する場合にLockを保持、管理します。
2348 TransactionModeを使用していて、このノードがダウンすると極端にスループットがダウンします。
2349 今後改修予定。
2350 ・設定ファイルはsrc\TransactionNode.properties
2351
2352 クライアント:・マスタノードへの通信を行う実際のプログラムインターフェースです。
2353 ・マスターノードの情報を複数セットすることで自動分散や、マスターノードダウン時の
2354 別ノードへの自動再接続をおこないます。
2355 ・JavaとPHPそれぞれのクラインプログラムがあります。
2356 使用方法は以下の項もしくはリリース物のサンプルプログラムTestSock.javaもしくは、
2357 etc_clietn\PhpTestSock.phpを参照してください。
2358 クライアントのソースファイルは
2359 Javaはsrc\org\imdst\client\ImdstKeyValueClient.java
2360 PHPはetc_client\OkuyamaClient.class.php
2361
2362 インターフェースとしては、
2363 1.setValue(Key値, Value値) :[Key(文字列)とValue(文字列)の組み合わせでのデータ登録]
2364 2.setValue(Key値, Tag値配列 Value値) :[Key(文字列)とTag(文字列(配列))とValue(文字列)の組み合わせでのデータ登録]
2365 3.getValue(Key値) :[Key(文字列)でのValue(文字列)取得]
2366 4.getTagKeys(Tag値) :[Tag(文字列)でのKey値群(Key値の配列)取得]
2367 5.setByteValue(Key値, byte値) :[Key(文字列)とbyte配列の組み合わせでのデータ登録](PHPは未実装)
2368 6.setByteValue(Key値, Tag値配列 byte値) :[Key(文字列)とTag(文字列(配列))とbyte配列の組み合わせでのデータ登録](PHPは未実装)
2369 7.getByteValue(Key値) :[Key(文字列)とValue値をByte配列で取得する.setByteValueで登録した値のみ取得できる]
2370 8.removeValue(Key値) :[Key(文字列)でデータを削除]
2371 9.getValueScript(Key値,JavaScriptコード) :[Key(文字列)とJavaScriptコードを渡し、取得されたvalue値にJavaScriptを実行し値を返す]
2372 10.startTransaction() :[Transactionモード時のみ。Transactionを開始する(分散Lockが使用可能になる)]
2373 11.lockData(Key値,Lock時間,Lock取得待ち時間):[Transactionモード時のみ。Key値でLockを行う。Lock時間で指定した時間維持される(0は無制限)、別のクライアントがLockしている場合はLock取得待ち時間の間リトライする]
2374 12.releaseLockData(Key値) :[Transactionモード時のみ。自身の取得したLockを開放する]
2375 13.setNewValue(Key値, Value値) :[未登録のKey値の場合のみ登録できる]
2376 14.setNewValue(Key値, Tag値配列 Value値) :[未登録のKey値の場合のみ登録できる]
2377
2378 それぞれのノード間の通信はTCP/IPでの通信となります。
2379 また、クライアントとマスタノード間の通信は試験的にBase64にてエンコーディングした文字列を使用しています。
2380
2381
2382 [インストール方法]
2383 [起動方法]
2384 ※Windows環境
2385
2386 前提条件:1.構成
2387 1台のマシン上で稼動するようなサンプル設定ファイルが同梱されています。
2388 それぞれのノード台数
2389 マスタノード:1台
2390 データノード:2台(2インスタンス×3(マスター、スレーブ、サード))
2391
2392 2.各ノードの使用ポートは以下となります。
2393 マスタノード:8888
2394 用途:クライアントからの要求待ち受け
2395 変更する場合:srcディレクトリ配下のMasterNode.propertiesの7行目を変更
2396 7行目=MasterManagerJob.Init=8888<=この番号
2397
2398 データノード:5553、5554 5556、5557
2399 用途:マスタノードからの要求待ち受け
2400 変更する場合:メインデータノード
2401 srcディレクトリ配下のDataNode.propertiesの7行目、13行目を変更
2402 7行目=KeyManagerJob1.Init=5553<=この番号
2403 13行目=KeyManagerJob2.Init=5554<=この番号
2404 スレーブデータノード
2405 srcディレクトリ配下のSlaveDataNode.propertiesの7行目、13行目を変更
2406 7行目=KeyManagerJob1.Init=5556<=この番号
2407 13行目=KeyManagerJob2.Init=5557<=この番号
2408
2409 1.コンパイル
2410 簡易的なコンパイル用バッチファイルを用意しています。
2411 本ファイルと同一ディレクトリにある、compile.batを実行してください。
2412 前提:javac.exeにPATHが通っている
2413
2414 2.MasterNode起動
2415 簡易的なMasterNode起動用バッチファイルを用意しています。
2416 本ファイルと同一ディレクトリにある、execMasterNode.batを実行してください。
2417 設定ファイルはclasses\MasterNode.propertiesを参照しています。
2418 停止方法はCtrl+Cをプロンプトで実行
2419 ※ServerStopファイルが存在するとサーバは起動しません。
2420 ※execMasterNode2.batはスレーブMasterNodeを起動します。
2421 ※execMasterNodeMemcached.batはスレーブMasterNodeをmemcache互換プロトコルで起動します。
2422 前提:1.java.exeにPATHが通っている
2423 2.メモリ上限を128MBとしています
2424
2425 3.DataNode起動
2426 簡易的なDataNode起動用バッチファイルを用意しています。
2427 本ファイルと同一ディレクトリにある、execDataNode.batを実行してください。
2428 2つのデータノードが同時に起動します。
2429 設定ファイルはclasses\DataNode.propertiesを参照しています。
2430 停止方法はCtrl+Cをプロンプトで実行
2431 ※ServerStopファイルが存在するとサーバは起動しません。
2432 前提:1.java.exeにPATHが通っている
2433 2.メモリ上限を256MBとしています
2434
2435 3.SlaveDataNode起動
2436 簡易的なスレーブ用SlaveDataNode起動用バッチファイルを用意しています。
2437 本ファイルと同一ディレクトリにある、execSlaveDataNode.batを実行してください。
2438 2つのデータノードが同時に起動します。
2439 設定ファイルはclasses\SlaveDataNode.propertiesを参照しています。
2440 停止方法はCtrl+Cをプロンプトで実行
2441 ※ServerStopファイルが存在するとサーバはDataNodeは起動しません。
2442 前提:1.java.exeにPATHが通っている
2443 2.メモリ上限を256MBとしています
2444
2445
2446 3.ThirdDataNode起動
2447 簡易的なスレーブ用ThirdDataNode起動用バッチファイルを用意しています。
2448 本ファイルと同一ディレクトリにある、execThirdDataNode.batを実行してください。
2449 2つのデータノードが同時に起動します。
2450 設定ファイルはclasses\SlaveDataNode.propertiesを参照しています。
2451 停止方法はCtrl+Cをプロンプトで実行
2452 ※ServerStopファイルが存在するとサーバはDataNodeは起動しません。
2453 前提:1.java.exeにPATHが通っている
2454 2.メモリ上限を256MBとしています
2455
2456
2457 4.TransactionNode起動
2458 簡易的な分散Lock用TransactionNode起動用バッチファイルを用意しています。
2459 本ファイルと同一ディレクトリにある、execTransactionNode.batを実行してください。
2460 設定ファイルはclasses\TransactionNode.propertiesを参照しています。
2461 停止方法はCtrl+Cをプロンプトで実行
2462 ※ServerStopファイルが存在するとサーバは起動しません。
2463 前提:1.java.exeにPATHが通っている
2464 2.メモリ上限を256MBとしています
2465
2466 ※execMasterNode2.batを実行すると、スレーブMasterNodeが起動します。
2467 ポート番号は8889を使用します。
2468 execMasterNodeMemcached.batはポート11211でプロトコルはmemcacheになります。
2469 設定ファイルはclasses\MasterNode2.propertiesを参照しています。
2470
2471 ・起動サンプルでの構成図
2472 ┌──────┐ ┌──────┐
2473 │ マスター │ │ スレーブ │
2474 │ ノード │ │ マスター │
2475 │ Port:8888 │ │ ノード │
2476 │ │ │ Port:8889 │
2477 └───┬──┘ └───┬──┘
2478 │┌─────────┘
2479 ┌─────┴┴───┐
2480 │ │
2481 ┌───────┐ ┌───────┐
2482 │┌─────┐│ │┌─────┐│
2483 ││データ ││ ││データ ││
2484 ││ノード ││ ││ノード ││
2485 ││Port:5553 ││ ││Port:5554 ││
2486 │└─────┘│ │└─────┘│
2487 │┌─────┐│ │┌─────┐│
2488 ││スレーブ ││ ││スレーブ ││
2489 ││データ ││ ││データ ││
2490 ││ノード ││ ││ノード ││
2491 ││Port:5556 ││ ││Port:5557 ││
2492 │└─────┘│ │└─────┘│
2493 └───────┘ └───────┘
2494
2495 4.サンプルの実行方法
2496 簡易的な接続、登録、取得、削除サンプルを用意しています。
2497 本ファイルと同一ディレクトリにある、TestSock.classを実行してください(jdk1.6にてコンパイル済み)。
2498 引数なしで実行すると使用方法が出力されます。
2499 例)
2500 # 以下の例は自動的にインクリメントするKey値でValue文字列を1000回登録している
2501 java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 1 127.0.0.1 8888 1000
2502
2503 # 以下の例はキー値をkey_aでバリュー値value_bを登録
2504 java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 1.1 127.0.0.1 key_a value_b
2505
2506 # 以下の例は自動的にインクリメントするKey値でValue文字列を1000回取得している
2507 java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 2 127.0.0.1 8888 1000
2508
2509 # 以下の例はキー値をkey_aでvalueを取得
2510 java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 2.1 127.0.0.1 8888 key_a
2511
2512 # 以下の例はマスターノードIP127.0.0.1,ポート8888とIP127.0.0.1,ポート8889に接続をバランシングして
2513 # 自動的にインクリメントするKey値でValue文字列を1000回取得している
2514 # execMasterNode2.batを起動していると、元のexecMasterNode.batのプロセスを終了しても正しく稼動し続ける
2515 java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 2.2 "127.0.0.1:8888,127.0.0.1:8889" 100
2516
2517 # 以下の例はキー値をkey_aで取得したValue値にJavaScriptを実行し結果を取得
2518 java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 2.3 127.0.0.1 8888 key_a "var dataValue; var retValue = dataValue.replace('b', 'scritpChangeRet'); var execRet = '1';"
2519
2520 # 以下の例は自動的にインクリメントするKey値と適当な4パターンのTag値でValue文字列を100回登録している
2521 java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 3 127.0.0.1 8888 100
2522
2523 # 以下の例はTag値「tag1」に紐付くKey値とValue値を1回取得している
2524 java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 4 127.0.0.1 8888 1 tag1
2525
2526 # 以下の例はKey値「wordfile」で「C:\temp\SampleWord.doc」ファイルを1回登録している
2527 java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 5 127.0.0.1 8888 1 C:\temp\SampleWord.doc wordfile
2528
2529 # 以下の例はKey値「wordfile」のバイトデータを取得し「C:\SampleWord.doc」ファイルとして1回作成している
2530 java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 6 127.0.0.1 8888 1 C:\SampleWord.doc wordfile
2531
2532 # 以下の例はKey値「key_a」のデータを削除して、Valueを取得している
2533 java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 8 127.0.0.1 8888 key_a
2534
2535 # 以下の例はTransactionを開始してデータをLock後、データを更新、取得し、Lockを解除
2536 java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 10 127.0.0.1 8888 key_a 5 10
2537
2538 # 以下の例は1度だけデータを登録する場合に使用する呼び出し
2539 # "key_abc"というKeyは1度しか登録しないようにしたい場合
2540 # 2度実行すると2回目はエラーとなる。(memcacheのaddに相当する)
2541 java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 11 127.0.0.1 8888 key_abc value_abc
2542
2543 PHPに関しては、etc_client\PhpAutoTest.batを参照してください。
2544
2545 [今後]
2546 今後はバグFixと分散トランザクション(ロック機構)を実現していきます。
2547

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26