====== UKey-ValueXgA uokuyamav=====================================================
JavaŎꂽAi^UKey-ValueXgAuokuyamav
_E[h肪Ƃ܂B

N@http://thinkit.co.jp/story/2011/02/17/2010A
  {eLXǵu@\ƃTv̎s@vB
  blog:http://d.hatena.ne.jp/okuyamaoo/

  EokuyamaɊւ鎷ML
    [Think IT] "UKVSuokuyamav̑Se"
    1 NOSQĹum鎞vugv http://thinkit.co.jp/story/2011/02/03/1990
    2 NOSQL̐VAUKVSuokuyamav̋@\ http://thinkit.co.jp/story/2011/02/10/2002
    3 UKVSuokuyamaṽCXg[ http://thinkit.co.jp/story/2011/02/17/2010
    4 UKVSuokuyamav̊pmEnE http://thinkit.co.jp/story/2011/02/24/2026

    [Think IT] "UKVSuokuyamavHTIPS"
    1 okuyama𓱓܂łɒmĂT[o\[XƂ4̊֌W http://thinkit.co.jp/story/2011/10/12/2303
    2 okuyama^p邽߂ɒmĂ{Iȑ http://thinkit.co.jp/story/2011/10/26/2316
    3 okuyamał̃AvJŉĂ@\ http://thinkit.co.jp/story/2011/11/10/2325


EC
========================================================================================================
[New - V@\ǉAsΉ]
[[[X Ver 0.9.3 - (2012/03/10)]]
oO񍐂ׁA}篃[Xs܂B
oOe
  1.St@C[hɁADataNode.properties'KeyManagerJob1.keySize='ɑ傫Ȓlݒ肵(1000Ȃ)
    Ȃo^̏ꍇɃobNAbvR}hADataNodẽJos鎖

  2.DataNodeǉ̃f[^ڍŝZԂ̊ԁAgetMultiValueňꕔ̃f[^擾oȂ

  3.PHPłOkuyamaClientvar_dump̋LqׁA폜


ǉ@\

  incrValueyсAdecrValueɒl̏@\ǉ
    incrValueyсAdecrValue݂͑ȂKey-Valueɑ΂ďsƎs邪AVɏwǉ
    wtruenĎsƒl݂ȂꍇA
   uKey=w肳ꂽKeyl:Value=0v
    ƂZbgœo^ȂɎw肳ꂽZAZs悤ɂȂB

    ǉꂽ\bh͈ȉ(PHPłOkuyamaClient.class.phpl)
    /**
     * MasterNodeփf[^̉Zv.<br>
     *
     * @param keyStr Keyl
     * @param value Zl
	 * @param initCalcValue ̏w true=vZΏۂKey-Valueokuyamaɑ݂ȂꍇA0̒l쐬ĂAvZs false=݂Ȃꍇ͌vZs
     * @return Object[] vf1():Boolean true/false,vf2(Ž):Long l
     * @throws OkuyamaClientException
     */
     public Object[] incrValue(String keyStr, long value, boolean initCalcValue) throws OkuyamaClientException;

    /**
     * MasterNodeփf[^̌Zv.<br>
     *
     * @param keyStr Keyl
     * @param value Zl
	 * @param initCalcValue ̏w true=vZΏۂKey-Valueokuyamaɑ݂ȂꍇA0̒l쐬ĂAvZs false=݂Ȃꍇ͌vZs
     * @return Object[] vf1():Boolean true/false,vf2(Ž):Long l
     * @throws OkuyamaClientException
     */
     public Object[] decrValue(String keyStr, long value, boolean initCalcValue) throws OkuyamaClientException;


    () JavałOkuyamaClient̏ꍇ͈ȉ̍\ɂȂB
    ----------------------------------------------------------
     // ݂ȂlɉZs
     Object[] incrRet = okuyamaClient.incrValue("NO_DATA_KEY", 10, true); // Otruew

     if (incrRet[0].equals("true")) {
         System.out.println("ResultValue=" + (Long)incrRet[1]);
	 }
    ----------------------------------------------------------

  MasterNodeǉ@\UtilClientɒǉ
    ]MasterNodeǉꍇWebx[X̃}l[WNAsȂA
    UtilClientɒǉ@\ǉ
     g)
     $ java -classpath ./:./lib/javamail-1.4.1.jar:./okuyama-0.9.3.jar okuyama.imdst.client.UtilClient addmasternode masternode:8888 masternode2:8889
     
      1)addmasternode : ǉ
      2)masternode:8888 : ǉ˗MasterNodẽAhXPortԍ(tH[}bg "AhX:|[gԍ")
      3)masternode2:8889 : ǉMasterNodẽAhXPortԍ(tH[}bg "AhX:|[gԍ")



========================================================================================================
[New - V@\ǉAsΉ]
[[[X Ver 0.9.2 - (2012/03/03)]]
IuWFNg̎XibvVbg@\ǉ
  IuWFNg̃XibvVbg@\ɂA܂DataNodeAɑL^O畜Ă̂ɑ΂āA
  ɒ~ȌԂɕ悤ɂȂB

  IuWFNg̃XibvVbg͒ʏ25Ɉx쐬B쐬ꂽODataNode̕Wo͂
  JnԂƏIԂ\B쐬ꏊyуt@C̖ÓADataNode̐ݒt@Cł
  DataNode.properties̈ȉ̐ݒl̑ݒl̖OɊgqɁu.objvtč쐬B
  "KeyManagerJob1.Option="
  )
     "KeyManagerJob1.Option=./keymapfile/1.key,./keymapfile/1.work.key"
     L̐ݒ̏ꍇkeymapfilefBNgɁu1.key.objvƂč쐬B

  ܂Ax쐬Ǎ25o߂ꍇ͓t@Cɏ㏑Ƃč쐬B
  ̂߁AǗȂǂ͍sȂB
  DataNodẽXg[W[hƂ̃IuWFNgɃXgAf[^̊֌W͈ȉƂȂ
   1.Key=AValue=
     ->IuWFNgKeyValue̗XgAB
   2.Key=AValue=fBXN
     ->IuWFNgKeyValuẽfBXN̈ʒuXgAB
   3.Key=fBXNAValue=fBXN
     ->IuWFNg͍쐬Ȃ

  u1.vAu2.vꂼDataNodeċÑf[^͈̋ȉƂȂB
    1.IuWFNg݂ꍇ̓IuWFNgǂݍށB̌AL^O݂ꍇ́A
      L^O烁IuWFNg쐬JnȎ삪g[XADataNode~O̊SȏԂ
      B
    2.IuWFNg݂ꍇ̓IuWFNgǂݍށB̌AValueۑĂfBXN
      t@C̑`FbNsAĂꍇ͂̃f[^폜BāAL^O
      ꍇ́AL^O烁IuWFNg쐬JnȎ삪g[XADataNode~O
      ԂɕB
      IuWFNg݂͑邪AValueۑĂfBXÑt@C݂ȂATCY0ł
      ꍇȂǂ́AL^OɎcĂf[^݂̂B



St@C[hDataNode~AċNۂɑL^OȂĂ
  ~ȌԂɕ悤ɋN̋ύXB

  ]̃o[Wł͊St@C[h(Key=fBXNAValue=fBXN)ōĂ
  ċN͑L^OSẴf[^𕜌邵f[^O~ȌԂɂ
  @͂ȂB̂߁Aʂ̃f[^ۑĂꍇ͋Nɑʂ̑L^O
  ǂݏoKvɎԂĂ܂ꍇB

  Ŗ{@\DataNode~KeypAValuep̃fBXÑt@CQfBXN
  cĂ΁AċNɂ̃t@CQēxp悤ɕύXANԂ̒ZkȂB
  ȂAKeypAValuep̃fBXÑt@CĂꍇ͉\Ȕ͈͂ŏCA
  fBXNɃf[^cĂȂꍇ͏]AL^O畜vZXƂȂB

  {@\ɂASt@C[h̓[e[Vς݂̑L^O(1.work.key1ȂǍŌɐl̂t@C)
    cKv͂ȂȂ邪AIɃobNAbvUtilClientɂĎ擾邱ƂŕۑS߂邱ƂoB
  p@͓ɈӎKvȂA{@\͗LƂȂB



fBXNLbV@\ǉ
  {@\ValuefBXNɕۑĂꍇ̂ݗLƂȂB

  okuyamaValuȅꏊfBXNɂꍇ́A܂ł̃TCYValueS1
  t@CŏWIɊǗĂB

  ɕۑĂ1Valuẽf[^̓ubNf[^ƌĂ΂B
  getȂǂ̎擾̏ꍇ́Ãt@CV[NubNf[^oĂB
  SSD̂悤ȃV[NKvƂȂfBXN̏ꍇ͍ɉғ邪AHDDȂǂ̏ꍇ
  ANZXWAValuẽt@COS̃obt@TCY𒴂悤ɂȂƁA
  ANZXxᑬB

  Ŗ{@\ł́Axǂ݂ubNf[^HDD_[h
  foCXɈꎞIɃLbV邱Ƃget̂łB

  ꎞIɃLbVValue̓R[hŎw\łBDefault1DataNodeA
  10000ƂȂBLbVɗpfBXNTCY̎ZóAubNf[^̃TCY
  pČvZ邱Ƃ\łB̃ubNTCYDefaultł12888byteƂȂB
  ̂߁ApfBXNTCÝAȉ̌vZŋ߂
  --------------------------------------------------------------------
   [12888byte ~ 10000 = 128880000byte]
  --------------------------------------------------------------------
  ̃ubNTCYDataNode̋Nłu-s]𗘗pāu-s 8192v̂悤ɕύX\łB

  LbV̗LyсALVt@C̍쐬ꏊẃADataNode.propertieśuKeyManagerJob*.cacheFilePath=v
  vfw肵At@CpXLq邱ƂŗLBpȂꍇ̗͂vf̂̂At@Cw
  ƂŖB
  --------------------------------------------------------------------
  [DataNode.propertiesł̐ݒ]
    ) "KeyManagerJob1.cacheFilePath=/usbdisk/cachedata/cache1.data"
  --------------------------------------------------------------------
  LbVValuěDataNode̋Nłu-mdcsv𗘗pāu-mdcs 50000v̂悤
  LbVw肵ĕύX\łBftHg͑Oq̒ʂA10000

  pUSBtbVꂽꍇ́ALbV̗p~邾ƂȂADataNode̒~
  ȂBꂽꍇ́AUSBT[oAVUSBfBXN̏OƓOŃ}Eg΁A
  IɍĔFApB̍DataNode̒~͔ȂB



Java&PHPOkuyamaClientObject̐VKo^ۏ؂setNewObjectValue\bhǉ
  setNewValueValueString^ΉĂȂAValueObjectƂo[WǉB
  p@setNewValueƓl
  p)Java
  ------------------------------------------------------
    OkuyamaClient client = new OkuyamaClient();
    client.connect("127.0.0.1", 8888);

    Map objectValue = new HashMap();
    objectValue.put("Key_XXX", "Value_XXX");
    objectValue.put("Key_YYY", "Value_YYY");
    objectValue.put("Key_ZZZ", "Value_ZZZ");

    String[] setResult = client.setNewObjectValue("Object_Key", objectValue); // VKo^

    if (setResult[0].equals("true")) { // o^mF
		System.out.println("o^");
    } else {
		System.out.println("o^s Message=[" + setResult[1] + "]");
    }
  ------------------------------------------------------



UtilClient𗘗pobNAbv@\łokuyama̕׌y@\ǉ
  UtilClient𗘗pobNAbvsꍇokuyama̓\[X̌E܂ŗp
  obNAbv쐬ȂĂAobNAbv̎w邱ƂŁAᑬŏXɃobNAbv
  쐬@\ǉBɂobNAbv쐬okuyamabusyɂȂȂ悤ɂ邱Ƃ\
  ]2ǉ
   4:NCAgȂ񂾂̗RŃA{[gꍇokuyamam鎞(~b)
   5:okuyamaf[^o͂ۂɈʔroɂŎw肵~b~B傫ƕׂ͉邪Ԃ
 
  p@)
  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



Np[^ȉ̒ʂǉ
  DataNodep̋Np[^
   -crcm LqFtrue/false
         FMasterNodeDataNodeԂ̏ɎsꍇɋI1xďs悤ɂ邩̐ݒ 
	           NetworksȏꍇxꍇtrueɂƂ悢Ƃ
               true/Đڑ, false/Đڑ͎
               ftBgfalse
         ݒF -crcm true

   -dcmuc LqF(p)
         FMasterNodeDataNodeԂSocke̍őėp () ȂlɂƐڑRXg
               ftBg50000
         ݒF -dcmuc 10000

   -smbsmf LqF(i[)
        FSerializeMapBucketTCYJVMւ̃1MBPʂւ̊i[W()
              ftBg400(X|Xサꍇ͏ȒlɂƗǂÅi[͌)
        ݒF -smbsmf 200

   -red LqFtrue/false
         FSt@C[hɊɑ݂f[^ėpݒ
               ftBgtrueB
               falseɂ邱ƂŒ~Õf[^Sč폜ăgUNVŐNI
        ݒF -red false

   -wfsrf LqFtrue/false
         FDataNodeNɑL^O(gUNVO)ǂݍސݒ
               truȅꍇ͓ǂݍ(ftHg)
               falsȅꍇ͓ǂ݂܂Ȃ.̏ꍇ̓f[^͏0̋NɂȂ
        ݒF -wfsrf false

   -udt LqF1/2
         Ff[^t@CۑfBXÑ^Cvw肷邱ƂŁAfBXNւ̃ANZXœK 
               1=HDD(ftHg) 2=SSD
         ݒF -udt 2

   -mdcs LqF(i[)
         FfBXNLbVpɁAǂꂾ̌LbVɏ悹邩Ŏw肷 
               ufBXNLbV@\ǉvQ
               ftHgł10000
         ݒF -mdcs 50000



PHPłOkuyamaClient.class.phpŖȉ̃\bhBJavałƓlł
  1.getTagValues
  2.getMultiTagValues
  3.getMultiTagKeys

  ȉ̃\bh͖
    getTagKeysResult
    getMultiTagKeysResult


Linuxp̃T[rXXNvgIɍ쐬Binstall/z
  MasterNodep[okuyamaMasterNodeServiceScript]
  DataNodep[okuyamaDataNodeServiceScript]
  ƂĔzu


L30ȏɐݒoȂoOC
m[hǉɔf[^ڍsTagf[^VKo^ƁA擾oȂoOC
DataNodẽJo[Am[hǉ̃f[^ĔzǔS
getMultiValues\bhœ̏ŉԂĂȂoOC
̐\

========================================================================================================
[New - V@\ǉAsΉ]
[[[X Ver 0.9.1 - (2011/12/19)]]

EPHPłOkuyamaClient̕sΉ
  EKeyAValueATag̓o^OTCY`FbN̏C
    o^\KeyсATag̃oCg320byteɌŒ
    PhpTestSock.phpɃeXgR[hǉ
    eXgsize-truesize-falseƂȂ
  EOkuyamaClient.class.php̑Oo[W71sڂ̍\svȂߍ폜
  EOkuyamaClient.class.php̑Oo[W113sunsetςݕϐւ̎QƂ̍\C
    isset֐ɒu


EJavapOkuyamaClientv[ORlNVv[ǉ
  {@\𗘗pƐڑAڑςOkuyamaClient̃v[AN[Y̊ǗsƂo
  ڑς݂̃RlNV𑦗p\Ȃ߁Aڑ̃RXg팸Aڑ̋ʉsƂ\
  YNX͈ȉ
  Eokuyama.imdst.client.OkuyamaClientFactory
  (p@)
   -------------------------------------------------------------------------------------------------------
   // MasterNode̐ڑ쐬āAOkuyamaClientFactory.getFactoryɓnƂŃRlNVv[擾
   // Ŏ擾CX^X̓VOgƂȂSẴXbhŗBƂȂ
   // XbhɐVFactory𗘗pꍇgetNewFactory\bh𗘗p
   String[] masterNodes = {"192.168.1.1:8888","192.168.1.2:8888"};
   OkuyamaClientFactory factory = OkuyamaClientFactory.getFactory(masterNodes, 20);

   // v[Client擾
   OkuyamaClient okuyamaClient = factory.getClient();

   // ȍ~͒ʏOkuyamaClient̗p@Ɠl
   String[] getResult = okuyamaClient.getValue("Key-XXXX");
   if (getResult[0].equals("true")) {
       System.out.println(getResult[1]);
   }

   // close()ĂяoƂŃRlNVv[ɕԋp
   okuyamaClient.close();

   // AvP[V̂̂Iۂ͈ȉFactoryIđSẴRlNVj
   // IēxgetFactoryĂяoΐVfactoryĐ
   factory.shutdown();
   -------------------------------------------------------------------------------------------------------


EUtilClientadddatanodeǉ
  DataNodeǉۂɏ]Web̊Ǘʂ炵ǉłȂA
  UtilClientǉ@\ǉ
  {@\ɂokuyamãT[o̕ύX͕Kv܂B
  g)
  $ 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
  
  1)adddatanode : ǉ
  2)masternode:8888 : ǉ˗MasterNodẽAhXPortԍ
  3)datanode02:5555 : ǉ˗DataNodẽAhXPortԍ(MasterNode.propertiesKeyMapNodesInfo̐ݒɊY)
  4)slavedatanode:6555 : ǉ˗DataNodẽAhXPortԍ(MasterNode.propertiesSubKeyMapNodesInfo̐ݒɊYBݒsĂȂꍇ͏ȗ)
  5)thirddatanode:7555 : ǉ˗DataNodẽAhXPortԍ(MasterNode.propertiesThirdKeyMapNodesInfo̐ݒɊYBݒsĂȂꍇ͏ȗ)


EDataNode̊SfBXN[h̐\
  t@Cւ̏oɃł̃obt@Ö݂ւ̏o_Ń[U
  Ƃ邱ƂŉxBۂ̏o͕ʃXbhŏsB


EMasterNodeIsolation@\(p[eBV@\)pgetTagKeysResultAgetMultiTagKeysResultŔ
  sɑΉ


ENp[^ȉ̒ʂǉ
  DataNodep̋Np[^
   -vidf LqFtrue/false
         FL؂̃f[^̃N[jOsǂ̐ݒ true=s false=sȂ 
               Lt̃f[^o^Ȃꍇfalseɂ邱ƂŃN[jOf[^̃`FbN
               镉ׂ炷Ƃo
               true=[jOsAfalse=[jOsȂ
               ftBgValuȅꍇtrueAValuefBXN̏ꍇfalse
               truew肷ƃt@CXg[WɎgĂꍇs
         ݒF -vidf false

   -svic LqF(/P)
         FL؂̃f[^̃N[jOsԊԊuBZԊuw肷ƁAN[jOf[^̃`FbN
               pɂɔ邽ߕׂB傫lw肷ƗL؂̃f[^܂łANZX
               s̏Ԃŕێ邽߃Xg[Ẅ𖳑ʂɂĂ܂܂B               
               ftBg30
         ݒF -svic 60

   -csf LqFtrue/false
        Fۑf[^̍vTCYvZ邩ǂ̎w
              ۑeʂvZKvȂꍇfalseɂ邱Ƃœo^E폜ׂ̕yłB
              ۑeʂƂMasterNodeKeyNodeWatchHelper.logȂǂŏo͂ĂA"Save Data Size"ڂȂǂɓ܂B
              true=vZAfalse=vZȂ
              ftBgtrue
        ݒF -csf false

   -rdvp LqFtrue/false
         FKeyAValueɃfBXN𗘗pۂValue̍XVɍXVÕf[^t@CValuȅꏊėp
               ĕۑ邩̐ݒB
               ėpꍇ͓o^ςValue̍ĕۑsƍXVÕfBXN̏ꏊ𗘗p邽߁AXVɂfBXNgpʂ
               ͂܂BfBXNւ̃ANZX͊ValuëʒuփfBXNV[NĂۑs߃fBXNւ
               ׂȂ܂B
               ėpȂꍇ͊ValuełĂɍŐVValuefBXN̍Ōɏ߁AfBXNւ̃ANZX
               V[PV()ȃANZXɂȂfBXNׂ͏ȂȂ܂BValueւ̍XVłĂ
               fBXNgpʂ܂B
               ftBgtrue
        ݒF -rdvp false

   -dwmqs LqF(obt@O/P)
         FDataNode̊SfBXN[hɃ̃obt@OԂ̒~ςł錏Ből20B
         ő傱Őݒ肵Key+10bytẽeʂ𗘗p邽߁A傫Ȓlɂꍇ͒ӂ
         KvƂȂBDefault̒l7000B
        ݒF -dwmqs 15000


EDataNode.propertiesDataSaveTransactionFileEveryCommit=false̕sΉ

========================================================================================================
[New - V@\ǉAsΉ]
[[[X Ver 0.9.0 - (2011/10/21)]]
HadoopΉ
  !!! [] {@\̓x[^@\ł !!!
  Hadoop̎FormatC^[tF[X𗘗pMapReduceokuyamaɓo^Ăf[^o
  pł悤ɂ܂B
  ڂhadoopfBNgzReadMe.txtQƂĂB


OkuyamaClientւgetMultiTagKeys\bh̒ǉ
  Tagw肵āAYKeŷݎ擾\ȃ\bhǉ܂B
  Keŷݎ擾ł̂ŁANCAg̃pʂ̍팸\łB
  ܂getMultiTagValuesɔׂčɉԂ܂B
  [OkuyamaClientł̃\bh]
  public String[] getMultiTagKeys(String[] tagList) throws OkuyamaClientException;
  public String[] getMultiTagKeys(String[] tagList, boolean margeType) throws OkuyamaClientException;
  public String[] getMultiTagKeys(String[] tagList, boolean margeType, boolean noExistsData) throws OkuyamaClientException;


OkuyamaClientւgetTagKeysResult\bh̒ǉ
  {\bh̋getTagKeysƓlTagw肷邱ƂŁARtSĂKey擾BAgetTagKeys
  xString^̔zŕRtSĂKeylԂĂ̂ɑ΂āA{\bhokuyama.imdst.client.OkuyamaResultSet
  ԋpĂBOkuyamaResultSetjava.sql.ResultSet̂悤ɏf[^o悤ɂȂĂA
  ]getTagKeysł͈Ȃ悤ȑʂKeylꍇɗpB
  ȉ̎TagɕRtSĂKeyValueo͂ĂłB
  ) "Tag1"ɕRtSĂKeyValueo
  ----------------------------------------------------------------------
	OkuyamaResultSet resultSet = client.getTagKeysResult("Tag1"); // OkuyamaResultSetC^[tF[XŌʂ󂯎

	while(resultSet.next()) {  // J[\ړȂl̗LmF trueԂėꍇ͏I[ł͂ȂAfalse͏I[
		System.out.println("Key=" + (Object)resultSet.getKey());     // getKey\bhɂČ݂̃J[\ʒuKeyl擾
		System.out.println("Value=" + (Object)resultSet.getValue()); // getValue\bhɂČ݂̃J[\ʒuValuel擾
	}
	resultSet.close();
  ----------------------------------------------------------------------
  ȂAgetTagKeysResult͎擾KeyValueɑ΂ătB^Oݒ肷邱Ƃ\łB
  tB^O
   1.lłKeyValueɑ΂Ă͈͎̔w
   2.K\łKeyValueɑ΂Ă̈vw
   3.[UsNXɂƎtB^O(tB^ONX́Aokuyama.imdst.client.UserDataFilterC^[tF[X)
  \łB
  [OkuyamaClientł̃\bh]
  public OkuyamaResultSet getTagKeysResult(String tagStr) throws OkuyamaClientException;
  public OkuyamaResultSet getTagKeysResult(String tagStr, String encoding) throws OkuyamaClientException;
  public OkuyamaResultSet getTagKeysResult(String tagStr, String matchPattern, int cehckType) throws OkuyamaClientException;
  public OkuyamaResultSet getTagKeysResult(String tagStr, String matchPattern, int cehckType, String encoding) throws OkuyamaClientException;
  public OkuyamaResultSet getTagKeysResult(String tagStr, double[] targetRange, int cehckType) throws OkuyamaClientException;
  public OkuyamaResultSet getTagKeysResult(String tagStr, double[] targetRange, int cehckType, String encoding) throws OkuyamaClientException;
  public OkuyamaResultSet getTagKeysResult(String tagStr, UserDataFilter filter) throws OkuyamaClientException;
  public OkuyamaResultSet getTagKeysResult(String tagStr, UserDataFilter filter, String encoding) throws OkuyamaClientException;
  !!!! 1.PHP̃NCAg͖Ή
             2.{\bh𗘗p邽߂ɂ́AokuyamaMasterNodeADataNodeɁAVersion-0.9.0ȏłKv
             3.OkuyamaResultSet̏ڂp@́AJavaDocokuyama.imdst.client.OkuyamaResultSet̕QƂĂ


OkuyamaClientւgetMultiTagKeysResult\bh̒ǉ
  {\bh̋getMultiTagKeysƓlɕTagw肷邱ƂŁARtSĂKey擾邱Ƃ\ł邪A
  getTagKeysResultƓlɁAokuyama.imdst.client.OkuyamaResultSetf[^oƂ\ł邽߁Aʂ
  f[^擾ɗpBgetTagKeysResultƈႢAl̃tB^O邱Ƃ͏oȂB
  [OkuyamaClientł̃\bh]
  public OkuyamaResultSet getMultiTagKeysResult(String[] tagList) throws OkuyamaClientException;
  public OkuyamaResultSet getMultiTagKeysResult(String[] tagList, boolean margeType) throws OkuyamaClientException;
  !!!! 1.PHP̃NCAg͖Ή
             2.{\bh𗘗p邽߂ɂ́AokuyamaMasterNodeADataNodeɁAVersion-0.9.0ȏłKv
             3.OkuyamaResultSet̏ڂp@́AJavaDocokuyama.imdst.client.OkuyamaResultSet̕QƂĂ


PHPłOkuyamaClient.class.phpŖȉ̃\bhBJavałƓlł
  1.getMultiValue
  2.removeSearchIndex
  3.getValueAndUpdateExpireTime
  4.setValuesetNewValueւ̗L(ExpireTime)Ή
  5.setObjectValue
  6.getObjectValue
  7.getObjectValueAndUpdateExpireTime
  8.getOkuyamaVersion

  ȉ̃\bh͖
    getTagValues
    getMultiTagValues
    getMultiTagKeys
    getTagKeysResult
    getMultiTagKeysResult


OkuyamaQueueClient̎
  !!! [] {@\̓x[^@\ł !!!
  okuyamaL[ƂėpłpJavaNCAgǉ
  NCAgFokuyama.imdst.client.OkuyamaQueueClient
  L[ƂėpꍇokuyamãT[o͓ɐݒ͕KvȂAʏƓ悤ɋN邾ŗǂB
  OkuyamaQueueClient̗p菇
   1.MasterNode֐ڑ
   2.createQueueSpace\bhŔCӂ̖OQueuë쐬(ɍ쐬ς݂Queuë𗘗pꍇ͍쐬sv)
   3.put\bhɂăf[^o^Atake\bhɂĎo
   4.pIcloseĂяo
  ƂȂBڂJavaDocokuyama.imdst.client.OkuyamaQueueClient̕QƂĂB


OkuyamaClientւgetObjectValueAndUpdateExpireTime\bh̒ǉ
  getValueAndUpdateExpireTimeObjectłɂȂB擾ƓɗLݒ肳Ăꍇ͐ݒ肵L
  bLBWebłsessionIuWFNgȂǂ́AANZXxɗL΂
  lɗpƕ֗łB
  [OkuyamaClientł̃\bh]
  public Object[] getObjectValueAndUpdateExpireTime(String keyStr) throws OkuyamaClientException;
  PHPł̃NCAgΉς݁B


̏\ƕs̏C


========================================================================================================
[New - V@\ǉAsΉ]
[[[X Ver 0.8.9 - (2011/08/31)]]

OkuyamaClientsetObjectValuegetObjectValue\bhǉ
  JavaŃNXSerializableimplementsĂNX̃IuWFNĝ܂ܓo^A
  擾o郁\bhǉ
  \bh͈ȉ
   ESet\bh
     boolean setObjectValue(String keyStr, Object objValue)
     boolean setObjectValue(String keyStr, String[] tagStrs, Object objValue)
     boolean setObjectValue(String keyStr, Object objValue, Integer expireTime)
     boolean setObjectValue(String keyStr, String[] tagStrs, Object objValue, Integer expireTime) 
    ԋplbooleantruȅꍇ͓o^Afalsȅꍇ͓o^s

   EGet\bh
     Object[] getObjectValue(String keyStr)
    ԋplObjectz̗vf
    Object[0] = vf1 f[^L(String^) : "true"=f[^L or "false"=f[^
    Object[1] = vf2 擾f[^(Object^) : f[^L"false"̏ꍇ̂݃G[bZ[W(String^Œ))ȊÓAo^Object


gUNVO(WALO)̃fBXNւfsync̕px𒲐\
  gUNVÕfBXNւfsync͏]OSCApx𒲐\ɕύX
  ImdstDefine.transactionLogFsyncType̒lύX邩ADataNode̋N"tlft"tW
  w肷邱ƂŕύX\BW͈̐ȉ
   0=OSC
   1=fsyncpx
   2=fsyncpx
   3=fsyncpx
   4=gUNVOݖfsync(f[^ւ̕ύX)

   DataNodeN)
    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

memcachedłƂflush_allɑΉ
  UtilClientɂf[^̑S폜sƂłAmemcachedNCAgflush_all֕Rt
  memcahcedNCAgڑĂMasterNode̒SIsolatioñf[^S폜łB
  IsolationĂȂMasterNodȅꍇ͎s


Datat@Cւ̃ANZXB
  f[^Updateɑ΂{


̏\ƕs̏C
  ER[hɂ鏈x
  Ememcached[hMasterNodeNꍇdelete\bhœ̃NCAgkeyȊOɃp[^
    ]Ă邽߁A̍ۃG[ɂȂĂߏC
  Em[hIǉMainMasterNodeȊOMasterNodeŔf[^擾oȂsɑΉ
  ESɁAIsolationpMasterNodeɑ΂āA2Ȃǂ̒ZŌIndex쐬ꍇ
    ΏۂɂȂȂsɑΉ


========================================================================================================
[New - V@\ǉAsΉ]
[[[X Ver 0.8.8 - (2011/07/3)]]

Xg[W@\SerializeMapǉ
  f[^i[ɃԂLpSerializeMapƂ@\ǉB
  f[^i[Mapɓo^KeyValue(f)VACUO玩RɎwł悤ɋ@\ǉ
  ڂ͈ȉBlogQ
  http://d.hatena.ne.jp/okuyamaoo/20110616
  http://d.hatena.ne.jp/okuyamaoo/20110623

  ݒDataNode.propertiesɈȉ̍ڂǉꂽ
  "DataSaveMapType"
  "SerializerClassName"

  "DataSaveMapType"SerializeMap̗pw
  "SerializerClassName"(f)VACŨNXw
  SerializerClassNameŎw肷NXokuyama.imdst.util.serializemap.ISerializerCvc
  ݒȂ́AConcurrentHashMap𗘗pBDefaultConcurrentHashMap

  ݒ@)
  DataSaveMapType=serialize
  SerializerClassName=okuyama.imdst.util.serializemap.ObjectStreamSerializer
  ObjectStreamSerializer͌ݎς݂(f)VACUNXB[XɓB
  LSerializeMapŗp

  DataSaveMapType=
  SerializerClassName=
  LŒʏConcurrentHashMapŗp



okuyamaNCAgLݒ\
  OkuyamaClientsetValueyсAsetNewValueexpireTimenƂŗL(Pʂ͕b)ݒ\
  Ԃ́AIntegeřEl
  )
  okuyamaClient.setValue("Key_XXX", "Value_YYY", new Integer(300));
  L̏ꍇL300b


f[^擾Ɠɂ̃f[^ɐݒ肳ĂLo^ɐݒ肵郁\bh
  okuyamaNCAgɒǉB
  \bhgetValueAndUpdateExpireTime
  Lݒ肳ĂȂf[^͉NȂ
  )
  okuyamaClient.setValue("Key_XXX", "Value_YYY", new Integer(300));
  String[] getResult = okuyamaClient.getValueAndUpdateExpireTime("Key_XXX");
  LsetValueɐݒ肳ꂽ300bƂLAgetValueAndUpdateExpireTimeĂяoɍēx300b
    IɉB


Tagw肵ĕRtKeyValue擾@\ǉ
  okuyamaNCAgł́AgetMultiTagValues

  擾@𕡐TagSĂɕRtĂANDƁAǂꂩɂRtORwłB
  ԋp`MapƂȂAKeyValuẽZbgɂȂB
  ̂߁ATagɕRtĂKey͑˂B
  )
   String[] getTags = {"Tag1","Tag2","Tag3"};
   Map retAndMap = okuyamaClient.getMultiTagValues(getTags, true) //<=ANDw
   Map retOrMap = okuyamaClient.getMultiTagValues(getTags, false) //<=ORw


f[^ꊇ폜@\ǉ
  IsolationPʂ͑SẴf[^ꊇō폜@\okuyama.imdst.client.UtilClientɒǉ
  p@͈ȉ
  p@)
  java -classpath ./:./classes okuyama.imdst.client.UtilClient truncatedata 192.168.1.1 8888 all
  1 = 'truncatedata' <=Œ
  2 = '192.168.1.1'  <=MainMasterNodeIPAhX
  3 = '8888'         <=MainMasterNode̋N|[gԍ
  4 = 'all'          <=SĂ̍폜w肷'all'͍폜IsolationPrefix


݂MasterNodew肵ĂMasterNode݂ǂ̂悤ȐݒŉғĂ邩擾@\UtilClientɒǉ
   p@)
   java -classpath ./:./classes okuyama.imdst.client.UtilClient masterconfig 192.168.1.1 8888
   1 = 'masterconfig' <=Œ
   2 = '192.168.1.1'  <=MainMasterNodeIPAhX
   3 = '8888'         <=MainMasterNode̋N|[gԍ
   o͗)
   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]- 
   CheckMasterNodeTargetInfo=[]- Algorithm [0]:mod [1]:consistenthash=[1]- AllDataNodeInfo=[{third=[localhost:7553  localhost:7554]  sub=[localhost:6553  localhost:6554]  
   main=[localhost:5553  localhost:5554]}]


̏\ƕs̏C
   1.Key-Value̗͂ǂ炩ɓWJꍇɃf[^o^ƃg錻ۂPB
   2.MasterNode̕sȌĂяoԍ(vgR̐擪)nꍇɉȂȂĂ܂
   
========================================================================================================
[New - V@\ǉAsΉ]
[[[X Ver 0.8.8 - (2011/07/3)]]

okuyamaNCAgLݒ\
  OkuyamaClientsetValueyсAsetNewValueexpireTimenƂŗL(Pʂ͕b)ݒ\
  Ԃ́AIntegeřEl
  )
  okuyamaClient.setValue("Key_XXX", "Value_YYY", new Integer(300));
  L̏ꍇL300b


f[^擾Ɠɂ̃f[^ɐݒ肳ĂLo^ɐݒ肵郁\bh
  okuyamaNCAgɒǉB\bhgetValueAndUpdateExpireTime
  Lݒ肳ĂȂf[^͉NȂ
  )
  okuyamaClient.setValue("Key_XXX", "Value_YYY", new Integer(300));
  String[] getResult = okuyamaClient.getValueAndUpdateExpireTime("Key_XXX");
  LsetValueɐݒ肳ꂽ300bƂLAgetValueAndUpdateExpireTimeĂяoɍēx300b
    IɉB

Xg[W@\SerializeMapǉ
  f[^i[ɃԂLpSerializeMapƂ@\ǉB
  ANZXX|X͒ቺ邪Ɋi[łf[^ʂ͌シB
  ڂ͈ȉBlogQ
  http://d.hatena.ne.jp/okuyamaoo/20110616
  http://d.hatena.ne.jp/okuyamaoo/20110623

  ݒDataNode.propertiesɈȉ̍ڂǉꂽ
  "DataSaveMapType"

  ݒȂ́AConcurrentHashMap𗘗pBDefaultConcurrentHashMap

  ݒ@)
  DataSaveMapType=serialize
  LSerializeMapŗp

  DataSaveMapType=
  LŒʏConcurrentHashMapŗp

̏\ƕs̏C

========================================================================================================
[New - [Xt@Cs]
[[[X Ver 0.8.7.2 - (2011/05/12)]]
[XɋkeymapfilefBNg𓯍Yꂽ߁Aǉ
  antŎsꍇȂǂɃG[ɂȂ邽߁B

installfBNgbinfBNgɔzuĂNXNvgokuyama̋LqĂ邽߂ɏC
  Ce̓NXpXʂĂokuyamajart@CAokuyama-0.8.6.jarɂȂĂ߁A
  okuyama-0.8.7.jarɕύX

========================================================================================================
[New - V@\ǉAsΉ]
[[[X Ver 0.8.7 - (2011/04/20)]]

EC
  ւ̃f[^ۑɈks
	̐ݒDataNode.properties"dataMemory=true"̏ꍇ̂ݗL
	true=kAfalse=񈳏k
	ksCPU𗘗p邽߈kʂ]߂Ȃf[^ۑꍇfalseL
	ݒ肵Ȃꍇ̃ftHgtrue
	SaveDataCompressType͈kw@1 or 9̂ǂ炩w
	1=Œሳk
	9=ᑬōk
	ݒ肵Ȃꍇ̃ftHg1

    DataNode.propertiesł̐ݒ́Aȉ̍
	SaveDataCompress=true
	SaveDataCompressType=1


  f[^gUNVOt@Cx݋@\
	̐ݒDataNode.properties"memoryMode=false"̏ꍇ̂ݗL
	!!falseɐݒ肵ꍇ͏ɏ܂Ȃ߁Asӂ̏QɃf[^Xg\オ!!
    ݒl"true"xȂ(ɏ)
    ݒl"false"x
	ݒ肵Ȃꍇ̃ftHgtrue
	̐ݒ͖{ݒt@CŒ`ĂDataNodeSĂɔf

    DataNode.propertiesł̐ݒ́Aȉ̍
	DataSaveTransactionFileEveryCommit=true


  Lf[^t@Cւ̕ύX݂̃^C~Oݒ ###
	 ̐ݒ"dataMemory=false"̏ꍇ̂ݗL
	 trueɂꍇ͋Lf[^t@Cւ̕ύX(fBXN)𑦎fBXNɔf̂ł͂ȂʃXbhŐs
	 ݂s܂Ńɕێ̂ŃB̍ő发݃v[(f[^)ݒ肷̂A
	 ShareDataFileMaxDelayCount(lw肷)ł邱Őݒ肵l̍ő12888{̃oCg
	 őxێ999999(̐~ςOɃȂȂꍇ)
	 ݒ肵Ȃꍇ̃ftHgfalse

    DataNode.propertiesł̐ݒ́Aȉ̍
	ShareDataFileWriteDelayFlg=true
	ShareDataFileMaxDelayCount=


  ServerControllerɃR}h̎ޒǉ
     T[oRg[R}hǉ

     ǉ@\͈ȉ
     "-help" : SR}hꗗo
     "netdebug" : debugo݂͂̃R\[ɏo͂BsMŒ~
     "fullgc" : gcw


  ž
    z1ubÑTCY𕡐̎ނɂāAۑTCYɍ킹Ďg悤ɕύX


  Valueɕۑꍇɐݒ肵TCYȏValuezԂɕۑ@\ǉ
    傫ValuelɕێȂꍇɗL
    DataNode.properties̈ȉ̐ݒl(SaveDataMemoryStoreLimitSize)
    ftHg"0"(TCYȂɃɕێ)

    DataNode.propertiesł̐ݒ́Aȉ̍
    SaveDataMemoryStoreLimitSize=0

    ݒ肷TCY̓oCgl
    )ȉ̏ꍇ128KBȏ
    SaveDataMemoryStoreLimitSize=131072


  f[^obNAbv@\ǉ
    okuyama.imdst.client.UtilClient쐬As_łDataNodẽf[^obNAbvł悤ɋ@\ǉ
    ̋@\ō쐬t@CDataNode.propertiesKeyManagerJob1.Option=2ڂ̈̃t@CƂ
    DataNodeNƃf[^
    g)
    java -classpath ./:./classes okuyama.imdst.client.UtilClient bkup 127.0.0.1 5554 > bkupFor5554.dump


  KeylɕRtTag폜郁\bhǉ
    KeylTagl̗w肷邱ƂKeylTag̕Rt폜

    OkuyamaClientłremoveTagFromKey(Key, Tag)\bh


  ]uCfbNX쐬@\ƑS@\ǉ(Index̑S폜܂)
    !!! {@\̓x[^@\ł !!!
    ]uCfbNXN-gramƂAOkuyamaClientsetValueAndCreateIndexŃCfbNX쐬
    (jOAoCOAqXgOBIndex̒w)
    SOkuyamaClientsearchValue𗘗pBxɕ̌WordnANDORwłB
    o^ɍ쐬IndexPrefixt邱ƂoB
    ɂAIndexo^f[^Pʂŕʂ̂̂ƂĈƂoB
    Prefixw肷邱ƂŁAlPrefixw肵Index쐬f[^̂ݎ擾\ƂȂ
    Index쐬AƂR[hUTF-8̂ݑΉ

    OkuyamaClientł͈ȉ̃\bhő삷
    EIndex쐬@̈Ⴂ̃\bĥ݂ŁAOkuyamaClientJavaDocQƂĂB(ant javadoc ō쐬\)
      setValueAndCreateIndex 

    EIndex\bh@̈Ⴂ̃\bĥ݂ŁAOkuyamaClientJavaDocQƂĂB(ant javadoc ō쐬\)
      searchValue

    E쐬Index̂ݍ폜
      removeSearchIndex@̈Ⴂ̃\bĥ݂ŁAOkuyamaClientJavaDocQƂĂB(ant javadoc ō쐬\)


  ̏\ƕs̏C


========================================================================================================
[New - V@\ǉAsΉ]
[[[X Ver 0.8.6 - (2011/02/11)]]
  Valueꊇ擾@\ǉ(memcachedgetɕKeylׂ̂Ɠ)
     ̎擾KeyzœnƂł܂Ƃ߂Value擾\BԋplKeyValueMapŕԂ
	 lKey𕡐w肵ꍇ͑˂ĕԂB
	 OkuyamaClientł<Map>getMultiValue(String[])\bhɂȂB
     memcachedvgRłgeťkeylׂ
	 !!!!:PHPNCAg͖ΉB


  Tagw肷ƂɕRtValue𓯎ɕԋp@\ǉ
     Tagw肷邱Ƃŏ]Key̔z擾\AKeyValueMap擾@\ǉB
	 Tagw肷ӊÓA<Map>getMultiValue(String[])Ɠl̋ƂȂB
	 OkuyamaClientł́A<Map>getTagValues(String tag)\bhɂȂB
	 !!!!:PHPNCAg͖ΉB


  Tago^AXVۂ̏\


  l̉Z@\ǉBZłނ̓CNgAfNgł(memcachedincrAdecrAappend)
  	  =>CNg
        =>OkuyamaClientłincrValue(String key, long val)
		=>memcachedvgRłincr
		
  	  =>fNg
        =>OkuyamaClientłdecrValue(String key, long val)
		=>memcachedvgRłdecr

	 !!!!:PHPNCAg͖ΉB


  ServerControllerɃR}h̎ޒǉ
    1.1. T[oRg[R}hǉ
         ǉ@\͈ȉ
         "cname" : okuyamaDNS@\ݒ肷 => DataNode̐ݒ̖OƎۂ̖OMappingς邱Ƃo
                          >datanode001=datanodeserver01
                          L̂悤Ɏw肷ƁAokuyama"datanode001"ƂODataNodeݒ"datanodeserver01"ƓǂݕςăANZX
                          ֌WύXꍇ͍ēxsΏ㏑

         "rname" : okuyamaDNSMapping폜
		                  rnamesA݂̐ݒ薼
                          >datanode001 

         "jobs" : ԕʂ̑ANZXԂ
                       >jobs
					   
         "allsize" : ׂĂIsolationʂ̕ۑf[^TCYԂ
                          Pʂ̓oCgɂȂ
						  >allsize
 
         "size" : Isolationw肷邱ƂŌʂ̃TCYԂ
                      >size
					  >IsolationPrefix


  vP[Vo^mF@\ǉ
    DataNodẽvP[Vݒ肵ĂꍇɁAvP[Ṽf[^]Af[^m[hœo^Ă邩mF
	ɃNCƂɂ͐ƂĕԂB
    vP[V̏ݑxɈˑȂ̂ŁAݏ锽ʁAm[h_EɃf[^\B
	MasterNode.properties̈ȉ̍ڂύX
	--------------------------------
	#݊mFȂ
	KeyMapDelayWrite=true
	
	#݊mF
	KeyMapDelayWrite=false
@--------------------------------


  ̏\ƕs̏C
  	  
========================================================================================================
[New - V@\ǉAsΉ]
[[[X Ver 0.8.5 - (2011/01/18)]]
  MasterNodePʂłIsolation@\ǉ
    Isolation@\Ƃokuyamã}`eig@\łB
    ܂łokuyama͕ۑKeyׂ͂ĂDataNodeŃj[NȒlł(vP[V͏)
    ̂߁ADataNode𕡐̃AvP[VÃ[Upꍇ́AKeylɃvtBbNX
    tȂǍHvKvłB
    {@\́ADataNodeLāAƗf[^Ԃ쐬@\ƂȂB
    ƗPʂ́AMasterNode̐ݒŎw肷B
    MasterNode.properties"IsolationMode""IsolationPrefix"𗘗pB
    ȉ̐ݒMasterNode.propertiesɐݒ肵ANƓl̐ݒ
    NMasterNode͒lLł邪AݒĂȂMasterNode͎擾oȂȂB
    ------------ MasterNode.properties --------------------
    IsolationMode=true
    IsolationPrefix=XC45G
    -------------------------------------------------------

	IsolationMode=falsew肷ƁALIȗ̈ɃANZX邱ƂɂȂBAʂMasterNode
    w肵ĂIsolationԂɂ̓ANZXłȂB


  L؂f[^폜
    memcachedNCAgɂexpire Timew肳AL؂ꂽf[^Iɍ폜@\ǉ
    sO"ImdstDefine.java""vacuumInvalidDataFlg"ϐ"true"(ftHg"true")
    KeyAValuȅꍇ̂ݎsB
    DataNode.properties̐ݒ肪ȉ̏ꍇ݂̂ł
    -------------- DataNode.properties --------------
    KeyManagerJob1.memoryMode=true
    KeyManagerJob1.dataMemory=true
    KeyManagerJob1.keyMemory=true

                     or                      

    -------------- DataNode.properties --------------
    KeyManagerJob1.memoryMode=false
    KeyManagerJob1.dataMemory=true
    KeyManagerJob1.keyMemory=true

                     or                      

    -------------- DataNode.properties --------------
    KeyManagerJob1.memoryMode=false
    KeyManagerJob1.dataMemory=true
    KeyManagerJob1.keyMemory=true

    L؂ꎩp[W301sA`FbNɗL5؂Ăf[^폜Ώ


  ۑf[^TCY(DataNodeۑĂTCY)擾@\ǉ
    DataNodeۑĂl̍voCgTCY擾ł@\ǉ
    1.1. DataNodeɐڑ
         "60,all"ƑM:DataNodeۗLSl̍vTCY擾ł
         "60,"#" + Isolation5Prefix"ƑM:IsolationPʂŎ擾ł
     IɎĂ邽߁ADataNodeɒڐڑKv


  fobOIvVǉBʐMOWo͂ɏo͂悤ɋ@\ǉ
    DataNdoeAMasterNodeɂׂĂ̒ʐMeWo͂Ƀ_v@\ǉ
    1.1. N@ 
	     DataNodeAMasterNodeƂɋN̑3"-debug"tċNƁAWo͂ɒʐMeo͂
         )DataNode
         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
         )MasterNode
         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

     \͗̂Œ


  ServerControllerɃR}h̎ޒǉ
    1.1. T[oRg[R}hǉ
         ]MasterNode.propertiesсAMasterNode.properties"ServerControllerHelper.Init="
         `Ă|[gɐڑƑShutdownAύXނǉ

         ǉ@\͈ȉ
         "shutdown" : T[o~
         "debug" : fobOIvVtrueɓIɕύX
         "nodebug" : fobOIvVfalseɓIɕύX


  f[^S폜@\ǉ
    1.1. f[^폜@\ƂāAIsolationPʂсAŜxɏ@\ǉ
         DataNode̒ʏ|[g(Yt̐ݒt@Cł55535554)ɐڑ
        E"61,#all"ƑM:DataNodêׂĂ
        E"61,"#"+IoslationPrefix"ƑM:DataNodeIsolationPʂŏ

     xf[^͕łȂ̂ŒӂKv
     IɎĂ邽߁ADataNodeɒڐڑKv

  Tagf[^Ɋ֌WsC


========================================================================================================
[New - V@\ǉAsΉ]
[[[X Ver 0.8.4 - (2010/12/16)]]
  f[^Lݒł@\ǉ 
    memcachedłƂexpireTimeݒ\ 
    ݂̐ݒmemcachedNCAĝݐݒ\łB
    ܂okuyamãNCAgo^l̗L͖ƂȂ
   ɂmemcachedNCAg̓o^ׂ̂ĂOptionJ̒lgp\ƂȂB

  rIXV@\ǉ
    memcachedłƂgetsAcasɑΉ 
    okuyamapNCAgł͂ꂼȉ̃\bhɂȂ܂

    >gets => getValueVersionCheck
    >cas  => setValueVersionCheck

  gpăf[^ێXg[W[ĥ 
    KeyyсAValuêǂ炩̃[hŉғۂ 
    炩ߐݒ肵gpʂ𒴂ꍇɁAIɃfBXNɃXgA悤ɉC 
      =>OutOfMemory̗\hɂA肵ĉғ悤ɕύXB
    DataNode.properties̈ȉ̍ڂŋegpʂ̏w

      >KeyManagerJob1.memoryLimitSize=85                             <-gp̃p[Zg
      >KeyManagerJob1.virtualStoreDirs=./keymapfile/virtualdata1/    <-XgAt@CfBNgw


  ValuefBXNɕێ郂[h̃fBXNgp 
    =>]ValuefBXNɕێꍇ͌Œ蒷ƂĕۑĂ߁A 
      ValueMaxTCYȓ̒lŒ蒷Ńf[^t@CɕۑĂA 
      ̂ValueMaxTCY傫ݒ肵ꍇ́Aȃf[^łĂ 
      fCXN𖳑ʂɏĂB 
      ̕œKAMaxTCYƂ͕ʂɗǂgpTCYݒł悤ɕύX 
      ̒lœKȒlɂĂƁAfBXNgp̌ƃX|X̌オ_B

      >okuyama.imdst.util.ImdstDefinedataFileWriteMaxSizeϐ̒l(Pʂ̓oCg)ύXčăRpC

  SfBXN[hɃfBXNւ̏ݏ񓯊ɕύX 
    =>񓯊݂ɂf[^o^A폜\ 
    =>݊܂ł̓̈gp邱ƂŐm 

  T[oԂ̃f[^̃oOC 
    =>f[^Ώۂ̃f[^ꍇ(SȏȂ)ɁAOutOfMemoryoOC 

  lbg[Nzɒ~ł悤ɕύX 
    =>]͋NvZXkillR}hŒ~邵ȂA炩ߐݒ肵|[gɃANZX邱Ƃ 
      ~悤ɋ@\ǉ 
      MasterNode.propertiesADataNode.properties̈ȉ̕Ń|[gw肷

      >ServerControllerHelper.Init=15553

  Linuxp̃CXg[ppbP[W 
    =>ȒPɋNłXNvg𓯍 
    =>[XinstallfBNgzɂAReadMe.txtQ

  ̃oOCƏ̌

========================================================================================================
========================================================================================================
[New - VXg[W[hǉApackage\ύXATagKey擾ۂɑ݂ȂkeyԂȂOptionǉATago^̃bNASYAsΉ]
[[[X Ver 0.8.3 - (2010/11/5)]]
  Xg[W[hɊSfBXN[hǉ
    ̃[hgp邱ƂŁAȂ̃T[ołfBXN̏܂Ńf[^Ǘ邱ƂłB
    DataNode.propertiesɐVɃp[^ǉꂽ

    DataNode.propertiest@C
    ---------------------------------------
    KeyManagerJob1.dataMemory=false
    KeyManagerJob1.keyMemory=false
    KeyManagerJob1.keyStoreDirs=./keymapfile/THdata1/,./keymapfile/THdata2/
    ----------------------------------------

    L̏ԂŊSfBXN[hɂȂ
      keyStoreDirs͕ۑfBNgɂȂBꏊw̓J}؂Œ`B
      wfBNgꂼʁX̃fBXNɂƃX|XシB


  pbP[W\͑啝ɕύX
    O܂ŎgpĂpbP[W͊URLʂ̕擾ς݂ł̂ŁAύXB
    ]̃pbP[W\
    okuyama.imdst
    okuyama.base
    ɕύX
    \󂠂܂񂪁A̕ύXɂImdstKeyValueClientimport̕ύXKvɂȂ܂B
    ȉƂȂ܂
      import okuyama.imdst.client.ImdstKeyValueClient


  TagKey擾ۂɂłɍ폜ꂽKeylԂȂOptionǉ
    ImdstKeyValueClientgetTagKeys\bh̑2falsew肷
    
    gp)
      imdstKeyValueClient.getTagKeys("Tag", false);

    PHPNCAglłB


  Tago^̃bNASY
    Tago^̃bNASYƂɂ蕡NCAg̓Tago^̃X|X

  sΉ
    ̃oOC

========================================================================================================
[New -[XsAant^XN쐬]
[[[X Ver 0.8.2 - (2010/09/22)]]
  Version-0.8.1ɂlibtH_memcached.jarzuɃ[XĂ܂܂B
    libtH_memcached.jarzuB
    ɂéAtesttH_̃eXgvOłB


  ant^XN쐬
    ant^XNɂāAcompileAjart@C쐬AT[oNAeXgR}hssł悤ɍ쐬
    antR}hւ̈Ƃꂼ̎seƂȂB
                          | e
   ------------------------------------------------------------------------------------------------
    compile                   | RpCs
    jar                       | okuyamajart@C쐬
                              |
    datanode                  | DataNodeServerN
    slavedatanode             | SlaveDataNodeServerN
    thirddatanode             | ThirdDataNodeServerN
    masternode                | MasterNodeServerN
    masternodelock            | MasterNodeServerbNgp\ȏԂŋN
    slavemasternode           | SlaveMasterNodeServerN
    memcachedmasternode       | MemcachedvgRMasterNodeServerN
    transactionnode           | UbNǗNodeServerN
    webmgr                    | WebǗR\[pWebT[oN(|[g10088)
                              |
    serverrun                 | datanodeAslavedatanodeAthirddatanodeAmasternodes({ssokuyamảғeXg͉\ł)
    serverrun-slave           | datanodeAslavedatanodeAthirddatanodeAmasternodeAslavemasternodes(MasterNode璷\ŋN܂)
    serverrun-memcached       | datanodeAslavedatanodeAthirddatanodeAmasternodeAmemcachedmasternodes(MasterNodeMemcachedvgRpMasterNodeŏ璷\ɂ܂)
    serverrun-transaction     | datanodeAslavedatanodeAthirddatanodeAmasternodelockAtransactionnodes(gUNVǗm[hNUbNgp\ȏԂɂ܂)
    serverrun-webmgr          | datanodeAslavedatanodeAthirddatanodeAmasternodeAwebmgrs(WebǗʂ킹ċN܂)
                              |
    testset                   | setR}h1000s
    set                       | CӂKeyValueo^(ant set -Dkey=key123 -Dvalue=value123)
    testget                   | getR}h1000s(testsetœo^ꂽf[^擾)
    get                       | CӂKeyValue擾(ant get -Dkey=key123)
    testsettag                | TagZbgR}h500s
    testgettag                | TagKeyValueGetR}htestsettagœo^Tag̎ޑSĂɎs(tag1Atag2Atag3Atag44)
    testremove                | removeR}htestsetœo^Keŷ500Ɏs
    testadd                   | addR}heXg(Key1=Value1Ƃgݍ킹œo^)
    testlock                  | bN@\gpăf[^̃bNAbN̓o^A폜AbNJs(serverrun-transactionʃR\[ŎsĂꍇ̂ݗp\)

    1(2̃R\[build.xmlƓꏊŊJ)
      R\[1:ant serverrun
      R\[2:ant testset
                  ant testget
      LŃR\[1okuyamãT[o\NAR\[2setR}hsAgetR}hsĂB
        ۂɂ́AR\[1okuyamaN܂Ŋɂ邪20b30bقǂ܂B
        ̂߁A30bقǌoߌAR\[2ł̃eXgsĂB

    2(2̃R\[build.xmlƓꏊŊJ)
      R\[1:ant serverrun-transaction
      R\[2:ant testlock
      LŃR\[1okuyamãbNgp\ԂŃT[o\NAR\[2Lock@\̃eXgsĂ
        ۂɂ́AR\[1okuyamaN܂Ŋɂ邪20b30bقǂ܂B
        ̂߁A30bقǌoߌAR\[2ł̃eXgsĂB

    3(2̃R\[build.xmlƓꏊŊJ)
      R\[1:ant serverrun-webmgr
      R\[2:ant testset
                  ant set -Dkey=key123 -Dvalue=value123
                  ant testget
                  ant get -Dkey=key123
                  ant testsettag
                  ant testgettag
                  ant testremove
      LŃR\[1okuyamãT[o\WebǗR\[NAR\[2setR}hsACӂKey=key123,Value=value123o^A
        getR}hsACӂKey=key123Value擾ATaggKeyValuesetATagKeyValue擾Af[^폜ĂB
        ۂɂ́AR\[1okuyamaN܂Ŋɂ邪20b30bقǂ܂B
        ̂߁A30bقǌoߌAR\[2ł̃eXgsĂB
        A̓쒆T[öȉURLɃANZXWebʂŏ󋵂mFł
        http://sT[oIP:10088/okuyamamgr


  SlaveDataNode.propertiesłDataNodeN|[gԍ65536554ɕύX

  testfBNgz̃t@CJavat@C̕R[hꕔShift-JisUTF-8ɕύX(fBNgclasst@CCRpCς)

  񃊃[Xȍ~Ȃ唼batt@CAsht@CexecutecommandfBNgɈړ܂B


========================================================================================================
========================================================================================================
[New - @\P]
[[[X Ver 0.8.1 - (2010/09/21)]]
  gUNVOt@CTCYŎIɃ[e[V悤ɕύX
    DataNode.properties"memoryMode=false"ƂĂꍇɍ쐬AgUNVOt@C
    (f[^엚t@C)]͉iɒǋL邽߁A剻ɂȂ邽߃TCY1.8GB
    B_ŎIɐVt@C쐬t@C̓t@C̖ɐtl[悤
    ύXBċN͖̐({Iɂ0)荞ōŌɐ̕tȂt@C
    ǂݍނ悤ɕύXB



  JavaScriptŃf[^XVs悤ɕύX
    ]JavaScriptValueւ̒lAԋp̉HɂgȂAVJavaScriptŃf[^m[hɎۂ
    ۑĂlXVo悤ɋ@\gB
    lXVɂ́AJavaScript{̕ϐl"execRet"̒l2ɂB
    邱ƂōŏIIJavaScript{̕ϐl"retValue"̒lۂɃf[^m[hɍĕۑB
    ܂AV"dataKey"ƂJavaScriptϐǉAɂKeyli[JavaScriptQƏo悤
    ȂB
    !!!!:lXVꍇImdstKeyValueClientgetValueScriptForUpdate\bhgp邱ƁB

    JavaScript ) ȉKeyl"key1"̏ꍇ͕uValuelXVANCAgValueԋpA"key1"ł͂Ȃꍇ͍XVɕԋpĂB
                  "var dataValue; var dataKey; var retValue = dataValue.replace('value', 'dummy'); if(dataKey == 'key1') {var execRet = '2'} else {var execRet = '1'}";

    ȉ̃eXgR[hŎ
    java -cp ./;./classes;./lib\mail.jar TestSock 1.1 127.0.0.1 8888 key1 value1
    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'}"
    java -cp ./;./classes;./lib\mail.jar TestSock 2.1 127.0.0.1 8888 key1
    NCAgɕԋpValuelōXVĂ

    java -cp ./;./classes;./lib\mail.jar TestSock 1.1 127.0.0.1 8888 key2 value2
    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'}"
    java -cp ./;./classes;./lib\mail.jar TestSock 2.1 127.0.0.1 8888 key2
    NCAgɕԋpValuelōXVĂȂ



  St@C[hɃf[^̈ʂɃLbV悤ɋ@\ǉ
    St@C[h(KeyAValue̓f[^t@C)Ƀf[^t@CɏȂTCYɂȂۂɔ
    X|Xቺ}邽߂ɁA(JVMɊ蓖ĂĂ郁10%ɑ)ɃLbV@\ǉB
    ̃LbV@\LRUASY̗pĂAppx̍f[^قǃLbV悤ɂȂAppx
    Ⴂf[^͎IɃp[WB
    ݂̃LbVOffɂ邱Ƃ͏oȂB



  f[^m[h̃p@A]ʂ̃f[^ێł悤ɏC
    ]KeyValuẽł̈ύXAœKpサB
    ɂ]1.3`1.4{x̃f[^悤ɌB



  f[^m[hłKeylTɍHvsA擾
    ̃p^[łKeylŤB
    Keyl̐擪AvtBbNXIɕύXăf[^ۑ悤ȏꍇɐ\オ҂łB


========================================================================================================
========================================================================================================
[New - @\P]
[[[X Ver 0.8.0 - (2010/09/07)]]
  U蕪[hConsistentHashǉ
    f[^UASY]Mod݂̂AVConsistentHashǉB
    m[hǉ̎f[^ڍs
    ConsistentHashASYexecOkuyamaManager.batNhttp://localhost:10088/okuyamamgrɃANZXA
    "Add Main DataNode"ɒǉm[hIP:PORTLqUPDATE{^ƎIɃf[^ڍss
    Subf[^m[hAThirdf[^m[h^pĂꍇ͈x"Add Sub DataNode"A"Add Third DataNode"
      IP:PORTLqUPDATE{^ȂƍXVɎs
      ܂AMainDataNode₷Ƃ͏oȂB
    MasterNode̐ݒ͑Sm[hModConsistentHasĥǂ炩ɓꂳĂKvB
      ]ModASYŕۑf[^ConsistentHashɈڍs͏oȂB
    ModASY͏]ʂ̊em[heLXgBox̍Ōɒǉm[h"IP:PORT"LqUPDATE{^

    MasterNode.properties̈ȉ̐ݒ荀ڂŐ\
    DistributionAlgorithm
        ݒl) "mod"=ModASY
                "consistenthash"=ConsistentHashASY
        Lq)
             DistributionAlgorithm=mod


  DataNodẽvP[V2m[hɕύX
    ]KeyMapNodesInfoɑ΂SubKeyMapNodesInfovP[VƂȂ2m[hŃf[^vP[V
    ĂAVThirdKeyMapNodesInfo݂B
    ThirdKeyMapNodesInfoLqƁAvP[Vs3m[h1gDataNodeƂċ@\B
    3m[hSĂ~ȂΉғ\łB
    3ڂ̃m[hɑ΂getñANZXMainASubǂ炩̃m[h~Ȃ͍sȂB
      getñANZX͐ғĂ2m[hɌ肳B

    MasterNode.properties̈ȉ̐ݒ荀ڂŐ\
    ThirdKeyMapNodesInfo
        ݒl) "IP:PORT"

        Lq)
             ThirdKeyMapNodesInfo=localhost:7553,localhost:7554


  f[^擾̈ѐ[hǉ
    f[^擾ɃvP[V̏Ԃɍ킹Ď擾f[^̈ѐӎ擾\B
    [h3ނƂȂB
    Eѐ:_ɃCAvP[V̂ǂ擾(ClientڑgpĂԂ1m[hɌŒ肳)
    Eѐ:KŌɕۑ郌vP[Vm[h擾
    Eѐ:CAvP[V̒l؂AVf[^Ԃ(Б폜Ăꍇ̓f[^L肪Ԃ)

    MasterNode.properties̈ȉ̐ݒ荀ڂŐ\
    3ڂ̃m[hɑ΂getñANZXMainASubǂ炩̃m[h~Ȃ͍sȂB
      getñANZX͐ғĂ2m[hɌ肳B
    DataConsistencyMode
        ݒl) "0"
                "1"
                "2"
 
        Lq)
             DataConsistencyMode=1


  [hoX̐U镪̊ݒ\
    [hoXݒ肪truȅꍇɏ]݂͌ɃCƃvP[Vm[hɃANZX悤
    U蕪ĂAU蕪銄ݒł悤ɕύX

    MasterNode.properties̈ȉ̐ݒ荀ڂŐ\
    3ڂ̃m[hɑ΂getñANZXMainASubǂ炩̃m[h~Ȃ͍sȂB
      getñANZX͐ғĂ2m[hɌ肳B
    BalanceRatio
        ݒl) "7:3"=U蕪銄(Cm[h:vP[Vm[h)
                L̏ꍇ73̊

        Lq)
             BalanceRatio=7:3


  ʐM啝
    NCAg<->MasterNodeAMasterNode<->DataNodeԂ̒ʐMC
    Xeon3430(2.4GHz)~1A4GBx̃}V(CentOS5.4 64bit)10bxɊԂɏ
    10000NCAg܂ŐڑڑRlNVset,getJn铯ڑeXgŊmFB
    (C10KɑΉ)
    NCAg͖̏ꍇ60bŎIɐؒf
    ɔȉ̐ݒ荀ڂŒʐM̃p[^ύX`[jO\

    MasterNode.properties̈ȉ̐ݒ荀ڂŐ\
    MasterNodeMaxConnectParallelExecution
        ݒl) l=ڑɐڑɍsSocketbv̕

        Lq)
             MasterNodeMaxConnectParallelExecution=10


    MasterNodeMaxConnectParallelQueue
        ݒl) l=MasterNodeMaxConnectParallelExecutionŐݒ肵񏈗ւ̈ݒ肳L[
 
        Lq)
             MasterNodeMaxConnectParallelQueue=5


    MasterNodeMaxAcceptParallelExecution
        ݒl) l=NCAgf[^]nĂȂmFB

        Lq)
             MasterNodeMaxAcceptParallelExecution=15

    MasterNodeMaxAcceptParallelQueue
        ݒl) l=MasterNodeMaxAcceptParallelExecutionŐݒ肵񏈗ւ̈ݒ肷L[

        Lq)
             MasterNodeMaxAcceptParallelQueue=5


    MasterNodeMaxWorkerParallelExecution
        ݒl) l=f[^]JnԂSocketo^ɑ΂ď񏈗B

        Lq)
             MasterNodeMaxWorkerParallelExecution=15


    MasterNodeMaxWorkerParallelQueue
        ݒl) l=MasterNodeMaxWorkerParallelExecutionŐݒ肵񏈗ւ̈ݒ肷L[

        Lq)
             MasterNodeMaxWorkerParallelQueue=5


    DataNode.properties̈ȉ̐ݒ荀ڂŐ\
    KeyNodeMaxConnectParallelExecution
        MasterNodeMaxConnectParallelExecutionƓl

    KeyNodeMaxConnectParallelQueue=5
        MasterNodeMaxConnectParallelQueueƓl

    KeyNodeMaxAcceptParallelExecution=20
        MasterNodeMaxAcceptParallelExecutionƓl

    KeyNodeMaxAcceptParallelQueue=5
        MasterNodeMaxAcceptParallelQueueƓl

    KeyNodeMaxWorkerParallelExecution=15
        MasterNodeMaxWorkerParallelExecutionƓl

    KeyNodeMaxWorkerParallelQueue=5
        MasterNodeMaxWorkerParallelQueueƓl


  eXgP[Xǉ
    [XexecTest.batsgetAset̃\bheXgƁADataNodeċÑeXgs
    ̃c[WindowsCygwinCXg[ACygwinbinPATHʂĂzłB
    Ȋł܂B
    [Xclasses\Test.propertiesȂ̃pXKȒlɏĂB

========================================================================================================
========================================================================================================
[New - @\P]
[[[X Ver 0.7.0 - (2010/06/27)]]
  MasterNode𕡐N璷ꍇ̎GXJ[V@\ǉ
    ]MasterNode𕡐ŏ璷͏oȀꍇMasterNodeɃCƂȂm[h݂A
    c̃}X^[m[h̓X[uƂB
    C̃m[h_Eꍇ́AX[um[hɃANZX΃f[^̎擾Ao^A폜SĂ
    NCAg͎słADataNode̊ĎAf[^m[h_E̋Ñf[^Jo[
    X[uMasterNodeł͎sȂB
    ̏ꍇ́AX[uMasterNode̓1CX^XMasterNode.properties̐ݒl
    "MainMasterNodeMode""true"ɕςKvB
    ̉CŃCMasterNode_Eꍇ̓X[uMasterNode玩I1CX^X
    CMasterNodeɏi悤ɉCB
    ̉CɂMasterNode.propertiesɐݒ荀ڂǉA]̐ݒ荀ڂgp\ł͂邪AȂȂB

    ǉꂽڂ͈ȉ
      ESystemConfigMode
        ) ݒ擾ꏊ(file or node)
              ݒ{t@CNQƂ邩AN͖{t@CxQƂA
              Ȍ́ADataNodeɓo^ĂݒQƂ邩肷
              "file"̏ꍇ͖{t@CQƂ
              "node"̏ꍇDataNodeQƂ
              ݒȂꍇ"node"ƂȂ
        Lq)
             SystemConfigMode=node


      EMyNodeInfo=127.0.0.1:8888
        ) g̏
              gIPƋN|[gԍ":"؂ŋLq
              gp𐄏
              ̐ݒ肪Ȃꍇ̓CMasterNode̎i@\@\Ȃ
        Lq)
             MyNodeInfo=127.0.0.1:8888


      EMainMasterNodeInfo
        ) C}X^[m[h̏
              NɃCMasterNodeƂĔFm[hIPƃ|[gԍ
              gCMasterNodȅꍇ͎g̏Lq
              gp𐄏
        Lq)
             MainMasterNodeInfo=127.0.0.1:8888


      EAllMasterNodeInfo
        ) SẴ}X^[m[h̏
              SẴ}X^[m[h̏"IP:PORTԍ"tH[}bg","؂ŋLq 
              g̏MyNodeInfoݒ̓eƓł邱
              ł̋LqŃCMasterNodeƂċ@\
              gp𐄏
              ̐ݒ肪Ȃꍇ̓CMasterNode̎i@\@\Ȃ
        Lq)
             AllMasterNodeInfo=127.0.0.1:8888,127.0.0.1:8889,127.0.0.1:11211

    gpȂȂ
      EMainMasterNodeMode
      ESlaveMasterNodes


  MasterNodegpݒMasterNode.propertiesQƂ邾łȂA
    DataNodeɐݒi[炩QƂ悤ɉC
    ]ݒMasterNode.properties˂ɎQƂĂAݒDataNodeɊi[
    悤ɉCASMasterNodeLɉC
    ANDataNodȅ񂪕Ȃ߁AMasterNode.propertiesQƂ
    ]ʂAMasterNode.propertieŝ݂ŉ^p邱Ƃ\
    ̐ݒύXɂMasterNode.properties̈ȉ̐ݒ荀ڂŕύXoB
    ǉꂽ
      ESystemConfigMode
        ) ݒ擾ꏊ(file or node)
              ݒ{t@CNQƂ邩AN͖{t@CxQƂA
              Ȍ́ADataNodeɓo^ĂݒQƂ邩肷
              "file"̏ꍇ͖{t@CQƂ
              "node"̏ꍇDataNodeQƂ
              ݒȂꍇ"node"ƂȂ
        Lq)
             SystemConfigMode=node



  okuyamaǗWebR\[AvP[Vǉ
    ғokuyamȁ󋵊mFƐݒ̕ύXołWebAv쐬B
    [XexecOkuyamaManager.batsƊǗWebAvNB

    URL : http://N}VIP:10088/okuyamamgr
    ŃANZXłB

    execOkuyamaManager.batŋN|[gԍ(10088)WebAvQƂMasterNodeIP:PORT","؂œnĂ܂B
      MasterNodȅMasterNode.properties̐ݒ"AllMasterNodeInfo"̓eƓlɂĂB


========================================================================================================
========================================================================================================
[New - @\P]
[[[X Ver 0.6.6 - (2010/06/08)]]
  f[^m[hJo[̎擾Ao^A폜̏̑҂Ԃy
    f[^m[hAX[uf[^m[h̍\ŉғĂꍇAЕ̃m[h_EA
    NĂƁAБ̃m[h̃f[^畜郊Jo[sB]̏̓NCAg
    Ym[h̃f[^ɃANZXƃL[COĂ߁A҂ɏԂɂȂĂB
    ̕AJo[̑҂ƂȂ^C~O啝ɌyB
    ̂ƂɂokuyamȃgpԂɑ΂AX[vbgコꂽB
    ɁA]̃m[h̃f[^okuyamaŎgpĂf[^MapVACY
    oĂA̕gUNVOƓOɏo悤ɕύXB
    ̂ƂŃJo[̑vԂጸꂽB
    ̉P̓f[^m[hAX[uf[^m[hgpĉғĂꍇɗLłB

========================================================================================================
========================================================================================================
[New - @\P]
[[[X Ver 0.6.5 - (2010/05/30)]]
  Vacuum̎擾Ao^A폜̏płpɉC
    ]Vacuum͎擾Ao^A폜͏ubN悤ɂȂĂ(͑҂ԂɂȂ)
    ̃ubNԂ啝ɍ팸悤ɉCB
    ]ȂVacuumn܂ƏInubNĂApo悤(҂Ȃ)Ȃ
    okuyamȃgpԂɑ΂AX[vbgコB
    VacuumDataNode.properties"KeyManagerJob1.dataMemory=true"̗pvaluet@CɕۑĂ
      ꍇ̂ݗLƂȂB

  epropertiest@CɃRgǉ
    MasterNode.propertiesADataNode.propertiesATransactionNode.propertiesɃRg啝ɒǋL
    ܂ŃRgȂĐ\󂠂܂łB

  ReadMe.txtAReadMe-UTF.txt[@\ƃTv̎s@]A[Tv̎s@]ǋL
    TransactionNode̎gp@AMemcached݊ł̋N@ANCAg̎gp\\bhC
    ULockAsetNewValue(memcacheadd)̎gpTvǋL

========================================================================================================
========================================================================================================
[New - @\P]
[[[X Ver 0.6.4 - (2010/05/21)]]
  f[^̕ۑKeylۑ悤ɕύX
    ]Keyl琶HashlۑĂȂႢ\ł͂邪Փ˂N\ׁA
    ʂ̃f[^ۑɌȂ̂ŁAKeylƂĕۑ悤ɕύXB
    Keylɂ̐tB(2048byte)
    ̕ύXɂϐ\󂠂܂񂪁A]o[Wł̃f[^͎gpłȂȂ܂B

  AB
    

========================================================================================================
========================================================================================================
[New - @\ǉ]
[[[X Ver 0.6.3 - (2010/05/19)]]
  f[^m[hmemcachẽm[hƂėp\
    }X^[m[hNɒڃf[^m[hmemcachẽm[hƂėp\B
    ȉ̂悤ɐݒύXexecDataNode.batsmemcacheNCAgŃANZXłB

    ݒt@CDataNode.properties25s
    ----------------------------------
    KeyManagerHelper.Init=
              LLeɕύX
    KeyManagerHelper.Init=memcache
    ----------------------------------
    ƂċNmemcachevgRŉb\ƂȂB
    Ή\bh̓}X^[m[hmemcache[hƂċNꍇƓlƂȂB
    (Eset, Eget, Eadd, Edelete)(flagɑΉ)

    t@Cւ̃f[^i\
    ݒt@CDataNode.properties30sځA31s
    ----------------------------------
    KeyManagerJob1.memoryMode=false       
    KeyManagerJob1.dataMemory=true
    ----------------------------------
    L̐ݒŃgUNVO͎cAo^ꂽf[^̓ɕێ
    trueɂƊS[h(łɉғ)(P̂memcacheƂقړx̏xo)
    falseɂƊSt@C[h(łʂ̃f[^(ValuẽTCY)ێ\)

    ftHgł2560oCgvalueTCY̍őlƂȂ̂ŁAsrc\org\imdst\util\ImdstDefine.java150sڂ
    ύXcompile.batsRpCƋełf[^TCYύXłB


  KeylHashl߂郍WbNύX
    okuyamał͓o^ꂽKeyl̓nbVl߂Ă̒lۂ̓o^ɎgpĂ邪A
    ̒l̐WbNAnbVlU悤ɕύX
    ̕ύXɂA܂œo^f[^͑SĔjKv܂B
    ̕ύX󂯓Ȃꍇsrc\org\imdst\helper\MasterManagerHelper.java2660sځA2661sڂ
    ȉ̂悤ɕύXAcompile.batsăRpCsB
    --------------------------------------------------------------------
    private int hashCodeCnv(String str) {
        return new HashCodeBuilder(17,37).append(str).toHashCode();
        //return str.hashCode();
    }
               ύX(RgAEgւ)
    private int hashCodeCnv(String str) {
        //return new HashCodeBuilder(17,37).append(str).toHashCode();
        return str.hashCode();
    }
    --------------------------------------------------------------------


  f[^o^\bhsetValuȅx20%
    f[^m[hAX[uf[^m[hNsetValuesۂ̏x
    20%Bf[^m[hւ̓o^NGXgMɃX[uf[^m[hւ̑M悤ɏCB


  oOFix
    

========================================================================================================
========================================================================================================
[New - @\ǉ]
[[[X Ver 0.6.2 - (2010/05/09)]]
  MemcahevgR[ḧȉ̏Ή
    1.memcachẽ\bhładdɑΉ
      o^f[^̏ꍇ̂ݓo^\memcacheaddR}hɑΉ

    2.memcachẽ\bhłdeleteɑΉ
      memcacheR}hłf[^폜pR}hdeleteɑΉ

    3.memcacheflago^ɑΉ
      memcacheR}hsetAaddɎw肷flagɑΉ
      getɓo^flagԋp

  f[^m[hԂ̃f[^Jo[̃f[^]ꕔύX
    ]̓m[h_ẼJo[ɃvP[Vm[h1ʐMőSĂ̓o^f[^擾ĂA
    ł͑傫ȃf[^o^ĂꍇɁAMAMŃɂ̂肫炸ɃJo[Ɏsꍇ
    ߁Agp\ȃ̎cʂmFȂAf[^𕪊ē]Jo[悤ɕύX
    f[^̕ۑł͂Ȃt@CɂĂꍇ́Aɂ̖͔\B

  PHPpNCAg(OkuyamaClient.class.php)getByteValue\bhǉ
    JavapNCAgœo^oCgf[^(setByteValueœo^f[^)擾ۂɎgp

  oOFix

========================================================================================================
========================================================================================================
[New - @\ǉ]
[[[X Ver 0.6.1 - (2010/04/21)]]
  f[^݂Ȃꍇ̂ݕۑł郁\bhǉ
    +o^̃L[lłꍇ̂ݓo^\ƂȂAɓo^ς݂̏ꍇ͓o^łȂB

     *o^̏ꍇ̂ݓo^\ȃ\bh͈ȉłB
      ENCAg̃\bh:setNewValue
      E1:Keyl
      E2:Valuel
      E߂l:String[] vf1(f[^L):"true" or "false",vf2(s̓bZ[W):"bZ[W"

      ENCAg̃\bh:setNewValue
      E1:String Keyl
      E2:String[] taglz
      E3:String Valuel
      E߂l:String[] vf1(f[^L):"true" or "false",vf2(s̓bZ[W):"bZ[W"

  NCAgڑɕۑoőf[^TCYMasterNode擾悤ɕύX

  oOFix

========================================================================================================
========================================================================================================
[New - @\ǉ]
[[[X Ver 0.6.0 - (2010/04/08)]]
  UbN@\ǉ
    +Cӂ̃f[^bN@\ǉB
    +UbN@\̓}X^[m[hpݒt@CłAMasterNode.properties9sڂ"TransactionMode=true"
     bN@\gp\ƂȂB
     ܂A72sڂ"TransactionManagerInfo=127.0.0.1:6655"TransactionManagerm[hw肷Kv
     āATransactionManagerm[hNĂKv邽߁AexecTransactionNode.batŋNB
     UbN@\gpꍇ́ASẴ}X^[m[h"TransactionMode=true"ŋNĂKvB
     ̐ݒt@C͑SĕUbN@\ŋNݒƂȂB
     execMasterNodeMemcached.bat͕UbN@\AmemcachevgR[hŋNB
     ܂A]̕UbN@\ȂŋNꍇ́A"TransactionMode=false"ƂexecMasterNode.batsB

    +dg݂ƂẮAClient烍bN擾˗sꍇATransactionManagerm[hɎw肵Keyl
     bNグB̍ہAłɕClient瓯KeylŃbN擾Ăꍇ́A
     w肵Ԃ̊ԁAbN̂҂A擾݂B
     bNꂽlɑ΂āAset,removeñANZXsꍇ́ATransactionManagerm[hɑ΂ĊY
     KeylANGXg𔭍sClientȊO烍bNĂ邩₢킹āAʃNCAgbN
     Ăꍇ́AbN̂҂B
     NCAgbNẮAbNȂꍇ́Â܂܏𑱍sB
     bÑ[XłB
     ȂAUbN@\Lɂꍇ́AƔ1ʐM邽߁Ax͗B
     ܂ATransactionManagerm[hSPOFƂȂ邪A@\ĂȂꍇ͖ĉғ邪A
     x͋ɒ[ɗ򉻂B
     ASPOFƂȂȂ悤ɉP\łB

    +ȉ͐ƂȂ
     *bN{f[^͈̋ȉƂȂB
      EbN\Keyl(f[^)͌ݓo^ς݂łĂAo^ĂȂĂ\łB
      E1NCAg瓯ɕ̃f[^bN\ł
      EbNf[^̓bN{NCAĝ݃bN\łB
      EbÑf[^̓bN{NCAĝݓo^\łB
      EbÑf[^̓bN{NCAĝݕύX\łB
      EbÑf[^̓bN{NCAĝݍ폜\łB
      EbÑf[^͑SNCAgQƉ\łB
 
     *bN@\gpJn\bh͈ȉłB
      ENCAg̃\bh:startTransaction
      EȂ
      E߂l:boolean true:X^[g false:X^[gs
        bN@\LTransactionManagerm[hNĂȂꍇ́AX^[gɎsB
          
     *bN\bhւ̈Ɩ߂l͈ȉłB
      ENCAg̃\bh:lockData
      E1:bNΏKeyl
        2:bNp
              (bNsȂꍇłAł̐ݒ莞Ԃo߂ƎIɉB
               Pʂ͕bB
               0ݒ肷ƃbN{NCAg܂ŉivɃbNB
               0w͐Ȃ)
        3:bN擾҂
              (ɕʃNCAgbÑf[^փbN{ꍇɁAݒ莞Ԃ̊ԃbN擾gCB
               Pʂ͕bB
               0ݒ肷1񃍃bN݂)
 
      E߂l:Stringz
               Stringz[0]:Lock "true"=Lock or "false"=Locks
 
     *bNJւ̈Ɩ߂l͈ȉłB
      ENCAg̃\bh:releaseLockData
      E1:bNΏKeyl
 
      E߂l:Stringz
               Stringz[0]:J "true"=J or "false"=Js

     *bN@\gpI\bh͈ȉłB
      ENCAg̃\bh:endTransaction
      EȂ
      E߂lȂ

    +JavaŁAPHPł̃NCAǵAbNA[X\
     MemchacheNCAg̓bNA[X@\͗płȂALock̃f[^setsꍇ"҂"ɓB

   ImdstKeyValueClientgp)
                                                                                                           
    // NCAgCX^X쐬                                                                        
    ImdstKeyValueClient client = new ImdstKeyValueClient();                                                
    // ڑ                                                                                                
    imdstKeyValueClient.connect("127.0.0.1", 8888);                                                        
    // TransactionJnăf[^LockAf[^XVA擾ALock                               
                                                                                                           
    // LockΏۂKeyl, Lockێ(b)(0͖), LockɎ擾Ăꍇ                  
    // 擾gC鎞(b)(01擾݂)                                                    
    ImdstKeyValueClient imdstKeyValueClient = new ImdstKeyValueClient();                                   
    imdstKeyValueClient.connect(args[1], port);                                                            
    String[] ret = null;                                                                                   
                                                                                                           
    // Lock                                                                                            
    if(!imdstKeyValueClient.startTransaction()) throw new Exception("Transaction Start Error!!");          
                                                                                                           
    long start = new Date().getTime();                                                                     
                                                                                                           
    // Locks                                                                                            
    // "DataKey"ƂKeyl10bԈێ郍bN쐬BɃbNĂꍇ́A5bԃbN擾 
    // JԂ                                                                                            
    ret = imdstKeyValueClient.lockData("DataKey", 10, 5);                                                  
    if (ret[0].equals("true")) {                                                                           
        System.out.println("Lock");                                                                    
    } else if (ret[0].equals("false")) {                                                                   
        System.out.println("Locks");                                                                    
    }                                                                                                      
                                                                                                           
                                                                                                           
    // ȉ̃RgAEg͂āARpCA                                                      
    // ʂ̃NCAgXVsƁAXVłȂ̂킩                                        
    //Thread.sleep(5000);                                                                                  
                                                                                                           
    // gŃbNĂ̂ōXV\                                                                    
    if (!imdstKeyValueClient.setValue(args[3], "LockDataValue")) {                                         
      System.out.println("o^s");                                                                      
    }                                                                                                      
                                                                                                           
    // 擾                                                                                                
    ret = imdstKeyValueClient.getValue(args[3]);                                                           
    if (ret[0].equals("true")) {                                                                           
        // f[^L                                                                                      
        System.out.println("Lockɓo^f[^[" + ret[1] + "]");                                      
    } else if (ret[0].equals("false")) {                                                                   
        System.out.println("f[^Ȃ");                                                                  
    } else if (ret[0].equals("error")) {                                                                   
        System.out.println(ret[1]);                                                                        
    }                                                                                                      
                                                                                                           
    // gŃbNĂ̂ō폜\                                                                    
    ret = imdstKeyValueClient.removeValue(args[3]);                                                        
                                                                                                           
    if (ret[0].equals("true")) {                                                                           
        // f[^L                                                                                      
        System.out.println("Lockɍ폜f[^[" + ret[1] + "]");                                      
    } else if (ret[0].equals("false")) {                                                                   
        System.out.println("f[^Ȃ");                                                                  
    } else if (ret[0].equals("error")) {                                                                   
        System.out.println(ret[1]);                                                                        
    }                                                                                                      
                                                                                                           
    // LockJ                                                                                            
    ret = imdstKeyValueClient.releaseLockData(args[3]);                                                    
    if (ret[0].equals("true")) {                                                                           
        System.out.println("LockJ");                                                                
    } else if (ret[0].equals("false")) {                                                                   
        System.out.println("LockJs");                                                                
    }                                                                                                      
                                                                                                           
    long end = new Date().getTime();                                                                       
    System.out.println((end - start) + "milli second");                                                    
                                                                                                           
    // gUNVJ                                                                                
    imdstKeyValueClient.endTransaction();                                                                  
    // ڑؒf                                                                                            
    imdstKeyValueClient.close();                                                                           
   

  ̃oOC

  ́AUgUNV悤Ɏi߂B
========================================================================================================
========================================================================================================
[New - @\ǉ]
[[[X Ver 0.5.2 - (2010/03/28)]]
  MemcachevgRɈꕔΉ
    KVS̕WvgRɂȂAmemcachẽvgRɑΉ郂[hǉ
    MasterNode.properties14s"MasterManagerJob.Option=""MasterManagerJob.Option=memcache"Ƃ
    memcachevgRŃANZX\łB
    MasterNode2.propertiesmemcachep̐ݒt@CɂȂĂB
    execMasterNodeMemcached.batsmemcachevgRŗオB
    Ή\bhsetgetłB܂set,getflag0̂ݑΉĂB
    Ή͈͂𑝂₷\B

  f[^ۑ`t@C(DataNode.properties30sځA33sڂfalseƂꍇ)ɂꍇɁA
    ǋL^ŋLĂ邽߁At@Ciɔ剻邽߁Avacuum@\ǉB
    IɎsB

  documetfBNgǉ
    \]{ƁA\}zu

========================================================================================================
========================================================================================================
[New - @\ǉ]
[[[X Ver 0.5.1 - (2010/03/17)]]
  PHPp̃NCAg쐬
    PHPMasterServerփANZXo悤ɃNCAg쐬B
    JavãR[hĂȂ܂B
    oCgf[^o^(setByteValue)A擾(getByteValue)郁\bĥݖB
    [Xetc_client\OkuyamaClient.class.phpɂȂ܂B
    TvsR[hetc_client\PhpTestSock.phpƁAspbatt@Cetc_client\PhpAutoTest.bat𓯍܂B

  ReadMe.txtAReadMe-UTF.txtŐV̏ԂɍXV

  ReadMe.txtAReadMe-UTF.txt"[[[X Ver 0.5.0 - (2010/03/17)]]"̋Lq~X
    ӏ͈ȉ
    -------------------------------------------------------------------------------------------------------------------------------------------
    TestSockTvScripts[h̃o[Wǉ( "2.3" Scripts)
    E擾AsTvN@
    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';"
                                                                        ^^^
                                                                127.0.0.1 8888
    -------------------------------------------------------------------------------------------------------------------------------------------

========================================================================================================
========================================================================================================
[New - @\ǉ]
[[[X Ver 0.5.0 - (2010/03/17)]]
  f[^擾JavaScripts\ȃC^[tF[Xǉ
    ImdstKeyValueClientgetValueScript\bhŎs\B
    f[^擾JavaScriptŋLqXNvgKeylƓɓnAKeylValuel擾oꍇA
    ̒lɃXNvgšʂ擾łB
    XNvgŁAԋpĽyсAԋpl(Value)ݒ肷邱ƂoB
    XNvg̓f[^m[hŎs邽߁A܂Ŏ擾f[^ɑ΂ĉ̏ŉHorl̑Ó
    ؂ȂǂsĂꍇ́AXNvgŏsA擾}Ṽ\[X̐ߖA擾}V
    XybNz悤ȑK͂ȃf[^f[^m[h̃p[gpď\łB

    yXNvgLqz
     XNvg͈̐ȉ̖O̕ϐ錾KvB
    E "dataValue" = keylŎ擾ovaluelݒ肳BXNvgł͂̕ϐvaluelƂȂB
    E "execRet" = s(retValueϐ)NCAgɕԂƂw
                   (1ƕԋp 0ƕԋpȂ)
    E "retValue" = sʂi[BNCAgɕԂl

   ImdstKeyValueClientgp)
                                                                                                           
    StringBuffer scriptBuf = new StringBuffer();                                                           
    // XNvg쐬                                                                                    
    scriptBuf.append("var dataValue;");                                                                    
    scriptBuf.append("var execRet;");                                                                      
    scriptBuf.append("var retValue;");                                                                     
    // 擾Valuel"data"Ƃꍇ"dummy"ɒu                                      
    scriptBuf.append("retValue = dataValue.replace('data', 'dummy');");                                    
    // ԋpw                                                                                            
    scriptBuf.append("execRet = '1';");                                                                     
                                                                                                           
    // NCAgCX^X쐬                                                                        
    ImdstKeyValueClient client = new ImdstKeyValueClient();                                                
    // ڑ                                                                                                
    imdstKeyValueClient.connect("127.0.0.1", 8888);                                                        
    // Value擾yсAXNvgs˗                                                                 
    String[] retValue = imdstKeyValueClient.getValueScript("key1", scriptBuf.toString());                  
                                                                                                           
    // ʂ\                                                                                          
    // sʂ݂ꍇ"true"݂Ȃꍇ"false"AG[̏ꍇ"error"ԋp        
    System.out.println(retValue[0]);                                                                       
    // retValue[0]"true"̏ꍇ̓XNvg̕ԋplԋpB"error"̏ꍇ̓G[bZ[Wԋp
    System.out.println(retValue[1]);                                                                       
   

  TestSockTvScripts[h̃o[Wǉ( "2.3" Scripts)
    E擾AsTvN@
    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';"

  NCAgɃ}X^[m[h̎oVO[hyсA_E̍Đڑ@\ǉ
    ImdstKeyValueClientsetConnectionInfos\bhɐڑΏۂƂȂ}X^[m[h̐ڑz
    Zbg(tH[}bg"IP:PORTԍ"Stringz)AautoConnect\bhŐڑƁAm[hւ̐ڑ
    oȂꍇAڑ㏈rŐؒfꂽꍇȂǂAIɍĐڑғ邱ƂoB


  TestSockTvɎڑ[h̃o[Wǉ( "1.2"ڑœo^  "2.2"ڑŎ擾)
    Eo^TvN@
    java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 1.2 "127.0.0.1:8888,127.0.0.1:8889" 20000
    E擾TvN@
    java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 2.2 "127.0.0.1:8888,127.0.0.1:8889" 20000

    execMasterNode.batexecMasterNode2.bat𓯎ɎsԂŏLsāAБ~ẮA
      ĎsJԂĂAғ邱ƂmFł܂B

========================================================================================================
========================================================================================================
[New - @\ǉ]
[[[X Ver 0.4.0 - (2010/03/15)]]
 f[^m[h̓IǉT|[g
   }X^[m[hAf[^m[hNMasterNode.propertiesKeyMapNodesRuleAKeyMapNodesInfoA
   SubKeyMapNodesInfoɐVȃm[h̋LqǋLۑƁAIɃt@Cēǂݍ݂A
   f[^AX[um[hǉB
   ݒt@C͍ĕۑƂقڃA^Cɔf邽߁AۑOɊYm[hNĂKvB
    ݒ                                                m[hǉ
    MasterNode.properties   MasterNode.properties
   KeyMapNodesRule=2                                   KeyMapNodesRule=4,2                                                             
                                                                                                                                       
   KeyMapNodesInfo=localhost:5553,localhost:5554     =>KeyMapNodesInfo=localhost:5553,localhost:5554,localhost:6553,localhost:6554     
                                                     ۄ                                                                                
   SubKeyMapNodesInfo=localhost:5556,localhost:5557  SubKeyMapNodesInfo=localhost:5556,localhost:5557,localhost:6556,localhost:6557                          
                                                                                                                                       
     

 f[^m[hǉɐVm[hփf[^̈ڍss@\ǉ
   f[^m[hǉɉߋf[^m[h䐔^p̃f[^ɃANZX^C~OŒǉm[h
   Cf[^m[hAX[uf[^m[hփf[^Iɕۑ悤ɂAȌߋ̃f[^ۑm[h
   ANZXsȂ悤ɋ@\ǉB
   m[hǉsƎIɃf[^ANZXɍsB

 f[^m[hւ̃ANZXCf[^m[hAX[uf[^m[hԂŃoVOo郂[hǉ
   MasterNode.propertiesLoadBalanceMode̐ݒtrueɂƃoVOsB
   CƁAX[uŐ\傫قȂꍇ̓oVOsȂقǂꍇB
   U蕪͒PȃEhrłB

 }X^[m[h𕡐ғAוUA璷o@\ǉ
   ܂ł́A}X^[m[h1\ASPOFƂȂĂׁANo悤ɋ@\ǉB
   }X^[m[h1`nł̍\\A1͕K}X^[m[hł̃CɂȂȂ΂ȂȂB
   ŔAf[^m[h̐Ďƕ̃Jo[ׂ̈łB
   Jo[́ASẴ}X^[m[hĉғ邽߁As͔Ȃ\ƂȂĂB
   MasterNode.propertiesMainMasterNodeModeC̏ꍇtrueƂAX[ȕꍇfalseƂB
   ܂AX[ũ}X^[m[h̃lbg[N̖OƉғ|[gԍSlaveMasterNodesɃJ}؂ŗ񋓂B
   璷ȂꍇMainMasterNodeMode=trueƂ邾ł悢B

  [X\(src or classes)\MasterNode.properties(Cp) [X\(src or classes)\MasterNode2.properties(X[up)
  MasterNode.properties       MasterNode2.properties 
 MainMasterNodeMode=true                                 MainMasterNodeMode=false                          
                                                                                                           
 SlaveMasterNodes=127.0.0.1:8889                         SlaveMasterNodes=                                 
                                                                                                           
       

   C̃}X^[m[hŁAf[^m[h̊ĎAsAC̃}X^[m[hғoȂԂ
   Ȃꍇ́AX[ũ}X^[m[h̐ݒt@Cȉ̂悤ɏčĕۑƁA
   X[ũ}X^[m[hC̃}X^[m[hɕύXĉғn߂B
  MasterNode2.properties   
 MainMasterNodeMode=true                               
                                                       
 SlaveMasterNodes=(ʂ̃}X^[m[hꍇ͋Lq) 
                                                       
 
   SlaveMasterNodesɗ񋓂m[hғĂȂĂACm[hғB
   IɃX[uCɏi悤Ɍقǎ\B
   ImdstKeyValueClientɕ̃}X^[m[hݒł悤ɂA
     oVOAڑłȂꍇ̎ʃm[hĐڑ@\Ȃǂقǎ\B

 Nbatt@Cǉ
   execMasterNode2.bat <=X[u}X^[m[hNR}h
   execMasterNode.bat݂̂ł̉ғ͏]Ɠ悤ɉ\
========================================================================================================
========================================================================================================
[New - @\P]
[[[X Ver 0.3.3 - (2010/03/12)]]
 f[^m[hm̃f[^Joɏ]͋Ñm[h̃f[^ċNĂm[h
   ŃJoĂAf[^̓o^A폜Ɏ{̗vfǉAJoɎ{
   mFAVm[h̃f[^K悤ɉPB

========================================================================================================
========================================================================================================
[New - sC&TvR[hǉ]
[[[X Ver 0.3.2 - (2010/03/10)]]
 萔Key-Value𓯂TagɕRtĕۑƐoȂsC

 TestSockɃL[lw肵č폜郂[hǉ("8")
   java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 8 127.0.0.1 8888 KeyName1
   L127.0.0.1̃|[g8888ԂŋNĂ}X^[m[hɐڑA"keyName1"ƂKeylŕۑ
  f[^폜B
========================================================================================================
========================================================================================================
[New - 폜\bh&f[^ۑƃt@CIł悤ɋ@\ǉ]
[[[X Ver 0.3.0 - (2010/03/4)]]
 폜\bhǉ
   ImdstKeyValueClientremoveValue\bhɂČĂяo\
   ^[lgetValueƓlŌʕ("true" or "false")ƍ폜łꍇ͑Ώۂ̒li[ꂽz
   TestSock"7"ԎwŌĂяo\
   ---------------------------------------------------------------------------------------------------
   java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 1 127.0.0.1 8888 100         <= 100o^
   java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 7 127.0.0.1 8888 50         <= 50폜

 f[^ۑ`ƃt@CI\
   ܂ł̃o[Wł͉ғ̓f[^͏KeyValue̊֌WŃɕێĂB
   o^̃gUNVL^t@CƁAIȃ̃t@CoŉiۂĂA
   t@Co[hłKeŷ݃ɕێf[^̓t@CɃXgA邱ƂB
   ɂ胁ł̏Ȃ邱Ƃ\łAeXgłJVMIvV-Xmx256mƂ
   DataNode400ȏ̃f[^i[oB
   (Keyl̒DataNodei[͉eȂAQl"datasavekey_1"`"datasavekey_4000000"ƂKeyl)
   A܂Ő݂ĂȂi[f[^ɐ񂪏oB
   ݊i[łValuẽTCÝA512bytełB
   ȏ̃f[^i[ꍇ́AImdstKeyValueClientsetByteValue\bhgp邱ƂƂȂB
   512̎wύXꍇ͈xSẴf[^t@C(Tvł.\keymapfilefBNg̃t@C)
     Sč폜ĂAImdstDefinesaveDataMaxSizeύX邱ƂőΉ\B
   f[^t@Cۑ@͒ǋL^ƂȂ̂ŁAoL[\bh\B
   ƃt@C̐؂ւDataNode.properties
     "KeyManagerJob1.dataMemory=false" <=t@C
     "KeyManagerJob1.dataMemory=true"  <=
     Ő؂ւ\

========================================================================================================
========================================================================================================
[New - MasterNodeœK&\]̃eLXgYt]
[[[X Ver 0.2.2 - (2010/02/24)]]
 MasterNodẽWbNœKB
   œKcӏ͂܂cĂB

 œKOƌŁAȒPɐ\𑪒B茋ʂeLXgƂēYt
========================================================================================================
========================================================================================================
[New - sC]
[[[X Ver 0.2.1 - (2010/02/11)]]
 Jo[̋CB
   ~m[hÑ^C~OɂĐf[^Jo[ȂsCB

 src\MasterNode.propertiesɃRgǉB
========================================================================================================
========================================================================================================
[New - @\ǉ]
[[[X Ver 0.2.0 - (2010/02/08)]]
 vP[VyсAJo[@\ǉ
   f[^m[hNbVVXe̋@\~h~B

 [ǉ@\ڍ]
  1. 1̃f[^𕡐̃f[^m[hɓo^悤@\ǉ(vP[V)
     Uo^sƂŁAIɃf[^̕sAS̍UKVSւƐi܂B

  2. Jo[@\
     1.̋@\gpĂꍇACf[^m[hNbVꍇACf[^m[hAA
     X[um[h(vP[Vm[h)玩IɃf[^𕜌܂B
     X[um[hNbVꍇAA㎩IɃCf[^m[h畜܂B

  3. L2̋@\gpĂꍇ̓m[h~VXe̒~ȂɎgp\
     f[^m[hNbVX[um[h(vP[Vm[h)ւ̎ڍss邽߁A
     gpVXe̒~܂B

  L̎gp@́Asrc\MasterNode.propertiesQƂĂB
  execMasterNode.bat̓}X^[m[hN܂B
  execDataNode.bat̓Cf[^m[hN܂B
  execSlaveDataNode.bat̓X[uf[^m[hN܂B
========================================================================================================


XybN
 :Java(jdk1.6ɂĊJ)
 \[XGR[fBO:UTF-8
 쌟OS:WinsowsXp SP3ACentOS 5.3(final)
 KvCu:log4j-1.2.14.jarAjavamail-1.4.1.jar(JavaMail Ver1.4.1)
 Version:0.6.5(2010/05/30)


@\ƃTv̎s@
[@\]
1.Key-ValueXgA
  Key-ValueXgA܂B
  Key͕AValue͕ƁAbytef[^̗o^\łB

2.Tag@\
  Key̑Tago^ł܂B
  Tag͕ƂȂ܂B
  XgAłKey̓j[NȒlƂĈ܂ATag͕̃f[^ɕRt
  Ƃo܂B
  f[^ɂ炩ߔCӂTagt邱ƂŁATagwɂ
  xɊ֘Af[^擾\ƂȂ܂B
  ݂TagwŊ֘Af[^Keyz񂪎擾ł܂B


4.IłAiꂽf[^
  f[^̓o^NCAg߂AƂ̃f[^2̃f[^m[hɓo^܂
  o^̂ꂩ́AKeyl̓(1)ƃt@C(2)ɁAValuel̓t@C(3)ɂ̂ݓo^܂B
  Valuel(1,4)ɂ̂ݓo^邱Ƃ\łB
  L2ȊOɃgUNVOɃt@Cɓo^Ă܂B
  f[^m[h_EĂۑꂽKeylt@C񂩂畜邩A
  Keyl̃t@Cւ̔f͒Ił邽߁ÅԂŕۑOɃ_E͔jĂꍇ́A
  gUNVO畜܂B

  1.o^f[^͊ef[^m[h1ConcurrentHashMapɊi[܂B
      f[^̓o^Ao͑SĂs܂B
  2.t@CVXeɕۑf[^́AIɕۑConcurrentHashMap
      VACYf[^ƁAf[^o^̃OƂȂ܂B
      VACYf[^̓o^̓f[^o^A擾Ƃ͔񓯊ɂĎs܂B
  3.Valuel͌Œ蒷LFs1t@Cɏ܂܂B
      L^͒ǋL^ƂȂ܂B
      Keyl͂Valuel̍ŐV̈ʒuĂ܂B
  4.DataNode.properties"KeyManagerJob1.dataMemory"̒lŕύX\
      trueŃێAfalseŃt@Cۑ
      ǂ̏ꍇgUNVO͕ۑ̂ŁAs̃_Eɂf[^̕ɂ͉e͂܂B
      KeyManagerJob1.memoryMode=truȅꍇ͕܂


5.U^
  uokuyamav̓}X^m[hAf[^m[hAgUNVm[hANCAg4ō\܂B
  ꂼ̖ڂ͈ȉłB
  }X^m[h:Eݒ肳ꂽASY(1)ɏ]āANCAg̃f[^˗K؂
                 f[^m[hɈ˗܂B
               E1̃f[^2̃f[^m[hɃvP[V܂
                 擾ɊYf[^m[h_EĂꍇAvP[Ṽf[^m[h擾܂B
                 ܂Af[^m[h2ƂғĂꍇ́A𕪎UוUs܂B
                 f[^o^1̃f[^m[h_EĂꍇ̃m[hɕۑ𑱍s܂B
               Eł̏璷\łB
                 ŉғꍇ́AMasterNodełMainm[h肷KvB
               E~Ȃł̓Iȃf[^m[h̒ǉ܂B
                 f[^m[hǉꍇA܂łɓo^f[^ւ̃ANZX͓悤ɉ\łB
               EDataNode̐ĎA_E̕Ƀf[^ғm[h玩Jo[܂B
                 Jo[̓f[^̕sȂ悤ɓ܂B
                 1.Ǘf[^m[h̐ɈˑȒPȃASYłB
               Eݒt@Csrc\MasterNode.properties


  f[^m[h:Eł̍\\
               EL[ƃf[^̑gݍ킹Ńf[^ۑ܂B
                 f[^̓o^AoA폜C^[tF[X܂B
               Egł͑m[hւ̃f[^̐U蕪Ȃǂ͍sȂ܂B
               Eݒt@Csrc\DataNode.properties

  gUNVm[h:EULock(TransactionMode)gpꍇLockێAǗ܂B
                           TransactionModegpĂāÃm[h_EƋɒ[ɃX[vbg_E܂B
                           C\B
                         Eݒt@Csrc\TransactionNode.properties

  NCAg:E}X^m[hւ̒ʐMsۂ̃vOC^[tF[XłB
               E}X^[m[h̏𕡐Zbg邱ƂŎUA}X^[m[h_E
                 ʃm[hւ̎ĐڑȂ܂B
               EJavaPHPꂼ̃NCvO܂B
                 gp@͈ȉ̍̓[X̃TvvOTestSock.javáA
                 etc_clietn\PhpTestSock.phpQƂĂB
                 NCAg̃\[Xt@C
                 Javasrc\org\imdst\client\ImdstKeyValueClient.java
                 PHPetc_client\OkuyamaClient.class.php

               C^[tF[XƂẮA
               1.setValue(Keyl, Valuel)                 :[Key()Value()̑gݍ킹ł̃f[^o^]
               2.setValue(Keyl, Taglz Valuel)       :[Key()Tag((z))Value()̑gݍ킹ł̃f[^o^]
               3.getValue(Keyl)                          :[Key()łValue()擾]
               4.getTagKeys(Tagl)                        :[Tag()łKeylQ(Keyl̔z)擾]
               5.setByteValue(Keyl, bytel)              :[Key()bytez̑gݍ킹ł̃f[^o^](PHP͖)
               6.setByteValue(Keyl, Taglz bytel)    :[Key()Tag((z))bytez̑gݍ킹ł̃f[^o^](PHP͖)
               7.getByteValue(Keyl)                      :[Key()ValuelBytezŎ擾.setByteValueœo^l̂ݎ擾ł]
               8.removeValue(Keyl)                       :[Key()Ńf[^폜]
               9.getValueScript(Keyl,JavaScriptR[h)   :[Key()JavaScriptR[hnA擾ꂽvaluelJavaScriptslԂ]
              10.startTransaction()                       :[Transaction[ĥ݁BTransactionJn(ULockgp\ɂȂ)]
              11.lockData(Keyl,Lock,Lock擾҂):[Transaction[ĥ݁BKeylLocksBLockԂŎw肵Ԉێ(0͖)Aʂ̃NCAgLockĂꍇLock擾҂Ԃ̊ԃgC]
              12.releaseLockData(Keyl)                   :[Transaction[ĥ݁Bg̎擾LockJ]
              13.setNewValue(Keyl, Valuel)              :[o^Keyl̏ꍇ̂ݓo^ł]
              14.setNewValue(Keyl, Taglz Valuel)    :[o^Keyl̏ꍇ̂ݓo^ł]

  ꂼ̃m[hԂ̒ʐMTCP/IPł̒ʐMƂȂ܂B
  ܂ANCAgƃ}X^m[hԂ̒ʐM͎IBase64ɂăGR[fBOgpĂ܂B


[CXg[@]
[N@]
 Windows

   O:1.\
              1̃}Vŉғ悤ȃTvݒt@CĂ܂B
              ꂼ̃m[h䐔
              }X^m[h:1
              f[^m[h:2(2CX^X~3(}X^[AX[uAT[h))

            2.em[h̎gp|[g͈ȉƂȂ܂B
              }X^m[h:8888
              pr:NCAg̗v҂
              ύXꍇ:srcfBNgzMasterNode.properties7sڂύX
                           7s=MasterManagerJob.Init=8888<=̔ԍ

              f[^m[h:5553A5554@5556A5557
              pr:}X^m[h̗v҂
              ύXꍇ:Cf[^m[h
                           srcfBNgzDataNode.properties7sځA13sڂύX
                           7s=KeyManagerJob1.Init=5553<=̔ԍ
                           13s=KeyManagerJob2.Init=5554<=̔ԍ
                           X[uf[^m[h
                           srcfBNgzSlaveDataNode.properties7sځA13sڂύX
                           7s=KeyManagerJob1.Init=5556<=̔ԍ
                           13s=KeyManagerJob2.Init=5557<=̔ԍ

 1.RpC
   ȈՓIȃRpCpob`t@CpӂĂ܂B
   {t@CƓfBNgɂAcompile.batsĂB
   O:javac.exePATHʂĂ

 2.MasterNodeN
   ȈՓIMasterNodeNpob`t@CpӂĂ܂B
   {t@CƓfBNgɂAexecMasterNode.batsĂB
   ݒt@Cclasses\MasterNode.propertiesQƂĂ܂B
   ~@Ctrl+CvvgŎs
   ServerStopt@C݂ƃT[o͋N܂B
   execMasterNode2.bat̓X[uMasterNodeN܂B
   execMasterNodeMemcached.bat̓X[uMasterNodememcache݊vgRŋN܂B
   O:1.java.exePATHʂĂ
        2.128MBƂĂ܂

 3.DataNodeN
   ȈՓIDataNodeNpob`t@CpӂĂ܂B
   {t@CƓfBNgɂAexecDataNode.batsĂB
   2̃f[^m[hɋN܂B
   ݒt@Cclasses\DataNode.propertiesQƂĂ܂B
   ~@Ctrl+CvvgŎs
   ServerStopt@C݂ƃT[o͋N܂B
   O:1.java.exePATHʂĂ
        2.256MBƂĂ܂

 3.SlaveDataNodeN
   ȈՓIȃX[upSlaveDataNodeNpob`t@CpӂĂ܂B
   {t@CƓfBNgɂAexecSlaveDataNode.batsĂB
   2̃f[^m[hɋN܂B
   ݒt@Cclasses\SlaveDataNode.propertiesQƂĂ܂B
   ~@Ctrl+CvvgŎs
   ServerStopt@C݂ƃT[oDataNode͋N܂B
   O:1.java.exePATHʂĂ
        2.256MBƂĂ܂


 3.ThirdDataNodeN
   ȈՓIȃX[upThirdDataNodeNpob`t@CpӂĂ܂B
   {t@CƓfBNgɂAexecThirdDataNode.batsĂB
   2̃f[^m[hɋN܂B
   ݒt@Cclasses\SlaveDataNode.propertiesQƂĂ܂B
   ~@Ctrl+CvvgŎs
   ServerStopt@C݂ƃT[oDataNode͋N܂B
   O:1.java.exePATHʂĂ
        2.256MBƂĂ܂


 4.TransactionNodeN
   ȈՓIȕULockpTransactionNodeNpob`t@CpӂĂ܂B
   {t@CƓfBNgɂAexecTransactionNode.batsĂB
   ݒt@Cclasses\TransactionNode.propertiesQƂĂ܂B
   ~@Ctrl+CvvgŎs
   ServerStopt@C݂ƃT[o͋N܂B
   O:1.java.exePATHʂĂ
        2.256MBƂĂ܂

 execMasterNode2.batsƁAX[uMasterNodeN܂B
   |[gԍ8889gp܂B
   execMasterNodeMemcached.bat̓|[g11211ŃvgRmemcacheɂȂ܂B
   ݒt@Cclasses\MasterNode2.propertiesQƂĂ܂B

   ENTvł̍\}
                      
                 }X^[          X[u   
                 m[h            }X^[   
                 Port:8888         m[h     
                                   Port:8889  
                      
                        
            
                                
       
       
      f[^     f[^    
      m[h     m[h    
      Port:5553  Port:5554 
       
       
      X[u   X[u  
      f[^     f[^    
      m[h     m[h    
      Port:5556  Port:5557 
       
       

 4.Tv̎s@
   ȈՓIȐڑAo^A擾A폜TvpӂĂ܂B
   {t@CƓfBNgɂATestSock.classsĂ(jdk1.6ɂăRpCς)B
   ȂŎsƎgp@o͂܂B
   )
     # ȉ̗͎IɃCNgKeylValue1000o^Ă
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 1 127.0.0.1 8888 1000

     # ȉ̗̓L[lkey_aŃo[lvalue_bo^
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 1.1 127.0.0.1 key_a value_b

     # ȉ̗͎IɃCNgKeylValue1000擾Ă
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 2 127.0.0.1 8888 1000

     # ȉ̗̓L[lkey_avalue擾
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 2.1 127.0.0.1 8888 key_a

     # ȉ̗̓}X^[m[hIP127.0.0.1,|[g8888IP127.0.0.1,|[g8889ɐڑoVO
     # IɃCNgKeylValue1000擾Ă
     # execMasterNode2.batNĂƁAexecMasterNode.bat̃vZXIĂғ
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 2.2 "127.0.0.1:8888,127.0.0.1:8889" 100

     # ȉ̗̓L[lkey_aŎ擾ValuelJavaScriptsʂ擾
     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';"

     # ȉ̗͎IɃCNgKeylƓK4p^[TaglValue100o^Ă
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 3 127.0.0.1 8888 100

     # ȉ̗Taglutag1vɕRtKeylValuel1擾Ă
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 4 127.0.0.1 8888 1 tag1

     # ȉ̗KeyluwordfilevŁuC:\temp\SampleWord.docvt@C1o^Ă
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 5 127.0.0.1 8888 1 C:\temp\SampleWord.doc wordfile

     # ȉ̗KeyluwordfileṽoCgf[^擾uC:\SampleWord.docvt@CƂ1쐬Ă
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 6 127.0.0.1 8888 1 C:\SampleWord.doc wordfile

     # ȉ̗Keylukey_aṽf[^폜āAValue擾Ă
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 8 127.0.0.1 8888 key_a

     # ȉ̗TransactionJnăf[^LockAf[^XVA擾ALock
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 10 127.0.0.1 8888 key_a 5 10

     # ȉ̗1xf[^o^ꍇɎgpĂяo
     # "key_abc"ƂKey1xo^Ȃ悤ɂꍇ
     # 2xs2ڂ̓G[ƂȂB(memcacheaddɑ)
     java -cp ./;./classes;./lib/javamail-1.4.1.jar TestSock 11 127.0.0.1 8888 key_abc value_abc

     PHPɊւẮAetc_client\PhpAutoTest.batQƂĂB

[]
 ̓oOFixƕUgUNV(bN@\)Ă܂B

