介绍

redis三种模式

一、主从模式

        Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构。下图为一主两从结构。
在这里插入图片描述

怎样实现主从复制?
1.从服务器初始化时进行全量同步
2.初始化完成后执行增量同步
优点:实现数据备份,做到读写分离
缺点:当主节点发生故障掉线时,需要人工进行:故障转移

二、哨兵模式

        可以说是主从复制的升级版本,增加了一个新的角色。由一个或多个哨兵实例组成的哨兵系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。

在这里插入图片描述
Server1掉线后
在这里插入图片描述
之后:
在这里插入图片描述

优点: 如果Master 异常,则会进行Master-slave 转换,自动实现故障转移。将其中一个Slave作为Master,之前的Master重新上线后作为Slave、

缺点: 如果是从节点下线了,哨兵是不会对其进行故障转移的,连接从节点的客户端也无法获取到新的可用从节点

三、 集群模式

        任何两个节点之间都是相互连通的。客户端可以与0任何一个节点相连接,然后就可以访问集群中的任何一个节点。对其进行存取和其他操作。一般集群建议搭建三主三从架构,三主提供服务,三从提供备份功能。每一个节点都存有这个集群所有主节点以及从节点的信息
在这里插入图片描述

掉线判断:
        过程是集群中所有master参与,如果半数以上master节点与某个master节点通信超时(cluster-node-timeout),认为该master节点挂掉.

什么时候整个集群不可用(cluster_state:fail)?
(1)如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,
(2)如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态.

优点:
        有效的解决了redis在分布式方面的需求遇到单机内存。并发和流量瓶颈等问题时,可采用集群方案达到负载均衡的目的。可实现动态扩容。自动故障转移

缺点: 架构新,实践较少


今天这里为大家讲解的是集群模式(也称为三主三从模式)
先介绍一下,我们的服务器信息(3台服务器,cpu,内存、数据盘等不作要求)

192.168.100.21master
192.168.100.22slaves1
192.168.100.22slaves2

一、上传解压先在每台机器上部署单机redis

1、上传
在这里插入图片描述
在这里插入图片描述
2、解压

[root@master servers]# pwd
/opt/servers
[root@master servers]# tar -zxvf redis-5.0.8.tar.gz -C  /opt/servers/

在这里插入图片描述
3、安装redis的相关依赖
这里三台机器都需要安装

[root@slaves2 ~]# yum -y install gcc-c++  tcl

4、进入redis编译

[root@master servers]# cd redis-5.0.8/
[root@master redis-5.0.8]# make && make install

在这里插入图片描述
5、修改redis配置文件
创建日志文件
cd /opt/servers/redis-5.0.8/
mkdir -p /opt/servers/redis-5.0.8/logs
mkdir -p /opt/servers/redis-5.0.8/redisdata
编辑
vim redis.conf

#设置ip
bind 本机ip
#设置让redis开启后可以在后台运行,除非kill -9,如果设置为no,exit后redis就关闭
daemonize yes
#保存redis的pid,这是默认路径,可自行修改
pidfile /var/run/redis_6379.pid
#保存日志文件
logfile "/opt/servers/redis-5.0.8/logs/redis.log"
#本地数据库存放路径
dir /opt/servers/redis-5.0.8/redisdata

#密码设置 
#主节点密码设置
#requirepass 1234abcD   配置集群这里先不要设置密码

6、启动

[root@node01 redis-5.0.8]# cd /opt/servers/redis-5.0.8/src/ 
[root@node01 src]# redis-server ../redis.conf 
ps -ef | grep redis

在这里插入图片描述

二、开始将单机模式变成三主三从集群

1、每台创建其中两实例对应的配置文件、日志文件及数据文件的存放目录

mkdir –p /opt/servers/redis-5.0.8/16379
mkdir –p /opt/servers/redis-5.0.8/16380
mkdir –p /opt/servers/redis-5.0.8/log
mkdir –p /opt/servers/redis-5.0.8/redisdata16379
mkdir –p /opt/servers/redis-5.0.8/redisdata16380

2、拷贝配置文件
将redis.conf分别拷贝到16379、16380中

cp /opt/servers/redis-5.0.8/redis.conf /opt/servers/redis-5.0.8/16379

