【redis】redis集群搭建学习

打印 上一主题 下一主题

主题 924|帖子 924|积分 2772

  本站以分享各种运维经验和运维所需要的技能为主
  《python零底子入门》:python零底子入门学习
  《python运维脚本》: python运维脚本实践
  《shell》:shell学习
  《terraform》持续更新中:terraform_Aws学习零底子入门到最佳实战
  《k8》从问题中去学习k8s
  《docker学习》暂未更新
  《ceph学习》ceph日常问题解决分享
  《日志收集》ELK+各种中心件
  《运维日常》运维日常
  《linux》运维面试100问
  《DBA》db的介绍使用(mysql、redis、mongodb...)
   
一、Redis Cluster 分布式集群

1.什么是Redis Cluster

  1. 1.Redis集群是一个可以在多个Redis节点之间进行数据共享的设施(installation)
  2. 2.Redis集群不支持那些需要同时处理多个键的Redis命令,因为执行这些命令需要在多个Redis节点之间移动数据,并且在高负载的情况下,这些命令将降低Redis集群的性能,并导致不可预测的行为。(使用ack协议)
  3. 3.Redis集群通过分区(partition)来提供一定程度的可用性(availability):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。
  4. 4.Redis集群有将数据自动切分(split)到多个节点的能力。
复制代码
2.Redis Cluster的特点

  1. #高性能:
  2. 1.在多分片节点中,将16384个槽位,均匀分布到多个分片节点中
  3. 2.存数据时,将key做crc16(key),然后和16384进行取模,得出槽位值(0-16384之间)
  4. 3.根据计算得出的槽位值,找到相对应的分片节点的主节点,存储到相应槽位上
  5. 4.如果客户端当时连接的节点不是将来要存储的分片节点,分片集群会将客户端连接切换至真正存储节点进行数据存储
  6. 5.客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
  7. 6.Redis Cluster解决了redis资源利用率的问题
  8. #高可用
  9. 7.在搭建集群时,会为每一个分片的主节点,对应一个从节点,实现slaveof功能,同时当主节点down,实现类似于sentinel的自动failover的功能。
复制代码
3.槽的概念

  1. 1.在集群中,会把所有节点分为16384个槽位
  2. 2.槽位的序号是 0 - 16383,序号不重要,数量才重要
  3. 3.每一个槽位分配到数据的概率是一样
复制代码
4.redis故障转移

  1. 1.在集群里面,节点会对其他节点进行下线检测。
  2. 2.当一个主节点下线时,集群里面的其他主节点负责对下线主节点进行故障移。
  3. 3.换句话说,集群的节点集成了下线检测和故障转移等类似 Sentinel 的功能。
复制代码
二、redis集群搭建(方法一)

须知

  1. # 如下只是集群关联的一种方式,还有一种方式需要安装相应工具,但那种方式比较简单,但会自动进行主从,缺点也存在,会自动进行主从,如果不是想要的主从状态,将要自己手动修改。(详情见方法二)
复制代码
1.环境预备
节点IP端口节点1172.16.1.516379,6380节点2172.16.1.526379,6380节点3172.16.1.536379,6380 2.搭建redis
  1. #删除以前的redis数据
  2. [root@db01 ~]# rm -rf /service/redis/*
  3. #创建多实例目录
  4. [root@db01 ~]# mkdir /service/redis/{6379,6380}
  5. [root@db02 ~]# mkdir /service/redis/{6379,6380}
  6. [root@db03 ~]# mkdir /service/redis/{6379,6380}
  7. #配置所有redis
  8. [root@db01 ~]# vim /service/redis/6379/redis.conf
  9. bind 172.16.1.51 127.0.0.1
  10. port 6379
  11. daemonize yes
  12. pidfile /service/redis/6379/redis.pid
  13. loglevel notice
  14. logfile /service/redis/6379/redis.log
  15. dbfilename dump.rdb
  16. dir /service/redis/6379
  17. cluster-enabled yes                                                # 打开redis集群
  18. cluster-config-file nodes.conf                                        # 集群关联文件地址
  19. cluster-node-timeout 5000                                        # 节点互联超时阈值
  20. [root@db01 ~]# vim /service/redis/6380/redis.conf
  21. bind 172.16.1.51 127.0.0.1
  22. port 6380
  23. daemonize yes
  24. pidfile /service/redis/6380/redis.pid
  25. loglevel notice
  26. logfile /service/redis/6380/redis.log
  27. dbfilename dump.rdb
  28. dir /service/redis/6380
  29. cluster-enabled yes
  30. cluster-config-file nodes.conf
  31. cluster-node-timeout 5000
复制代码
3.启动全部redis
  1. [root@db01 ~]# redis-server /service/redis/6379/redis.conf
  2. [root@db01 ~]# redis-server /service/redis/6380/redis.conf
  3. [root@db02 ~]# redis-server /service/redis/6379/redis.conf
  4. [root@db02 ~]# redis-server /service/redis/6380/redis.conf
  5. [root@db03 ~]# redis-server /service/redis/6379/redis.conf
  6. [root@db03 ~]# redis-server /service/redis/6380/redis.conf
复制代码
4.关联全部redis节点
1)登录全部节点
  1. [root@db01 ~]# redis-cli -h 172.16.1.51 -p 6379
  2. [root@db01 ~]# redis-cli -h 172.16.1.51 -p 6380
  3. [root@db02 ~]# redis-cli -h 172.16.1.52 -p 6379
  4. [root@db02 ~]# redis-cli -h 172.16.1.52 -p 6380
  5. [root@db03 ~]# redis-cli -h 172.16.1.53 -p 6379
  6. [root@db03 ~]# redis-cli -h 172.16.1.53 -p 6380
复制代码
2)检察集群节点
  1. #查看集群节 79 myself,master - 0 0 0 connected
复制代码
3)关联全部节点
  1. # 将需要加入集群中的主从服务器全部进行关联
  2. 172.16.1.51:6379> CLUSTER MEET 172.16.1.51 6380
  3. OK
  4. 172.16.1.51:6379> CLUSTER MEET 172.16.1.52 6379
  5. OK
  6. 172.16.1.51:6379> CLUSTER MEET 172.16.1.52 6380
  7. OK
  8. 172.16.1.51:6379> CLUSTER MEET 172.16.1.53 6379
  9. OK
  10. 172.16.1.51:6379> CLUSTER MEET 172.16.1.53 6380
  11. OK
  12. #查看集群状态,所有节点
  13. 172.16.1.51:6379> CLUSTER NODES
  14. aee9f4e6e09a452fd44bca7639be442b5138f141 172.16.1.52:6380 master - 0 1596687131655 4 connected
  15. 777412c8d6554e3390e1083bf1f55002be08cf62 172.16.1.51:6380 master - 0 1596687131352 2 connected
  16. ef18ab5bab6d8bc06917a0cf2dc9bffa8b431087 172.16.1.52:6379 master - 0 1596687132362 3 connected
  17. f2747c92813ea06b25c3e9c8d5232b46b3cf9d3d 172.16.1.53:6379 master - 0 1596687131856 0 connected
  18. 25f735f08ac62b2f758c1e2c21e178cc46279087 172.16.1.53:6380 master - 0 1596687131251 5 connected
  19. 28faba09f4c0ec8cdb90d92e09636796427b7143 172.16.1.51:6379 myself,master - 0 0 1 connected
复制代码
5.分配槽位
  1. #查看集群状态
  2. 172.16.1.51:6379> CLUSTER INFO
  3. cluster_state:fail
  4. cluster_slots_assigned:0
  5. cluster_slots_ok:0
  6. cluster_slots_pfail:0
  7. cluster_slots_fail:0
  8. cluster_known_nodes:6
  9. cluster_size:0
  10. cluster_current_epoch:5
  11. cluster_my_epoch:1
  12. cluster_stats_messages_sent:1168
  13. cluster_stats_messages_received:1168
  14. #槽位规划
  15. db01:     5462 个槽位  (0-5461)
  16. db02:     5461 个槽位  (5462-10922)
  17. db03:   5461 个槽位  (10923-16383)
  18. #分配槽位
  19. [root@db01 ~]# redis-cli -p 6379 -h 172.16.1.51 CLUSTER ADDSLOTS {0..5461}
  20. OK
  21. [root@db02 ~]# redis-cli -p 6379 -h 172.16.1.52 CLUSTER ADDSLOTS {5462..10922}
  22. OK
  23. [root@db02 ~]# redis-cli -p 6379 -h 172.16.1.53 CLUSTER ADDSLOTS {10923..16383}
