资讯专栏INFORMATION COLUMN

docker-compose启动redis集群的实现步骤

3119555200 / 754人阅读

第一步:进行伪集的群安装


1.1:创建redis-cluster目录


我们需要先创建名为redis-cluster目录,在这个目录下创建一个docker-compose.yml文件


docker-compose.yml

</>复制代码

  1. version: '2.2'
  2. x-image:
  3. &default-image
  4. bitnami/redis-cluster:7.0
  5. x-restart:
  6. &default-restart
  7. always
  8. services:
  9. redis-node-0:
  10. image: *default-image
  11. restart: *default-restart
  12. container_name: redis-node-0
  13. ports:
  14. 6379:6379
  15. volumes:
  16. - ./redis-cluster_data-0:/bitnami/redis/data
  17. environment:
  18. 'REDIS_PASSWORD=liubei@161'
  19. 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 
  20. redis-node-4 redis-node-5'
  21. redis-node-1:
  22. image: *default-image
  23. restart: *default-restart
  24. container_name: redis-node-1
  25. ports:
  26. 16379:6379
  27. volumes:
  28. - ./redis-cluster_data-1:/bitnami/redis/data
  29. environment:
  30. 'REDIS_PASSWORD=liubei@161'
  31. 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 
  32. redis-node-4 redis-node-5'
  33. redis-node-2:
  34. image: *default-image
  35. restart: *default-restart
  36. container_name: redis-node-2
  37. ports:
  38. 26379:6379
  39. volumes:
  40. - ./redis-cluster_data-2:/bitnami/redis/data
  41. environment:
  42. 'REDIS_PASSWORD=liubei@161'
  43. 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 
  44. redis-node-4 redis-node-5'
  45. redis-node-3:
  46. image: *default-image
  47. restart: *default-restart
  48. container_name: redis-node-3
  49. ports:
  50. 36379:6379
  51. volumes:
  52. - ./redis-cluster_data-3:/bitnami/redis/data
  53. environment:
  54. 'REDIS_PASSWORD=liubei@161'
  55. 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 
  56. redis-node-4 redis-node-5'
  57. redis-node-4:
  58. image: *default-image
  59. restart: *default-restart
  60. container_name: redis-node-4
  61. ports:
  62. 46379:6379
  63. volumes:
  64. - ./redis-cluster_data-4:/bitnami/redis/data
  65. environment:
  66. 'REDIS_PASSWORD=liubei@161'
  67. 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 
  68. redis-node-4 redis-node-5'
  69. redis-node-5:
  70. image: *default-image
  71. restart: *default-restart
  72. container_name: redis-node-5
  73. ports:
  74. 56379:6379
  75. volumes:
  76. - ./redis-cluster_data-5:/bitnami/redis/data
  77. depends_on:
  78. redis-node-0
  79. redis-node-1
  80. redis-node-2
  81. redis-node-3
  82. redis-node-4
  83. environment:
  84. 'REDIS_PASSWORD=liubei@161'
  85. 'REDIS_NODES=redis-node-0 redis-node-1 redis-node-2 redis-node-3 
  86. redis-node-4 redis-node-5'


1.2:进行持久化存储


这些可以创建的目录我们能够直接启动,但我们在容器中没有使用root用户,大部分服务器都不会有写权限。因此

我们要先给这些目录读写权限。最后看对应宿主机是哪个用户,我们再将目录属主改为哪个用户即可。


储存目录

</>复制代码

  1. mkdir redis-cluster_data-{0..5}
  2. chmod 777 redis-cluster-data-*



结果如下

</>复制代码

  1. [root@liubei redis-cluster]# ll
  2. 总用量 7
  3. -rw-r----- 1 root root 2481 7月 6 10:21 docker-compose.yml
  4. drwxrwxrwx 3 root root 61 7月 6 10:43 redis-cluster_data-0
  5. drwxrwxrwx 3 root root 61 7月 6 10:43 redis-cluster_data-1
  6. drwxrwxrwx 3 root root 61 7月 6 10:43 redis-cluster_data-2
  7. drwxrwxrwx 3 root root 77 7月 6 10:51 redis-cluster_data-3
  8. drwxrwxrwx 3 root root 77 7月 6 10:51 redis-cluster_data-4
  9. drwxrwxrwx 3 root root 77 7月 6 10:51 redis-cluster_data-5


