Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Redis ¼Ü¹¹ÑݱäÓë Redis-cluster Ⱥ¼¯¶Áд·½°¸
 
  2326  次浏览      32
 2018-9-13
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚ²®ÀÖÔÚÏß,±¾ÎÄÉæ¼°µ½½üÄêÀ´ Redis ¶àʵÀý¼Ü¹¹µÄÑݱä¹ý³Ì£¬°üÀ¨ÆÕͨÖ÷´Ó¼Ü¹¹¡¢ÉÚ±øÄ£Ê½ÏµÄÖ÷´Ó¼Ü¹¹¡¢Redis-cluster ¸ß¿ÉÓüܹ¹µÄ¼ò½é¡£

µ¼ÑÔ

Redis-cluster ÊǽüÄêÀ´ Redis ¼Ü¹¹²»¶Ï¸Ä½øÖеÄÏà¶Ô½ÏºÃµÄ Redis ¸ß¿ÉÓ÷½°¸¡£±¾ÎÄÉæ¼°µ½½üÄêÀ´ Redis ¶àʵÀý¼Ü¹¹µÄÑݱä¹ý³Ì£¬°üÀ¨ÆÕͨÖ÷´Ó¼Ü¹¹£¨Master¡¢slave ¿É½øÐÐд¶Á·ÖÀ룩¡¢ÉÚ±øÄ£Ê½ÏµÄÖ÷´Ó¼Ü¹¹¡¢Redis-cluster ¸ß¿ÉÓüܹ¹£¨Redis ¹Ù·½Ä¬ÈÏ cluster ϲ»½øÐжÁд·ÖÀ룩µÄ¼ò½é¡£Í¬Ê±»¹½éÉÜʹÓÃJavaµÄÁ½´óredis¿Í»§¶Ë£ºJedisÓëLettuceÓÃÓÚ¶Áдredis-clusterµÄÊý¾ÝµÄÒ»°ã·½·¨¡£ÔÙͨ¹ý¹Ù·½ÎĵµÒÔ¼°»¥ÁªÍøµÄÏà¹Ø¼¼ÊõÎĵµ£¬¸ø³öredis-cluster¼Ü¹¹ÏµĶÁдÄÜÁ¦µÄÓÅ»¯·½°¸£¬°üÀ¨¹Ù·½µÄÍÆ¼öµÄÀ©Õ¹redis-clusterϵÄMasterÊýÁ¿ÒÔ¼°·Ç¹Ù·½Ä¬ÈϵÄredis-clusterµÄ¶Áд·ÖÀë·½°¸£¬°¸ÀýÖÐʹÓÃLettuceµÄÌØ¶¨·½·¨½øÐÐredis-cluster¼Ü¹¹ÏµÄÊý¾Ý¶Áд·ÖÀë¡£

½üÄêÀ´redis¶àʵÀýÓüܹ¹µÄÑݱä¹ý³Ì

redisÊÇ»ùÓÚÄÚ´æµÄ¸ßÐÔÄÜkey-valueÊý¾Ý¿â£¬ÈôÒªÈÃredisµÄÊý¾Ý¸üÎȶ¨°²È«£¬ÐèÒªÒýÈë¶àʵÀýÒÔ¼°Ïà¹ØµÄ¸ß¿ÉÓüܹ¹¡£¶ø½üÄêÀ´redisµÄ¸ß¿ÉÓüܹ¹Ò಻¶Ï¸Ä½ø£¬ÏȺó³öÏÖÁ˱¾µØ³Ö¾Ã»¯¡¢Ö÷´Ó±¸·Ý¡¢ÉÚ±øÄ£Ê½¡¢redis-clusterȺ¼¯¸ß¿ÉÓüܹ¹µÈµÈ·½°¸¡£

1¡¢redisÆÕͨÖ÷´Óģʽ

ͨ¹ý³Ö¾Ã»¯¹¦ÄÜ£¬Redis±£Ö¤Á˼´Ê¹ÔÚ·þÎñÆ÷ÖØÆôµÄÇé¿öÏÂÒ²²»»áËðʧ£¨»òÉÙÁ¿Ëðʧ£©Êý¾Ý£¬ÒòΪ³Ö¾Ã»¯»á°ÑÄÚ´æÖÐÊý¾Ý±£´æµ½Ó²ÅÌÉÏ£¬ÖØÆô»á´ÓÓ²ÅÌÉϼÓÔØÊý¾Ý¡£ ¡£µ«ÊÇÓÉÓÚÊý¾ÝÊÇ´æ´¢ÔÚһ̨·þÎñÆ÷Éϵģ¬Èç¹ûÕą̂·þÎñÆ÷³öÏÖÓ²Å̹ÊÕϵÈÎÊÌ⣬Ҳ»áµ¼ÖÂÊý¾Ý¶ªÊ§¡£ÎªÁ˱ÜÃâµ¥µã¹ÊÕÏ£¬Í¨³£µÄ×ö·¨Êǽ«Êý¾Ý¿â¸´Öƶà¸ö¸±±¾ÒÔ²¿ÊðÔÚ²»Í¬µÄ·þÎñÆ÷ÉÏ£¬ÕâÑù¼´Ê¹ÓÐһ̨·þÎñÆ÷³öÏÖ¹ÊÕÏ£¬ÆäËû·þÎñÆ÷ÒÀÈ»¿ÉÒÔ¼ÌÐøÌṩ·þÎñ¡£Îª´Ë£¬ Redis ÌṩÁ˸´ÖÆ£¨replication£©¹¦ÄÜ£¬¿ÉÒÔʵÏÖµ±Ò»Ì¨Êý¾Ý¿âÖеÄÊý¾Ý¸üкó£¬×Ô¶¯½«¸üеÄÊý¾Ýͬ²½µ½ÆäËûÊý¾Ý¿âÉÏ¡£

ÔÚ¸´ÖƵĸÅÄîÖУ¬Êý¾Ý¿â·ÖΪÁ½À࣬һÀàÊÇÖ÷Êý¾Ý¿â£¨master£©£¬ÁíÒ»ÀàÊÇ´ÓÊý¾Ý¿â£¨slave£©¡£Ö÷Êý¾Ý¿â¿ÉÒÔ½øÐжÁд²Ù×÷£¬µ±Ð´²Ù×÷µ¼ÖÂÊý¾Ý±ä»¯Ê±»á×Ô¶¯½«Êý¾Ýͬ²½¸ø´ÓÊý¾Ý¿â¡£¶ø´ÓÊý¾Ý¿âÒ»°ãÊÇÖ»¶ÁµÄ£¬²¢½ÓÊÜÖ÷Êý¾Ý¿âͬ²½¹ýÀ´µÄÊý¾Ý¡£Ò»¸öÖ÷Êý¾Ý¿â¿ÉÒÔÓµÓжà¸ö´ÓÊý¾Ý¿â£¬¶øÒ»¸ö´ÓÊý¾Ý¿âÖ»ÄÜÓµÓÐÒ»¸öÖ÷Êý¾Ý¿â¡£

Ö÷´ÓģʽµÄÅäÖã¬Ò»°ãÖ»ÐèÒªÔÙ×÷ΪslaveµÄredis½ÚµãµÄconfÎļþÉϼÓÈë¡°slaveof masterip masterport¡±£¬ »òÕß×÷ΪslaveµÄredis½ÚµãÆô¶¯Ê±Ê¹ÓÃÈçϲο¼ÃüÁ

redis-server --port 6380 --slaveof masterIp masterPort

redisµÄÆÕͨÖ÷´Óģʽ£¬ÄܽϺõرÜÃâµ¥¶À¹ÊÕÏÎÊÌ⣬ÒÔ¼°Ìá³öÁ˶Áд·ÖÀ룬½µµÍÁËMaster½ÚµãµÄѹÁ¦¡£»¥ÁªÍøÉÏ´ó¶àÊýµÄ¶Ôredis¶Áд·ÖÀëµÄ½Ì³Ì£¬¶¼ÊÇ»ùÓÚÕâһģʽ»ò¼Ü¹¹Ï½øÐеġ£µ«Êµ¼ÊÉÏÕâÒ»¼Ü¹¹²¢·ÇÊÇĿǰ×îºÃµÄredis¸ß¿ÉÓüܹ¹¡£

