详解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遍历所有key的两个命令(KEYS 和 SCAN)
Apr 12 Redis
基于Redis位图实现用户签到功能
May 08 Redis
浅谈redis缓存在项目中的使用
May 20 Redis
springboot使用Redis作缓存使用入门教程
Jul 25 Redis
Redisson实现Redis分布式锁的几种方式
Aug 07 Redis
Redis RDB技术底层原理详解
Sep 04 Redis
Jedis操作Redis实现模拟验证码发送功能
Sep 25 Redis
CentOS8.4安装Redis6.2.6的详细过程
Nov 20 Redis
redis的list数据类型相关命令介绍及使用
Jan 18 Redis
源码分析Redis中 set 和 sorted set 的使用方法
Mar 22 Redis
Redis实现短信验证码登录的示例代码
Jun 14 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
php4的session功能评述(二)
2006/10/09 PHP
Php中用PDO查询Mysql来避免SQL注入风险的方法
2013/04/25 PHP
php中header跳转使用include包含解决参数丢失问题
2015/05/08 PHP
CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析
2019/02/28 PHP
php生成微信红包数组的方法
2019/09/05 PHP
bcastr2.0 通用的图片浏览器
2006/11/22 Javascript
NodeJS Express框架中处理404页面一个方式
2014/05/28 NodeJs
node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
2014/11/04 Javascript
谈一谈js中的执行环境及作用域
2016/03/30 Javascript
jQuery实现checkbox列表的全选、反选功能
2016/11/24 Javascript
Web前端开发之水印、图片验证码
2016/11/27 Javascript
angular.fromJson与toJson方法用法示例
2017/05/17 Javascript
浅谈VUE监听窗口变化事件的问题
2018/02/24 Javascript
node+koa2+mysql+bootstrap搭建一个前端论坛
2018/05/06 Javascript
详解.vue文件解析的实现
2018/06/11 Javascript
JavaScript设计模式之原型模式分析【ES5与ES6】
2018/07/26 Javascript
vue配置文件实现代理v2版本的方法
2019/06/21 Javascript
使用Python编写一个在Linux下实现截图分享的脚本的教程
2015/04/24 Python
在Python中操作列表之List.append()方法的使用
2015/05/20 Python
Python函数式编程指南(二):从函数开始
2015/06/24 Python
Python语言描述KNN算法与Kd树
2017/12/13 Python
Django中Forms的使用代码解析
2018/02/10 Python
python sys.argv[]用法实例详解
2018/05/25 Python
python实现人人自动回复、抢沙发功能
2018/06/08 Python
Python读取csv文件分隔符设置方法
2019/01/14 Python
django框架forms组件用法实例详解
2019/12/10 Python
Django+python服务器部署与环境部署教程详解
2020/03/30 Python
Python 如何对文件目录操作
2020/07/10 Python
Merrell美国官网:美国登山运动鞋品牌
2018/02/07 全球购物
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
德国受欢迎的旅游和休闲网站:lastminute.de
2019/09/23 全球购物
《明天,我们毕业》教学反思
2014/04/24 职场文书
学前班语言教学计划
2015/01/20 职场文书
2015年小学数学教师工作总结
2015/05/20 职场文书
傲慢与偏见电影观后感
2015/06/10 职场文书
怎么用Python识别手势数字
2021/06/07 Python