1.3:启动集群


启动

</>复制代码

  1. # docker-compose up -d


结果如下

</>复制代码

  1. [root@liubei redis-cluster]# docker-compose ps
  2. Name Command State Ports
  3. -------------------------------------------------------------------------------
  4. redis-node-0 /opt/bitnami/scripts/redis ... Up 0.0.0.0:6379->6379/tcp
  5. redis-node-1 /opt/bitnami/scripts/redis ... Up 0.0.0.0:16379->6379/tcp
  6. redis-node-2 /opt/bitnami/scripts/redis ... Up 0.0.0.0:26379->6379/tcp
  7. redis-node-3 /opt/bitnami/scripts/redis ... Up 0.0.0.0:36379->6379/tcp
  8. redis-node-4 /opt/bitnami/scripts/redis ... Up 0.0.0.0:46379->6379/tcp
  9. redis-node-5 /opt/bitnami/scripts/redis ... Up 0.0.0.0:56379->6379/tcp


1.4:初始化集群


我们先进入其中的一个容器,执行以下这条命令

</>复制代码

  1. I have no name!@d4a8a3ef35ce:/$ redis-cli -a liubei@161 --cluster create 
  2. redis-node-0:6379 redis-node-1:6379 redis-node-2:6379 redis-node-3:6379 
  3. redis-node-4:6379 redis-node-5:6379 --cluster-replicas 1



执行结果如下

</>复制代码

  1. Warning: Using a password with '-a' or '-u' option on the command line 
  2. interface may not be safe.
  3. >>> Performing hash slots allocation on 6 nodes...
  4. Master[0] -Slots 0 - 5460
  5. Master[1] -Slots 5461 - 10922
  6. Master[2] -Slots 10923 - 16383
  7. Adding replica redis-node-4:6379 to redis-node-0:6379
  8. Adding replica redis-node-5:6379 to redis-node-1:6379
  9. Adding replica redis-node-3:6379 to redis-node-2:6379
  10. M: 4cdf0f24f67eadb3b7a610fd9b5409a571cce8d3 redis-node-0:6379
  11. slots:[0-5460] (5461 slots) master
  12. M: ee85d84a95793ee031a4b45fe3600ef81ecef7d1 redis-node-1:6379
  13. slots:[5461-10922] (5462 slots) master
  14. M: f48ab32421dfe4405b73129d88f64a4ce4d076e3 redis-node-2:6379
  15. slots:[10923-16383] (5461 slots) master
  16. S: 0315d864aec40531c9630d5e21959aea6837236e redis-node-3:6379
  17. replicates f48ab32421dfe4405b73129d88f64a4ce4d076e3
  18. S: ec43dee472ce9f1531ccdbd0853cd672519ec2fe redis-node-4:6379
  19. replicates 4cdf0f24f67eadb3b7a610fd9b5409a571cce8d3
  20. S: c834ba17bfdf0d498533355022e548b040083ed9 redis-node-5:6379
  21. replicates ee85d84a95793ee031a4b45fe3600ef81ecef7d1
  22. Can I set the above configuration? (type 'yes' to accept): yes
  23. >>> Nodes configuration updated
  24. >>> Assign a different config epoch to each node
  25. >>> Sending CLUSTER MEET messages to join the cluster
  26. Waiting for the cluster to join
  27. ..
  28. >>> Performing Cluster Check (using node redis-node-0:6379)
  29. M: 4cdf0f24f67eadb3b7a610fd9b5409a571cce8d3 redis-node-0:6379
  30. slots:[0-5460] (5461 slots) master
  31. 1 additional replica(s)
  32. Sec43dee472ce9f1531ccdbd0853cd672519ec2fe 172.29.0.2:6379
  33. slots: (0 slots) slave
  34. replicates 4cdf0f24f67eadb3b7a610fd9b5409a571cce8d3
  35. Mf48ab32421dfe4405b73129d88f64a4ce4d076e3 172.29.0.4:6379
  36. slots:[10923-16383] (5461 slots) master
  37. 1 additional replica(s)
  38. Mee85d84a95793ee031a4b45fe3600ef81ecef7d1 172.29.0.5:6379
  39. slots:[5461-10922] (5462 slots) master
  40. 1 additional replica(s)
  41. S: 0315d864aec40531c9630d5e21959aea6837236e 172.29.0.6:6379
  42. slots: (0 slots) slave
  43. replicates f48ab32421dfe4405b73129d88f64a4ce4d076e3
  44. Sc834ba17bfdf0d498533355022e548b040083ed9 172.29.0.7:6379
  45. slots: (0 slots) slave
  46. replicates ee85d84a95793ee031a4b45fe3600ef81ecef7d1
  47. [OK] All nodes agree about slots configuration.
  48. >>> Check for open slots...
  49. >>> Check slots coverage...
  50. [OK] All 16384 slots covered.


