Redis--(linux安装redis3.2.9主从复制与集群的搭建--教程)

来源:互联网 发布:arp ip 对应mac地址 编辑:程序博客网 时间:2024/06/18 12:33

如果中间遇见问题可以加扣扣群300458205

一、安装redis并且启动

看上一篇文章
http://blog.csdn.net/wolf_love666/article/details/76223299

二、配置多个Redis

2-0了解下机制:

redis的replication机制允许slave从master那里通过网络传输拷贝到完整的数据备份。具有以下特点:
● 异步复制,从2.8版本开始,slave能不时地从master那里获取到数据。
● 允许单个master配置多个slave
● slave允许其它slave连接到自己。一个slave除了可以连接master外,它还可以连接其它的slave。形成一个图状的架构。
● master在进行replication时是非阻塞的,这意味着在replication期间,master依然能够处理客户端的请求。
● slave在replication期间也是非阻塞的,也可以接受来自客户端的请求,但是它用的是之前的旧数据。可以通过配置来决定slave是否在进行replication时用旧数据响应客户端的请求,如果配置为否,那么slave将会返回一个错误消息给客户端。不过当新的数据接收完全后,必须将新数据与旧数据替换,即删除旧数据,在替换数据的这个时间窗口内,slave将会拒绝客户端的请求和连接。
● 一般使用replication来可以实现扩展性,例如说,可以将多个slave配置为“只读”,或者是纯粹的数据冗余备份。
● 能够通过replication来避免master每次持久化时都将整个数据集持久化到硬盘中。只需把master配置为不进行持久化操作(把配置文件中持久化相关的配置项注释掉即可),然后连接上一个slave,这个slave则被配置持久化选项。不过需要注意的是,在这个方案中,必须确保master不会自动启动(原因就是如果master自动启动将会导致IO问题,master数据会同时写入slave)。

2-1将redis.conf复制一份,并修改名称

打开redis安装目录,执行如下命令:

cp redis.conf  ./redis_6380.conf

2-2编辑redis.conf文件

Master配置:
这里写图片描述

1:关闭rdb快照(备份工作交给slave)

2-2-1、执行如下命令

三个save到rdb的命令配置含义:
save 900 1 #在900秒之内,redis至少发生1次修改则redis抓快照到磁盘
save 300 100 #在300秒之内,redis至少发生100次修改则redis抓快照到磁盘
save 60 10000 #在60秒之内,redis至少发生10000次修改则redis抓快照到磁盘

2:可以开启aof

2-2-2、执行如下命令:

将appendonly no 改为yes 默认的数据会保存在appendonly.aof文件中
这里写图片描述
原因:
数据快照的缺点是持久化之后如果出现系统宕机则会丢失一段数据我们知道他是多少秒dump一次,因此增加了另外一种追加式的操作日志记录,叫append only file,其日志文件以aof结尾,我们称为aof文件,要开启aof日志的记录,需要在配置文件中进行如下配置: appendonly yes
Appendonly配置不开启,可能在断电时导致一段时间的数据丢失,因为redis本身同步数据文件时按save条件来同步的,所以有的数据会在一段时间内只存在于内存中。
Appendfsync no/always/everysec
no:表示等操作系统进行数据缓存同步到磁盘。性能最好,持久化没有保障。
Always:表示每次更新操作后手动调用fsync()将数据写到磁盘.每次收到写命令就立即强制写入磁盘,最慢的,但是保障完全的持久化。
Everysec:表示每秒同步一次.每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中。(常常选择这个折中的方案默认也是这个配置)

2-3编辑redis_6380.conf

slave配置:
0:修改端口号和pid号
这里写图片描述
这里写图片描述