2¡¢redisÉÚ±øÄ£Ê½¸ß¿ÉÓüܹ¹

µ±Ö÷Êý¾Ý¿âÓöµ½Òì³£ÖжϷþÎñºó£¬¿ª·¢Õß¿ÉÒÔͨ¹ýÊÖ¶¯µÄ·½Ê½Ñ¡ÔñÒ»¸ö´ÓÊý¾Ý¿âÀ´Éý¸ñΪÖ÷Êý¾Ý¿â£¬ÒÔʹµÃϵͳÄܹ»¼ÌÐøÌṩ·þÎñ¡£È»¶øÕû¸ö¹ý³ÌÏà¶ÔÂé·³ÇÒÐèÒªÈ˹¤½éÈ룬ÄÑÒÔʵÏÖ×Ô¶¯»¯¡£ Ϊ´Ë£¬Redis 2.8¿ªÊ¼ÌṩÁËÉÚ±ø¹¤¾ßÀ´ÊµÏÖ×Ô¶¯»¯µÄϵͳ¼à¿ØºÍ¹ÊÕϻָ´¹¦ÄÜ¡£ ÉÚ±øµÄ×÷ÓþÍÊÇ¼à¿ØredisÖ÷¡¢´ÓÊý¾Ý¿âÊÇ·ñÕý³£ÔËÐУ¬Ö÷³öÏÖ¹ÊÕÏ×Ô¶¯½«´ÓÊý¾Ý¿âת»»ÎªÖ÷Êý¾Ý¿â¡£

¹ËÃû˼Ò壬ÉÚ±øµÄ×÷ÓþÍÊÇ¼à¿ØRedisϵͳµÄÔËÐÐ×´¿ö¡£ËüµÄ¹¦ÄܰüÀ¨ÒÔÏÂÁ½¸ö¡£

£¨1£©¼à¿ØÖ÷Êý¾Ý¿âºÍ´ÓÊý¾Ý¿âÊÇ·ñÕý³£ÔËÐС£

£¨2£©Ö÷Êý¾Ý¿â³öÏÖ¹ÊÕÏʱ×Ô¶¯½«´ÓÊý¾Ý¿âת»»ÎªÖ÷Êý¾Ý¿â¡£

¿ÉÒÔÓÃinfo replication²é¿´Ö÷´ÓÇé¿ö Àý×Ó£º 1Ö÷2´Ó 1ÉÚ±ø,¿ÉÒÔÓÃÃüÁîÆðÒ²¿ÉÒÔÓÃÅäÖÃÎļþÀï ¿ÉÒÔʹÓÃË«ÉÚ±ø£¬¸ü°²È«£¬²Î¿¼ÃüÁîÈçÏ£º


redis-server --port 6379
redis-server --port 6380 --slaveof 192.168.0.167 6379
redis-server --port 6381 --slaveof 192.168.0.167 6379
redis-sentinel sentinel.conf

ÆäÖУ¬ÉÚ±øÅäÖÃÎļþsentinel.conf²Î¿¼ÈçÏ£º


sentinel monitor mymaster 192.168.0.167 6379 1

ÆäÖÐmymaster±íʾҪ¼à¿ØµÄÖ÷Êý¾Ý¿âµÄÃû×Ö¡£ÅäÖÃÉÚ±ø¼à¿ØÒ»¸öϵͳʱ£¬Ö»ÐèÒªÅäÖÃÆä¼à¿ØÖ÷Êý¾Ý¿â¼´¿É£¬ÉÚ±ø»á×Ô¶¯·¢ÏÖËùÓи´ÖƸÃÖ÷Êý¾Ý¿âµÄ´ÓÊý¾Ý¿â¡£

MasterÓëslaveµÄÇл»¹ý³Ì£º

£¨1£©slave leaderÉý¼¶Îªmaster

£¨2£©ÆäËûslaveÐÞ¸ÄΪÐÂmasterµÄslave

£¨3£©¿Í»§¶ËÐÞ¸ÄÁ¬½Ó

£¨4£©ÀϵÄmasterÈç¹ûÖØÆô³É¹¦£¬±äΪÐÂmasterµÄslave

3¡¢redis-clusterȺ¼¯¸ß¿ÉÓüܹ¹

¼´Ê¹Ê¹ÓÃÉÚ±ø£¬redisÿ¸öʵÀýÒ²ÊÇÈ«Á¿´æ´¢£¬Ã¿¸öredis´æ´¢µÄÄÚÈݶ¼ÊÇÍêÕûµÄÊý¾Ý£¬ÀË·ÑÄÚ´æÇÒÓÐľͰЧӦ¡£ÎªÁË×î´ó»¯ÀûÓÃÄڴ棬¿ÉÒÔ²ÉÓÃclusterȺ¼¯£¬¾ÍÊÇ·Ö²¼Ê½´æ´¢¡£¼´Ã¿Ì¨redis´æ´¢²»Í¬µÄÄÚÈÝ¡£

²ÉÓÃredis-cluster¼Ü¹¹ÕýÊÇÂú×ãÕâÖÖ·Ö²¼Ê½´æ´¢ÒªÇóµÄ¼¯ÈºµÄÒ»ÖÖÌåÏÖ¡£redis-cluster¼Ü¹¹ÖУ¬±»Éè¼Æ³É¹²ÓÐ16384¸öhash slot¡£Ã¿¸ömaster·ÖµÃÒ»²¿·Öslot£¬ÆäË㷨Ϊ£ºhash_slot = crc16(key) mod 16384 £¬Õâ¾ÍÕÒµ½¶ÔÓ¦slot¡£²ÉÓÃhash slotµÄËã·¨£¬Êµ¼ÊÉÏÊǽâ¾öÁËredis-cluster¼Ü¹¹Ï£¬Óжà¸ömaster½ÚµãµÄʱºò£¬Êý¾ÝÈçºÎ·Ö²¼µ½ÕâЩ½ÚµãÉÏÈ¥¡£keyÊÇ¿ÉÓÃkey£¬Èç¹ûÓÐ{}ÔòÈ¡{}ÄÚµÄ×÷Ϊ¿ÉÓÃkey£¬·ñÔòÕû¸ö¿ÉÒÔÊÇ¿ÉÓÃkey¡£Èº¼¯ÖÁÉÙÐèÒª3Ö÷3´Ó£¬ÇÒÿ¸öʵÀýʹÓò»Í¬µÄÅäÖÃÎļþ¡£

ÔÚredis-cluster¼Ü¹¹ÖУ¬redis-master½ÚµãÒ»°ãÓÃÓÚ½ÓÊÕ¶Áд£¬¶øredis-slave½ÚµãÔòÒ»°ãÖ»ÓÃÓÚ±¸·Ý£¬ÆäÓë¶ÔÓ¦µÄmasterÓµÓÐÏàͬµÄslot¼¯ºÏ£¬Èôij¸öredis-masterÒâÍâʧЧ£¬ÔòÔÙ½«Æä¶ÔÓ¦µÄslave½øÐÐÉý¼¶ÎªÁÙʱredis-master¡£

ÔÚredisµÄ¹Ù·½ÎĵµÖУ¬¶Ôredis-cluster¼Ü¹¹ÉÏ£¬ÓÐÕâÑùµÄ˵Ã÷£ºÔÚcluster¼Ü¹¹Ï£¬Ä¬Èϵģ¬Ò»°ãredis-masterÓÃÓÚ½ÓÊÕ¶Áд£¬¶øredis-slaveÔòÓÃÓÚ±¸·Ý£¬µ±ÓÐÇëÇóÊÇÔÚÏòslave·¢Æðʱ£¬»áÖ±½ÓÖØ¶¨Ïòµ½¶ÔÓ¦keyËùÔÚµÄmasterÀ´´¦Àí¡£µ«Èç¹û²»½éÒâ¶ÁÈ¡µÄÊÇredis-clusterÖÐÓпÉÄܹýÆÚµÄÊý¾Ý²¢ÇÒ¶ÔдÇëÇ󲻸ÐÐËȤʱ£¬ÔòÒà¿Éͨ¹ýreadonlyÃüÁ½«slaveÉèÖóɿɶÁ£¬È»ºóͨ¹ýslave»ñÈ¡Ïà¹ØµÄkey£¬´ïµ½¶Áд·ÖÀë¡£¾ßÌå¿ÉÒÔ²ÎÔÄredis¹Ù·½Îĵµ£¨https://redis.io/commands/readonly£©µÈÏà¹ØÄÚÈÝ£º