3、修改配置文件
vim /opt/servers/redis-5.0.8/16379/redis.conf

#设置ip
bind 本机ip
#开启集群模式
cluster-enabled yes
#设置集群模式config文件(是集群自动创建,用于记录集群节点信息以及持久化参数) 
cluster-config-file nodes-16379.conf
#设置让redis开启后可以在后台运行,除非kill -9,如果设置为no,exit后redis就关闭
daemonize yes
#设置端口
port 16379
#保存redis的pid,这是默认路径,可自行修改
pidfile /var/run/redis_16379.pid
#保存日志文件
logfile "/opt/servers/redis-5.0.8/logs/redis-16379.log"
#本地数据库存放路径
dir /opt/servers/redis-5.0.8/redisdata16379

cp /opt/servers/redis-5.0.8/16379/redis.conf /opt/servers/redis-5.0.8/16380/
vim /opt/servers/redis-5.0.8/1638/redis.conf

#设置集群模式config文件(是集群自动创建,用于记录集群节点信息以及持久化参数) 
cluster-config-file nodes-16380.conf
#设置端口
port 16380
#保存redis的pid,这是默认路径,可自行修改
pidfile /var/run/redis_16380id
#保存日志文件
logfile "/opt/servers/redis-5.0.8/logs/redis-16380og"
#本地数据库存放路径
dir /opt/servers/redis-5.0.8/redisdata16380

4、启动
先在每台机器上启动

cd /opt/servers/redis-5.0.8/src/
redis-server ../16379/redis.conf
redis-server ../16380/redis.conf

5、查看集群状态是否正常

[root@master redis-5.0.8]# ps -ef | grep redis
root      17676      1  0 21:51 ?        00:00:00 src/redis-server master:16379 [cluster]
root      17685      1  0 21:51 ?        00:00:00 src/redis-server master:16380 [cluster]
root      17729   9823  0 21:52 pts/0    00:00:00 grep --color=auto redis

在这里插入图片描述
这里大家注意一下:
如果使用5.0版本以上的redis创建集群的命令就有所不同了,原因是因为redis5.0使用redis-cli作为创建集群的命令,使用c语言实现,不再使用ruby语言。
6、这里我先为大家直接讲一下redis5.0版本的,后面在为大家扩展5.0以下redis版本,创建集群的方式。

[root@master redis-5.0.8]# src/redis-cli --cluster create 192.168.100.21:16379  192.168.100.21:16380 192.168.100.22:16379 192.168.100.22:16380 192.168.100.23:16379 192.168.100.23:16380   --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.100.22:16380 to 192.168.100.21:16379
Adding replica 192.168.100.23:16380 to 192.168.100.22:16379
Adding replica 192.168.100.21:16380 to 192.168.100.23:16379
M: 2cda3eec9cb484a7d91103e998c3a5e3e6791961 192.168.100.21:16379
   slots:[0-5460] (5461 slots) master
S: 6f3d94bf87d0237f35b638944493a99ecb92d603 192.168.100.21:16380
   replicates 646a498c7b3406395a62e1df2dc418fc834d257e
M: 8057cb6e27f0baeb9306c475e99cbb0272c3c946 192.168.100.22:16379
   slots:[5461-10922] (5462 slots) master
S: 2f77c304a17db87a273892109181250006c8716a 192.168.100.22:16380
   replicates 2cda3eec9cb484a7d91103e998c3a5e3e6791961
M: 646a498c7b3406395a62e1df2dc418fc834d257e 192.168.100.23:16379
   slots:[10923-16383] (5461 slots) master
S: 88786bdaee76fffd171cd670db9227152d1fb2d2 192.168.100.23:16380
   replicates 8057cb6e27f0baeb9306c475e99cbb0272c3c946
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.........
>>> Performing Cluster Check (using node 192.168.100.21:16379)
M: 2cda3eec9cb484a7d91103e998c3a5e3e6791961 192.168.100.21:16379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 2f77c304a17db87a273892109181250006c8716a 192.168.100.22:16380
   slots: (0 slots) slave
   replicates 2cda3eec9cb484a7d91103e998c3a5e3e6791961
