Redis主从模式、哨兵模式和集群的相关操作

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.

此时需要交要删除节点的槽位分配出去,再执行删除(槽位分配课参照添加主节点时的槽位分配步骤)

posted @ 2020-08-07 16:25  CharyGao  阅读(48)  评论(0编辑  收藏

返回顶部

返回顶部