• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    Redis实现集群搭建+集群读写的示例

    发布者: 姬7089 | 发布时间: 2025-6-19 12:42| 查看数: 120| 评论数: 0|帖子模式

    问题

    容量不够,redis 如何进行扩容?并发写操作, redis 如何分摊?另外,主从模式,薪火相传模式,主机宕机,导致 ip 地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息。
    之前通过代理主机来解决,但是 redis7.0 中提供了解决方案。就是 无中心化集群 配置:即每个节点都可以和其他节点进行联系。如 A、B、C 节点。想访问 B 节点,可以先访问 A 节点,A 节点会去联系 B 节点。无须代理服务器或者负载均衡去找对应的节点

    什么是集群

    Redis 集群实现了对 Redis 的水平扩容,即启动 N 个 redis 节点,将整个数据库分布存储在这 N 个节点中,每个节点存储总数据的 1/N。
    Redis 集群通过分区(partition)来提供一定程度的可用性(availability):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。

    环境准备


    • 将 rdb、aof 文件都删除掉
    • 三台虚拟机,新建目录/myredis/cluster
    • 制作 6 个实例,三主三从,三主机端口分别为 6381,6383,6385。三从机端口分别为6382,6384,6386(具体端口视情况)
    • 每一个配置文件的基本信息修改(和 主从复制 - 哨兵模式 一样)

      • 开启 daemonize yes
      • 指定 6 个端口,不能重复
      • 6 个 Pid 文件名字配置,不能重复,尽量以加上端口进行识别
      • 6 个 Log 文件名字,不能重复,尽量以加上端口进行识别
      • 6 个 dump.rdb 名字,不能重复,尽量以加上端口进行识别
      • Appendonly 关掉或者换名字

    • 每一个配置文件的集群信息修改

      • cluster-enabled yes:打开集群模式
      • cluster-config-file nodes-6379.conf:设定节点配置文件名
      • cluster-node-timeout 15000:设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换


    配置文件模板(替换端口号):
    1. [root@redis-cluster2 cluster]# cat redisCluster6383.conf
    2. bind 0.0.0.0
    3. daemonize yes
    4. protected-mode no
    5. logfile "/myredis/cluster/cluster6383.log"
    6. pidfile /myredis/cluster6383.pid
    7. dir /myredis/cluster
    8. dbfilename dump6383.rdb
    9. appendonly yes
    10. appendfilename "appendonly6383.aof"
    11. requirepass 111111
    12. masterauth 111111
    13. port 6383

    14. cluster-enabled yes
    15. cluster-config-file nodes-6383.conf
    16. cluster-node-timeout 5000
    复制代码
    将以上配置文件分别写入到三台虚拟机中,每个虚拟机其两个redis服务,使用redis-server指定配置文件启动
    1. [root@redis-cluster2 cluster]# redis-server /myredis/cluster/redisCluster6383.conf
    2. [root@redis-cluster2 cluster]# redis-server /myredis/cluster/redisCluster6384.conf
    3. [root@redis-cluster2 cluster]# ps -ef | grep redis
    4. root        1950       1  0 15:38 ?        00:00:00 redis-server 0.0.0.0:6383 [cluster]
    5. root        1956       1  0 15:38 ?        00:00:00 redis-server 0.0.0.0:6384 [cluster]
    6. root        1962    1569  0 15:38 pts/0    00:00:00 grep --color=auto redis
    复制代码
    通过命令redis-cli为集群构建主从关系
    1. [root@k8s-master01 cluster]# redis-cli -a 111111 --cluster create --cluster-replicas 1 192.168.58.129:6381 192.168.58.129:6382 192.168.58.130:6383 192.168.58.130:6384 192.168.58.212:6385 192.168.58.212:6386
    2. Warning: Using a password with '-a' or '-u' option on the command line 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 192.168.58.130:6384 to 192.168.58.129:6381
    8. Adding replica 192.168.58.212:6386 to 192.168.58.130:6383
    9. Adding replica 192.168.58.129:6382 to 192.168.58.212:6385
    10. M: 772165af2d8a6b4600833ff36f33d1fe02acfa96 192.168.58.129:6381
    11.    slots:[0-5460] (5461 slots) master
    12. S: 5edb851c0aa5de08924f1d079c21b668e74e14ab 192.168.58.129:6382
    13.    replicates c1e8aaf10e92cd3aebffe1247d8c99a9d857e916
    14. M: e722f20399055c4543aa5a60697a1c6cebfe8e06 192.168.58.130:6383
    15.    slots:[5461-10922] (5462 slots) master
    16. S: afc75f35d9856b15040460f3373fd658907e1cc8 192.168.58.130:6384
    17.    replicates 772165af2d8a6b4600833ff36f33d1fe02acfa96
    18. M: c1e8aaf10e92cd3aebffe1247d8c99a9d857e916 192.168.58.212:6385
    19.    slots:[10923-16383] (5461 slots) master
    20. S: a256bdaeafd97ff59a4e59d994046ff102e7509b 192.168.58.212:6386
    21.    replicates e722f20399055c4543aa5a60697a1c6cebfe8e06
    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 192.168.58.129:6381)
    29. M: 772165af2d8a6b4600833ff36f33d1fe02acfa96 192.168.58.129:6381
    30.    slots:[0-5460] (5461 slots) master
    31.    1 additional replica(s)
    32. S: afc75f35d9856b15040460f3373fd658907e1cc8 192.168.58.130:6384
    33.    slots: (0 slots) slave
    34.    replicates 772165af2d8a6b4600833ff36f33d1fe02acfa96
    35. S: 5edb851c0aa5de08924f1d079c21b668e74e14ab 192.168.58.129:6382
    36.    slots: (0 slots) slave
    37.    replicates c1e8aaf10e92cd3aebffe1247d8c99a9d857e916
    38. M: e722f20399055c4543aa5a60697a1c6cebfe8e06 192.168.58.130:6383
    39.    slots:[5461-10922] (5462 slots) master
    40.    1 additional replica(s)
    41. S: a256bdaeafd97ff59a4e59d994046ff102e7509b 192.168.58.212:6386
    42.    slots: (0 slots) slave
    43.    replicates e722f20399055c4543aa5a60697a1c6cebfe8e06
    44. M: c1e8aaf10e92cd3aebffe1247d8c99a9d857e916 192.168.58.212:6385
    45.    slots:[10923-16383] (5461 slots) master
    46.    1 additional replica(s)
    47. [OK] All nodes agree about slots configuration.
    48. >>> Check for open slots...
    49. >>> Check slots coverage...
    50. [OK] All 16384 slots covered.
    51. [root@k8s-master01 cluster]# ll
    52. total 52
    53. drwxr-xr-x. 2 root root  4096 Dec  1 15:30 appendonlydir
    54. -rw-r--r--. 1 root root 10718 Dec  1 15:50 cluster6381.log
    55. -rw-r--r--. 1 root root 15205 Dec  1 15:50 cluster6382.log
    56. -rw-r--r--. 1 root root   171 Dec  1 15:49 dump6382.rdb
    57. -rw-r--r--. 1 root root   799 Dec  1 15:49 nodes-6381.conf
    58. -rw-r--r--. 1 root root   811 Dec  1 15:49 nodes-6382.conf
    59. -rw-r--r--. 1 root root   347 Dec  1 15:32 redisCluster6381.conf
    60. -rw-r--r--. 1 root root   346 Dec  1 15:32 redisCluster6382.conf
    复制代码
    以6381为切入点查看集群状态
    1. [root@k8s-master01 cluster]# redis-cli -a 111111 -p 6381
    2. Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    3. 127.0.0.1:6381>
    4. 127.0.0.1:6381> info replication
    5. # Replication
    6. role:master
    7. connected_slaves:1
    8. slave0:ip=192.168.58.130,port=6384,state=online,offset=224,lag=0
    9. master_failover_state:no-failover
    10. master_replid:6955624b397904832e2911972f1c9b871e8b86fc
    11. master_replid2:0000000000000000000000000000000000000000
    12. master_repl_offset:224
    13. second_repl_offset:-1
    14. repl_backlog_active:1
    15. repl_backlog_size:1048576
    16. repl_backlog_first_byte_offset:1
    17. repl_backlog_histlen:224
    18. 127.0.0.1:6381>
    复制代码
    集群指令


    查看集群信息
    1. 127.0.0.1:6381> cluster nodes
    2. afc75f35d9856b15040460f3373fd658907e1cc8 192.168.58.130:6384@16384 slave 772165af2d8a6b4600833ff36f33d1fe02acfa96 0 1733039642782 1 connected
    3. 5edb851c0aa5de08924f1d079c21b668e74e14ab 192.168.58.129:6382@16382 slave c1e8aaf10e92cd3aebffe1247d8c99a9d857e916 0 1733039641297 5 connected
    4. e722f20399055c4543aa5a60697a1c6cebfe8e06 192.168.58.130:6383@16383 master - 0 1733039641617 3 connected 5461-10922
    5. a256bdaeafd97ff59a4e59d994046ff102e7509b 192.168.58.212:6386@16386 slave e722f20399055c4543aa5a60697a1c6cebfe8e06 0 1733039641067 3 connected
    6. c1e8aaf10e92cd3aebffe1247d8c99a9d857e916 192.168.58.212:6385@16385 master - 0 1733039640849 5 connected 10923-16383
    7. 772165af2d8a6b4600833ff36f33d1fe02acfa96 192.168.58.129:6381@16381 myself,master - 0 1733039639000 1 connected 0-5460
    复制代码
    查看键的插槽值
    1. cluster keyslot k1
    2. 192.168.58.129:6381> cluster keyslot k1
    3. (integer) 12706
    4. 192.168.58.129:6381> cluster keyslot k2
    5. (integer) 449
    复制代码
    查看插槽值里有几个key
    1. cluster countkeysinslot 4847             #只能看自己插槽的值
    复制代码
    查询集群中的值
    1. cluster getkeysinslot <slot> <count>     #返回 count 个 slot 槽中的键
    复制代码
    查看单节点
    1. 127.0.0.1:6381> cluster info
    2. cluster_state:ok
    3. cluster_slots_assigned:16384
    4. cluster_slots_ok:16384
    5. cluster_slots_pfail:0
    6. cluster_slots_fail:0
    7. cluster_known_nodes:6
    8. cluster_size:3
    9. cluster_current_epoch:6
    10. cluster_my_epoch:1
    11. cluster_stats_messages_ping_sent:1226
    12. cluster_stats_messages_pong_sent:1199
    13. cluster_stats_messages_sent:2425
    14. cluster_stats_messages_ping_received:1194
    15. cluster_stats_messages_pong_received:1226
    16. cluster_stats_messages_meet_received:5
    17. cluster_stats_messages_received:2425
    18. total_cluster_links_buffer_limit_exceeded:0
    复制代码
    集群读写

    在6381进行写操作时,set k1出现报错,显示到6385进行写,操作,set k2 却可以执行成功,这是为什么呢?
    1. 127.0.0.1:6381> set k1 v1
    2. (error) MOVED 12706 192.168.58.212:6385
    3. 127.0.0.1:6381> set k2 v2
    4. OK
    5. 127.0.0.1:6381> keys *
    6. 1) "k2"
    7. 127.0.0.1:6381>
    复制代码
    是因为集群在创建时,分配了三个槽位,必须在各自的槽位进行写操作



    如何解决?

    防止路由失效,添加参数-c并新增两个key
    1. 127.0.0.1:6381> FLUSHALL
    2. OK
    3. 127.0.0.1:6381> keys *
    4. (empty array)
    5. 127.0.0.1:6381> quit
    6. [root@k8s-master01 cluster]# redis-cli -a 111111 -p 6381 -c
    7. Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    8. 127.0.0.1:6381>
    9. 127.0.0.1:6381>
    10. 127.0.0.1:6381> keys *
    11. (empty array)
    12. 127.0.0.1:6381> set k1 v1
    13. -> Redirected to slot [12706] located at 192.168.58.212:6385
    14. OK
    15. 192.168.58.212:6385>
    16. 192.168.58.212:6385> set k2 v2
    17. -> Redirected to slot [449] located at 192.168.58.129:6381
    18. OK
    复制代码
    到此这篇关于Redis实现集群搭建+集群读写的示例的文章就介绍到这了,更多相关Redis 集群搭建+集群读写内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:https://www.jb51.net/database/336711tpc.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表