1: 声明slave-of1-1、运行关联进入slave(从)redis:运行:slaveof 127.0.0.1 6379 (设定主数据库)完成,但是使用这种方式,一旦从库挂掉重启,他们的复制关系将终止。1-2、配置关联(长期关联)到服务器配置文件目录,找到从库的配置文件,执行修改操作(也就是上面的redis6380.conf文件)vi redis6380.conf将# slaveof <masterip> <masterport>改为 slaveof 127.0.0.1 6379保存退出,这样从库每次启动都会主动建立与主库的复制关系。2: 配置密码[如果master有密码]--一般也不需要3: [某1个]slave打开 rdb快照功能默认就是save都打开的 如果没有打开 打开所有的saveaof日志关掉,因为如果都开启的话恢复的时候是以aof恢复,而我们可以直接让masteraof日志恢复。

这里写图片描述
这里写图片描述

4: 配置是否只读[slave-read-only]

这里写图片描述

2-4为了防止日志恢复,重写的时候误将flushall命令重写可以注释掉。

rename-command FLUSHALL “” #可以用这种方式关掉非常危险的命令,如FLUSHALL这个命令,它清空整个 Redis 服务器的数据,而且不用确认且从不会失败
这里写图片描述

2-5分别启动redis和redis_6380

主从通信原理:
这里写图片描述
判断是否有启动如果有杀掉进程
这里写图片描述
这里写图片描述
启动redis6380 6380输出日志:
这里写图片描述
我们再看redis6379 6379输出日志:
这里写图片描述

2-6手动切换redis的master和slave

我们现在将主redis杀掉: ps -ef|grep redis
然后:kill -9 6860或者如果没有前台启动可以直接CTRL+C退出
这里写图片描述
此时:src/redis-cli -p 6379
这里写图片描述
表明主master已经结束
此时6380的redis连接不上
这里写图片描述
使用命令:127.0.0.1:6378> slaveof NO ONE
OK slave变为master
127.0.0.1:6378> set age 20
OK 已经可以插入数据了
这里写图片描述

此时切换已经完成,但是我们还需要启动之前的主redis,但是这个时候我们已经进行过插入、删除等操作,以前的主redis并没有记录这些,那么就需要将redis6380的dump.rdb替换之前redismaster 的dump.rdb文件。
首先进入redis-master 启动 ./src/redis-server redis.conf
然后127.0.0.1:6378> slaveof 127.0.0.1 6379
OK
表示又回到之前的状态
这里就不做数据恢复了
恢复的时候注意事项:
数据迁移:
数据迁移首先需要关闭aof因为恢复先以aof日志恢复后以快照恢复,
然后需要关掉redis进程,(如果进程开启复制的话那么具有相同的句柄导致的后果是只能有一个端口获取到rdb),
然后save dump出rdb,复制rdb一份新的rdb
然后进行数据迁移重新导入另外一个端口

启动redis6379
客户端访问6380的时候输出信息
这里写图片描述
服务端6380输出信息:

这里写图片描述

2-7sentinel自动切换

这里写图片描述

sentinel就是监听master,通过监听其状态,来完成主从之间的切换, 我们直接使用sentinel的默认配置,使用./src/redis-sentinel sentinel.conf –sentinel启动sentinel, 可以看到日志信息
这里写图片描述

可以使用上述步骤试验下

补充知识:
原理:
这里写图片描述
一、Sentinel作用:
1):Master状态检测
2):如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave
3):Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换
二、Sentinel工作方式:
1):每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令
2):如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。
3):如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
4):当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线
5):在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有Master,Slave发送 INFO 命令
6):当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次
7):若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。
若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。

2-8其它后继数据备份工作

1、用redis-cli bgsave 命令每天凌晨一次持久化一次master redis上的数据,并CP到其它备份服务器上。
2、用redis-cli bgrewriteaof 命令每半小时持久化一次 slave redis上的数据,并CP到其它备份服务器上。
3、写个脚本 ,定期get master和slave上的key,看两个是否同步,如果没有同步,及时报警。

三、主从复制与集群的架构

这里写图片描述
一般选用第二种架构 好处就是宕机切换的时候快,而且注意一点启动主redis时候不能启用多个slave否则主redis的IO会同时写入到从redis,造成IO压力过大

原创粉丝点击