详解Redis集群搭建的三种方式


Posted in Redis onMay 31, 2021

一、单节点实例

单节点实例还是比较简单的,平时做个测试,写个小程序如果需要用到缓存的话,启动一个

Redis 还是很轻松的,做为一个 key/value 数据库也是可以胜任的

二、主从模式(master/slaver)

redis 主从模式配置

主从模式:

redis 的主从模式,使用异步复制,slave 节点异步从 master 节点复制数据,master

节点提供读写服务,slave 节点只提供读服务(这个是默认配置,可以通过修改配置文件

slave-read-only 控制)。master 节点可以有多个从节点。配置一个 slave 节点只需要在

redis.conf 文件中指定 slaveof master-ip master-port 即可。

从节点开启主从复制,有 3 种方式:

配置文件

在从服务器的配置文件中加入:slaveof<masterip><masterport>

启动命令

redis-server 启动命令后加入:slaveof<masterip><masterport>

客户端命令

Redis 服务器启动后直接通过客户端执行命令:slaveof<masterip><masterport>,则该 Redis

实例成为从节点。

上述 3 种方式是等效的,下面以客户端命令的方式为例,看一下当执行了 slaveof 后,Redis

主节点和从节点的变化。

本示例:一个 master 节点有两个 slave 节点

配置:

1,cd /usr/local/redis/redis-4.0.2

切换到当前 redis 安装路径

2, mkdir config

新建一个文件夹,存放 redis 的配置文件

3,在 config 下,新建三个配置文件,如下:

cd config
vi master-6739.conf
bind 0.0.0.0
port 6379
logfile "6379.log"
dbfilename "dump-6379.rdb"
daemonize yes
rdbcompression yes
vi slave-6380.confbind 0.0.0.0
port 6380
logfile "6380.log"
dbfilename "dump-6380.rdb"
daemonize yes
rdbcompression yes
slaveof 192.168.81.135 6379
vi slave-6381.conf
bind 0.0.0.0
port 6381
logfile "6381.log"
dbfilename "dump-6381.rdb"
daemonize yes
rdbcompression yes
slaveof 192.168.81.135 6379

master-6739.conf,为主节点配置文件,slave-6380.conf,slave-6381.conf为从节点配置文件

在从节点的配置文件中使用:slaveof 指定 master 节点

4,启动三台 reids 服务

[root@localhost redis-4.0.2]# ./src/redis-server config/master-6379.conf  

[root@localhost redis-4.0.2]# ./src/redis-server config/slave-6380.conf  

[root@localhost redis-4.0.2]# ./src/redis-server config/slave-6381.conf

查看一下 redis 服务

测试主从模式

a,先分别连上三台 Redis 服务,获取 key 为 name 的值,通过-p 指定连接那个端口的 redis 服务

[root@localhost redis-4.0.2]# ./src/redis-cli -p 6379 

127.0.0.1:6379> get name 

(nil) 

[root@localhost redis-4.0.2]# ./src/redis-cli -p 6380 

127.0.0.1:6380> get name 

(nil) 

[root@localhost redis-4.0.2]# ./src/redis-cli -p 6381 

127.0.0.1:6381> get name 

(nil) 

#获取的值都为空

b,给 master 节点 set 一个 key

[root@localhost redis-4.0.2]# ./src/redis-cli -p 6379

127.0.0.1:6379> set name cmy

OK

127.0.0.1:6379> get name

"cmy"

c,slave 节点直接读取 key 为 name 的值

[root@localhost redis-4.0.2]# ./src/redis-cli -p 6380

127.0.0.1:6380> get name

"cmy"

[root@localhost redis-4.0.2]# ./src/redis-cli -p 6381

127.0.0.1:6381> get name

"cmy"

d,slave 节点只提供读服务,不能进行写入操作

127.0.0.1:6381> set age 23

(error) READONLY You can't write against a read only slave.

注意

使用主从模式时应注意 matser 节点的持久化操作,matser 节点在未使用持久化的情况详情