执行这条代码,查看集群状态

</>复制代码

  1. redis-cli -h redis-node-0 -a liubei@161 cluster info


输出结果如下:

</>复制代码

  1. Warning: Using a password with '-a' or '-u' option on the command line 
  2. interface may not be safe.
  3. cluster_state:ok
  4. cluster_slots_assigned:16384
  5. cluster_slots_ok:16384
  6. cluster_slots_pfail:0
  7. cluster_slots_fail:0
  8. cluster_known_nodes:6
  9. cluster_size:3
  10. cluster_current_epoch:6
  11. cluster_my_epoch:1
  12. cluster_stats_messages_ping_sent:174
  13. cluster_stats_messages_pong_sent:203
  14. cluster_stats_messages_sent:377
  15. cluster_stats_messages_ping_received:198
  16. cluster_stats_messages_pong_received:174
  17. cluster_stats_messages_meet_received:5
  18. cluster_stats_messages_received:377
  19. total_cluster_links_buffer_limit_exceeded:0
  20. I have no name!@c193f9814adb:/$


然后看一下集群节点状态

</>复制代码

  1. redis-cli -h redis-node-0 -a liubei@161 cluster nodes


结果

</>复制代码

  1. Warning: Using a password with '-a' or '-u' option on the command line 
  2. interface may not be safe.
  3. 921dd4fc8977562273e8f0f297d7809f5d785a96 192.168.0.2:6379@16379 myself,master 
  4. 0 1657079063000 1 connected 0-5460
  5. e3be1ac5c4b5a8ea5789dd62aaa550cece718504 192.168.0.5:6379@16379 slave 
  6. 921dd4fc8977562273e8f0f297d7809f5d785a96 0 1657079062000 1 connected
  7. d45ea5232290aefd17ec87229b2b68be76061b84 192.168.0.6:6379@16379 slave 
  8. 505a1c9a1e3bc8b7685a6cdf6aa1d82bd48cc95f 0 1657079063278 3 connected
  9. 88f0d7a2377bf876105925e330793091f2390a20 192.168.0.4:6379@16379 slave 
  10. 477f835648ca3ddffa48af99a2e162e541277186 0 1657079062274 2 connected
  11. 505a1c9a1e3bc8b7685a6cdf6aa1d82bd48cc95f 192.168.0.7:6379@16379 master - 0 
  12. 1657079064281 3 connected 10923-16383
  13. 477f835648ca3ddffa48af99a2e162e541277186 192.168.0.3:6379@16379 master - 0 
  14. 1657079065285 2 connected 5461-10922


第二步:测试


2.1:进行读写测试


用集群模式登录

</>复制代码

  1. redis-cli -h redis-nod-1 -a liubei@161 -c


数据载入

</>复制代码

  1. redis-node-1:6379set name liubei
  2. OK


另一个节点上读取

</>复制代码

  1. I have no name!@ab2a18399901:/$ redis-cli -h redis-node-5 -a liubei@161 
  2. -c
  3. Warning: Using a password with '-a' or '-u' option on the command line 
  4. interface may not be safe.
  5. redis-node-5:6379get name
  6. -Redirected to slot [5798] located at 192.168.0.3:6379
  7. "liubei"
  8. 192.168.0.3:6379>


