±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ²®ÀÖÔÚÏß,±¾ÎÄÉæ¼°µ½½üÄêÀ´
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À´´ïµ½ÐÔÄܵÄÌáÉý¡£ |