下如果宕机,并自动重新拉起服务,从服务器会出现丢失数据的情况。

首先,禁止 matser 服务持久化

127.0.0.1:6379> CONFIG SET save "" 

OK

在 master 节点 set 一个值

127.0.0.1:6379> set age 23 

OK

slave 节点可以 get 到 age 的值

127.0.0.1:6380> get age 

"23" 

关掉 master 节点服务

127.0.0.1:6379> shutdown 

not connected> 

slave 节点此时仍可以 get 到 age 的值

127.0.0.1:6380> get age 

"23" 

重启 master 服务,此时获取不到 age 的值

[root@localhost redis-4.0.2]# ./src/redis-server config/master-6379.conf  

[root@localhost redis-4.0.2]# ./src/redis-cli -p 6379 

127.0.0.1:6379> get age 

(nil) 

slave 节点此时在获取 age 的值为空,数据丢失

[root@localhost redis-4.0.2]# ./src/redis-cli -p 6380 

127.0.0.1:6380> get age 

(nil) 

数据丢失的原因:因为 master 服务挂了之后,重启服务后,slave 节点会与 master 节点进行

一次完整的重同步操作,所以由于 master 节点没有持久化,就导致 slave 节点上的数据也会

丢失掉。所以在配置了 Redis 的主从模式的时候,应该打开主服务器的持久化功能。

到这,redis 的主从模式就已经完成了

谈谈我认为主从模式的必要性:

主从模式的一个作用是备份数据,这样当一个节点损坏(指不可恢复的硬件损坏)时,数据因为有备份,可以方便恢复。

另一个作用是负载均衡,所有客户端都访问一个节点肯定会影响 Redis 工作效率,有了主从以后,查询操作就可以通过查询从节点来完成。

对主从模式必须的理解(结论已经验证过,可以自行验证):

一个 Master 可以有多个 Slaves

默认配置下,master 节点可以进行读和写,slave 节点只能进行读操作,写操作被禁止

不要修改配置让 slave 节点支持写操作,没有意义,原因一,写入的数据不会被同步到其他节点;原因二,当 master 节点修改同一条数据后,slave 节点的数据会被覆盖掉

slave 节点挂了不影响其他 slave 节点的读和 master 节点的读和写,重新启动后会将数据从master 节点同步过来,master 节点挂了以后,不影响 slave 节点的读,Redis 将不再提供写服务,master 节点启动后 Redis 将重新对外提供写服务。master 节点挂了以后,不会 slave 节点重新选一个 master

对有密码的情况说明一下,当 master 节点设置密码时:

客户端访问 master 需要密码

启动 slave 需要密码,在配置中进行配置即可

客户端访问 slave 不需要密码

主从节点的缺点

主从模式的缺点其实从上面的描述中可以得出:

master 节点挂了以后,redis 就不能对外提供写服务了,因为剩下的 slave 不能成为 master

这个缺点影响是很大的,尤其是对生产环境来说,是一刻都不能停止服务的,所以一般的生产坏境是不会单单只有主从模式的。所以有了下面的 sentinel 模式。

三、sentinel 模式

Redis 哨兵模式,用现在流行的话可以说就是一个“哨兵机器人”,给“哨兵机器人”进行相应的配置之后,这个"机器人"可以 7*24 小时工作,它能能够自动帮助你做一些事情,如监控,提醒,自动处理故障等。

Redis-sentinel 简介

Redis-sentinel 是 Redis 的作者 antirez,因为 Redis 集群的被各大公司使用,每个公司要写自 己的集群管理工具,于是 antirez 花了几个星期写出了 Redis-sentinel。

Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance),Redis 的 Sentinel 为 Redis 提供了高可用性。使用哨兵模式创建一个可以不用人为干预而应对各种故障的 Redis 部署。

该系统执行以下三个任务:

监控(Monitoring):Sentinel 会不断地检查你的主服务器和从服务器是否允许正常。

提醒(Notification):当被监控的某个 Redis 服务器出现问题时,Sentinel 可以通过 API 向管 理员或者其他应用程序发送通知。