复制代码
6.插入数据测试集群
  1. #插入一条数据
  2. 172.16.1.51:6379> set k1 v1
  3. (error) MOVED 12706 172.16.1.53:6379
  4. #报错,该key的值只能插入到12706这个槽位
  5. [root@db03 ~]# redis-cli -h 172.16.1.53
  6. 172.16.1.53:6379> set k1 v1
  7. OK
  8. #ASK协议,自动切换将数据添加到指定槽位(加一个-c参数即可)
  9. [root@db03 ~]# redis-cli -h 172.16.1.53
  10. 172.16.1.53:6379> set k2 v2
  11. (error) MOVED 449 172.16.1.51:6379
  12. 172.16.1.53:6379> quit
  13. [root@db03 ~]# redis-cli -c -h 172.16.1.53
  14. 172.16.1.53:6379> set k2 v2
  15. -> Redirected to slot [449] located at 172.16.1.51:6379
  16. OK
  17. #脚本插入数据测试
  18. [root@db03 ~]# vim data.sh
  19. #!/bin/bash
  20. for i in {1..1000};do
  21.    redis-cli -c -p 6379 -h 172.16.1.51 set k${i} v${i}
  22. done
  23. #查看数据分配
  24. 172.16.1.51:6379> DBSIZE
  25. (integer) 341
  26. 172.16.1.52:6379> DBSIZE
  27. (integer) 332
  28. 172.16.1.53:6379> DBSIZE
  29. (integer) 327
复制代码
7.添加副本节点
1)检察节点
  1. 172.16.1.51:6379> CLUSTER NODES
  2. 5a7f0cf95e1850b5b5ae81d873c4c76fd366d604 172.16.1.51:6380 master - 0 1596763193422 4 connected
  3. 5eb9e5356534ff4acda736d13f0dc9fc3d40049b 172.16.1.52:6379 master - 0 1596763192412 5 connected 5462-10922
  4. 50878ef6a4d8141c8dbca3e2bf7c84ed48a73ee2 172.16.1.53:6380 master - 0 1596763192512 3 connected
  5. acc3a4d0e6e43fc74630c1f0714865fdcbdaf677 172.16.1.53:6379 master - 0 1596763191908 0 connected 10923-16383
  6. 2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 172.16.1.51:6379 myself,master - 0 0 1 connected 0-5461
  7. 381b54584572e8013becdae2eeaff48bf6eb5450 172.16.1.52:6380 master - 0 1596763193925 2 connected
复制代码
2)设置主从
  1. #db01的6380做db02的6379的从库
  2. 172.16.1.51:6380> CLUSTER REPLICATE 5eb9e5356534ff4acda736d13f0dc9fc3d40049b
  3. OK
  4. #db02的6380做db03的6379的从库
  5. 172.16.1.52:6380> CLUSTER REPLICATE acc3a4d0e6e43fc74630c1f0714865fdcbdaf677
  6. OK
  7. #db03的6380做db01的6379的从库
  8. 172.16.1.53:6380> CLUSTER REPLICATE 2325be6f1f9c1c9f57d5a033fc05e0d798ea823a
  9. OK
