1、主从模式
(1)特点
有且仅有一个主节点Master,从节点slave可以有
主节点master可读可写,从节点slave只能读;主节点将读的操作交给了从节点,变向的提高了自己写的能力
(2)配置步骤(同一台服务器,利用不同端口进行部署)
1】在/usr/local目录下,创建一个/redis/master-slave目录
2】 在master-slave目录下,创建三个子目录6380、6381、6382
3】 依次拷贝redis解压目录下的redis.conf配置文件,到这三个子目录中
4】 进入6380目录,修改redis.conf,将port端口修改成6380即可
5】 进入6381目录,修改redis.conf,将port端口改成6381,同时指定开启主从复制
6】 进入6382目录,修改redis.conf,将port端口改成6382,同时指定开启主从复制
(3)测试
1】启动每个redis节点,查看输入日志(每启动一个redis从节点时,主节点的日志就会提示从节点连接信息)
[root@node0719 master-slave]# cd 6380 && redis-server ./redis.conf
[root@node0719 master-slave]# cd 6381 && redis-server ./redis.conf
[root@node0719 master-slave]# cd 6382 && redis-server ./redis.conf
2】在每个redis节点进行读写操作(即:”set user:name zhangsan“和”get user:name“)
结论:当主节点写入数据时,系统会同步到从节点;主节点可读可写操作,而从节点只能读操作
(4)优缺点
1】 主从模型可以提高读的能力,在一定程度上缓解了写的能力
2】 主节点宕机了,整个集群就没有可写的节点了
2、哨兵模式( Sentinel)
(1)特点:
哨兵模式的任务是:监控( Monitoring)、提醒( Notification)、自动故障迁移( Automatic failover)
1】监控: Sentinel 会不断地检查你的主服务器和从服务器是否运作正常
Sentinel可以监控任意多个Master和该Master下的Slaves。(即多个主从模式)
同一个哨兵下的、不同主从模型,彼此之间相互独立。
Sentinel会不断检查Master和Slaves是否正常
2】提醒: 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知
3】自动故障迁移:当主节点服务器不能正常工作时,Sentinel会自动将其中一个从节点服务器升级为新的主节点服务器,让故障服务器失效
Sentinel网络: 当只有一个sentinel的时候,如果这个sentinel挂掉了,那么就无法实现自动故障切换了;在sentinel网络中,只要还有一个sentinel活着,就可以实现故障切换。
(2)自动故障迁移中故障切换的过程
1】投票(过半原则),确定有问题主服务器是否下线
2】选举(过半原则),选举一个从节点(slave)服务器作为主节点master服务器
3】原master节点重新上线后,自动转为当前master的从节点
(3)哨兵模式部署
由于哨兵模式的故障迁移时切换采用过半原则,所有至少要配置三个Sentinel实例(必须为奇数)
由于哨兵模式与节点相互独立,只是对节点进行监控作用,所有需要存在一个正在运行的主从模式
1】配置Sentinel
在/usr/local目录下,创建/redis/sentinels/目录
在/sentinels目录下,以次创建s1、s2、s3三个子目录中
依次拷贝redis解压目录下的sentinel.conf文件,到这三个子目录中
[root@node0719 local]# mkdir -p redis/sentinels
[root@node0719 sentinels]# mkdir s1 s2 s3
[root@node0719 sentinels]# cp /root/redis-3.2.9/sentinel.conf ./s1/
[root@node0719 sentinels]# cp /root/redis-3.2.9/sentinel.conf ./s2/
[root@node0719 sentinels]# cp /root/redis-3.2.9/sentinel.conf ./s3/
依次修改s1、s2、s3子目录中的sentinel.conf文件,修改端口,并指定要监控的主节点。(从节点不需要指定,sentinel会自动识别)
S1哨兵配置如下:
S2/S3哨兵配置如S1只是端口号不一样,监控的主节点一致
(4)测试
关闭主节点master观察输出日志,发现确实重新指定一个主节点,当该节点再次上线时,该节点成为新主节点的从节点
(5)优缺点
优点:Sentinel哨兵模式,确实能实现自动故障切换。提供稳定的服务
缺点:仍然只有一个Master节点。当并发写请求较大时,哨兵模式并不能缓解写压力
3、Redis-cluster集群
由于哨兵模式在同一时刻只有一个主节点master具有写的能力,所有无法满足并发写入请求较大时的需求
通过集群模式提供多个master主节点,每个节点都可以读写,节点之间可以互相通信;整个集群无中心节点
(1)准备工作:
1】安装ruby环境(如果已存在就不需要再次安装)
redis集群管理工具redis-trib.rb依赖ruby环境,首先需要安装ruby环境:
yum -y install ruby
yum -y install rubygems
2】 安装ruby和redis的接口程序
将下载好的 redis-3.0.0.gem拷贝 至/usr/local下,执行安装:
gem install /usr/local/redis-3.0.0.gem
(2)创建节点
1】 Redis集群最少需要6个节点,可以分布在一台或者多台主机上。(同一台主机上用不同端口表示不同节点)
主节点:192.168.56.3:7001 192.168.56.3:7002 192.168.56.3:7003
从节点:192.168.56.3:7004 192.168.56.3:7005 192.168.56.3:7006
2】 在/usr/local/redis下创建redis-cluster目录,其下创建7001、7002。。7006目录,拷贝原始的redis.conf文件到每个700x文件夹下,并修改相关配置,端口号、开启集群、开启后台运行、绑定主机及日志文件位置等设置
必选配置:
port 700X
bind 192.168.23.3
cluster-enabled yes
建议配置:
daemonized yes
logfile /usr/local/redis/redis-cluster/700X/node.log
(3)启动每个节点
[root@node5 redis-cluster]# cd 7001 && redis-server ./redis.conf
[root@node5 7001]# cd ..
[root@node5 redis-cluster]# cd 7002 && redis-server ./redis.conf
[root@node5 7002]# cd ..
[root@node5 redis-cluster]# cd 7003 && redis-server ./redis.conf
[root@node5 7003]# cd ..
[root@node5 redis-cluster]# cd 7004 && redis-server ./redis.conf
。。。。
(注意:每次启动一个节点必须在不同的位置,否则无法启动)
查看每个节点启动信息(ps -aux |grep redis)
[root@node5 ~]# ps -aux |grep redis
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 2319 0.4 0.5 137632 9764 ? Ssl 18:47 0:01 redis-server 192.168.100.251:7001 [cluster]
root 2346 0.6 0.5 137632 9764 ? Ssl 18:48 0:00 redis-server 192.168.100.251:7002 [cluster]
root 2352 0.5 0.5 137632 9768 ? Ssl 18:48 0:00 redis-server 192.168.100.251:7003 [cluster]
root 2358 0.3 0.4 137632 7720 ? Ssl 18:49 0:00 redis-server 192.168.100.251:7004 [cluster]
root 2363 0.2 0.4 137632 7712 ? Ssl 18:50 0:00 redis-server 192.168.100.251:7005 [cluster]
root 2368 1.1 0.4 137632 7716 ? Ssl 18:50 0:00 redis-server 192.168.100.251:7006 [cluster]
(4)创建集群(把每个启动的节点全部加入集群)
执行redis-trib.rb(文件位置: redis源码存放目录redis/redis-4.10.3/src下,.rb文件依赖ruby环境),
[root@node5 src]# ./redis-trib.rb create --replicas 1 192.168.159.10:7001 192.168.159.10:7002 192.168.159.10:7003
192.168.159.10:7004 192.168.159.10:7005 192.168.159.10:7006
注: --replicas 1 1其实代表的是一个比例,就是主节点数/从节点数的比例, 按照命令中IP:PORT的顺序,先是3个主节点,然后是3个从节点
(5)查看集群信息
在集群创建成功之后,集群可以包含多个可读写的主节点,集群无中心节点;
可以通过登录任意一个redis节点查看集群信息
[root@node5 bin]# ./redis-cli -c -h 192.168.100.251 -p 7001
192.168.100.251:7001>
注:-c表示以集群方式连接redis,-h指定ip地址,-p指定端口号
查询集群节点信息,执行 cluster nodes
查询集群状态信息,执行cluster info
192.168.100.251:7001> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:8
cluster_my_epoch:8
cluster_stats_messages_sent:9423
cluster_stats_messages_received:3362
192.168.100.251:7001>
(6)向集群添加master主节点
【1】创建并添加节点
1)创建新的节点7007并启动节点服务
2)执行添加命令:./redis-trib.rb add-node 192.168.100.251:7007 192.168.100.251:7001
3)查看节点集群信息7007是否加入集群,是否为master
【2】给新加主节点分配槽位
1)连接上集群(连接集群中任意一个可用节点都行)
./redis-trib.rb reshard 192.168.23.3:7001
2)输入分配槽位的数量
3)输入接收槽位的节点id (分配的槽位给谁,节点id可以同cluster nodes查看)
4)输入源节点id(即从哪个节点分离出来要分配的槽位,节点id可以同cluster nodes查看),原节点id输入完后,以done命令为结束标志(源节点输入all表示从其他主节点分配)
5)分配完成后,输入开始进行槽位移动
至此主节点添加完成
(7)添加slave从节点
【1】创建新节点7008并启动节点服务
【2】执行新增节点命令:./redis-trib.rb add-node --slave --master-id masterID newNodIP:port MasterIP:port
masterID 主节点id,从cluster nodes信息中查看
newNodIP:port 新增节点的ip:端口
MasterIP:port 主节点的ip:端口
例如:将7008节点添加到7007下,909c349f5f2d4db015101fb7c4e3c227a74ad382为7007节点id(可通过cluster nodes 查看节点信息)
./redis-trib.rb add-node --slave --master-id 909c349f5f2d4db015101fb7c4e3c227a74ad382 192.168.4.253:7008 192.168.4.253:7007
注:此处常见错误(原因 原来该结点在集群中的配置信息已经生成cluster-config-file指定的配置文件中)
[ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
解决方法:删除生成的配置文件nodes.conf,删除后再执行./redis-trib.rb add-node指令。
(8)删除节点
执行删除节点命令:./redis-trib.rb del-node nodeIP:port nodeID
nodeIP:port 待删除节点的ip:端口
nodeID 待删除节点的id,从cluster node中查看
注:删除主节点的时候会报错,原因是,主节点占有槽位
[ERR] Node 127.0.0.1:7005 is not empty! Reshard data away and try again.
此时需要交要删除节点的槽位分配出去,再执行删除(槽位分配课参照添加主节点时的槽位分配步骤)