Enables read queries for a connection to a Redis

Cluster slave node.
Normally slave nodes will redirect clients to the

authoritative master for the hash slot involved

in a given command, however clients can use slaves

in order to scale reads using the READONLY command.
READONLY tells a Redis Cluster slave node that

the client is willing to read possibly stale

data and is not interested in running write queries.
When the connection is in readonly mode, the

cluster will send a redirection to the client

only if the operation involves keys not served

by the slave's master node. This may happen because:
The client sent a command about hash slots never served

by the master of this slave.
The cluster was reconfigured (for example resharded)

and the slave is no longer able to serve commands for

a given hash slot.

ÀýÈ磬ÎÒÃǼÙÉèÒѾ­½¨Á¢ÁËÒ»¸öÈýÖ÷Èý´ÓµÄredis-cluster¼Ü¹¹£¬ÆäÖÐA¡¢B¡¢C½Úµã¶¼ÊÇredis-master½Úµã£¬A1¡¢B1¡¢C1½Úµã¶¼ÊǶÔÓ¦µÄredis-slave½Úµã¡£ÔÚÎÒÃÇÖ»ÓÐmaster½ÚµãA£¬B£¬CµÄÇé¿öÏ£¬¶ÔÓ¦redis-clusterÈç¹û½ÚµãBʧ°Ü£¬ÔòȺ¼¯ÎÞ·¨¼ÌÐø£¬ÒòΪÎÒÃÇûÓа취ÔÙÔÚ½ÚµãBµÄËù¾ßÓеÄÔ¼Èý·ÖÖ®Ò»µÄhash slot¼¯ºÏ·¶Î§ÄÚÌṩÏà¶ÔÓ¦µÄslot¡£È»¶ø£¬Èç¹ûÎÒÃÇΪÿ¸öÖ÷·þÎñÆ÷½ÚµãÌí¼ÓÒ»¸ö´Ó·þÎñÆ÷½Úµã£¬ÒÔ±ã×îÖÕ¼¯ÈºÓÉ×÷ΪÖ÷·þÎñÆ÷½ÚµãµÄA£¬B£¬CÒÔ¼°×÷Ϊ´Ó·þÎñÆ÷½ÚµãµÄA1£¬B1£¬C1×é³É£¬ÄÇôÈç¹û½ÚµãB·¢Éú¹ÊÕÏ£¬ÏµÍ³Äܹ»¼ÌÐøÔËÐС£½ÚµãB1¸´ÖÆB£¬²¢ÇÒBʧЧʱ£¬Ôòredis-cluster½«´ÙʹBµÄ´Ó½ÚµãB1×÷ΪеÄÖ÷·þÎñÆ÷½Úµã²¢ÇÒ½«¼ÌÐøÕýÈ·µØ²Ù×÷¡£µ«Çë×¢Ò⣬Èç¹û½ÚµãBºÍB1ÔÚͬһʱ¼ä·¢Éú¹ÊÕÏ£¬ÔòRedisȺ¼¯ÎÞ·¨¼ÌÐøÔËÐС£

RedisȺ¼¯ÅäÖòÎÊý:ÔÚ¼ÌÐøÖ®Ç°£¬ÈÃÎÒÃǽéÉÜÒ»ÏÂRedis ClusterÔÚredis.confÎļþÖÐÒýÈëµÄÅäÖòÎÊý¡£ÓÐЩÃüÁîµÄÒâ˼ÊÇÏÔ¶øÒ×¼ûµÄ£¬ÓÐЩÃüÁîÔÚÄãÔĶÁÏÂÃæµÄ½âÊͺó²Å»á¸ü¼ÓÇåÎú¡£

£¨1£©cluster-enabled £ºÈç¹ûÏëÔÚÌØ¶¨µÄRedisʵÀýÖÐÆôÓÃRedisȺ¼¯Ö§³Ö¾ÍÉèÖÃΪyes¡£ ·ñÔò£¬ÊµÀýͨ³£×÷Ϊ¶ÀÁ¢ÊµÀýÆô¶¯¡£

£¨2£©cluster-config-file £ºÇë×¢Ò⣬¾¡¹ÜÓдËÑ¡ÏîµÄÃû³Æ£¬µ«Õâ²»ÊÇÓû§¿É±à¼­µÄÅäÖÃÎļþ£¬¶øÊÇRedisȺ¼¯½Úµãÿ´Î·¢Éú¸ü¸Äʱ×Ô¶¯±£ÁôȺ¼¯ÅäÖ㨻ù±¾ÉÏΪ״̬£©µÄÎļþ¡£

£¨3£©cluster-node-timeout £ºRedisȺ¼¯½Úµã¿ÉÒÔ²»¿ÉÓõÄ×ʱ¼ä£¬¶ø²»»á½«ÆäÊÓΪʧ°Ü¡£ Èç¹ûÖ÷½Úµã³¬¹ýÖ¸¶¨µÄʱ¼ä²»¿É´ï£¬Ëü½«ÓÉÆä´ÓÊôÉ豸½øÐйÊÕÏÇл»¡£

£¨4£©cluster-slave-validity-factor £ºÈç¹ûÉèÖÃΪ0£¬ÎÞÂÛÖ÷É豸ºÍ´ÓÉ豸֮¼äµÄÁ´Â·±£³Ö¶Ï¿ªÁ¬½ÓµÄʱ¼ä³¤¶Ì£¬´ÓÉ豸¶¼½«³¢ÊÔ¹ÊÕÏÇл»Ö÷É豸¡£ Èç¹û¸ÃֵΪÕýÖµ£¬Ôò¼ÆËã×î´ó¶Ï¿ªÊ±¼ä×÷Ϊ½Úµã³¬Ê±Öµ³ËÒÔ´ËÑ¡ÏîÌṩµÄϵÊý£¬Èç¹û¸Ã½ÚµãÊǴӽڵ㣬ÔòÔÚÖ÷Á´Â·¶Ï¿ªÁ¬½ÓµÄʱ¼ä³¬¹ýÖ¸¶¨µÄ³¬Ê±ÖµÊ±£¬Ëü²»»á³¢ÊÔÆô¶¯¹ÊÕÏÇл»¡£

£¨5£©cluster-migration-barrier £ºÖ÷É豸½«±£³ÖÁ¬½ÓµÄ×îС´ÓÉ豸ÊýÁ¿£¬ÒÔ±ãÁíÒ»¸ö´ÓÉè±¸Ç¨ÒÆµ½²»ÊÜÈκδÓÉ豸¸²¸ÇµÄÖ÷É豸¡£Óйظü¶àÐÅÏ¢£¬Çë²ÎÔı¾½Ì³ÌÖÐÓйظ±±¾Ç¨ÒƵÄÏàÓ¦²¿·Ö¡£

£¨6£©cluster-require-full-coverage £ºÈç¹û½«ÆäÉèÖÃΪyes£¬ÔòĬÈÏÇé¿öÏ£¬Èç¹ûkeyµÄ¿Õ¼äµÄij¸ö°Ù·Ö±Èδ±»Èκνڵ㸲¸Ç£¬Ôò¼¯ÈºÍ£Ö¹½ÓÊÜдÈë¡£ Èç¹û¸ÃÑ¡ÏîÉèÖÃΪno£¬Ôò¼´Ê¹Ö»´¦Àí¹ØÓÚkeys×Ó¼¯µÄÇëÇó£¬Èº¼¯ÈÔ½«Ìṩ²éѯ¡£

ÒÔÏÂÊÇ×îСµÄRedis¼¯ÈºÅäÖÃÎļþ£º


port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

×¢Ò⣺

£¨1£©redis-cluster×îСÅäÖÃΪÈýÖ÷Èý´Ó£¬µ±1¸öÖ÷¹ÊÕÏ£¬´ó¼Ò»á¸ø¶ÔÓ¦µÄ´ÓͶƱ£¬°Ñ´ÓÁ¢ÎªÖ÷£¬ÈôûÓдÓÊý¾Ý¿â¿ÉÒÔ»Ö¸´ÔòredisȺ¼¯¾ÍdownÁË¡£

