redis 高可用方案总结(下)
sanlanlan 2020-12-31 标签: redis 浏览:1879 评论:0
上一篇介绍了集群的相关知识,这篇主要是实践搭建集群
集群:
集群的作用,可以归纳为两点:
1、数据分区:数据分区(或称数据分片)是集群最核心的功能。
集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。
Redis单机内存大小受限问题,在介绍持久化和主从复制时都有提及;例如,如果单机内存太大,bgsave和bgrewriteaof的fork操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出……。
2、高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似);当任一节点发生故障时,集群仍然可以对外提供服务。
cluster 搭建集群的2中方式:
1. 执行Redis命令搭建集群
集群的搭建可以分为四步:
(1)启动节点:将节点以集群模式启动,此时节点是独立的,并没有建立联系;
(2)节点握手:让独立的节点连成一个网络;
(3)分配槽:将16384个槽分配给主节点;
(4)指定主从关系:为从节点指定主节点。
实际上,前三步完成后集群便可以对外提供服务;但指定从节点后,集群才能够提供真正高可用的服务。
(1)启动节点
使用redis-server命令, 配置conf 配置文件,如:redis-6390.conf
port 6390
cluster-enabled yes
cluster-config-file "nodes-6390.conf"
daemonize yes
logfile "log-6390.log"
dbfilename "dump-6390.rdb"
cluster-require-full-coverage no
监听端口:port 6390
开启Cluster:cluster-enabled yes
集群配置文件:cluster-config-file nodes-6390.conf。
后台运行:daemonize yes
输出日志:logfile "log-6390.log"
DB日志:dbfilename "dump-6390.rdb"
槽是否全覆盖:cluster-require-full-coverage no。默认是yes,只要有结点宕机导致16384个槽没全被覆盖,整个集群就全部停止服务,所以一定要改为no
(2)节点握手
127.0.0.1:6390> CLUSTER MEET 127.0.0.1 6391
127.0.0.1:6390> CLUSTER nodes
40d15fb0dbad2cdb4e5464395389d6404eada89e 127.0.0.1:6391@16391 master - 0 1567850742221 1 connected
a3772b8d85b25fc9e35c92b511c0baa2756cb233 127.0.0.1:6390@16390 myself,master - 0 1567850739000 2 connected
(3)分配slots
slots 属性是一个二进制数组,这个数组长度是16384/8=2048字节,共包含16384个二进制位。
➜ clusrer ./redis-cli -p 6390 cluster addslots {0..5461}
OK
➜ clusrer ./redis-cli -p 6391 cluster addslots {5462..10000}
OK
➜ clusrer ./redis-cli -p 6392 cluster addslots {10001..13000}
OK
➜ clusrer ./redis-cli -p 6393 cluster addslots {13001..16383}
OK
(4)指定主从关系
//后面是主节点 id
➜ clusrer ./redis-cli -p 6395 cluster replicate a3772b8d85b25fc9e35c92b511c0baa2756cb233
OK
➜ clusrer ./redis-cli -p 6395 cluster replicate a3772b8d85b25fc9e35c92b511c0baa2756cb233
➜ clusrer ./redis-cli -p 6396 cluster replicate 40d15fb0dbad2cdb4e5464395389d6404eada89e
OK
➜ clusrer ./redis-cli -p 6397 cluster replicate c6e7a2718ea438c0d82bbf49e9f815673c76fefa
OK
➜ clusrer ./redis-cli -p 6398 cluster replicate 0bb36cba5bc565af51e6932d373285ef6e453fa4
OK
查看结果:127.0.0.1:6391> CLUSTER nodes
2.redis-trib管理器
Redis作者是个Ruby爱好者,他写了个redis-trib管理器,可以使用Ruby脚本搭建集群。
集群中应该至少有三个节点,每个节点有一备份节点。需要6台服务器。
创建单独目录redis-cluster,来搭建。把 在redis源码文件夹下的src目录下,redis-trib.rb 文件copy 过来
(1)执行ruby脚本需要安装ruby环境
yum install ruby
yum install rubygems
(2)安装redis需要依赖的gem包
下载 redis-3.2.4.gem
在 /usr/local/redis-cluster/下,执行
gem install redis-3.2.4.gem
(3)配置各自的config 文件
使用redis-server命令, 配置conf 配置文件,如:redis-6390.conf
#redis-6390.conf
port 6390
cluster-enabled yes
cluster-config-file "nodes-6390.conf"
daemonize yes
logfile "log-6390.log"
dbfilename "dump-6390.rdb"
cluster-require-full-coverage no
监听端口:port 6390
开启Cluster:cluster-enabled yes
集群配置文件:cluster-config-file nodes-6390.conf。
后台运行:daemonize yes
输出日志:logfile "log-6390.log"
DB日志:dbfilename "dump-6390.rdb"
槽是否全覆盖:cluster-require-full-coverage no。默认是yes,只要有结点宕机导致16384个槽没全被覆盖,整个集群就全部停止服务,所以一定要改为no
(4)使用redis-trib.rb创建集群
./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
其中:--replicas=1表示每个主节点有1个从节点;后面的多个{ip:port}表示节点地址,前面的做主节点,后面的做从节点。使用redis-trib.rb搭建集群时,要求节点不能包含任何槽和数据。
(5)redis-cli -c -p 7001 查看集群情况
(6)集群重启
ps -ef | grep redis | awk '{print $2}' | xargs kill //关闭集群全部进程,然后执行重启
(7)redis-trib.rb 提供很多命令:
add-node:添加集群节点
del-node:删除集群节点
./redis-trib.rb check 127.0.0.1:7001 查看所有的主从节点信息
《Redis 设计与实现》
https://redis.io/topics/cluster-spec
https://redis.io/topics/cluster-tutorial
本文相关标签: redis
发表评论: