JMS学习(七)-ActiveMQ消息的持久存储方式之KahaDB存储
一,介绍
自ActiveMQ5.4以来,KahaDB成为了ActiveMQ默认的持久化存储方式。相比于原来的AMQ存储方式,官方宣称KahaDB使用了更少的文件描述符,并且提供了更快的存储恢复机制。
二,KahaDB存储配置
在 conf/activemq.xml 中配置如下:
<broker brokerName="broker" ... >
<persistenceAdapter>
<kahaDB directory="activemq-data" journalMaxFileLength="32mb"/>
</persistenceAdapter>
...
</broker>
<persistenceAdapter>中指定了kahaDB,并表明数据存储在 "activemq-data"目录下,日志文件最大长度是32MB。
比如一个实际的ActiveMQ的KahaDB存储方式下的数据目录如下:
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAu8AAACKCAIAAACVRzPGAAAgAElEQVR4nO2dO47juhKGez+OzxqcOLhb6Mg4gHbgwHGnApxPokBehfZxgJlZyg1kySSriiy+JLH7N75gxi2LYpGs+sXnx3///ffr16/fv3///v37169f//7778fpnyboxun96a/F73+6PSfu8/VpX3m+D9M03P43//fST5Px34bT2qso35/HJeFu5/tg3mO8B5Ib7x+n69daiz4f5LfLX6dpmp7dmUuFTc68VdjUcyrL/RWlllhesA+QsEpENHUQsywk7+TUseUnz+7sVJ7ZCXB1LPJJxHpYLu96P2ZcKXo5yybh5Hzeshujw4RgGevjNLE5Hq0fPkW//1n+6sQ4baG0q2YAAAAAAD5OUDMAAAAAaB2oGQAAAAC0DdQMAAAAANoGagYAAAAAbQM1AwAAAIC2gZoBAAAAQNtAzQAAAACgbaBmAAAAANA2ejVj7KuYvk0kuZu7eWjEDp7uHoV0M8Tr11Rlm2CKZm9HMe/fhdx8zQWaXF5kH8mcm9TYSdaxz7LNpWLLY3MDzZB9Ln2WBaztU4W0NNcAkZp1DICfS5yaKey5rl925OtGdQs/34dw1NxIzXSjsUPz50O3Jb+bdyWZsao+KflatOCjy65jRewTUQ8z7XO+DzEHOGjaoLm/eE4uNGlV8Ak7s1n7qlnHAPiRNKpmDuRGiXzROUSoGYb8Yv3JaubVZfK64PoFNRMP1AwArQI1kwk90AtqBmpGa59yauZ0e7JHSCYDNVMVqBkAClNOzZjHnE5Tf6V+wTpjs79KasY/QUdzTql/XN8+WHVOwn14ITl2as77IdcMUocYzLt73CuJTELG3bQC9zEnlxizMXgPbs9MYp1vMF8KG+rrWBiz1hnpvh8paGdlPdTcJ2yfRc0oZ6J47FM8DB9Hzdimflw+H2V121ro7KeSuNHUMQBABGXUzOfDiXazEzcdQTdabvrST9P4pGpmGI1XzPN9EIKo0o16LmMOSXdflMm0G5JNMzhd+ldIo3FFk3fmybnAHxu02Ptc+mnoH4M9BZs73t21Rny+NDaMLlYPln0UYY+1j74eBu8TsM/5PkyPYbTEUDeK2ijUBiO6eVQ15wBqZm1WRjZF+xRJbrO+mdg6BgDwUULN8IMLpl843Z7UR5xuz4moGcdPSYnmqxka6i69FXv43zKK59mdre8dh6jMO4Xti07wtvQ+l959F3QzK+gA81aafOlsGF2sHlb7SHJQYx99PfTcR1Xuc/cYubNUyoHHsPrScpXNgdSMk0Sdvhm/5YuTVscAACIF1EzYuUhzKcLzZiqqGXeapHYSj/19UM1o8x5K6EUpNcOMT9m9CKFoqsqXzobRxephfnJP94bmYfT1MFwx/OUuLc0T2lSEfbx9YBpqqxl3qM74cOJb/GvxtDLVjDKttDoGABDJVzOKRnhMNWP9lU6ilMbR7RG0NQvvgZhENWPuKSI77rC3VdwnqGYUakOrZhQ2jC5WD2vkE2Oewj6qehi4j17NcJ0owvdR9sk05kH6ZjgDVuw+2XEWMNQMAFn84L4Z681Y84Ieypo5lXgNRbq8c2/SKX0zuvvs3jeTWF4KlicX1ifr7BOuh+H7bNs3w6mfb6pmPLYtANQMAK1Sb96MOS1RP29mUzWzzgVmZ1B+PjRJMLOJyTME88760AQ1o7xPUM2UmjejtGFssXp4Z40TCkr7BOuh5j6bzpuh91FtL5lbFtUDMN9HBTUDACAUWdNEdcnc4e+MEztzY9k1TRurmVnHfAkuzF1PcfqH6ehWzEkM5t0d55L3Pncnt34+zFEb5X3CaoabfUl1m6ZMVTaMLFYPVtZILFTaJ1gP9fcJ2Gdd0+QufYpc08QMe+XG+8OomYnuTlkvUX/7KgjUDACFKbbfjONPhTd7+4JlaKa/WssxXr81B27c45zcD13DyX24UY85FdH10zl99CbWQlzhndiX99M/H+5Ux2d3Xn5CLGlfyay+9t3HMuD8W87OzK14nx7Ml8aGmj2EwpBzmoznZ/YE4u2jrIfq8vLYxzyniWxLk9QGlxTTJ/9q2k5c+8pj1qNOihusonp/Si56ZwzorWMAgAh23Qv4+2AGLWwaASpRXc0AAECjQM0A0ApQMwAAwBOnZtAXCsD2mOODeKMAAACKXs0AAAAAABwRqBkAAAAAtA3UDAAAAADaBmoGAAAAAG0DNQMAAACAtoGaAQAAAEDbNKdmrI1l81erzvtyhk8/wMpYAAAA4Kho1Eypk9jKnuiWuZvfsnvvo5Pv479m3f+XOW8FW4MAAAAAm/Fj1UzUfaRrunEaRvsAwuXIlW1O4gUAAAAA1Eyumvm62cdMeg/lBgAAAEB5/GpGONyYC9X2Obe6Q5Ld+7iHLXMHcVsXH0HNfP5z6d+DSt04Dbf/ldVtAAAAAPBRpG/m0k/T9Li8v7l+cYonNsafbk/7tuSvx1AzH+ele2b5B9QMAAAAsB0F1Mzng+1EoWf5JsR4z4HAB1IzS5fMehnUDAAAALAd+WpG+itVAN9YzawDbfN/oWYAAACA7chXM5LgSFEz5/tA5ta0oWbmuUFLHxXUDAAAALAdB+qb+Xyw04dbUTMROQUAAABAQY4zb4b9K9QMAAAAAAJo1Iy7tujz4SyuNpcoz8yzYqPuc7rZ29Ato05QMwAAAADwoTyn6dKbU1mYVdP2BWIs99/H/uuzOy8b1awqx97VRjO9RkLYAsd6JN819pOs+XUyuH8BAwAAAN+e5k6dBAAAAACwgJoBAAAAQNtAzQAAAACgbaBmAAAAANA2UDMAAAAAaBuoGQAAAAC0DdQMAAAAANoGagYAAAAAbbOqmT9//kDNAAAAAKA9VGrGPNqaO5LJvWZ6dufQNdJ9wLdk3jq5xEkUek63p1UbQ2dliI8tbBX9cfrn43T92jxfsE8isX4s55ojsRT0VKYN+tuyFQhen9iN2leMrdWZDehnjB3bxWvC+MuUy1QRYzptcMlvRkbUaX1DZjXz588fUc3YR1tfesbW3WjbiDsNO3Af/qCA65fPUYIGWHzNoyt0rlYk1y+79XrOMXU534dwyz9StIZ9PCj8mOoaO9fu6XIV/JhzaIwYcRVknm2nasvn+1DIV5vH/7l2Nh/JOvcmKelwuV+/yJ1LHRTotsFyBgynFVMWDZw8GFIz1y+iS+gZkxRS0qr7cCa7fsmnPoGGKNf4o0iP1js9MOxTKZtB/5Pooy4986tKfixCa9YsMt99SgXjz4cjXxirkms+Ph/xGUyMcezJyklAzRQi2DfT9UQR0zpEoNVdcx/XZOf7kNFLCQ4F1Mwh+Sn20fgf1TXEPtQO9fzYz1EzVCPSsjjdnpxqjE49JcapOiaVQM0UIjzSRAg3ic+HZnAu4AV0N0ll7ft9JbF0ojr/dbsck8ZoD5TWjpTwpGaP/TT1V/ZF2bxAitbGTALGMprz1f1zEay/vpJwH15ILseRwT6FKyTro+h7vK9vpqgfs9TMMqq1fvO2qpCvhtRMNxKjkTsLaoaxduyUkaChpJEvDYE2uGSzyGynYHu3WyIzgik0dtexBO+zBdFqxlNZ31OlFJWGu8/qBU635yYTZeaiNTqBjZFXUY0mjs4eJa29yPWkZDLW3FBNu3Wj1ewv/TSNTxqth9HwRPJ7s/KBPZcxfdFutSfTStg5Z7BPvn0cNEGXv8Z++z/fB+K46/kx2jej6SuKLbKcMp2N1hmxLemdnhMltDhoD4pQXdeQrHoYRd3QDEVJJRhog+f7MD2G0RIE3ZiiDzTtnSlZLu+xfTNbRXCbODWj617jZ88p7jOb7NJHiOg8Xq+DUc46VZUfJa29yPOk/CuX2ca4F7W5UbnRmvZXi8bPi9bsWKp5Mf/blLdb2CcGjR/zXGNN9d3UjzWiZtxIHC9odGrGDtizwQduMC6ib0Y9tz3Bu6ra4GxAYt4EPaFp7xR2NDNhpClzVDSFCDUTM1LoC8PyfV7dYv1VKlFt0sKHGNdbKQ1Xa7p4s3G2mJbmPjFpxZRLsicNT9WSxoPD80IqRmu3ILSTVKIdAeyjp4CUsftmyJVF/Bhbpg2oGb6US6hzQcU6I/LV6watAzmZot9Lz6CYrhqdFscPUDPRk54Eq3nv45is3KTxyId0HvU1gvYe3U8qpMOktRM5nlTx22NGa+uvVOJLY9JTZP887KMlU8oI9qGTkwr4sW+lZqLdERMLdX1yzIQbJeoYlzrMpFczXDbjuiTVaka3P1BYzRTdZygRlZpJmb8tiWvffbi1AFXH3gLNbG5Rc9191eD0qewHSmsXfmTfjFXnNaEI9qliH5JW8jU0WOrWNMX7sZ+tZlTrsfniSwoZMc429TX7eH0z3Cy0lL4Z9X3qots9L7ouMiNNivuwSzBqds8Emtmln4bb/dVB8vl4bRuVOFv7QGntQo15M2aXr35eyKbRevV9bO90yvYYsE8SGj+m8lGMmgl6rRQ/xk9xdVM/lpphxUTauAwpeo0NpQgamDcTFeMy1mYXnzfjyZcmLfaeCWpGf5+6BNQMW8xOPTvfB7vjdzaxlRPNfSQ9vt/i+6WuzA+wrCBNdAcHSmsXMj0pjbvz7ASzmjnvTKfbk12zs3G0nuvwl+AOLj1drZCy0xrsE0oi5H90PsoN2N61mU4eo/dBGSfjV/yuyo55X25kv74Z1/lnrEFzF7qHex/FWuFb06QsdzODGcuPw21wXdPkLkcStkKWB16Dabl5kc82cdcofT7MRPX3qYtfzYizQQOr0rlNoP334XcEN+5cdP269DzcSO37YeiS11bT2hDN3iRanKFZb/NeLjB0oVnHXr819zhZGrl0Jou8gX3I1HMqor6kpZZYXrCPgMaP6X2db01TaT9mPlUwVM/3d9/X48rCh7Yta87si06R8xh21jzZ8fdh8NYRSip/NqenDZrnNJGtYuLyFUxrvsA+N+PZncWKal/JKHjlfSqSsHseAAAAAMCBgJoBAAAAQNtAzQAAAACgbaBmAAAAANA2UDMAAAAAaBuoGQAAAAC0DdQMAAAAANoGagYAAAAAbQM1AwAAAIC2KaNmlOdnmpdtuUUg2J15185SZ+7ocDfKTNhv291HlW5Iyu833wSwjwf/ZtyBPWoPhrXdbX5Z+Nty0bOUjR1mRTuXKQt/bJL2v842ptMGzb2A69WHss98IMqpmVAB2Ad2XPqJnvuwfhYnYm6sfugCBhKLr3l0hc6IiSR8RrSI6ni5VqM17BPM2iDsYd+NzpEsdf2YvWe8HHEVZJ7TpGrLyadYsxlfUpFOR/KVhR5/bHqVIHdcT40jY8sZsCZHPApwMzVz/SIK3ays6zfEfaScwAcOSLnGH0V6tN7pgWGf/ZldE39uMD3+UHXacxk/lnku8QanThYLxsTO/FmeobJQoIpNbFkUCkxQM4XYrG+m67nD2/z19Xwfdj0xERQEauaQwD6Epc+JVTOn25NTKpb3q+fHfo6aufQkpyReaMpCZVVFbOKyWSqcQ80UYruRJgJtEu4R8BXttfb9vpJYOlGd/7pdjkljtAdKa0dKeFKzx55/eyYHz/LR2phJwFhGc1awfy6CfTDvnIT78EJyOY4M9inA+s4do2YsK9XzY5aaWUa11m/eVvUcudyImulGYjRyZ01Z2JbRFkTQUNLIl4ZAG1yymT3bSRsLNO0r6Dc+ThFHmteioJrpFIfXOz+hp4rPPzzdnptMlJmLxOgENkZe+X7mU/Lo7FHS2otcT2qPbX9w8zS70Wr2l36axieN1sNoeCL5vVn5wJ7LmL5ot9qTaSUkm7BPGftEmNHbKulbOzFRPT9G+2boNx6Db6Zm4mIBAxcsachQlMVqpYiHUQgyzVCUVIKBNni+D9NjGK2pUd2YvG7GHwtU7UvjN8hkoz2miJRc02Rb35cToZtu9gKXPkJE5/FSr1HOOlWVHyWtvcjzpPwrlxlvuBe1OZy40Zr2V4vGz4vW7FiqeTH/25S3W9inDKbjkt4xTOc+O6thZNRMDT/WiJqJiQU8OjWjKIv3Ayv7ZtRz2xO8q6oNzgYk5hXfeMOWjIw7tp1VzywMzGUOjEZTbb8ZefxSri6v7qz+KpWoBrsT2/oQy3orpVFCpos3G2eLaWnuE5NWTLkke9LgMLY4jhueF1IxWrsFoZ2kEu0FYJ8i2F2YnvjhjAJ3RM3k+zG2TBtQM3wpl1Dngor1l0UcytkwWV3moe+lZwi3cSlR0SCK9qV6ZqmlbD21rqaa4azgrS6OUcpNGo98SOdRX5sNvEf3k1rLYdLaiZyarfjtMaO19Vfa0yZMQJmmyE5a2KcIjsPRvw07kzzK+LFvpWai3RETaHV9csyEGyXqib2pw0x6NcNlM7FL0md8RftSPbOkir61mglVF24tQNXZHoFmNhfSulxzedlKay0HSmsXfmTfjFXnNaEI9qliHxX2NOT1E8wjcVNl/NjPVjOq9diKstAS42xTX7P36pvxqZlQ+/ppfTNsBaJ9cYq5/ewSjJrdM4Fmdumn4XZ/dZB8Pl7bRmXNxjpEWrtQY96MWc3080I2jdar72N7p1O2x4B9NkLpfKjFyvgxfoorsyDlQGpGGQuU2Q/v4hMui/cDv/u8ubT0DjNjbXbxeTOK+UDeWKBoXz9u3sxsU2fpoJUNtrpo6mvdxTiBqL/UlfkBlle3RHdwoLR2IdOT0rg7z04wq5nzznS6Pdk1OxtH67kOfwm++NLT1QopywFgn+Iowif/JKX8WDdOvuUnnHlfbmS/vplwLEizv6r3MTzPiV+kpohNVgYzjuUJt8F1TZO7jEjYCjkw8Bp+iw62L43foKNv9SeKEIqNNFknWbjmE2eVWptS84PirwIreq6T9DzcSK21xsFbb9pJa0M0e5NocU5L8Tbv5QJDF5p17PVbc3BhqbTSmSxmcu75RH5Tz6mIPoWWWmJ5wT41Kq0T1fybapT2Y2beFVOSp2m8u+/rcWWhNsv7Q9qyNxakpsh5DPUGJ54+jHBsIo+UGaQ9bdA8p4ls8VImX/KCL981Pr+xXOMcwbHDDv44QxsAAAAAbQM1AwAAAIC2gZoBAAAAQNtAzQAAAACgbaBmAAAAANA2UDMAAAAAaBuoGQAAAAC0DdQMAAAAANoGagYAAAAAbaNUM4E9GdWUug9ojHnXzm3P3HE3yly2KI3YAtXdR5VWWn6/+SaAfRg0+9ia1xTdo7wS1mav+WXhb8vcVtHJezcb28uK8aJMTPGXqbT/dbYxnTZo7gVcoOgLlUXh+lMPjZrpRucIgkRbe+6z1kjmjJjjGxHILCX76DY+T/VF+IxoEdXxcq1Fa9hHphsn9yw94eyC9ctLP9X2Y86G8WLEVZB5TpOqLSefYs1mfElFOh2pTGzylunH6Z+P0/WL3LncAdH0DO2CaqZkr8HWZ2LHElYz9LivtINtQ/fpxmkYnSr7OgxihxMfQGl2agnp0froTRf2qQ/J4/WLKBXnvL2qfizzUOINTp0sFkFJvODP8iwQm8JlKpVFocAENVOIoJrhDgRnhKrGEP77dOP0dbPf9ryH64K2gJo5JLBPXB67nvQQ2DG1qh/7OWrm0nO9YrZ2KRWbgmUqZDPrQE37maFmSpCqZqILMnifuaGaongWv4wkL8B6OPDrAZZOVOe/bpdj0hjtgdLakRItwTzS+XXkrFM3yMGzfLQ2RoIZy2jOCvaPJdvH0s5JuA8vJJfjfWCfonw+NA3HqdhV/ZilZpZJS+s3wfGshtRMNxLLkzvrY5PnrOk0Q0kjXxoCbXDJZoHZKhurGcWR5mZbNvxMofCUMtJ0vg8Jk4lC93k11FXzLv+oo2Zm5mp0/Vo7gY2RVzHdxNHZo6S1F7melEximJ2CabduJCfUj08ara2BALkyKx/YcxnTF+36FzKthJ2rAfvk20fPe+6kwsmSgFHVj9G+GfqNx+CbqZnOiMRJueZECY3N6ti0BlHVwyhEgGYoSirBQBs834fpMYyT0+GXIp7KlIWq3MlkIyP68N9cv6ZpGIt29mhnAS9JXvppmp5DUoen/z5rs5x93Gq4ympGVJFSyaWq8qOktRd5npR/5TLrBveiNmt/N1rT/mrR+HnRmh37Ny/mf5vyRgX7lIebDUqfxDV7VT/WiJpxI3F8xnVqRh2bIvoA1HPb0xYHhdvgbEBi3pT6U6YsFOUuDMyZlZN7/tJLBNJWaCcP33ru8/633YMaW4p2J7b1Ic/srZRGCZku3qwQLaaluU9MWjHlklxxg8PY4uhneF5IxWjtFoR2kkp0+4J96uB7nRDCXik/xpZpA2qGL+US6lxQsaVik6dMmaJJ7zIPfS89g1EfMvxzyryiYLlLddu4nk+38EScVc38/ftXv3seM6iZhHkfR9msJVd/pEn4q9VXPJmj+0mt5TBp7UROxVX89pjR2vorDY3CBJRpiuwThn2qIdhNDnvF/Ni3UjPR7ogRJbo+ufTYpJ7YmzrMpFczXDbLdElmhQap3CUF+b5eePgqaubv378RaqZUT699H8kiu6kZe0LfqwanT2U/UFq78CP7ZiwXqQlFsE8V+6QjdRKI7auYH/vZaka1HpuSHJtinG3qeE2xvpkMqqiZY/XNRKkZnxB79yuEce5zQDVz6afhdn91kHw+XttGJVapA6W1CzXmzZhdvvp5IZtG69X3sb3TaVs3wT5bwYw0hRY6VVQz3mk6GoNXVzOsmEgblyFFrzFgYmzSLV7zlILebtvNm4kpC2XsbmPejFrN0InK1qOrO4GZ+xxQzSxlPBf/soI00foHSmsXMj0pjbvzmh1HEJtV5XR7smt2No7W/u1GLj1dreBrZbBPmn3CnO/DROzjDPWyYY/sAlrKj3XjZMQe3vU75n25kf36ZlyjZaxBsyym6n1Mik2KMnUzmNFHEm6D65omd+lTdKL6slDG7sCaJvtPpAfLnTjxWj65qZpRLCI3befVv8J97D+tJrC39C69bp77cCO17vMkhZmDpbUhmr1JtDjHjkg7nVsXGLrQrGav35p7nCz1VjqTxUzOPZ/Ib+o5FVFf0lJLLC/Yp3B15Taz9+S9gh8zUwyG6vlJXD8cVxZ648g50px1FZ0iZ7cSsSlQptwjZSppTxs0z2ki29IkJacrC1/sVtcf5wgOzkrWnlLmir8ypMybAQAAAADIAGoGAAAAAG0DNQMAAACAlomafK0BagYAAAAAtbGnXpVeqgI1AwAAAIC2gZoBAAAAQNtAzQAAAACgbaBmAAAAANA2UDMAAAAAaJsoNZO2QS29w7rd4f75B9swbyi57Zk77gaXy7aYEVuguvtg0kpb+qgR2Od7YO7BWuCwwMOgyVfBvCv8RpmY4t8zV9r/Or5iW1sPV20XyzNvddr8AYhQM+f7MD2HjH2dzaMc3NMu+E3BzY2QoX6aZFmS9+jKbpSkJXxGtIjqeLnWozXsUwHbMpkn+zgbxu+pkOyDfi4955YL5V3pN3wxJS4toyYz5xkxR0AXOHiufruoecrh8dCrmbnepFuHHBtGbyUds/mDyuP7sk3rJaRH650eGPZpHtazFTlbKkJrlsc9NfCDO2uweN591UwRU8onapRFTlpQM+XRqplFcSdbh6nTwbp4vg+7npgICgI1c0hgn/LozyHPv/Om+epJzwfx4cXz7j+3ORhTiif6QtUxmZdECaBmmOtWHZpsnW5kByOt7jv3CPjiewW+WcewXkksHZvOf92u1MCZrodPa0dKtF7rCFa2p5AcPMtHa2P0mrGM5qxg//i3fTDvnIT78EJyOSOqsM8hoFG2St/MMjq/fvO26mo9c/KEMfmjVISjjbp43j1+QxNTbMvo3KAi9GSOHvrzZRauU8Q2qva+fmO0o/3DQRVUaubzsTqRVDXjOs2Pk0/NnG7PTdzW/FTGYJYmp8Y1Laa1F7lqhgxm0znp3WhFwUs/TeOTRuthNDyR3P+nfGCvtyXF6tZ5Mq2EGbOHfUrYZ1PsaRbn+1Bomgvt+dD0hVz6aegf776EUn3evHQonHe5/qhiymqlsIx7q71wsKdDbOXyRSckcdMtFO39g3YQfKcJ6RSNmjGdzgZq5tJvJh5f2jbKWaeq8qOktRd5aoarP3ZtPN2etGaebs+JRGvHpD7j50VrdizVvJj/reCRYZ8M+2yO9W5dzJslqxnnGQp0lHqGWormvYiaieqb4Wc3u0nnelcxX4LmsAs63N6db7bqINiVsJqxX+trq5lXN+ksk5Pam92JbX1I/fNWSqNWmS7e1HYtpqW5T0xaMeWS7EDDbxV889bMC6kYrd2C0E5SiZ4eAfscCqcrNG2OBVem6X0zttPOVTMBKZOdd9WjRqiZlEQ9DapEV7eULynCWtere1nmu9FXlO9JUM04vcEZ82aIA/LPm8meNK5AcvHr4z2789oD+R7dT/Kkh0lrJ3IcqOK3x4zW1l+pixQmoExT5MwG2OdQsDaMfuDDqhmvQCmTd92jamJKKj4Xmj/M5MmXpNTdlqJ7gHWe3KHVfylCasaeZ7R+4suSkUGqNU1VO8cCUX+uWOvS9KXTKE0oHCitXfiRfTOW69eEItinin22hc5OTan8x1QzIadUJu+6n2tiSio+F1rkNXvLvpkiQ2MNEHuygadvJjA2+fnQ7Eyg2IGmIIGof+mn4XZ/1YPPx2srp8TWcqC0dqHGvBmzy1c/L2TTaL36PrZ3mjQK2KeOfTbl0jMRvUDfDKckNlUzisU+ZfKufFRFTHnfxBOb2Ot9Ox0X8K415s3QRvQ2SKHHPjQF1Uxw3nhwfjWvtSt2zwSi/tIG5gdYuqkS3euB0tqFAq9odqbmTlTTlTvvTKfbk12zs3G0nuvwl9BwLj0d0k7ZMRL2ORBOp3JqH3M3Tob343dVdsz7ciM11AwrZajcLJR35aMq1+z4YtP5PkykXfjnHVbe0oaOZNHeIE17d+3TxPT5HPRqxhrDlrxbSP+Ke6jwJxsYPyk6iUma5cqNwlrruRIG7I+Y1oZo9ibR4pVpcNkAAACTSURBVJyWIrzB2BcYutCsY6/fmgOp7nFF7kc+iCNk6jkVsV3QUkssL9jnOBRa12PmPfgaOZeC5YetwrLflCIfTFwZQKtZibzr/YZmX65gbNLvaZQ1zKRuF85xFnyK/vZOzmky7nm4d90y4AxtAAAAALQN1AwAAAAA2gZqBgAAAABtAzUDAAAAgLaBmgEAAABA0/wfFRMnp81wDlkAAAAASUVORK5CYII=" alt="" />
可以看出,上面directory一共有四个文件:
①db.data
它是消息的索引文件。本质上是B-Tree的实现,使用B-Tree作为索引指向db-*.log里面存储的消息。
②db.redo
主要用来进行消息恢复。
③db-*.log 存储消息的内容。对于一个消息而言,不仅仅有消息本身的数据(message data),而且还有(Destinations、订阅关系、事务...)
the data logs contain all of the message data and all of the information about destinations, subscriptions, transactions, etc..
data log以日志形式存储消息,而且新的数据总是以APPEND的方式追加到日志文件末尾。因此,消息的存储是很快的。比如,对于持久化消息,Producer把消息发送给Broker,Broker先把消息存储到磁盘中(enableJournalDiskSyncs配置选项),然后再向Producer返回Acknowledge。Append方式在一定程度上减少了Broker向Producer返回Acknowledge的时间。
④lock文件
另外,一些关于KahaDB的配置选项如下:
1)indexWriteBatchSize 默认值1000,当Metadata Cache中更新的索引到达了1000时,才同步到磁盘上的Metadata Store中。不是每次更新都写磁盘,而是批量更新写磁盘,比较写磁盘的代价是很大的。
2)indexCacheSize 默认值10000,(number of index pages cached in memory),在内存中最多分配多个页面来缓存index。缓存的index越多,命中的概率就越大,检索的效率就越高。
3)journalMaxFileLength 默认值32MB,当存储的消息达到32MB时,新建一个新文件来保存消息。这个配置对生产者或消息者的速率有影响。比如,生产者速率很快而消费者速率很慢时,将它配置得大一点比较好。
4)enableJournalDiskSyncs 默认值true,默认采用同步写磁盘,即消息先存储到磁盘中再向Producer返回ACK
normally,the broker performs a disk sync(ensuring that a message has been physically written to disk)
before sending the ACK back to a producer
5)cleanupInterval 默认值30000ms,当消息被消息者成功消费之后,Broker就可以将消息删除了。
6)checkpointInterval 默认值5s,每隔5s将内存中的Index(Metadata Cache)更新到磁盘的Index文件中(Metadata Store)
三, KahaDB存储底层实现简单分析
下图是KahaDB的Architecture:

从上图中可以看出:图中各个部分与KahaDB配置的存储目录下的文件是一 一对应的。
①在内存(cache)中的那部分B-Tree是Metadata Cache
通过将索引缓存到内存中,可以加快查询的速度(quick retrival of message data)。但是需要定时将 Metadata Cache 与 Metadata Store同步。
这个同步过程就称为:check point。由checkpointInterval选项 决定每隔多久时间进行一次checkpoint操作。
②BTree Indexes则是保存在磁盘上的,称为Metadata Store,它对应于文件db.data,它就是对Data Logs以B树的形式 索引。
有了它,Broker(消息服务器)可以快速地重启恢复,因为它是消息的索引,根据它就能恢复出每条消息的location。
如果Metadata Store被损坏,则只能扫描整个Data Logs来重建B树了,这个过程是很复杂且缓慢的。
The presence of the metadata store, however, enables the broker instance to restart rapidly.
If the metadata store got damaged or was accidentally deleted, the broker could recover by reading the data logs,
but the restart would then take a considerable length of time.
③Data Logs则对应于文件 db-*.log,默认是32MB
Data Logs以日志形式存储消息,它是生产者生产的数据的真正载体。
The data logs are used to store data in the form of journals,
where events of all kinds—messages, acknowledgments, subscriptions, subscription cancellations, transaction boundaries, etc.
---are stored in a rolling log
④Redo Log则对应于文件 db.redo
redo log的原理用到了“Double Write”。关于“Double Write”可参考
简要记录下自己的理解:因为磁盘的页大小与操作系统的页大小不一样,磁盘的页大小一般是16KB,而OS的页大小是4KB。而数据写入磁盘是以磁盘页大小为单位进行的,即一次写一个磁盘页大小,这就需要4个OS的页大小(4*4=16)。如果在写入过程中出现故障(突然断电)就会导致只写入了一部分数据(partial page write)
而采用了“Double Write”之后,将数据写入磁盘时,先写到一个Recovery Buffer中,然后再写到真正的目的文件中。在ActiveMQ的源码PageFile.java中有相应的实现。
扩展知识:Linux中的日志文件系统:因为Linux的 ext文件系统采用索引节点来存储文件的元数据,每次数据写入磁盘之后,需要更新索引节点表。而写入磁盘与更新索引节点表并不是“原子操作”,比如,在数据写入磁盘后,系统发生故障,之前写入的数据就再也找不到了。
因此,日志文件系统给Linux系统增加了一层安全性:数据写入存储设备之前,先将数据(或者只将索引节点信息写日志)写入到临时文件中,该临时文件称日志。如果在数据写入时发生故障,还可以通过日志来进行一定的恢复。
四,参考文档
【ActiveMQ Tuning】KahaDB Optimization
JMS学习(七)-ActiveMQ消息的持久存储方式之KahaDB存储的更多相关文章
- C++动态存储方式与静态存储方式
如果从变量值存在的时间(即生存期)来分,可将程序中的变量分为:动态存储方式和静态存储方式.它们所占用的存储空间区域不同. C++存储空间区域 代码区:存放可执行程序的程序代码.静态存储区:存放静态变量 ...
- JMS学习(五)--ActiveMQ中的消息的持久化和非持久化 以及 持久订阅者 和 非持久订阅者之间的区别与联系
一,消息的持久化和非持久化 ①DeliveryMode 这是传输模式.ActiveMQ支持两种传输模式:持久传输和非持久传输(persistent and non-persistent deliver ...
- JMS学习七(ActiveMQ之Topic的持久订阅)
非持久化订阅持续到它们订阅对象的生命周期.这意味着,客户端只能在订阅者活动时看到相关主题发布的消息.如果订阅者不活动,它会错过相关主题的消息.如果花费较大的开销,订阅者可以被定义为durable(持久 ...
- JMS学习(八)-ActiveMQ Consumer 使用 push 还是 pull 获取消息
ActiveMQ是一个消息中间件,对于消费者而言有两种方式从消息中间件获取消息: ①Push方式:由消息中间件主动地将消息推送给消费者:②Pull方式:由消费者主动向消息中间件拉取消息.看一段官网对P ...
- [ Android 五种数据存储方式之四 ] —— ContentProvider存储数据
Android这个系统和其他的操作系统还不太一样,我们需要记住的是,数据在Android当中是私有的,当然这些数据包括文件数据和数据库数据以及一些其他类型的数据.那这个时候有读者就会提出问题,难道两个 ...
- Python3编写网络爬虫08-数据存储方式一-文件存储
数据存储 用解析器解析出数据之后,就是存储数据了.保存的形式可以多种多样,最简单的形式是直接保存为文本文件,如TXT JSON CSV等.另外还可以保存到数据库中,如关系型数据库MySQL 非关系型数 ...
- iNeuOS工业互联网操作系统,发布实时存储方式:实时存储、变化存储、定时存储,增加设备振动状态和电能状态监测驱动,v3.6.2
目 录 1. 概述... 1 2. 平台演示... 2 3. 存储方式... 2 4. 设备状态和用电状态监控驱动... 3 1. 概述 本次升 ...
- JMS学习(六)-ActiveMQ的高可用性实现
原文地址:http://www.cnblogs.com/hapjin/p/5663024.html 一,ActiveMQ高可用性的架构 ActiveMQ的高可用性架构是基于Master/Slave 模 ...
- JMS学习十一(ActiveMQ Consumer高级特性之独有消费者(Exclusive Consumer))
一.简介 Queue中的消息是按照顺序被分发到consumers的.然而,当你有多个consumers同时从相同的queue中提取消息时, 你将失去这个保证.因为这些消息是被多个线程并发的处理.有的时 ...
随机推荐
- [CB转帖]台湾晶圆厂产能居全球第一 大陆排名第五但增长最多
台湾晶圆厂产能居全球第一 大陆排名第五但增长最多 据台湾地区媒体报道,近日市场调查机构IC Insights发布了各个地区或国家晶圆厂月产能排名,其中台湾地区排名第一,韩国排名第二,日本排名第三,美国 ...
- LODOP在页面不同位置输出页眉页脚
Lodop中的页眉页脚项的特点是:每页固定位置输出,具体该特点可查看本博客的其他博文:Lodop打印项对象类型属性区分 Lodop中有可以设置打印项次页偏移属性,但是该方法是针对单个打印项自动分页的, ...
- 如何在循环中使用await?
我正在尝试创建一个异步控制台应用程序,对集合进行一些操作.我有一个版本使用并行for循环,使用异步/等待.我预计异步/等待版本的工作类似于并行版本,但它同步执行.是什么原因呢? class Progr ...
- /include/caffe/common.cuh(9): error: function "atomicAdd(double *, double)" has already been defined
https://stackoverflow.com/questions/39274472/error-function-atomicadddouble-double-has-already-been- ...
- Linux共享库LD_LIBRARY_PATH与ld.so.conf
1. 往/lib和/usr/lib里面加东西,是不用修改/etc/ld.so.conf的,但是完了之后要调一下ldconfig,不然这个library会找不到 2. 想往上面两个目录以外加东西的时候, ...
- [代码]--C#action和func的使用
以前我都是通过定义一个delegate来写委托的,但是最近看一些外国人写的源码都是用action和func方式来写,当时感觉对这很陌生所以看起源码也觉得陌生,所以我就花费时间来学习下这两种方式,然后发 ...
- JavaScript实现两小时倒计时
[构思] 因为只需要的是两小时,所以时间直接写死,然后通过setInterval每1000ms对时间进行减1操作 前期未考虑到当时分秒小于10的状态,所以后面又加上了一个checkTime()来进行限 ...
- 浅析python日志重复输出问题
浅析python日志重复输出问题 问题起源: 在学习了python的函数式编程后,又接触到了logging这样一个强大的日志模块.为了减少重复代码,应该不少同学和我一样便迫不及待的写了一个自己的日 ...
- RedIsGood TopCoder - 9915(概率dp)
---恢复内容开始--- 论文题: 桌面上有 R 张红牌和 B 张黑牌,随机打乱顺序后放在桌面上,开始一张一张 地翻牌,翻到红牌得到 1 美元,黑牌则付出 1 美元.可以随时停止翻牌,在最优策略下平均 ...
- 如何修改可运行Jar包,如何反编译Jar包
将可运行Jar包,反编译成项目,修改代码,再次编译,打包. 需要工具:jd-gui.myeclipse 具体步骤: 1.使用jd-gui打开原始的Jar包,选择File-->Save All ...