自动故障迁移(Automatic failover):

(1)当一个主服务器不能正常工作时,Sentinel 会开始一次自动故障迁移操作,他会将失效主服务器的其中一个从服务器升级为新的主服务器,

并让失效主服务器的其他从服务器改为复制新的主服务器;

(2)客户端试图连接失败的主服务器时,集群也会向客服端返回新主服务器的地址,是的集群可以使用新主服务器代替失效服务器。

sentinel 的分布式特性

Redis Sentinel 是一个分布式系统,

你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投 票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为 新的主服务器。

单个 sentinel 进程来监控 redis 集群是不可靠的,当 sentinel 进程宕掉后(sentinel 本身也有单 点问题,single-point-of-failure)整个集群系统将无法按照预期的方式运行。所以有必要将sentinel 集群,这样有几个好处:

有一些 sentinel 进程宕掉了,依然可以进行 redis 集群的主备切换;

如果只有一个 sentinel 进程,如果这个进程运行出错,或者是网络堵塞,那么将无法实现 redis集群的主备切换(单点问题);

如果有多个 sentinel,redis 的客户端可以随意地连接任意一个 sentinel 来获得关于 redis 集群 中的信息一个健壮的部署至少需要三个哨兵实例。三个哨兵实例应该放置在客户使用独立方式确认故障的计算机或虚拟机中。例如不同的物理机或不同可用区域的虚拟机。【本次讲解是一个机器上进行搭建,和多级是一个道理背景

最近项目需求,接触到了 Redis 的搭建,简单记录下搭建过程中遇到的坑

总体配置

192.168.1.100:6379 -> master 

192.168.1.101:6379 -> slave 

192.168.1.102:6379 -> slave 

192.168.1.100:26379 -> sentinel 

192.168.1.101:26379 -> sentinel 

192.168.1.102:26379 -> sentinel 

搭建步骤

1.安装 redis

# 解压 

tar -xvf /usr/local/redis-3.2.11.tar.gz 

mkdir -p /usr/local/redis/bin 

cp  

/usr/local/redis/src/{redis-benchmark,redis-check-aof,redis-check-rdb,redis-cli,redis-sentinel,redi 

s-server,redis-trib.rb} /usr/local/redis/bin 