复制代码
3)再次检察节点信息
  1. 172.16.1.51:6379> CLUSTER NODES
  2. 5a7f0cf95e1850b5b5ae81d873c4c76fd366d604 172.16.1.51:6380 slave 5eb9e5356534ff4acda736d13f0dc9fc3d40049b 0 1596763362696 5 connected
  3. 5eb9e5356534ff4acda736d13f0dc9fc3d40049b 172.16.1.52:6379 master - 0 1596763363202 5 connected 5462-10922
  4. 50878ef6a4d8141c8dbca3e2bf7c84ed48a73ee2 172.16.1.53:6380 slave 2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 0 1596763362192 3 connected
  5. acc3a4d0e6e43fc74630c1f0714865fdcbdaf677 172.16.1.53:6379 master - 0 1596763363203 0 connected 10923-16383
  6. 2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 172.16.1.51:6379 myself,master - 0 0 1 connected 0-5461
  7. 381b54584572e8013becdae2eeaff48bf6eb5450 172.16.1.52:6380 slave acc3a4d0e6e43fc74630c1f0714865fdcbdaf677 0 1596763364211 2 connected
复制代码
8.故障演示
  1. #停掉一台节点
  2. [root@db03 ~]# reboot
  3. #到另一台机器查看集群状态,发现集群是正常的
  4. 172.16.1.51:6379> CLUSTER INFO
  5. cluster_state:ok
  6. cluster_slots_assigned:16384
  7. cluster_slots_ok:16384
  8. cluster_slots_pfail:0
  9. cluster_slots_fail:0
  10. cluster_known_nodes:6
  11. cluster_size:3
  12. cluster_current_epoch:6
  13. cluster_my_epoch:1
  14. cluster_stats_messages_sent:327031
  15. cluster_stats_messages_received:326973
  16. #查看节点信息,副本被提升为主库
  17. 172.16.1.51:6379> CLUSTER NODES
  18. 5a7f0cf95e1850b5b5ae81d873c4c76fd366d604 172.16.1.51:6380 slave 5eb9e5356534ff4acda736d13f0dc9fc3d40049b 0 1596763771309 5 connected
  19. 5eb9e5356534ff4acda736d13f0dc9fc3d40049b 172.16.1.52:6379 master - 0 1596763771310 5 connected 5462-10922
  20. 50878ef6a4d8141c8dbca3e2bf7c84ed48a73ee2 172.16.1.53:6380 slave,fail 2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 1596763736458 1596763734245 3 disconnected
  21. acc3a4d0e6e43fc74630c1f0714865fdcbdaf677 172.16.1.53:6379 master,fail - 1596763736458 1596763735246 0 disconnected
  22. 2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 172.16.1.51:6379 myself,master - 0 0 1 connected 0-5461
  23. 381b54584572e8013becdae2eeaff48bf6eb5450 172.16.1.52:6380 master - 0 1596763772319 6 connected 10923-16383
复制代码
9.节点规复
  1. #修复机器
  2. [root@db03 ~]# redis-server /service/redis/6379/redis.conf
  3. [root@db03 ~]# redis-server /service/redis/6380/redis.conf
  4. #再次查看节点信息
  5. 172.16.1.51:6379> CLUSTER NODES
  6. 5a7f0cf95e1850b5b5ae81d873c4c76fd366d604 172.16.1.51:6380 slave 5eb9e5356534ff4acda736d13f0dc9fc3d40049b 0 1596764061287 5 connected
  7. 5eb9e5356534ff4acda736d13f0dc9fc3d40049b 172.16.1.52:6379 master - 0 1596764060781 5 connected 5462-10922
  8. 50878ef6a4d8141c8dbca3e2bf7c84ed48a73ee2 172.16.1.53:6380 slave 2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 0 1596764059770 3 connected
  9. acc3a4d0e6e43fc74630c1f0714865fdcbdaf677 172.16.1.53:6379 slave 381b54584572e8013becdae2eeaff48bf6eb5450 0 1596764062094 6 connected
  10. 2325be6f1f9c1c9f57d5a033fc05e0d798ea823a 172.16.1.51:6379 myself,master - 0 0 1 connected 0-5461
  11. 381b54584572e8013becdae2eeaff48bf6eb5450 172.16.1.52:6380 master - 0 1596764061789 6 connected 10923-16383
  12. #原主节点修复后变为从节点
复制代码
三、使用工具搭建redis集群(方法二)