S: 88786bdaee76fffd171cd670db9227152d1fb2d2 192.168.100.23:16380
   slots: (0 slots) slave
   replicates 8057cb6e27f0baeb9306c475e99cbb0272c3c946
M: 8057cb6e27f0baeb9306c475e99cbb0272c3c946 192.168.100.22:16379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 6f3d94bf87d0237f35b638944493a99ecb92d603 192.168.100.21:16380
   slots: (0 slots) slave
   replicates 646a498c7b3406395a62e1df2dc418fc834d257e
M: 646a498c7b3406395a62e1df2dc418fc834d257e 192.168.100.23:16379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

在这里插入图片描述
7、登入,并且设置主从的密码

[root@master redis-5.0.8]# src/redis-cli -h master -p 16379 -c
master:16379> config set masterauth 1234abcD
OK
master:16379> config set requirepass  1234abcD
OK

master:16379> auth '1234abcD'
OK
master:16379> CONFIG rewrite
OK
master:16379> set name 123
-> Redirected to slot [5798] located at 192.168.100.22:16379
OK
192.168.100.22:16379> keys *
1) "name"
192.168.100.22:16379> 
master:16379> auth '1234abcD'
OK
#重写配置
master:16379> CONFIG rewrite
OK
master:16379> set name 123
-> Redirected to slot [5798] located at 192.168.100.22:16379
OK
192.168.100.22:16379> keys *
1) "name"
#查看集群的详细信息
192.168.100.22:16379> 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:6
cluster_my_epoch:3
cluster_stats_messages_ping_sent:1584
cluster_stats_messages_pong_sent:1488
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:3077
cluster_stats_messages_ping_received:1487
cluster_stats_messages_pong_received:1589
cluster_stats_messages_meet_received:1
cluster_stats_messages_received:3077
192.168.100.22:16379> 
#查看主从之间的关系
192.168.100.22:16379> cluster nodes
88786bdaee76fffd171cd670db9227152d1fb2d2 192.168.100.23:16380@26380 slave 8057cb6e27f0baeb9306c475e99cbb0272c3c946 0 1611981803000 6 connected
8057cb6e27f0baeb9306c475e99cbb0272c3c946 192.168.100.22:16379@26379 myself,master - 0 1611981804000 3 connected 5461-10922
2f77c304a17db87a273892109181250006c8716a 192.168.100.22:16380@26380 slave 2cda3eec9cb484a7d91103e998c3a5e3e6791961 0 1611981805000 4 connected
646a498c7b3406395a62e1df2dc418fc834d257e 192.168.100.23:16379@26379 master - 0 1611981805965 5 connected 10923-16383
2cda3eec9cb484a7d91103e998c3a5e3e6791961 192.168.100.21:16379@26379 master - 0 1611981804000 1 connected 0-5460
6f3d94bf87d0237f35b638944493a99ecb92d603 192.168.100.21:16380@26380 slave 646a498c7b3406395a62e1df2dc418fc834d257e 0 1611981805000 5 connected

在这里插入图片描述

扩展:

当如果你们使用redis的5.0版本以下的后可能会出现这个错误:
(error) CLUSTERDOWN Hash slot not served

1、准备redis-trib.rb的运行环境
相关连接:https://blog.csdn.net/weixin_45697341/article/details/102736907

wget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.1.tar.gz
yum -y install zlib-devel
tar xvf ruby-2.5.1.tar.gz
cd ruby-2.5.1/
./configure -prefix=/usr/local/ruby
make
make install
cd /usr/local/ruby/
cp bin/ruby /usr/local/bin
cp bin/gem /usr/local/bin

2、安装redis-trib依赖

wget http://rubygems.org/downloads/redis-3.3.0.gem
gem install -l redis-3.3.0.gem

3、构建集群
./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

在这里插入图片描述
10、验证集群
通过客户端命令连接上,通过集群命令看一下状态和节点信息等

[root@master src]# ./redis-cli -h 192.168.100.21 -p 16379 -c
192.168.100.21:16379> auth '密码'
OK

192.168.100.21:16379> clster info
192.168.100.21:16379> cluster info
cluster_state:fail
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:1
cluster_size:0
cluster_current_epoch:0
cluster_my_epoch:0
cluster_stats_messages_sent:0
cluster_stats_messages_received:0

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