Yandex.MoneyããŒã¿ããŒã¹ã¯ãå€ãã®äºæ¬¡çããã³äžæçãªæ å ±ãä¿åããããšãäœåãªããããããããã®ãããªãœãªã¥ãŒã·ã§ã³ãæé©ã§ãªããªããšã ãã®ãããHazelcastããŒã¹ã®ã€ã³ã¡ã¢ãªããŒã¿ããŒã¹æ©èœãåããåæ£ããŒã¿ã°ãªãããã€ã³ãã©ã¹ãã©ã¯ãã£ã«ç»å ŽããŸããã
äžè²«ããŠé«ãããã©ãŒãã³ã¹ãšãã©ãŒã«ããã¬ã©ã³ã¹ãšåŒãæãã«ãèå³æ·±ãå®è£ ã®çµéšãåŸãããŸãããããã¹ãŠã®ããã¥ã¡ã³ããç¹°ãè¿ãããã§ã¯ãããŸããã ã«ããã®äžã§ã¯ãé«è² è·ã§äœæ¥ãã Split BrainãšæŠããšãã®Hazelcastã®åé¡ã解決ããã¹ããŒãªãŒãšã倧èŠæš¡ãªã€ã³ãã©ã¹ãã©ã¯ãã£ã§åæ£ããŒã¿ãŠã§ã¢ããŠã¹ã䜿çšããå°è±¡ãèŠã€ãããŸãã
ãªãã€ã³ã¡ã¢ãªããŒã¹ãå¿ èŠãªã®ã§ãã
Yandex.Moneyã§ã¯ãHazelcastã¯ã¡ã¢ãªå ããŒã¿ããŒã¹ãšããŠäœ¿çšããã次ã«Javaã€ã³ãã©ã¹ãã©ã¯ãã£ã®åæ£ãã£ãã·ã¥ãšããŠäœ¿çšãããŸãã æ¯æãã®ãã³ã«ãååŒåŸã«äžèŠã«ãªã£ã倧éã®æ å ±ãã©ããã«ä¿ç®¡ããå¿ èŠããããç°¡åã«ã¢ã¯ã»ã¹ã§ããå¿ èŠããããŸãã ãã®ããŒã¿ããŠãŒã¶ãŒã®ã»ãã·ã§ã³ã®ã³ã³ããã¹ããšåŒã³ãééã®ãœãŒã¹ãšæ¹æ³ãã«ãŒãããã®ééã®ãµã€ã³ãééã®ç¢ºèªæ¹æ³ãªã©ãåç §ããŸãã
é·ãå¿çã«å ããŠãã¹ã¯ãªãããç¶æããããã¯ã¢ããã«è¿œå ã®ããŒã¿ãä¿åããããšã¯äžäŸ¿ã§ããã ããŸããŸãªæ¯æãã³ã³ããã¹ãããã®ä»ã®äžæããŒã¿ãèªåã¯ãªãŒãã³ã°ããµããŒãããå¿ èŠæ§ãããã³ããŒã¿ããŒã¹ã®è² è·ã®å¢å ã«ãããäžæããŒã¿ãä¿åããã¢ãããŒããåèããããã«ãªããŸããã
ã¢ã¯ã»ã¹é床ã®éãç¬ç«ããã¹ã±ãŒã©ãã«ã¹ãã¬ãŒãžãå¿ èŠã§ããã å€æŽãšãäžæããŒã¿ã®ãããšã¬ã¬ã³ãã§é«éãªã¹ãã¬ãŒãžã®æ€çŽ¢ã®æšé²åã¯ã以åã®PostgreSQLã«ããéšåçãªçœ®ãæãã§ããã
ç®çã®ãœãªã¥ãŒã·ã§ã³ã®äž»èŠãªèŠä»¶ã¯æ¬¡ã®ãšããã§ãã
1ã€ã®ããŒã¿ã»ã³ã¿ãŒïŒDCïŒã®ã¬ãã«ãš2ã€ã®å©çšå¯èœãªã¬ãã«ã®äž¡æ¹ã§ã®ãã©ãŒã«ããã¬ã©ã³ã¹ ã
æå°ã¡ã¢ãªãªãŒããŒããã ã ãŸãããã®ãœãªã¥ãŒã·ã§ã³ã¯ããŒã¿ãŠã§ã¢ããŠã¹ãšããŠäœ¿çšããããããã¹ãã¬ãŒãžèªäœã®ã¡ã¢ãªæ¶è²»ãèæ ®ããããšãéèŠã§ãã ç§ãã¡ã®ã±ãŒã¹ã§ã¯ãããã€ãã®ããŒã«ã«ã¢ããªã±ãŒã·ã§ã³ãã£ãã·ã¥ãã¯ã©ã¹ã¿ãŒã¡ã¢ãªå šäœã«åæ£ããããšãå€æããçµæãšããŠäœååãã®å©çãåŸãããŸããã
- ã¹ã±ãŒãªã³ã°ã®ã³ã¹ã ã æ¯æããµãŒãã¹ã¯åžžã«çèãæ§ç¯ããŠããããïŒåžžã«çŽç·çã§ãããšã¯éããŸããïŒãæ°ããããŒã¿ããŒã¹ã¯æ¬çªç°å¢ããã¹ãç°å¢ããŸãã¯ããŒã«ã«ç°å¢ã§å¯èœãªéãå®äŸ¡ã«å®è¡ã§ããå¿ èŠããããŸãã
äžèšã®3ã€ã®åºæºããã詳现ã«åæãããšããããç®çã®ãœãããŠã§ã¢ã§ã§ããããšã§ãã
éåžžã®ããŒã¿ããŒã¹ãšæ¯èŒããŠé«ãèªã¿åã/æžã蟌ã¿é床ãšãããŒã¿ã¹ãã¬ãŒãžçšã®ã¡ã¢ãªã®å°ããªãªãŒããŒãããã
åã ã®ããŒãã®ãšã©ãŒã«å¯Ÿãããã©ãŒã«ããã¬ã©ã³ã¹ã
ããŒã¿ã»ã³ã¿ãŒå ããã³ããŒã¿ã»ã³ã¿ãŒéã®ã¬ããªã±ãŒã·ã§ã³ã
è·å Žã§ã®çšŒåçãé«ãããªã³ã¶ãã©ã€ã§æ§æããèœåã
ãªããžã§ã¯ãã®åºå®å¯¿åœãèšå®ããæ©èœ-TTLã
åæ£ã¹ãã¬ãŒãžïŒã·ã£ãŒãã£ã³ã°ïŒããã³ã¯ã©ã€ã¢ã³ãåŽããã®ã¯ã©ã¹ã¿ãŒããŒãã®è² è·åæ£ã
ã¯ã©ã¹ã¿ãŒã¹ããŒã¿ã¹ã®ç£èŠãšãããŒã«ã«ã³ã³ãã¥ãŒã¿ãŒã§ãã¹ãããæ©èœã®ãµããŒãã
ã€ã³ãã©ã¹ãã©ã¯ãã£ã®æ§æãšä¿å®ãç°¡åã§ãæè»æ§ããããŸãã
- èªåã¯ã©ã¹ã¿ãŒæ¡åŒµãç¹å®ã®ã¿ã€ãã®ãªããžã§ã¯ãã®ãã£ãã·ã¥ãµã€ãºãå¶éããæ©èœã
ããããã¹ãŠã«å ããŠãåæ£ããã¯ã¡ã«ããºã ãã¢ããªã±ãŒã·ã§ã³çµ±åãã¯ã©ã€ã¢ã³ãåŽãã£ãã·ã¥ãMemcacheãããã³ã«ã®ãµããŒããããã³JVMãJavaãRESTãNode.jsã®ã¯ã©ã€ã¢ã³ããååŸããããšã¯çŽ æŽãããããšã§ãã
ãããã®èŠä»¶ã®ã»ãšãã©ã¯ã次ã®è£œåã«ãã£ãŠæºããããŠããŸãã
Redis-ãã£ãã·ã¥ãšã³ããªã®max-idle-secondsã®æå®ãè€éãªã¬ããªã±ãŒã·ã§ã³ã®å®è¡ãç¹å®ã®ã¿ã€ãã®ãªããžã§ã¯ãã®ã¡ã¢ãªéã®å¶éãèš±å¯ããŸããã
Ehcacheããã°ã¡ã¢ãª -åªããæ©èœãåããŠããŸãããææã©ã€ã»ã³ã¹ã®ã¿ãæäŸããŸãã
GridgainãåªããŠããŸãããDCãšDCå ã®è€è£œã¯ææçã®ã¿ã§ãã
Infinispan-誰ã«ãšã£ãŠãè¯ãããã«èŠããŸãããèšå®ããã®ã¯éåžžã«è€éã§ãåçšãµããŒãã¯å«ãŸããŠããŸããã ããã«æ²ããããšã¯ããããã¯ãŒã¯äžã®æ¬çªç°å¢ã§ã®åäœã«é¢ããæ å ±ããªããããããªã¹ã¯ãå¢å€§ãããããšã§ãã
- Hazelcastã¯ãã¹ãŠã®èŠä»¶ãæºãããæ¬çªç°å¢ã§ç©æ¥µçã«äœ¿çšãããŠããŸãã ããã«ãRedisã§ç§»è¡ããã®ã¯ãã®ã·ã¹ãã äžã§ãã ãã€ãã¹ã®ãã¡ãã¢ãã¿ãªã³ã°çšã®ææã®ç®¡çã¹ã¿ãžãªã®ã¿ã§ãã¢ãã¿ãªã³ã°ã·ã¹ãã ãå®è£ ããããã«APIã®ãã©ã³ã¹ãåããŸãã
Hazelcastã®é£ããã¯ãæ§æã®ãã¬ãŒãããšæ£ç¢ºã«é¢é£ããŠããããã次ã«ãå šå¡ãã©ã®ããã«èšå®ããã©ã®ãããªçµè«ãåºããããã«ã€ããŠè©³ãã説æããŸãã
25ããŒãã®ã¯ã©ã¹ã¿ãŒ
Yandex.Moneyã€ã³ãã©ã¹ãã©ã¯ãã£ã«ã¯ããŒã«ã«ããã³å°ççåé·æ§ãå¿ èŠãªãããäžå³ã«ç€ºãããã«ãHazelcastã¯ã©ã¹ã¿ãŒã®2ã€ã®ããŒã¿ã»ã³ã¿ãŒã«ããŒããå«ããŸããã
ãã®å³ã¯ã2ã€ã®ãªã¢ãŒãDCéã«åæ£ãããHazelcastã¯ã©ã¹ã¿ãŒã瀺ããŠããŸãã
åèšã§ã2ã€ã®ã°ã«ãŒãã«åå²ããã25ã®ããŒãã§æ§æãããŸãã Hazelcastã¯ããŒã¿ãã¯ã©ã¹ã¿ãŒã®ããŒãã£ã·ã§ã³ã«æ ŒçŽãããããã®ããŒãã£ã·ã§ã³ãããŒãéã§åæ£ããŸãã ããŒãã£ã·ã§ã³ãã°ã«ãŒãã«ã°ã«ãŒãåãããšãHazelcastã¯ã°ã«ãŒãéã®ããŒãã£ã·ã§ã³ãããã¯ã¢ããã§ããŸãã åDCã®ã¯ã©ã¹ã¿ãŒã®ããŒããã°ã«ãŒãã«ã°ã«ãŒãåããDCéã®ã·ã³ãã«ã§ééçãªããŒã¿ããã¯ã¢ãããååŸããŸããã
èšå®äŸïŒ
<?xml version="1.0" encoding="UTF-8"?> <hazelcast xsi:schemaLocation="http://www.hazelcast.com/schema/config hazelcast-config-3.5.xsd" xmlns="http://www.hazelcast.com/schema/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <!-- --> <network> <port auto-increment="false">5701</port> <join> <multicast enabled="false"/> <!-- --> <tcp-ip enabled="true"> <!-- 1 --> <member>192.168.0.0-255</member> <!-- 2 --> <member>192.168.1.0-255</member> </tcp-ip> </join> </network> <!-- --> <partition-group enabled="true" group-type="CUSTOM"> <member-group> <!-- 1 --> <interface>192.168.0.*</interface> </member-group> <member-group> <!-- 2 --> <interface>192.168.1.*</interface> </member-group> </partition-group> <properties> <property name="hazelcast.logging.type">slf4j</property> <!-- --> <property name="hazelcast.health.monitoring.level">NOISY</property> <!-- JMX --> <property name="hazelcast.jmx">true</property> <!-- SEGTERM --> <property name="hazelcast.shutdownhook.enabled">false</property> </properties> </hazelcast>
ãããã¯ãŒã¯ãããã¯ã¯ãã¯ã©ã¹ã¿ãŒã圢æãããµãŒããŒã®ã¢ãã¬ã¹ã®èšå®ãæ åœããŸãïŒã€ã³ãã©ã¹ãã©ã¯ãã£ã§ã¯ããããã¯2ã€ã®DCã®åå¥ã®ç¯å²ã§ãïŒã Partition-groupã«ã¯ãããŒã¿ãããã¯ã¢ãããããããŒãã£ã·ã§ã³ã°ã«ãŒãã®èšå®ãå«ãŸããŸãã ããã§ããäž¡æ¹ã®ããŒã¿ãè€è£œããããã®2ã€ã®DCãžã®ãã€ã³ãããããŸãã
Hazelcastã80åãªããŒãããå Žå
ã·ã¹ãã ãã»ããã¢ããããŠãã°ãã芳å¯ããåŸãèªã¿èŸŒã¿/æžã蟌ã¿ã®é床ãéãããšã«æ°ä»ãããšãã§ããŸããããã¯è² è·ãå¢å ããŠãå€åããŸããïŒããŒã¿ã¯ã¡ã¢ãªã«ä¿åãããŸãïŒã ããããä»ã®åæ£ã·ã¹ãã ãšåæ§ã«ãHazelcastã¯ãããã¯ãŒã¯åž¯åå¹ ãšå¿çã«ææã§ãã Hazelcastã¯Javaã¢ããªã±ãŒã·ã§ã³ã§ããã€ãŸããè² è·ãããã¡ã€ã«ã«å¿ããŠã¬ããŒãžã³ã¬ã¯ã¿ãŒã埮調æŽããå¿ èŠããããŸãã
埮調æŽã«ã€ããŠã¯ãéåžžãããã¥ã¡ã³ããåç §ããŸãããããã§ã¯æããã«äžè¶³ããŠããŸãã ãããã£ãŠããœãŒã¹ã³ãŒããç©æ¥µçã«ç 究ããæ§æãæãæµ®ãã¹ãŸããã å šäœãšããŠããœãªã¥ãŒã·ã§ã³ã¯ä¿¡é Œæ§ãé«ããã¿ã¹ã¯ã«å¯ŸåŠããããšãå€æããŸãããè² è·ãã¹ãã§ãããã確èªããããã®80åã®è² è·ã¯Hazelcastã¡ããªãã¯ã«åæ ãããŸããã§ããã
ã°ã©ãã¯ãããããã®ã¯ã©ã€ã¢ã³ãã®Hazelcastã§ããŒã¿ãæ¿å
¥ããã³ååŸããã®ã«ããã£ãå¹³åæéã瀺ããŠããŸãã å¹³åããŒã¿æ¿å
¥æéã¯2.1ããªç§ã§ãèªã¿åãæéã¯1.6ããªç§ã§ããã ãããã®æ°å€ã¯ãã·ã¹ãã ã®å
šäœçãªããã©ãŒãã³ã¹ãåæ ããŠããŸãããªã¯ãšã¹ãã®éä¿¡ãã¯ã©ã¹ã¿ãŒã§ã®ãªã¯ãšã¹ãã®å®è¡ããããã¯ãŒã¯åãã¬ã¹ãã³ã¹ã®ãã·ãªã¢ã©ã€ãºã
ããããäžè¬çã«è¯å®çãªèæ¯ããããããç¹å¥ãªæ³šæãæãå¿ èŠãããããã€ãã®é åããããŸãã ããšãã°ãHazelcastã®äœ¿çšæã«æ¬¡ã®åé¡ãçºçããŸããã
ã¯ã©ã¹ã¿ãŒã®åŽ©å£ãšã¹ããªãããã¬ã€ã³ãããŠã³ã¿ã€ã ãšSLAéåã«æ©ãŸãããŠããŸãã
ããŒã¿æ倱ã®åå ãšãªãããŒã¿å»ºèšããªã·ãŒã®èª€ã£ãããªã¬ãŒã
IMapèšå®ã«é¢ä¿ãªãããŒã¿ãããŠã³ããŒããããšãã¹ãã¬ãŒãžãè©°ãŸããŸãã
- ã³ãã³ãã¯ãã¯ã©ã¹ã¿ãŒæ§é ã®å€æŽæã«é·æéå®è¡ãããŸãã éåžžã®åèµ·åã§ã¯ãæ¿å ¥ã³ãã³ããšåä¿¡ã³ãã³ãã«ããã¯ã©ã¹ã¿ãŒããŒãã®é床ãäœäžããŸãã
補åã®ããã¥ã¡ã³ãã¯ããŸããªãã®ã§ããœãªã¥ãŒã·ã§ã³ã«ã€ããŠè©³ãã説æããŸãã
ã¯ã©ã¹ã¿ãŒåŽ©å£ãšã¹ããªãããã¬ã€ã³
ãããã¯ãŒã¯ãšã©ãŒã¯çµ¶ããçºçããHazelcastã¯ããããåŠçããŠããŒã¿ã®æ倱ãšäžæŽåãæé€ããŸãã ãã®å ŽåãåHazelcastããŒãã¯ãå¿ èŠãªèšå®ãšã¢ãã¿ãŒãå®è¡ããã¢ããªã±ãŒã·ã§ã³ã®äžéšãšããŠèµ·åãããŸãã ããã«ãããHazelcastãã€ã³ãã©ã¹ãã©ã¯ãã£ã«çµ±åããæè»æ§ãé«ããYandex.Moneyã€ã³ãã©ã¹ãã©ã¯ãã£ãæäŸãç£èŠããã°èšé²ã管çããããã®çµ±äžãããæ¹æ³ãæäŸã§ããŸãã
ã¢ããªã±ãŒã·ã§ã³ã¯ãSpring Bootã«ãã£ãŠèµ·åãããŸããSpringBootã¯classLoaderãå®è£ ããŸãã äžæ¹ãèªå·±èšè¿°åã®classLoader Spring Bootã«ã¯ãéåžžã«æªããã°ã1ã€ãããŸãã ç·æ¥ã®å Žåãã¯ã©ã¹ã¿ãŒã¯ãã®ããŒãã«äŸå€èå¥åãéä¿¡ããŠç¶æ³ãåŠçããŸãã ããŒãã¯ãšã©ãŒã¡ãã»ãŒãžãåä¿¡ããäŸå€ã¯ã©ã¹ããã·ãªã¢ã©ã€ãºããããšããŸãã Spring Bootã¯ã©ã¹ããŒããŒã¯ãé«è² è·ã§ã¯ã©ã¹ãããŒãã§ããã NoClassDefFoundErrorãšã©ãŒãã¹ããŒããŸãã
æçµçã«ãã¯ã©ã¹ã¿ãŒã¯ãã©ãã©ã«ãªããããã€ãã®å°ããªç¬ç«ãããã¯ã©ã¹ã¿ãŒãã«å€æãããå¯èœæ§ããããŸãã ããã¯æ£ç¢ºã«è² è·ãããã£ãç¶æ ã§çºçãããã°ã«ã¯Hazelcastèªäœã®NoClassDefFoundErrorã¯ã©ã¹ãããããŸããã§ããã åŠçãšããŠãã¢ããªã±ãŒã·ã§ã³ãèµ·åããåã«ã次ã®ã³ãã³ãã䜿çšããŠãã¹ãŠã®ã©ã€ãã©ãªã®ã¯ã©ã¹ã匷å¶çã«ã¢ã³ããã¯ããå¿ èŠããããŸããã
(springBoot {requiresUnpack = ['com.hazelcast:hazelcast', 'com.hazelcast:hazelcast-client']} )
å°æ¥ãããèµ·ãããªãããã«ããããã«ãã¹ããªã³ã°ããŒãã§ããã±ãŒãžã³ã¬ã¯ã¿ãŒãç¡å¹ã«ããŸããã
apply plugin: 'spring-boot' bootRepackage { enabled = false }
次ã«ãã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšãã«ãèµ·åæã«ãã¹ãŠã®.jarã³ã³ãã³ããæ瀺çã«ã¢ã³ããŒãããå¿ èŠããããŸãã
-Dsun.misc.URLClassPath.disableJarChecking=true \$JAVA_OPTS -cp \$jarfile:$libDirectory/*:. $mainClassName
æšæºã®ã¯ã©ã¹ããŒããŒã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ã®å®è¡äžã«ã¯ã©ã¹ã®èªã¿èŸŒã¿ãšã©ãŒããªããªããŸããããã€ã³ã¹ããŒã«çšã®ããã±ãŒãžããã«ãããã³ãŒããæžãå¿ èŠããããŸããã
誀ã£ãããŒã¿å¹çåããªã·ãŒ
ã€ã³ãã©ã¹ãã©ã¯ãã£ã§ã¯ãHazelcastã¯äž»ã«ããŒã¿ãŠã§ã¢ããŠã¹ãšããŠäœ¿çšãããŸãããã®IMapã¯çæ³çã§ã-åæ£ããã<KeyãValue> ã ã¡ã¢ãªäžè¶³ãšOutOfMemoryäŸå€ããèªèº«ãä¿è·ããããã«ãäºåèšå®ãããåHazelcast IMapã€ã³ã¹ã¿ã³ã¹ã«ã¯ã¡ã¢ãªã®äžéããããå€ããšã³ããªã®ããŒããŒã·ã§ã³ããªã·ãŒããããŸãã
è·å Žã®ã¬ããŒãžã³ã¬ã¯ã¿ãŒã
äžèŠãªæ å ±ãæ£ããåé€ããããã«ãTTLããã³MaxIDLEïŒïŒãã©ã¡ãŒã¿ã®æã䜿çšããŠããããã®ã³ã¬ã¯ã·ã§ã³ã®ããŒã¿ã®æå¹æéãå¶éããåããŒãã«ä¿åãããããŒã¿ã®ãµã€ãºãå¶éããŸãã
ã³ã¬ã¯ã·ã§ã³ããµã€ãºã§å¶éããããã®ããªã·ãŒïŒMaxSizePolicyïŒãããã€ããããŸãã
PER_NODEïŒåJVMã®ãšã³ããªã®æ倧æ°ã
PER_PARTITIONïŒ1ã€ã®ããŒãã£ã·ã§ã³ã®æ倧ã¬ã³ãŒãæ°ã
USEDââ_HEAP_SIZEïŒç¹å®ã®ã³ã¬ã¯ã·ã§ã³å ã®ã¬ã³ãŒããå æã§ããæ倧ã¡ã¢ãªãµã€ãºã¯ãåã¬ã³ãŒãã®èšç®ããããµã€ãºã®åèšã§ãã
USEDââ_HEAP_PERCENTAGEïŒUSED_HEAP_SIZEãšåããããŒã»ã³ãã®ã¿ã
FREE_HEAP_SIZEïŒJVMèªäœã®ããŒã¿ã«åºã¥ããå²ãåœãŠãããæ®ãã®JVMã¡ã¢ãªã®æå°ãµã€ãºã
- FREE_HEAP_PERCENTAGEïŒFREE_HEAP_SIZEãšåããããŒã»ã³ãã®ã¿ïŒã
æåã¯FREE_HEAP_PERCENTAGEã䜿çšããŠããŸããããæçµçã«ã¯USED_HEAP_PERCENTAGEã«åãæ¿ããŸããã å®éããããã®åæ§ã«èšèšãããããªã·ãŒã®åäœã¯éåžžã«ç°ãªããŸãã
FREE_HEAP_PERCENTAGE-Runtime.getRuntimeïŒïŒãFreeMemoryïŒïŒãèšå®ãããå¶éããå°ããå Žåãã³ã¬ã¯ã·ã§ã³å ã®ããŒã¿ã®ã¯ãªã¢ãéå§ããŸãã ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšã§ããã¡ã¢ãªã10ïŒ æªæºããæ®ã£ãŠããªãå Žåããããã¯ãèµ·ãããããŒã¿ãåé€ããããšããŸãã ãã®åŸããã®ããªã·ãŒã¯è² è·ãããã£ãŠãåžžã«æ©èœããŸãã ããã¯ãã¡ã¢ãªãå²ãåœãŠãã解æŸãããããéã«Javaãã·ã³ãã©ã®ããã«åäœããããšããçç±ã§æ£åžžã§ãã
- USEDââ_HEAP_PERCENTAGE-ãŸã£ããç°ãªãæ¹æ³ã§åäœããŸãïŒããã¯Hazelcastã®ãœãŒã¹ã³ãŒãã泚ææ·±ã調ã¹ãããšã«ãã£ãŠã®ã¿ç解ã§ããŸããèªç±ã«å©çšã§ããã®ã¯è¯ãããšã§ãïŒããã®ããªã·ãŒã¯ã³ã¬ã¯ã·ã§ã³ããšã«åå¥ã«åäœããä¿æ°ã¯ä¿åããŒã¿ã®æšå®ã³ã¹ãã§ãå®éã®å€ã ããã¯JVMã®èªã¿åãå€ã§ã¯ãªããèšç®ãããããŒã¿ã§ãããããEntryCostå€æŽã¹ã±ãžã¥ãŒã«ã¯å¿é»å³ã®ããã«èŠãããã»ã³ãµãŒã¯èª€ã£ãŠåäœãããããŒã¿åé€ããã»ã¹ã¯éå§ãããŸããã
FREE_HEAP_PERCENTAGEã«ã€ããŠã¯ã䜿çšå¯èœãªã¡ã¢ãªã®ãããå€ã«å°éããªãããã«GCã調æŽããããšããŸããããããããäœãå€æŽãããŸããã§ããã ãŸãã¯ãOldGenãšStop-the-Worldã«åé¡ããããŸããã
USEDââ_HEAP_PERCENTAGEã䜿çšããŠãã³ã¬ã¯ã·ã§ã³ããã®æ©æããŒã¿åéã®åé¡ãå®å šã«åãé€ãããšãã§ããŸããã eiktã®æ©èœã®ç¹åŸŽã®1ã€ã¯ãåé€ããèŠçŽ ãéžæããã¡ã«ããºã ã§ãïŒEvictionPolicyïŒLRUãRANDOMãªã©ïŒã LRUïŒLast Recent UsedïŒãå¿ èŠã§ããã圌ã®èŠ³ç¹ããã¯ãããŠã³ããŒãããã°ããã®ããŒã¿ãšèŠæ±ãããŠããªãããŒã¿ã®éã¿ã¯åãã§ãããããèæ ®ããå¿ èŠããããŸãã
IMapèšå®ãèæ ®ããªãããŒã¿ã®èªã¿èŸŒã¿
HazelcastãœãããŠã§ã¢ãèµ·åãããšããã®æ§ææ¹æ³ã«èªç±ãäžããããŸããããšãã°ãæåã«ã¯ã©ã¹ã¿ãŒããŒããå®è¡ããŠããã¹ãã¬ãŒãžèšå®ãé©çšã§ããŸãã ããŒããèµ·åããåŸããã§ã«HazelcastããŒã¿ã®ã·ã£ãŒãã£ã³ã°ãã¬ããªã±ãŒã·ã§ã³ãããã³ããã¯ã¢ããã®ã¡ã«ããºã ã«ããŒããå«ãŸããŠãããããããã¯å®è¡ãã䟡å€ããããŸããã ãããã®ã»ãã®äžç¬ã®è² è·ã®äžã§ãããã©ã«ãã®ewiktèšå®ãæã€ã³ã¬ã¯ã·ã§ã³å ã®å€æ°ã®ã¬ã³ãŒããååŸã§ããŸãã ç§ãã¡ã®å Žåãç¡éã®TTLã ã¬ã³ãŒãã¯ããã«è€è£œãããä»ã®ããŒãã«ããã¯ã¢ãããããŸãã
åé¡ã¯æããã«ãªããŸããããååãªæéãçµéããã¯ã©ã¹ã¿ãŒå ã«ããªãã®éã®ãã©ã¹ããèç©ããŸããã èšå®ã¯ãããã®ã¬ã³ãŒãã«é©çšãããããããèªäœã¯åé€ãããŸããã Hazelcastã§ã¯ãåã¬ã³ãŒãã®ããããã£ã¯ä¿åæã«ãã€ã¯åŠçãããŸãã ãããŠããã®ãããªãã¹ãŠã®ã¬ã³ãŒããèŠã€ããŠåé€ããããšã¯ãå®å šã«ç°¡åãªäœæ¥ã§ã¯ãããŸããã çµè«ïŒæåã«ã€ã³ã¹ã¿ã³ã¹ãæ§æããŠãããå®è¡ããŸãã
ã¯ã©ã¹ã¿ãŒæ§é ã®å€æŽæã«ã³ãã³ããé·æéå®è¡ããã
Hazelcastã¯ããã¹ãŠã®åå è éã§ããŒã¿ãè€è£œãããããã1ã€ã®ããŒããŸãã¯ã¯ã©ã¹ã¿ãŒå šäœã®ååããªãã«ããã®ã«ãé©åã«å¯Ÿå¿ããŸãã ããããHazelcastã®éåžžã®åäœã¯ã顧客ã«ãšã£ãŠããã»ã©è¯ããããŸããã ã¯ã©ã€ã¢ã³ãã«ã¯çŽ æŽãããsmartRoutingèšå®ããããããã©ã«ãã®æ¥ç¶ã倱ãããå Žåãèªåã§å¥ã®ããŒãã«åãæ¿ããããšãã§ããŸãã
åäœããŸãããååãªé床ã§ã¯ãªããããŒã¿ãè¿œå ãŸãã¯åä¿¡ããããã®ãã¹ãŠã®èŠæ±ã¯ãäºåæ¥ç¶ã§ã¯ã©ã¹ã¿ãŒã®ä»ã®ããŒãã«éä¿¡ãããŸãã æ¥ç¶ã®ç¢ºç«ã®é 延ããã³è² è·ã®ããã£ãããŒã¿ã䜿çšããæäœã¯ãã¯ã©ã€ã¢ã³ãã®ã¿ã€ã ã¢ãŠãã«é©åããïŒæäœæéã400ããªç§ã«å¶éããŸããïŒããããã®æäœã¯äžæãããŸãã ãããã£ãŠãã¯ã©ã€ã¢ã³ãã«ãã®ãããªãšã©ãŒãåŠçããæäœãç¹°ãè¿ãããšãæããããšãéèŠã§ãã
åæ§ã«ãã¿ã€ã ã¢ãŠããªãã§æäœãå®è¡ããããšããå§ãã§ããŸãããããã©ã«ãã§ã¯60ç§ã§ããæ£è ã¯ååãªå¿èãæã£ãŠããã§ããããïŒ ãããã®åé¡ã¯ãã¹ãŠãHazelcastããŒããå®æçã«åèµ·åããããšã§åé¿ã§ããŸããã¯ã©ã€ã¢ã³ãã§smartRoutingã䜿çšãããããŒããåæ¢ããåã«ãã¹ãŠã®ã¯ã©ã€ã¢ã³ããåæ¢ããã ãã§ååã§ãã
ã¯ã©ã¹ã¿ãŒç£èŠ
Hazelcastã«ã¯ãEnterpriseã©ã€ã»ã³ã¹ã§å©çšã§ããç¬èªã®ç£èŠããŒã«ã§ããManagement CenterããããŸãã ãã ãããã¹ãŠã®ã¡ããªãã¯ã¯JMXãä»ããŠå©çšã§ããZabbixãªã©ã䜿çšããŠåéã§ããŸãã ãããã£ãŠããããã¯ãŒã¯ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ãå æããã¡ã¢ãªãšãå¿ èŠã«å¿ããŠä»ã®å©çšå¯èœãªã¡ããªãã¯ãç£èŠãããŸãã
ãã ããZabbixã¯ãã¯ãšãªããããããããã³ã°ã©ãäœææ©èœã®ç¹ã§äžååã§ããããã Grafanaã®ããŒã¿ãœãŒã¹ãšããŠããé©ããŠããŸãã ã³ã¬ã¯ã·ã§ã³ã®ãµã€ãºããããçãåŸ ã¡æéãç£èŠããããã«ããããã®å€ã¯HazelcastããŒãã®èµ·åãå¶åŸ¡ããã³ã³ããŒãã³ãããGraphiteã«éä¿¡ãããŸãã
äžæããŒã¿ã«ã¯èªåã¯ãªãŒãã³ã°ãå¿ èŠã§ãããŸããããã«æ³šæãæãå¿ èŠããããŸãã ãããã£ãŠãã³ã¬ã¯ã·ã§ã³ããã®ããŒã¿ã®è¿œå ãåé€ããŸãã¯æ§ç¯ã¯ãã¹ãŠãã°ã«å«ãŸããŸãã Kibanaã§ãªã³ã©ã€ã³ãã°ãå©çšã§ããŸãïŒAdeleãæè¿ããã«ã€ããŠè©±ããŸããïŒãããã¯ãã€ã³ã·ãã³ãã®èª¿æ»ããã£ãã·ã¥ã®æå¹æ§ã®è¿œè·¡ã«æé©ã§ãã ãã®ãããªãã®ã³ã°ã¯MapListenerã䜿çšããŠå®è£ ã§ããŸããããã¯ãã¯ã©ã¹ã¿ãŒã®ç£èŠã«ãããããŒã ã®ããŒãºãå®å šã«ã«ããŒããŸãã
ã¯ã©ã¹ã¿ãŒããŒããåèµ·åãã
ã·ã¹ãã ã§å¯èœãªéããã¹ãŠã®ã¯ã©ã¹ã¿ãŒããŒããåèµ·åããããã»ã¹ãç°¡åã«ããããã«ã次ã®ã¢ãããŒãã䜿çšããŸãã
Hazelcastèšå®ã®åå€æŽïŒæ°èŠãŸãã¯æ¢åã®ã³ã¬ã¯ã·ã§ã³ã®èšå®ãç£èŠãã¢ããªã±ãŒã·ã§ã³ãžã®ã¡ã¢ãªã®å²ãåœãŠïŒã¯ãã·ã¹ãã ã®ã³ã³ããŒãã³ããšããŠã¯ã©ã¹ã¿ãŒãªãªãŒã¹ããã»ã¹ã®äžéšãšããŠå®è¡ãããŸãã
æ°ããèšå®ã§ãã¹ãŠã®ããŒããåèµ·åããããã»ã¹ãèªååããããã«ãããŒãã®ç£èŠããŒã¿ã«åºã¥ããŠãæ°ããããŒãžã§ã³ã§åèµ·åããå¯èœæ§ã«ã€ããŠæ±ºå®ããã¹ã¯ãªãããèšè¿°ãããŠããŸãã Hazelcastã«ã¯ããã¹ãŠã®ããŒã¿ã®ããã¯ã¢ããã«é¢ããæ å ±ãå«ããã¯ã©ã¹ã¿ãŒããŒãã£ã·ã§ã³ã®ã¹ããŒã¿ã¹ã«é¢ããæ å ±ãå«ãPartitionService isLocalMemberSafeïŒïŒããããŸãã ã¹ã¯ãªããã¯ããã®ãã©ã°ãããŒãã®å®å šãªåèµ·åã®å¯èœæ§ã®å åãšããŠè§£éããŸã-ãã¹ãŠã®ããŒã¿ã¯ä»ã®ããŒãã®ããã¯ã¢ãããã埩å ã§ããŸãã
- isLocalMemberSafeïŒïŒãã©ã°ã ãã§ã¯ã次ã®ããªç§ã§ãã¹ãŠããã©ãã©ã«ãªããªãããšãä¿èšŒããŸããã ãããã£ãŠã次ã®ãã©ã¡ãŒã¿ãŒã䜿çšããŠHazelcastãèµ·åããŸãã
<property name="hazelcast.shutdownhook.enabled">false</property>
ããã«ãããSEGTERMã·ã°ãã«ãåä¿¡ãããšãã«ãããŒãã®çµäº ïŒããŒãåæïŒãç¡å¹ã«ã§ããŸãã ã¹ã¯ãªããã¯SEGTERMããŒããéä¿¡ããã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãã¯Graceful Shutdownã®åŒã³åºãã§éããããŸãã
ãã®æ¹æ³ã¯ãããŒãããªãã«ãªãåã«å®å šãªããŒã¿åæãæåŸ ããã¯ã©ã¹ã¿ãŒããã®ããŒãã®å®æçãªåºåãä¿èšŒããŸãã ã¯ã©ã¹ã¿ãŒã解æŸããããã»ã¹ã¯ãåèªåã¢ãŒãã§çŽ1æéããããã¯ã©ã¹ã¿ãŒãžã®ããŒãã®å°å ¥ã«ã¯å¹³å5ç§ããããŸãã
ã¯ã©ã¹ã¿ãŒããŒãã®ååã®æ倱
ãã¯ããããããŸããé¢çœãã¹ã±ãžã¥ãŒã«ã«æ°ã¥ããŸããã ä¿å®ãµãŒãã¹ã¯1ã€ã®DCãåæããããã®æŒç¿ãå®æœããããæç¹ã§Hazelcastã¯ã©ã¹ã¿ãŒã®ããŒãã®ååããªããªããŸããã ãã¹ãŠã®ããŒã¿ã¯ããŒãã£ã·ã§ã³ã°ã«ãŒãã®ããã¯ã¢ããããæ£åžžã«åŸ©å ãããã¯ã©ã¹ã¿ãŒå ã®ããŒãæ°ã®æžå°ã¯äœæ¥é床ã«ãã©ã¹ã®åœ±é¿ãäžããŸããã
DCã®1ã€ãå®å
šã«ãªãã«ãªããšãHazelcastã¯æ®ãã®ããŒãã®ããŒã¿ã修埩ããåäœé床ã¯ã»ãŒ2åã«å¢å ããŸããã
çåãçããŸãããªãããŒãã2åå°ãªãããŸãããïŒ ããã«ç 究ã®ããã®ã¹ããŒã¹ããããŸã-ãã©ãŒã«ããã¬ã©ã³ã¹ãæãªãããšãªãæ倧é床ãæäŸããæ§æãéžæããŸãã
ããã¯äŸ¡å€ããã£ãã
åæ£ã€ã³ã¡ã¢ãªããŒã¿ããŒã¹ã«ããã倧éã®äžææ å ±ã®äŸ¿å©ã§ãçŸãããã¹ãã¬ãŒãžãæŽçããããšãã§ããŸããã ããã«ããã®ã¢ãŒããã¯ãã£ã¯çç£çã§ããã ãã§ãªããæ¡åŒµæ§ã«ãåªããŠããããšãããããŸããã ãããããã®ãããªåæ£ã·ã¹ãã ããµããŒãããã®ã¯éåžžã«é£ããããã®å©ç¹ã¯éåžžã«å€§ããªããŒã¿ã¹ããªãŒã ã§ããæããããªãããããã®ãããªåæ£ã·ã¹ãã ã誰ã«ãã¢ããã€ã¹ããªãããã«æ³šæããŸãã
ããã«ããããžã§ã¯ãã®çµæã«ãããšã人æ°ã ãã§ãœãªã¥ãŒã·ã§ã³ãä¿¡é Œããã®ã§ã¯ãªãïŒhi Spring BootïŒãå®è£ åã«æ°è£œåãæ éã«ãã¹ãããããšãåŠã³ãŸããã ããããèšäºã§èª¬æãããŠãããã¹ãŠã®èšå®ãè¡ã£ãåŸã§ããäœãã工倫ããŠå€æŽããå¿ èŠããããŸããããšãã°ãHazelcast 3.5.5ããææ°ããŒãžã§ã³3.8ã«æŽæ°ãããåã³ãããŸã åŠãã§ããŸããã ãã€ã³ãã¯ãããŒãžã§ã³ãåŸæ¹äºææ§ããªããããã¹ãªã«ãä¿èšŒããããšããããšã§ãã ããããããã«ã€ããŠã¯æ¹ããŠè©±ããŸãããã