读取后我们发现,连接会跳到存储这个key的节点上(192.168.0.3)


2.2:key所在节点


随便登录一个节点

</>复制代码

  1. redis-cli -h redis-node-0 -a liubei@161 -c


我们就会看到节点哈希槽编号的范围

</>复制代码

  1. redis-node-0:6379> cluster slots
  2. 1) 1) (integer) 0
  3. 2) (integer) 5460
  4. 3) 1) "192.168.0.2"
  5. 2) (integer) 6379
  6. 3"921dd4fc8977562273e8f0f297d7809f5d785a96"
  7. 4) (empty array)
  8. 4) 1) "192.168.0.5"
  9. 2) (integer) 6379
  10. 3"e3be1ac5c4b5a8ea5789dd62aaa550cece718504"
  11. 4) (empty array)
  12. 2) 1) (integer) 5461
  13. 2) (integer) 10922
  14. 3) 1) "192.168.0.3"
  15. 2) (integer) 6379
  16. 3"477f835648ca3ddffa48af99a2e162e541277186"
  17. 4) (empty array)
  18. 4) 1) "192.168.0.4"
  19. 2) (integer) 6379
  20. 3"88f0d7a2377bf876105925e330793091f2390a20"
  21. 4) (empty array)
  22. 3) 1) (integer) 10923
  23. 2) (integer) 16383
  24. 3) 1) "192.168.0.7"
  25. 2) (integer) 6379
  26. 3"505a1c9a1e3bc8b7685a6cdf6aa1d82bd48cc95f"
  27. 4) (empty array)
  28. 4) 1) "192.168.0.6"
  29. 2) (integer) 6379
  30. 3"d45ea5232290aefd17ec87229b2b68be76061b84"
  31. 4) (empty array)


再查看一下name的哈希槽编号

</>复制代码

  1. redis-node-0:6379> cluster keyslot name
  2. (integer) 5798



可以看到,哈希槽编号的范围我们可以看到5798 这个编号在 192.168.0.3 上,如果想要在其他节点上读取到这个key值,就需要集群模式登录


集群模式验证是否准确

</>复制代码

  1. redis-node-0:6379get name
  2. -Redirected to slot [5798] located at 192.168.0.3:6379
  3. "liubei"
  4. 192.168.0.3:6379>


集群模式登录,查找这个key,我们的连接会跳到了 192.168.0.3上。在非集群模式登录查看的话,

如果登录到其他节点,会提示我们这个key存在了192.168.0.3上

</>复制代码

  1. I have no name!@ab2a18399901:/$ redis-cli -h 192.168.0.5 -a liubei@161
  2. Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
  3. 192.168.0.5:6379get name
  4. (errorMOVED 5798 192.168.0.3:6379



想要查询到值只有登录这个节点才行

</>复制代码

  1. I have no name!@ab2a18399901:/$ redis-cli -h 192.168.0.3 -a liubei@161
  2. Warning: Using a password with '-a' or '-u' option on the command line 
  3. interface may not be safe.
  4. 192.168.0.3:6379get name
  5. "liubei"


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/127571.html

相关文章

  • web应用集群入门-利用docker在单机搭建web应用集群实现session共享

    摘要:环境要求安装了的主机本文示例环境为准备镜像首先把所有需要用到的镜像拉取下来容器编排是容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器。 环境要求:安装了docker的主机 (本文示例环境为centos7.4) 准备镜像 首先把所有需要用到的镜像拉取下来 # nginx $ docker pull nginx # php & php-fpm $ docker pul...

    ls0609 评论0 收藏0
  • web应用集群入门-利用docker在单机搭建web应用集群实现session共享

    摘要:环境要求安装了的主机本文示例环境为准备镜像首先把所有需要用到的镜像拉取下来容器编排是容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器。 环境要求:安装了docker的主机 (本文示例环境为centos7.4) 准备镜像 首先把所有需要用到的镜像拉取下来 # nginx $ docker pull nginx # php & php-fpm $ docker pul...

    jcc 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<