1.环境预备
节点IP端口节点1172.16.1.516379,6380节点2172.16.1.526379,6380节点3172.16.1.536379,6380 2.搭建redis
3.启动全部redis
4.安装集群插件
  1. #EPEL源安装ruby支持
  2. [root@db01 ~]# yum install ruby rubygems -y
  3. #查看gem源
  4. [root@db01 ~]# gem sources -l
  5. *** CURRENT SOURCES ***
  6. http://rubygems.org/
  7. #添加阿里云的gem源
  8. [root@db01 ~]# gem sources -a http://mirrors.aliyun.com/rubygems/
  9. http://mirrors.aliyun.com/rubygems/ added to sources
  10. #删除国外gem源
  11. [root@db01 ~]# gem sources  --remove https://rubygems.org/
  12. http://rubygems.org/ removed from sources
  13. #再次查看gem源
  14. [root@db01 ~]# gem sources -l
  15. #使用gem安装redis的ruby插件
  16. [root@db01 ~]# gem install redis -v 3.3.3
  17. Successfully installed redis-3.3.3
  18. 1 gem installed
  19. Installing ri documentation for redis-3.3.3...
  20. Installing RDoc documentation for redis-3.3.3...
复制代码

  • redis-trib.rb命令
  1. [root@db01 ~]# redis-trib.rb
  2. create      #创建一个集群
  3. check     #检查集群
  4. info      #集群状态
  5. fix           #修复集群
  6. reshard     #重新分配槽位
  7. rebalance   #平衡槽位数量
  8. add-node    #添加节点
  9. del-node    #删除节点
  10. set-timeout   #设置超时时间
  11. call      #向集群所有机器输入命令
  12. import      #导入数据
  13. help                    #帮助
复制代码
6.关联全部节点
  1. [root@db01 ~]# redis-trib.rb create --replicas 1 172.16.1.51:6379 172.16.1.52:6379 172.16.1.53:6379 172.16.1.52:6380 172.16.1.53:6380 172.16.1.51:6380
  2. # --replicas参数指定集群中每个主节点配备几个从节点,这里设置为1。
  3. >>> Creating cluster
  4. >>> Performing hash slots allocation on 6 nodes...
  5. Using 3 masters:
  6. 172.16.1.51:6379
  7. 172.16.1.52:6379
  8. 172.16.1.53:6379
  9. Adding replica 172.16.1.52:6380 to 172.16.1.51:6379
  10. Adding replica 172.16.1.51:6380 to 172.16.1.52:6379
  11. Adding replica 172.16.1.53:6380 to 172.16.1.53:6379
  12. M: 5ad7bd957133eac9c3a692b35f8ae72258cf0ece 172.16.1.51:6379
  13.    slots:0-5460 (5461 slots) master
  14. M: 7c79559b280db9d9c182f3a25c718efe9e934fc7 172.16.1.52:6379
  15.    slots:5461-10922 (5462 slots) master
  16. M: d27553035a3e91c78d375208c72b756e9b2523d4 172.16.1.53:6379
  17.    slots:10923-16383 (5461 slots) master
  18. S: fee551a90c8646839f66fa0cd1f6e5859e9dd8e0 172.16.1.52:6380
  19.    replicates 5ad7bd957133eac9c3a692b35f8ae72258cf0ece
  20. S: e4794215d9d3548e9c514c10626ce618be19ebfb 172.16.1.53:6380
  21.    replicates d27553035a3e91c78d375208c72b756e9b2523d4
  22. S: 1d10edbc5ed08f85d2afc21cd338b023b9dd61b4 172.16.1.51:6380
  23.    replicates 7c79559b280db9d9c182f3a25c718efe9e934fc7
  24. Can I set the above configuration? (type 'yes' to accept): yes   
  25. >>> Nodes configuration updated
  26. >>> Assign a different config epoch to each node
  27. >>> Sending CLUSTER MEET messages to join the cluster
  28. Waiting for the cluster to join...
  29. >>> Performing Cluster Check (using node 172.16.1.51:6379)
  30. M: 5ad7bd957133eac9c3a692b35f8ae72258cf0ece 172.16.1.51:6379
  31.    slots:0-5460 (5461 slots) master
  32.    1 additional replica(s)
  33. S: e4794215d9d3548e9c514c10626ce618be19ebfb 172.16.1.53:6380
  34.    slots: (0 slots) slave
  35.    replicates d27553035a3e91c78d375208c72b756e9b2523d4
  36. M: d27553035a3e91c78d375208c72b756e9b2523d4 172.16.1.53:6379
  37.    slots:10923-16383 (5461 slots) master
  38.    1 additional replica(s)
  39. S: fee551a90c8646839f66fa0cd1f6e5859e9dd8e0 172.16.1.52:6380
  40.    slots: (0 slots) slave
  41.    replicates 5ad7bd957133eac9c3a692b35f8ae72258cf0ece
  42. S: 1d10edbc5ed08f85d2afc21cd338b023b9dd61b4 172.16.1.51:6380
  43.    slots: (0 slots) slave
  44.    replicates 7c79559b280db9d9c182f3a25c718efe9e934fc7
  45. M: 7c79559b280db9d9c182f3a25c718efe9e934fc7 172.16.1.52:6379
  46.    slots:5461-10922 (5462 slots) master
  47.    1 additional replica(s)
  48. [OK] All nodes agree about slots configuration.
  49. >>> Check for open slots...
  50. >>> Check slots coverage...
  51. [OK] All 16384 slots covered.