£¨2£©ÔÚÕâ¸öredis clusterÖУ¬Èç¹ûÄãÒªÔÚslave¶ÁÈ¡Êý¾Ý£¬ÄÇôÐèÒª´øÉÏreadonlyÖ¸Áî¡£redis clusterµÄºËÐĵÄÀíÄÖ÷ÒªÊÇÓÃslave×ö¸ß¿ÉÓõģ¬Ã¿¸ömaster¹ÒÒ»Á½¸öslave£¬Ö÷ÒªÊÇ×öÊý¾ÝµÄÈȱ¸£¬µ±master¹ÊÕÏʱµÄ×÷ΪÖ÷±¸Çл»£¬ÊµÏָ߿ÉÓõġ£redis clusterĬÈÏÊDz»Ö§³Öslave½Úµã¶Á»òÕßдµÄ£¬¸úÎÒÃÇÊÖ¶¯»ùÓÚreplication´î½¨µÄÖ÷´Ó¼Ü¹¹²»Ò»ÑùµÄ¡£slave nodeÒªÉèÖÃreadonly£¬È»ºóÔÙget£¬Õâ¸öʱºò²ÅÄÜÔÚslave node½øÐжÁÈ¡¡£¶ÔÓÚredis -clusterÖ÷´Ó¼Ü¹¹£¬ÈôÒª½øÐжÁд·ÖÀ룬¹Ù·½ÆäʵÊDz»½¨ÒéµÄ£¬µ«Ò²ÄÜ×ö£¬Ö»ÊǻḴÔÓһЩ¡£¾ßÌå¼ûÏÂÃæµÄÕ½ڡ£

£¨3£©redis-clusterµÄ¼Ü¹¹Ï£¬Êµ¼ÊÉϱ¾Éímaster¾ÍÊÇ¿ÉÒÔÈÎÒâÀ©Õ¹µÄ£¬ÄãÈç¹ûÒªÖ§³Å¸ü´óµÄ¶ÁÍÌÍÂÁ¿£¬»òÕßдÍÌÍÂÁ¿£¬»òÕßÊý¾ÝÁ¿£¬¶¼¿ÉÒÔÖ±½Ó¶Ômaster½øÐкáÏòÀ©Õ¹¾Í¿ÉÒÔÁË¡£Ò²À©ÈÝmaster£¬¸ú֮ǰÀ©ÈÝslave½øÐжÁд·ÖÀ룬Ч¹ûÊÇÒ»ÑùµÄ»òÕß˵¸üºÃ¡£

£¨4£©¿ÉÒÔʹÓÃ×Ô´ø¿Í»§¶ËÁ¬½Ó£ºÊ¹ÓÃredis-cli -c -p clusterÖÐÈÎÒâÒ»¸ö¶Ë¿Ú£¬½øÐÐÊý¾Ý»ñÈ¡²âÊÔ¡£

JavaÖжÔredis-clusterÊý¾ÝµÄÒ»°ã¶ÁÈ¡·½·¨¼ò½é

ʹÓÃJedis¶Áдredis-clusterµÄÊý¾Ý

ÓÉÓÚJedisÀàÒ»°ãÖ»ÄܶÔһ̨redis-master½øÐÐÊý¾Ý²Ù×÷£¬ËùÒÔÃæ¶Ôredis-cluster¶ą̀masterÓëslaveµÄȺ¼¯£¬JedisÀà¾Í²»ÄÜÂú×ãÁË¡£Õâ¸öʱºòÎÒÃÇÐèÒªÒýÓÃÁíÍâÒ»¸ö²Ù×÷ÀࣺJedisClusterÀà¡£

ÀýÈçÎÒÃÇÓÐ6̨»úÆ÷×é³ÉµÄredis-cluster£º

172.20.52.85:7000¡¢ 172.20.52.85:7001¡¢

172.20.52.85:7002¡¢172.20.52.85:7003¡¢172.20.52

.85:7004¡¢172.20.52.85:7005

ÆäÖÐmaster»úÆ÷¶ÔÓ¦¶Ë¿Ú£º7000¡¢7004¡¢7005

slave¶ÔÓ¦¶Ë¿Ú£º7001¡¢7002¡¢7003

ʹÓÃJedisCluster¶Ôredis-cluster½øÐÐÊý¾Ý²Ù×÷µÄ²Î¿¼´úÂëÈçÏ£º


// Ìí¼Ónodes·þÎñ½Úµãµ½Set¼¯ºÏ
Set<HostAndPort> hostAndPortsSet = new HashSet<HostAndPort>();
// Ìí¼Ó½Úµã
hostAndPortsSet.add(new HostAndPort("172.20.52.85", 7000));
hostAndPortsSet.add(new HostAndPort("172.20.52.85", 7001));
hostAndPortsSet.add(new HostAndPort("172.20.52.85", 7002));
hostAndPortsSet.add(new HostAndPort("172.20.52.85", 7003));
hostAndPortsSet.add(new HostAndPort("172.20.52.85", 7004));
hostAndPortsSet.add(new HostAndPort("172.20.52.85", 7005));

// JedisÁ¬½Ó³ØÅäÖÃ
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(100);
jedisPoolConfig.setMaxTotal(500);
jedisPoolConfig.setMinIdle(0);
jedisPoolConfig.setMaxWaitMillis(2000); // ÉèÖÃ2Ãë
jedisPoolConfig.setTestOnBorrow(true);

JedisCluster jedisCluster = new JedisCluster

(hostAndPortsSet ,jedisPoolConfig);
String result = jedisCluster.get("event:10");
System.out.println(result);

ÔËÐнá¹û½ØÍ¼ÈçÏÂͼËùʾ£º

µÚÒ»½ÚÖÐÎÒÃÇÒѾ­½éÉÜÁËredis-cluster¼Ü¹¹ÏÂmasterÌṩ¶Áд¹¦ÄÜ£¬¶øslaveÒ»°ãÖ»×÷Ϊ¶ÔÓ¦master»úÆ÷µÄÊý¾Ý±¸·Ý²»Ìṩ¶Áд¡£Èç¹ûÎÒÃÇÖ»ÔÚhostAndPortsSetÖÐÖ»ÅäÖÃslave£¬¶ø²»ÅäÖÃmaster£¬Êµ¼ÊÉÏ»¹ÊÇ¿ÉÒÔ¶Áµ½Êý¾Ý£¬µ«ÆäÄÚ²¿²Ù×÷ʵ¼ÊÊÇͨ¹ýslaveÖØ¶¨Ïòµ½Ïà¹ØµÄmasterÖ÷»úÉÏ£¬È»ºóÔÙ½«½á¹û»ñÈ¡ºÍÊä³ö¡£

ÉÏÃæÊÇÆÕͨÏîĿʹÓÃJedisClusterµÄ¼òµ¥¹ý³Ì£¬ÈôÔÚspring bootÏîÄ¿ÖУ¬¿ÉÒÔ¶¨ÒåJedisConfigÀ࣬ʹÓÃ@Configuration¡¢@Value¡¢@BeanµÈһЩÁÐ×¢½âÍê³ÉJedisClusterµÄÅäÖã¬È»ºóÔÙ×¢Èë¸ÃJedisClusterµ½Ïà¹ØserviceÂß¼­ÖÐÒýÓã¬ÕâÀï½éÉÜÂÔ¡£

ʹÓÃLettuce¶Áдredis-clusterÊý¾Ý

Lettuce ºÍ Jedis µÄ¶¨Î»¶¼ÊÇRedisµÄclient¡£JedisÔÚʵÏÖÉÏÊÇÖ±½ÓÁ¬½ÓµÄredis server£¬Èç¹ûÔÚ¶àÏ̻߳·¾³ÏÂÊÇ·ÇḬ̈߳²È«µÄ£¬Õâ¸öʱºòÖ»ÓÐʹÓÃÁ¬½Ó³Ø£¬ÎªÃ¿¸öJedisʵÀýÔö¼ÓÎïÀíÁ¬½Ó£¬Ã¿¸öÏ̶߳¼È¥ÄÃ×Ô¼ºµÄ Jedis ʵÀý£¬µ±Á¬½ÓÊýÁ¿Ôö¶àʱ£¬ÎïÀíÁ¬½Ó³É±¾¾Í½Ï¸ßÁË¡£