mkdir -p /u01/redis/{6379/{log,data,pid,conf},26379/{log,data,pid,conf} 

# 添加环境变量 

echo "export PATH=/usr/local/redis/bin:$PATH" >> /etc/profile 

source /etc/profile 

2.redis-6379 配置

redis 节 点 配 置 基 本 如 下 , 把 如 下 配 置 分 别 cp 到 三 台 虚 拟 机 的

/u01/redis/6379/conf/redis_6379.conf 

bind 0.0.0.0 

protected-mode no 

daemonize yes 

pidfile "/u01/redis/6379/pid/redis_6379.pid" 

port 6379 

tcp-backlog 511 

timeout 0tcp-keepalive 0 

loglevel notice 

logfile "/u01/redis/6379/log/redis_6379.log" 

databases 16 

stop-writes-on-bgsave-error yes 

rdbcompression yes 

rdbchecksum yes 

dbfilename "dump.rdb" 

dir "/u01/redis/6379/data" 

slave-serve-stale-data yes 

slave-read-only yes 

repl-diskless-sync no 

repl-diskless-sync-delay 5 

repl-disable-tcp-nodelay no 

slave-priority 100 

min-slaves-to-write 1 

min-slaves-max-lag 10 

appendonly no 

appendfilename "appendonly.aof" 

appendfsync everysec 

no-appendfsync-on-rewrite no 

auto-aof-rewrite-percentage 100 

auto-aof-rewrite-min-size 64mb 

aof-load-truncated yes 

lua-time-limit 5000 

slowlog-log-slower-than 10000 

slowlog-max-len 128 

latency-monitor-threshold 0 

notify-keyspace-events "" 

hash-max-ziplist-entries 512 

hash-max-ziplist-value 64 

list-max-ziplist-entries 512 

启动服务

# 在三台虚拟机上分别执行 

redis-server /u01/redis/6379/conf/redis_6379.conf 

建立主从关系

# 在 192.168.1.101 

redis-cli -p 6379 SLAVEOF 192.168.1.100 6379 

# 在 192.168.1.102 

redis-cli -p 6379 SLAVEOF 192.168.1.100 6379查看 Replication 

192.168.1.101:6379> info replication 

# Replication 

role:master 

connected_slaves:2 

min_slaves_good_slaves:2 

slave0:ip=192.168.1.102,port=6379,state=online,offset=9577826,lag=1 

slave1:ip=192.168.1.103,port=6379,state=online,offset=9577965,lag=0 

master_repl_offset:9577965 

repl_backlog_active:1 

repl_backlog_size:1048576 

repl_backlog_first_byte_offset:8529390 

repl_backlog_histlen:1048576 

192.168.1.102:6379> info replication 

# Replication 

role:slave 

master_host:192.168.1.101 

master_port:6379 

master_link_status:up 

master_last_io_seconds_ago:0 

master_sync_in_progress:0 

slave_repl_offset:9600220 

slave_priority:100 

slave_read_only:1 

connected_slaves:0 

min_slaves_good_slaves:0 

master_repl_offset:0 

repl_backlog_active:0 

repl_backlog_size:1048576 

repl_backlog_first_byte_offset:0 

repl_backlog_histlen:0 

192.168.1.103:6379> info replication 

# Replication 

role:slave 

master_host:192.168.1.101 

master_port:6379 

master_link_status:up 

master_last_io_seconds_ago:0 

master_sync_in_progress:0 

slave_repl_offset:9612675slave_priority:100 

slave_read_only:1 

connected_slaves:0 

min_slaves_good_slaves:0 

master_repl_offset:0 

repl_backlog_active:0 

repl_backlog_size:1048576 

repl_backlog_first_byte_offset:0 

repl_backlog_histlen:0 

3.sentinel-6379 配置

sentinel 节 点 配 置 基 本 如 下 , 把 如 下 配 置 分 别 cp 到 三 台 虚 拟 机 的

/u01/redis/26379/conf/sentinel_26379.conf 

sentinel monitor mymaster 后监控的是 redis 中的 master 节点,也就是 192.168.1.100,所以这个文件在三台机器上是相同的

port 26379 

bind 0.0.0.0 

daemonize yes 

protected-mode no 

dir "/u01/redis/26379/tmp" 

logfile "/u01/redis/26379/log/sentinel_26379.log" 

sentinel monitor mymaster 192.168.1.100 6379 1 

等待启动完毕后观察/u01/redis/26379/conf/sentinel_26379.conf 文件变化

查看 sentinel 状态用 info sentinel

redis-cli -h 192.168.1.100 -p 26379 info sentinel 

# Sentinel 

sentinel_masters:1 

sentinel_tilt:0 

sentinel_running_scripts:0 

sentinel_scripts_queue_length:0 

sentinel_simulate_failure_flags:0 

master0:name=zhuanche01,status=ok,address=192.168.1.100:6379,slaves=2,sentinels=3 

总结

我搭建的时候遇到了 192.168.1.101、192.168.1.102 上的 sentinel 启动后一段时间出错的问题,

后来发现是没有监控 master

再就是出问题了多看 log

四、cluster 模式

cluster 的出现是为了解决单机 Redis 容量有限的问题,将 Redis 的数据根据一定的规则分配

到多台机器。对 cluster 的一些理解:

cluster 可以说是 sentinel 和主从模式的结合体,通过 cluster 可以实现主从和 master 重选功能,所以如果配置两个副本三个分片的话,就需要六个 Redis 实例。

因为 Redis 的数据是根据一定规则分配到 cluster 的不同机器的,当数据量过大时,可以新增机器进行扩容

这种模式适合数据量巨大的缓存要求,当数据量不是很大使用 sentinel 即可。

以上就是详解Redis集群搭建的三种方式的详细内容,更多关于Redis集群搭建的三种方式的资料请关注三水点靠木其它相关文章!

Redis 相关文章推荐
redis连接被拒绝的解决方案
Apr 12 Redis
使用Redis实现秒杀功能的简单方法
May 08 Redis
Django使用redis配置缓存的方法
Jun 01 Redis
Windows中Redis安装配置流程并实现远程访问功能
Jun 07 Redis
redis不能访问本机真实ip地址的解决方案
Jul 07 Redis
Redis Cluster集群动态扩容的实现
Jul 15 Redis
Redis字典实现、Hash键冲突及渐进式rehash详解
Sep 04 Redis
浅谈Redis的keys命令到底有多慢
Oct 05 Redis
Springboot/Springcloud项目集成redis进行存取的过程解析
Dec 04 Redis
关于使用Redisson订阅数问题
Jan 18 Redis
关于Redis的主从复制及哨兵问题
Jun 16 Redis
Redis唯一ID生成器的实现
Jul 07 Redis
浅谈Redis主从复制以及主从复制原理
5分钟教你docker安装启动redis全教程(全新方式)
May 29 #Redis
详解缓存穿透击穿雪崩解决方案
浅谈Redis的几个过期策略
May 27 #Redis
Redis Cluster 字段模糊匹配及删除
May 27 #Redis
redis哨兵常用命令和监控示例详解
May 27 #Redis
Java Socket实现Redis客户端的详细说明
May 26 #Redis
You might like
PHP中的类-什么叫类
2006/11/20 PHP
用php实现的下载css文件中的图片的代码
2010/02/08 PHP
php 发送带附件邮件示例
2014/01/23 PHP
推荐几个开源的微信开发项目
2014/12/28 PHP
50个优秀经典PHP算法大集合 附源码
2020/08/26 PHP
jQuery的一些注意
2006/12/06 Javascript
JavaScript中各种编码解码函数的区别和注意事项
2010/08/19 Javascript
js特效,页面下雪的小例子
2013/06/17 Javascript
jQuery随便控制任意div隐藏的方法
2013/06/28 Javascript
eclipse导入jquery包后报错的解决方法
2014/02/17 Javascript
js打开windows上的可执行文件示例
2014/05/27 Javascript
Javascript常用小技巧汇总
2015/06/24 Javascript
javascript中判断json的方法总结
2015/08/27 Javascript
AngularJS基础 ng-include 指令示例讲解
2016/08/01 Javascript
JS禁止查看网页源代码的实现方法
2016/10/12 Javascript
JS数组求和的常用方法总结【5种方法】
2019/01/14 Javascript
微信小程序基于高德地图查找位置并显示文字
2019/10/30 Javascript
vue表单数据交互提交演示教程
2019/11/13 Javascript
jQuery实现朋友圈查看图片
2020/09/11 jQuery
jQuery实现手风琴特效
2021/01/11 jQuery
深入学习Python中的装饰器使用
2016/06/20 Python
Python 遍历列表里面序号和值的方法(三种)
2017/02/17 Python
python生成n个元素的全组合方法
2018/11/13 Python
python面试题小结附答案实例代码
2019/04/11 Python
Python如何在windows环境安装pip及rarfile
2020/06/15 Python
HTML5 Canvas draw方法制作动画效果示例
2013/07/11 HTML / CSS
MCAKE蛋糕官方网站:一直都是巴黎的味道
2018/02/06 全球购物
.NET程序员的几道面试题
2012/06/01 面试题
学生会个人自荐书范文
2014/02/12 职场文书
三分钟英语演讲稿
2014/04/24 职场文书
绿色环保口号
2014/06/12 职场文书
会计毕业生自荐书
2014/06/12 职场文书
离婚协议书范本2014
2014/10/27 职场文书
启动Tomcat时出现大量乱码的解决方法
2021/06/21 Java/Android
Nginx内网单机反向代理的实现
2021/11/07 Servers
python创建字典及相关管理操作
2022/04/13 Python