复制代码
7.检察集群状态
  1. [root@db01 ~]# redis-cli -h 172.16.1.51 -p 6379 CLUSTER NODES
  2. e4794215d9d3548e9c514c10626ce618be19ebfb 172.16.1.53:6380 slave d27553035a3e91c78d375208c72b756e9b2523d4 0 1596767315453 5 connected
  3. d27553035a3e91c78d375208c72b756e9b2523d4 172.16.1.53:6379 master - 0 1596767315453 3 connected 10923-16383
  4. 5ad7bd957133eac9c3a692b35f8ae72258cf0ece 172.16.1.51:6379 myself,master - 0 0 1 connected 0-5460
  5. fee551a90c8646839f66fa0cd1f6e5859e9dd8e0 172.16.1.52:6380 slave 5ad7bd957133eac9c3a692b35f8ae72258cf0ece 0 1596767313429 4 connected
  6. 1d10edbc5ed08f85d2afc21cd338b023b9dd61b4 172.16.1.51:6380 slave 7c79559b280db9d9c182f3a25c718efe9e934fc7 0 1596767313935 6 connected
  7. 7c79559b280db9d9c182f3a25c718efe9e934fc7 172.16.1.52:6379 master - 0 1596767314949 2 connected 5461-10922
复制代码
8.重新做主从
  1. #由于使用工具,始终有一台机器为主库本机的从库,所以要重新分配主从
  2. 172.16.1.52:6380> CLUSTER REPLICATE d27553035a3e91c78d375208c72b756e9b2523d4
  3. OK
  4. 172.16.1.53:6380> CLUSTER REPLICATE 5ad7bd957133eac9c3a692b35f8ae72258cf0ece
  5. OK
复制代码
9.插入数据测试
  1. [root@db01 ~]# redis-trib.rb info 172.16.1.52:6379
  2. 172.16.1.52:6379 (7c79559b...) -> 332 keys | 5462 slots | 1 slaves.
  3. 172.16.1.51:6379 (5ad7bd95...) -> 341 keys | 5461 slots | 1 slaves.
  4. 172.16.1.53:6379 (d2755303...) -> 327 keys | 5461 slots | 1 slaves.
  5. [OK] 1000 keys in 3 masters.
  6. 0.06 keys per slot on average.
  7. [root@db01 ~]# redis-trib.rb info 172.16.1.52:6379
  8. 172.16.1.52:6379 (7c79559b...) -> 661 keys | 5462 slots | 1 slaves.
  9. 172.16.1.51:6379 (5ad7bd95...) -> 674 keys | 5461 slots | 1 slaves.
  10. 172.16.1.53:6379 (d2755303...) -> 665 keys | 5461 slots | 1 slaves.
  11. [OK] 2000 keys in 3 masters.
  12. 0.12 keys per slot on average.
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

汕尾海湾

金牌会员
这个人很懒什么都没写!

标签云

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