LettuceµÄÁ¬½ÓÊÇ»ùÓÚNettyµÄ£¬Á¬½ÓʵÀý£¨StatefulRedisConnection£©¿ÉÒÔÔÚ¶à¸öÏ̼߳䲢·¢·ÃÎÊ£¬Ó¦ÎªStatefulRedisConnectionÊÇḬ̈߳²È«µÄ£¬ËùÒÔÒ»¸öÁ¬½ÓʵÀý£¨StatefulRedisConnection£©¾Í¿ÉÒÔÂú×ã¶àÏ̻߳·¾³ÏµIJ¢·¢·ÃÎÊ£¬µ±È»Õâ¸öÒ²ÊÇ¿ÉÉìËõµÄÉè¼Æ£¬Ò»¸öÁ¬½ÓʵÀý²»¹»µÄÇé¿öÒ²¿ÉÒÔ°´ÐèÔö¼ÓÁ¬½ÓʵÀý¡£

ÆäÖÐspring boot 2.X°æ±¾ÖУ¬ÒÀÀµµÄspring-session-data-redisÒѾ­Ä¬ÈÏÌæ»»³ÉLettuceÁË¡£

ͬÑù£¬ÀýÈçÎÒÃÇÓÐ6̨»úÆ÷×é³ÉµÄredis-cluster£º

172.20.52.85:7000¡¢ 172.20.52.85:7001¡¢172.20.52.

85:7002¡¢172.20.52.85:7003¡¢172.20.52.85:7004¡¢172.20.52.85:7005

ÆäÖÐmaster»úÆ÷¶ÔÓ¦¶Ë¿Ú£º7000¡¢7004¡¢7005

slave¶ÔÓ¦¶Ë¿Ú£º7001¡¢7002¡¢7003

ÔÚspring boot 2.X°æ±¾ÖÐʹÓÃLettuce²Ù×÷redis-clusterÊý¾ÝµÄ·½·¨²Î¿¼ÈçÏ£º

£¨1£©pomÎļþ²Î¿¼ÈçÏ£º

parentÖÐÖ¸³öspring bootµÄ°æ±¾£¬ÒªÇó2.XÒÔÉÏ£º

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- lookup parent from repository -->

ÒÀÀµÖÐÐèÒª¼ÓÈëspring-boot-starter-data-redis£¬²Î¿¼ÈçÏ£º

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

£¨2£©springbootµÄÅäÖÃÎļþÒª°üº¬ÈçÏÂÄÚÈÝ£º

spring.redis.database=0
spring.redis.lettuce.pool.max-idle=10
spring.redis.lettuce.pool.max-wait=500
spring.redis.cluster.timeout=1000
spring.redis.cluster.max-redirects=3

spring.redis.cluster.nodes=172.20.52.85:7000,

172.20.52.85:7001,172.20.52.85:7002,172.20.

52.85:7003,172.20.52.85:7004,172.20.52.85:7005

£¨3£©Ð½¨RedisConfigurationÀ࣬²Î¿¼´úÂëÈçÏ£º

@Configuration
public class RedisConfiguration {
[@Resource](https://my.oschina.net/u/929718)
private LettuceConnectionFactory myLettuceConnectionFactory;


<a href='http://www.jobbole.com/members/q890462235'

>@Bean</a>
public RedisTemplate<String, Serializable>

redisTemplate() {

RedisTemplate<String, Serializable> template = new RedisTemplate<>();

template.setKeySerializer(new StringRedisSerializer

());

//template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setValueSerializer(new StringRedisSerializer

());

template.setConnectionFactory(myLettuceConnec

tionFactory);

return template;

}
}

£¨4£©Ð½¨RedisFactoryConfigÀ࣬²Î¿¼´úÂëÈçÏ£º


@Configuration
public class RedisFactoryConfig {

@Autowired
private Environment environment;


<a href='http://www.jobbole.com/members/q890462235'>

@Bean</a>
public RedisConnectionFactory myLettuceConnection

Factory() {
Map<String, Object> source = new HashMap<String, Object>();

source.put("spring.redis.cluster.nodes", environment.getProperty("spring.redis.cluster.

nodes"));
source.put("spring.redis.cluster.timeout", environment.getProperty("spring.redis.cluster.timeout

"));
source.put("spring.redis.cluster.max-redirects", environment.getProperty("spring.redis.cluster.max-redirects"));

RedisClusterConfiguration redisClusterConfiguration;

redisClusterConfiguration = new RedisClusterConfiguration(new MapPropertySource("RedisClusterConfiguration",

source));

return new LettuceConnectionFactory(redisClusterConfiguration);

}
}

£¨5£©ÔÚÒµÎñÀàserviceÖÐ×¢ÈëLettuceÏà¹ØµÄRedisTemplate£¬½øÐÐÏà¹Ø²Ù×÷¡£ÒÔÏÂÊÇÎÒ»¯¼òµ½ÁËspringbootstarterÖнøÐУ¬²Î¿¼´úÂëÈçÏ£º

@SpringBootApplication
public class NewRedisClientApplication {

public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(NewRedisClientApplication.

class, args);
RedisTemplate redisTemplate = (RedisTemplate)context.getBean("redisTemplate");
String rtnValue = (String)redisTemplate.opsForValue().get("event:10");
System.out.println(rtnValue);

}
}

ÔËÐнá¹ûµÄ½ØÍ¼ÈçÏ£º

ÒÔÉϵĽéÉÜ£¬ÊDzÉÓÃJedisÒÔ¼°Lettuce¶Ôredis-clusterÊý¾ÝµÄ¼òµ¥¶ÁÈ¡¡£JedisÒ²ºÃ£¬LettuceÒ²ºÃ£¬Æä¶ÔÓÚredis-cluster¼Ü¹¹ÏµÄÊý¾ÝµÄ¶ÁÈ¡£¬¶¼ÊÇĬÈÏÊǰ´ÕÕredis¹Ù·½¶Ôredis-clusterµÄÉè¼Æ£¬×Ô¶¯½øÐÐÖØ¶¨Ïòµ½master½ÚµãÖнøÐеģ¬ÄÄÅÂÊÇÎÒÃÇÔÚÅäÖÃÖÐÁгöÁËËùÓеÄmaster½ÚµãºÍslave½Úµã¡£²éÔÄÁËJedisÒÔ¼°LettuceµÄgithubÉϵÄÔ´Â룬ĬÈϲ»Ö§³Öredis-clusterϵĶÁд·ÖÀ룬¿ÉÒÔ¿´³öJedisÈôÒªÖ§³Öredis-cluster¼Ü¹¹ÏµĶÁд·ÖÀ룬ÐèÒª×Ô¼º¸ÄдºÍ¹¹½¨¶àһЩ°ü×°À࣬¶¨ÒåºÃMasterºÍslave½ÚµãµÄÂß¼­£»¶øLettuceµÄÔ´ÂëÖУ¬Êµ¼ÊÉÏÔ¤ÁôÁË·½·¨£¨setReadForm(ReadFrom.SLAVE)£©½øÐÐredis-cluster¼Ü¹¹ÏµĶÁд·ÖÀ룬Ïà¶ÔÀ´ËµÐ޸Ļá¼òµ¥Ò»Ð©£¬¾ßÌå¿ÉÒԲο¼ºóÃæµÄÕ½ڡ£

redis-cluster¼Ü¹¹ÏµĶÁдÄÜÁ¦µÄÓÅ»¯·½°¸

ÔÚÉÏÃæµÄһЩÕ½ÚÖУ¬ÒѾ­Óн²µ½redis½üÄêÀ´µÄ¸ß¿ÉÓüܹ¹µÄÑݱ䣬ÒÔ¼°ÔÚredis-cluster¼Ü¹¹Ï£¬¹Ù·½¶Ôredis-master¡¢redis-slaveµÄÆäʵÓÐʹÓÃÉϵĽ¨Ò飬¼´redis-master½ÚµãÒ»°ãÓÃÓÚ½ÓÊÕ¶Áд£¬¶øredis-slave½ÚµãÔòÒ»°ãÖ»ÓÃÓÚ±¸·Ý£¬ÆäÓë¶ÔÓ¦µÄmasterÓµÓÐÏàͬµÄslot¼¯ºÏ£¬Èôij¸öredis-masterÒâÍâʧЧ£¬ÔòÔÙ½«Æä¶ÔÓ¦µÄslave½øÐÐÉý¼¶ÎªÁÙʱredis-master¡£µ«Èç¹û²»½éÒâ¶ÁÈ¡µÄÊÇredis-clusterÖÐÓпÉÄܹýÆÚµÄÊý¾Ý²¢ÇÒ¶ÔдÇëÇ󲻸ÐÐËȤʱ£¬ÔòÒà¿Éͨ¹ýreadonlyÃüÁ½«slaveÉèÖóɿɶÁ£¬È»ºóͨ¹ýslave»ñÈ¡Ïà¹ØµÄkey£¬´ïµ½¶Áд·ÖÀë¡£

¾ßÌå¿ÉÒÔ²ÎÔÄredis¹Ù·½Îĵµ£¨https://redis.io/commands/readonly£©£¬ÒÔÏÂÊÇreidsÔÚÏßÎĵµÖУ¬¶ÔslaveµÄreadonly˵Ã÷ÄÚÈÝ£º

ʵ¼ÊÉϱ¾Éímaster¾ÍÊÇ¿ÉÒÔÈÎÒâÀ©Õ¹µÄ£¬ËùÒÔÈç¹ûÒªÖ§³Å¸ü´óµÄ¶ÁÍÌÍÂÁ¿£¬»òÕßдÍÌÍÂÁ¿£¬»òÕßÊý¾ÝÁ¿£¬¶¼¿ÉÒÔÖ±½Ó¶Ômaster½øÐкáÏòˮƽÀ©Õ¹¾Í¿ÉÒÔÁË¡£Ò²¾ÍÊÇ˵£¬À©ÈÝmaster£¬¸ú֮ǰÀ©ÈÝslave²¢½øÐжÁд·ÖÀ룬Ч¹ûÊÇÒ»ÑùµÄ»òÕß˵¸üºÃ¡£

ËùÒÔÏÂÃæÎÒÃǽ«°´ÕÕredis-cluster¼Ü¹¹Ï·ֱð½øÐÐˮƽÀ©Õ¹Master£¬ÒÔ¼°ÔÚredis-cluster¼Ü¹¹Ï¶Ômaster¡¢slave½øÐжÁд·ÖÀëÁ½Ì×·½°¸½øÐн²½â¡£

£¨Ò»£©Ë®Æ½À©Õ¹MasterʵÀýÀ´½øÐÐredis-clusterÐÔÄܵÄÌáÉý

redis¹Ù·½ÔÚÏßÎĵµÒÔ¼°Ò»Ð©»¥ÁªÍøµÄ²Î¿¼×ÊÁ϶¼±íÃ÷£¬ÔÚredis-cluster¼Ü¹¹Ï£¬Êµ¼ÊÉϲ»½¨Òé×öÎïÀíµÄ¶Áд·ÖÀë¡£ÄÇôÈç¹ûÎÒÃÇÕæµÄ²»×ö¶Áд·ÖÀëµÄ»°£¬ÄÜ·ñͨ¹ý¼òµ¥µÄ·½·¨½øÐÐredis-clusterϵÄÐÔÄܵÄÌáÉý£¿ÎÒÃÇ¿ÉÒÔͨ¹ýmasterµÄˮƽÀ©Õ¹£¬À´ºáÏòÀ©Õ¹¶ÁдÍÌÍÂÁ¿£¬²¢ÇÒÄÜÖ§³Å¸ü¶àµÄº£Á¿Êý¾Ý¡£

¶Ômaster½øÐÐˮƽÀ©Õ¹ÓÐÁ½ÖÖ·½·¨£¬Ò»ÖÖÊǵ¥»úÉÏÃæ½øÐÐmasterʵÀýµÄÔö¼Ó£¨½¨ÒéÿÐÂÔöÒ»¸ömaster£¬Ò²ÐÂÔöÒ»¸ö¶ÔÓ¦µÄslave£©£¬ÁíÒ»ÖÖÊÇÐÂÔö»úÆ÷²¿ÊðеÄmasterʵÀý£¨Í¬Ñù½¨ÒéÿÐÂÔöÒ»¸ömaster£¬Ò²ÐÂÔöÒ»¸ö¶ÔÓ¦µÄslave£©¡£µ±È»£¬ÎÒÃÇÒ²¿ÉÒÔ½øÐÐÕâÁ½ÖÖ·½·¨µÄÓÐЧ½áºÏ¡£

£¨1£©µ¥»úÉÏͨ¹ý¶àÏ߳̽¨Á¢ÐÂredis-masterʵÀý£¬¼´Âß¼­ÉϵÄˮƽÀ©Õ¹£º

Ò»°ãµÄ£¬¶ÔÓÚredisµ¥»ú£¬µ¥Ï̵߳ĶÁÍÌÍÂÊÇ4w/s~5W/s£¬Ð´ÍÌÍÂΪ2w/s¡£

µ¥»úºÏÀí¿ªÆôredis¶àÏß³ÌÇé¿öÏ£¨Ò»°ãÏß³ÌÊýΪCPUºËÊýµÄ±¶Êý£©£¬×ÜÍÌÍÂÁ¿»áÓÐËùÉÏÉý£¬µ«Ã¿¸öÏß³ÌµÄÆ½¾ù´¦ÀíÄÜÁ¦»áÓÐËùϽµ¡£ÀýÈçÒ»¸ö2ºËCPU£¬¿ªÆô2Ï̵߳Äʱºò£¬×ܶÁÍÌÍÂÄÜÉÏÉýÊÇ6W/s~7W/s£¬¼´Ã¿¸öÏß³ÌÆ½¾ùÔ¼3W/sÔÙ¶àһЩ¡£µ«¹ý¶àµÄredisÏ̷߳´¶ø»áÏÞÖÆÁË×ÜÍÌÍÂÁ¿¡£

£¨2£©À©Õ¹¸ü¶àµÄ»úÆ÷£¬²¿ÊðÐÂredis-masterʵÀý£¬¼´ÎïÀíÉϵÄˮƽÀ©Õ¹£º

ÀýÈ磬ÎÒÃÇ¿ÉÒÔÔÙÔ­À´Ö»ÓÐ3̨masterµÄ»ù´¡ÉÏ£¬Á¬ÈëлúÆ÷¼ÌÐøÐÂʵÀýµÄ²¿Êð£¬×îÖÕˮƽÀ©Õ¹Îª6̨master£¨½¨ÒéÿÐÂÔöÒ»¸ömaster£¬Ò²ÐÂÔöÒ»¸ö¶ÔÓ¦µÄslave£©¡£ÀýÈç֮ǰÿ̨masterµÄ´¦ÀíÄÜÁ¦¼ÙÉèÊǶÁÍÌÍÂ5W/s,дÍÌÍÂ2W/s,À©Õ¹Ç°Ò»¹²µÄ´¦ÀíÄÜÁ¦ÊÇ£º15W/s¶Á£¬6W/sд¡£Èç¹ûÎÒÃÇˮƽÀ©Õ¹µ½6̨master£¬¶ÁÍÌÍ¿ÉÒÔ´ïµ½×ÜÁ¿30W/s£¬Ð´¿ÉÒÔ´ïµ½12w/s£¬ÐÔÄÜÄܹ»³É±¶Ôö¼Ó¡£

£¨3£©ÈôÔ­±¾Ã¿Ì¨²¿Êðredis-masterʵÀýµÄ»úÆ÷¶¼ÐÔÄÜÁ¼ºÃ£¬Ôò¿ÉÒÔͨ¹ýÉÏÊöÁ½ÕߵĽáºÏ£¬½øÐÐÒ»¸ö¸üÓŵÄ×éºÏ¡£

ʹÓø÷½°¸½øÐÐredis-clusterÐÔÄܵÄÌáÉýµÄÓŵãÓУº

£¨1£©·ûºÏredis¹Ù·½ÒªÇóºÍÊý¾ÝµÄ׼ȷÐÔ¡£

£¨2£©ÕæÕý´ïµ½¸ü´óÍÌÍÂÁ¿µÄÐÔÄÜÀ©Õ¹¡£

£¨3£©ÎÞÐè´úÂëµÄ´óÁ¿¸ü¸Ä£¬Ö»ÐèÔÚÅäÖÃÎļþÖÐÖØÐÂÅäÖÃеĽڵãÐÅÏ¢¡£

µ±È»È±µãÒ²ÊÇÓеģº

£¨1£©ÐèÒªÐÂÔö»úÆ÷£¬ÌáÉýÐÔÄÜ£¬¼´³É±¾»áÔö¼Ó¡£

£¨2£©Èô²»ÐÂÔö»úÆ÷£¬ÔòÐèÒªÔ­À´µÄʵÀýËùÔËÐеĻúÆ÷ÐÔÄܽϺã¬ÄܽøÐÐÒÔ¶àÏ̵߳ķ½Ê½²¿ÊðÐÂʵÀý¡£µ«Ëæ×ÅÏ̵߳ÄÔö¶à£¬¶ø»úÆ÷µÄÄÜÁ¦²»×ãÒÔÖ§³ÅµÄʱºò£¬Êµ¼ÊÉÏ×ÜÌåÄÜÁ¦»áÌáÉý²»Ì«Ã÷ÏÔ¡£

£¨3£©redis-cluster½øÐÐеÄˮƽÀ©Èݺó£¬ÐèÒª¶Ômaster½øÐÐеÄhash slotÖØÐ·ÖÅ䣬ÕâÏ൱ÓÚÐèÒªÖØÐ¼ÓÔØËùÓеÄkey£¬²¢°´Ë㷨ƽ¾ù·ÖÅäµ½¸÷¸öMasterµÄslotµ±ÖС£

£¨¶þ£©ÒýÈëLettuceÒÔ¼°ÐÞ¸ÄÏà¹Ø·½·¨£¬´ïµ½¶Ôredis-clusterµÄ¶Áд·ÖÀë

ͨ¹ýÉÏÃæµÄһЩÕ½ڣ¬ÎÒÃÇÒѾ­¿ÉÒÔÁ˽⵽Lettuce¿Í»§¶Ë¶ÁÈ¡redisµÄһЩ²Ù×÷£¬Ê¹ÓÃLettuceÄÜÌåÏÖ³öÁ˼òµ¥£¬°²È«£¬¸ßЧ¡£Êµ¼ÊÉÏ£¬²éÔÄÁËLettuce¶ÔredisµÄ¶Áд£¬Ðí¶àµØ·½¶¼½øÐÐÁËredisµÄ¶Áд·ÖÀë¡£µ«ÕâЩ¶¼ÊÇ»ùÓÚÉÏÊöredis¼Ü¹¹ÖÐ×îÆÕͨµÄÖ÷´Ó·ÖÀë¼Ü¹¹ÏµĶÁд·ÖÀ룬¶ø¶ÔÓÚredis-cluster¼Ü¹¹Ï£¬Lettuce¿ÉÄÜÊÇ×ñÑ­ÁËredis¹Ù·½µÄÒâ¼û£¬Ôڸüܹ¹Ï£¬LettuceÔÚÔ´ÂëÖÐÖ±½ÓÉèÖÃÁËÖ»ÓÉmasterÉϽøÐжÁд£¨¾ßÌå²Î¼ûgitHubµÄLettuceÏîÄ¿£©£º

ÄÇôÈç¹ûÕæµÄÐèÒªÈÃLettuce¸ÄΪÄܹ»¶ÁÈ¡redis-clusterµÄslave£¬½øÐжÁд·ÖÀ룬ÊÇ·ñ¿ÉÐУ¿Êµ¼ÊÉÏ»¹ÊÇ¿ÉÒԵġ£Õâ¾ÍÐèÒªÎÒÃÇ×Ô¼ºÔÚÏîÄ¿ÖнøÐжþ´Î¼Ó¹¤£¬¼´²»Ê¹ÓÃspring-bootÖеÄĬÈÏLettuce³õʼ»¯·½·¨£¬¶øÊÇ×Ô¼ºÈ¥Ð´Ò»¸öÊôÓÚ×Ô¼ºµÄLettuceµÄÐÂRedisClusterClientµÄÁ¬½Ó£¬²¢ÇÒ¶Ô¸ÃRedisClusterClientµÄÁ¬½Ó½øÐÐÒ»¸ö±È½ÏÖØÒªµÄÉèÖã¬ÄǾÍÊÇÓÉconnection.setReadFrom(ReadFrom.MASTER)¸ÄΪconnection.setReadFrom(ReadFrom.SLAVE)¡£

ÏÂÃæÎÒÃÇ¿ªÊ¼¶Ô֮ǰÕ½ÚÖеÄLettuce¶ÁÈ¡redis-clusterÊý¾ÝµÄÀý×Ó£¬½øÐиÄд£¬ÈÃLettuceÄܹ»Ö§³Ö¸Ã¼Ü¹¹ÏµĶÁд·ÖÀ룺

spring boot 2.X°æ±¾ÖУ¬ÒÀÀµµÄspring-session-data-redisÒѾ­Ä¬ÈÏÌæ»»³ÉLettuceÁË¡£

ͬÑù£¬ÀýÈçÎÒÃÇÓÐ6̨»úÆ÷×é³ÉµÄredis-cluster£º

172.20.52.85:7000¡¢ 172.20.52.85:7001¡¢172.20.52.85:7002¡¢172.20.52.85:7003¡¢172.20.52.85:7004¡¢172.20.52.85:7005

ÆäÖÐmaster»úÆ÷¶ÔÓ¦¶Ë¿Ú£º7000¡¢7004¡¢7005

slave¶ÔÓ¦¶Ë¿Ú£º7001¡¢7002¡¢7003

ÔÚspring boot 2.X°æ±¾ÖÐʹÓÃLettuce²Ù×÷redis-clusterÊý¾ÝµÄ·½·¨²Î¿¼ÈçÏ£º

£¨1£©pomÎļþ²Î¿¼ÈçÏ£º

parentÖÐÖ¸³öspring bootµÄ°æ±¾£¬ÒªÇó2.XÒÔÉÏ£º

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- lookup parent from repository -->

ÒÀÀµÖÐÐèÒª¼ÓÈëspring-boot-starter-data-redis£¬²Î¿¼ÈçÏ£º

spring.redis.database=0
spring.redis.lettuce.pool.max-idle=10
spring.redis.lettuce.pool.max-wait=500
spring.redis.cluster.timeout=1000
spring.redis.cluster.max-redirects=3

spring.redis.cluster.nodes=172.20.52.85:7000,172.

20.52.85:7001,172.20.52.85:7002,172.20.52.85:

7003,172.20.52.85:7004,172.20.52.85:7005

£¨3£©ÎÒÃǻص½RedisConfigurationÀàÖУ¬É¾³ý»òÆÁ±Î֮ǰµÄRedisTemplate·½·¨£¬ÐÂÔö×Ô¶¨ÒåµÄredisClusterConnection·½·¨£¬²¢ÇÒÉèÖúöÁд·ÖÀ룬²Î¿¼´úÂëÈçÏ£º


@Configuration
public class RedisConfiguration {

@Autowired
private Environment environment;


<a href='http://www.jobbole.com/members/q890462235

'>@Bean</a>
public StatefulRedisClusterConnection redisClus

terConnection(){

String strRedisClusterNodes = environment.getProperty("spring.redis.cluster.nodes");
String[] listNodesInfos = strRedisClusterNodes.split(",");

List<RedisURI> listRedisURIs = new ArrayList<RedisURI>();
for(String tmpNodeInfo : listNodesInfos){
String[] tmpInfo = tmpNodeInfo.split(":");
listRedisURIs.add(new RedisURI(tmpInfo[0],Integer.

parseInt(tmpInfo[1]),

Duration.ofDays(10)));
}

RedisClusterClient clusterClient = RedisClusterClient.create(listRedisURIs);
StatefulRedisClusterConnection<String, String>

connection = clusterClient.connect();
connection.setReadFrom(ReadFrom.SLAVE);

return connection;
}
}

ÆäÖУ¬ÕâÈýÐдúÂëÊÇÄܽøÐÐredis-cluster¼Ü¹¹Ï¶Áд·ÖÀëµÄºËÐÄ£º

RedisClusterClient clusterClient = RedisClusterClient.create(listRedisURIs);
StatefulRedisClusterConnection<String, String> connection = clusterClient.connect();
connection.setReadFrom(ReadFrom.SLAVE);

ÔÚÒµÎñÀàserviceÖÐ×¢ÈëLettuceÏà¹ØµÄredisClusterConnection£¬½øÐÐÏà¹Ø¶Áд²Ù×÷¡£ÒÔÏÂÊÇÎÒÖ±½Ó»¯¼òµ½ÁËspringbootstarterÖнøÐУ¬²Î¿¼´úÂëÈçÏ£º



@SpringBootApplication
public class NewRedisClientApplication {

public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(NewRedisClientApplication.

class, args);

StatefulRedisClusterConnection<String, String>

redisClusterConnection = (StatefulRedisClusterConnection)context.getBean

("redisClusterConnection");
System.out.println(redisClusterConnection.sync()

.get("event:10"));


}
}

ÔËÐеĽá¹ûÈçÏÂͼËùʾ£º

¿ÉÒÔ¿´µ½£¬¾­¹ý¸ÄдµÄredisClusterConnectionµÄÈ·ÄܶÁÈ¡µ½redis-clusterµÄÊý¾Ý¡£µ«ÕâÒ»¸öÊý¾ÝÎÒÃÇ»¹ÐèÒªÑé֤һϵ½µ×ÊDz»ÊÇͨ¹ýslave¶ÁÈ¡µ½µÄ£¬ÓÖ»òÕß»¹ÊÇͨ¹ýslaveÖØ¶¨Ïò¸ømaster²Å»ñÈ¡µ½µÄ£¿

´ø×ÅÒÉÎÊ£¬ÎÒÃÇ¿ÉÒÔ¿ªÍ¨debugģʽ£¬ÔÚredisClusterConnection.sync().get(¡°event:10¡±)µÈÀàËÆµÄ»ñÈ¡Êý¾ÝµÄ´úÂëÐÐÉÏÃæ´òÉ϶ϵ㡣ͨ¹ý´úÂëµÄ×߲飬ÎÒÃÇ¿ÉÒÔ¿´µ½£¬ÔÚReadFromImplÀàÖУ¬×îÖÕ»áselectµ½keyËùÔÚµÄslave½Úµã£¬½øÐзµ»Ø£¬²¢ÔÚ¸ÃslaveÖнøÐÐÊý¾ÝµÄ¶ÁÈ¡£º

ReadFromImplÏÔʾ£º

ÁíÍâÎÒÃÇͨ¹ýconnectFutureÖеÄÏÔʾҲÑéÖ¤Á˶ÔÓÚslaveµÄreadonlyÉúЧÁË£º

ÕâÑù£¬¾Í´ïµ½ÁËͨ¹ýLettuce¿Í»§¶Ë¶Ôredis-clusterµÄ¶Áд·ÖÀëÁË¡£

ʹÓø÷½°¸½øÐÐredis-clusterÐÔÄܵÄÌáÉýµÄÓŵãÓУº

£¨1£©Ö±½Óͨ¹ý´úÂë¼¶¸ü¸Ä£¬¶ø²»ÐèÒªÅäÖÃеÄredis-cluster»·¾³¡£

£¨2£©ÎÞÐèÔö¼Ó»úÆ÷»òÉý¼¶Ó²¼þÉ豸¡£

µ«Í¬Ê±£¬¸Ã·½°¸Ò²ÓÐȱµã£º

£¨1£©·Ç¹Ù·½¶Ôredis-clusterµÄÍÆ¼ö·½°¸£¬ÒòΪÔÚredis-cluster¼Ü¹¹Ï£¬½øÐжÁд·ÖÀ룬ÓпÉÄÜ»á¶Áµ½¹ýÆÚµÄÊý¾Ý¡£

£¨2£©Ðè¶ÔÏîÄ¿½øÐÐÈ«ÃæµÄÌæ»»£¬½«Jedis¿Í»§¶Ë±äΪLettuce¿Í»§¶Ë£¬¶Ô´úÂëµÄ¸Ä¶¯½Ï´ó£¬¶øÇÒʹÓÃLettuceʱ£¬Ê¹ÓõIJ¢·Çspring bootµÄ×Ô´ø¼¯³ÉLettuceµÄredisTemplateÅäÖ÷½·¨£¬¶øÊÇ×Ô¼ºÅäÖöÁд·ÖÀëµÄ redisClusterConnetcion£¬ÈÕºóÓöµ½ÎÊÌâµÄʱºò£¬¿ÉÄܹٷ½ÎĵµµÄÖ§³ÖÂÊ»òÖ§³ÅÄÜÁ¦»á±È½ÏµÍ¡£

£¨3£©ÐèÐÞ¸Äredis-clusterµÄmaster¡¢slaveÅäÖã¬ÔÚ¸÷¸ö½ÚµãÖж¼ÐèÒª¼ÓÈëslave-read-only yes¡£

£¨4£©ÐÔÄܵÄÌáÉýûÓÐˮƽÀ©Õ¹masterÖ÷»úºÍʵÀýÀ´µÃÖ±½Ó¸É´à¡£

×ܽá

×ÜÌåÉÏÀ´Ëµ£¬redis-cluster¸ß¿ÉÓüܹ¹·½°¸ÊÇĿǰ×îºÃµÄredis¼Ü¹¹·½°¸£¬redisµÄ¹Ù·½¶Ôredis-cluster¼Ü¹¹Êǽ¨Òéredis-masterÓÃÓÚ½ÓÊÕ¶Áд£¬¶øredis-slaveÔòÓÃÓÚ±¸·Ý£¨±¸Óã©£¬Ä¬Èϲ»½¨Òé¶Áд·ÖÀë¡£µ«Èç¹û²»½éÒâ¶ÁÈ¡µÄÊÇredis-clusterÖÐÓпÉÄܹýÆÚµÄÊý¾Ý²¢ÇÒ¶ÔдÇëÇ󲻸ÐÐËȤʱ£¬ÔòÒà¿Éͨ¹ýreadonlyÃüÁ½«slaveÉèÖóɿɶÁ£¬È»ºóͨ¹ýslave»ñÈ¡Ïà¹ØµÄkey£¬´ïµ½¶Áд·ÖÀë¡£Jedis¡¢Lettuce¶¼¿ÉÒÔ½øÐÐredis-clusterµÄ¶Áд²Ù×÷£¬¶øÇÒĬÈÏÖ»Õë¶ÔMaster½øÐжÁд£¬ÈôÒª¶Ôredis-cluster¼Ü¹¹Ï½øÐжÁд·ÖÀ룬ÔòJedisÐèÒª½øÐÐÔ´ÂëµÄ½Ï´ó¸Ä¶¯£¬¶øLettuce¿ª·ÅÁËsetReadFrom()·½·¨£¬¿ÉÒÔ½øÐжþ´Î·â×°³É¶Áд·ÖÀëµÄ¿Í»§¶Ë£¬Ïà¶Ô¼òµ¥£¬¶øÇÒLettuce±ÈJedis¸ü°²È«¡£redis-cluster¼Ü¹¹Ï¿ÉÒÔÖ±½Óͨ¹ýˮƽÀ©Õ¹masterÀ´´ïµ½ÐÔÄܵÄÌáÉý¡£

   
2326 ´Îä¯ÀÀ       32
Ïà¹ØÎÄÕÂ

»ùÓÚEAµÄÊý¾Ý¿â½¨Ä£
Êý¾ÝÁ÷½¨Ä££¨EAÖ¸ÄÏ£©
¡°Êý¾Ýºþ¡±£º¸ÅÄî¡¢ÌØÕ÷¡¢¼Ü¹¹Óë°¸Àý
ÔÚÏßÉ̳ÇÊý¾Ý¿âϵͳÉè¼Æ ˼·+Ч¹û
 
Ïà¹ØÎĵµ

GreenplumÊý¾Ý¿â»ù´¡Åàѵ
MySQL5.1ÐÔÄÜÓÅ»¯·½°¸
ijµçÉÌÊý¾ÝÖÐ̨¼Ü¹¹Êµ¼ù
MySQL¸ßÀ©Õ¹¼Ü¹¹Éè¼Æ
Ïà¹Ø¿Î³Ì

Êý¾ÝÖÎÀí¡¢Êý¾Ý¼Ü¹¹¼°Êý¾Ý±ê×¼
MongoDBʵս¿Î³Ì
²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
PostgreSQLÊý¾Ý¿âʵսÅàѵ