一、Redis安装
- Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
- Redis 可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。
- 与传统数据库不同的是 Redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。
安装、编译、配置
先从官网下载redis压缩包到本机,我下载的版本时redis-5.0.8。下载网址
前提:redis的编译需要安装gcc。yum install gcc -y
[root@servera ~]# tar zxf redis-5.0.8.tar.gz
[root@servera ~]# cd redis-5.0.8/
[root@servera redis-5.0.8]# ls
00-RELEASENOTES COPYING Makefile redis.conf runtest-moduleapi src
BUGS deps MANIFESTO runtest runtest-sentinel tests
CONTRIBUTING INSTALL README.md runtest-cluster sentinel.conf utils
[root@servera redis-5.0.8]# make
[root@servera redis-5.0.8]# make install
[root@servera redis-5.0.8]# cd utils/ //进入目录 完成安装配置
[root@servera utils]# ./install_server.sh //设定默认配置
[root@servera utils]# vim /etc/redis/6379.conf //在配置文件中,打开所有接口的6379端口
# JUST COMMENT THE FOLLOWING LINE.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bind 0.0.0.0 //设定为所有主机
[root@servera utils]# /etc/init.d/redis_6379 restart //重启redis
二、Redis持久化
Redis的持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。支持AOF和RDB(默认)两种持久化方式。
持久化机制
RDB:是Redis DataBase缩写快照
RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。
配置文件【/etc/redis/6379.conf】中的相关参数含义:
# Save the DB on disk:
# save <seconds> <changes>
save 900 1 //当有1条Keys数据被改变时,900秒刷新到Disk一次
save 300 10 //当有10条Keys数据被改变时,300秒刷新到Disk一次
save 60 10000 //当有10000条Keys数据被改变时,60秒刷新到Disk一次
stop-writes-on-bgsave-error yes
//当后台RDB进程导出快照到rdb文件这个过程出错时redis主进程是否还接受向数据库写数据,
该种方式会让用户知道在数据持久化到硬盘时出错了(相当于一种监控)。
SAVE:速度快,但会堵塞;BGSAVE:异步,通过子进程执行。
rdbcompression yes //是否启用rdb文件压缩,默认为“yes”。如果希望RDB进程节省一点CPU时间,设置为no。
rdbchecksum yes //在redis重启后,从rdb文件向内存写数据之前,是否先检测该rdb文件是否损坏
# The filename where to dump the DB
dbfilename dump.rdb //dbfilename:持久化数据存储在本地的文件
dir /var/lib/redis/6379 //dir:持久化数据存储在本地的路径
AOF:是Append Only File持久化
AOF持久化,以追加的方式保存所有写操作,是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。
当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。
AOF默认关闭,开启方法,修改配置文件:appendonly yes
appendonly no //此选项为aof功能的开关,默认为“no”,可以通过“yes”来开启aof功能
appendfilename "appendonly.aof" //aof文件的存放路径与文件名称
appendfsync everysec //每秒强制写入磁盘一次
【 指定aof操作中文件同步策略,有三个合法值:always everysec no,默认为everysec
always:每一个命令,都立即同步到aof文件中去;
everysec:每秒将数据写一次到aof文件,redis推荐的方式;
no:将写入工作交给操作系统,由操作系统来判断缓冲区大小,统一写到aof文件。】
三、Redis主从复制
一主多从,主负责写,并且将数据复制到其它的 slave 节点,从节点负责读。所有的读请求全部走从节点。
设定主从复制,只需要在从节点的配置文件中,设定slaveof参数,添加主节点的IP和Redis端口。
实验环境:
主机名 | IP | 职能 | 说明 |
---|---|---|---|
server1 | 192.168.43.127 | 主节点 | redis正常开启 |
serverb | 192.168.43.137 | 从节点 | redis正常开启 |
在从节点中设定主从复制
[root@serverb utils]# vim /etc/redis/6379.conf //从节点的配置文件
slaveof 192.168.43.127 6379 //使用参数,设定主节点
[root@serverb utils]# /etc/init.d/redis_6379 restart
测试,设定完成后,在主节点中写入数据,从节点可以读取到数据:
主从复制的核心原理:
- 当启动一个 slave node 的时候,它会发送一个 PSYNC 命令 给 master node。
- 如果这是 slave node 初次连接到 master node,那么会触发一次full resynchronization 全量复制。此时 master 会启动一个后台线程,开始生成一份 RDB 快照文件, 同时还会将从客户端 client 新收到的所有写命令缓存在内存中。
- RDB 文件生成完毕后, master 会将这个 RDB 发送给 slave,slave 会先写入本地磁盘,然后再从本地磁盘加载到内存中, 接着 master 会将内存中缓存的写命令发送到 slave,slave 也会同步这些数据。
- slave node 如果跟 master node 有网络故障,断开了连接,会自动重连,连接之后 master node 仅会复制给 slave 部分缺少的数据。
四、Redis高可用
Redis Sentinel为Redis提供高可用性。实际上,这意味着使用Sentinel可以创建一个Redis部署,在不需要人为干预的情况下抵抗某些类型的故障。
Redis Sentinel还提供其他辅助任务,如监视、通知,并充当客户端的配置提供者。
宏观层面上哨兵能力有以下四个方面:
- 监控(Monitoring): Sentinel会不断检查主实例和副本实例是否按预期工作。
- 通知(Notification): Sentinel可以通过API通知系统管理员或其他计算机程序,其中一个被监视的Redis实例有问题。
- 自动故障转移(Automatic failover): 如果某个主服务器没有按预期工作,Sentinel可以启动一个故障转移过程,其中一个副本被提升为主副本,其他附加副本被重新配置为使用新的主副本,并且使用Redis服务器的应用程序会被通知在连接时要使用的新地址。
- 配置提供程序(Configuration provider): Sentinel充当客户端服务发现的授权源。客户端连接到Sentinel,以请求负责给定服务的当前Redis主机的地址。如果发生故障转移,sentinel将报告新地址。
Redis Sentinel是一个分布式系统: Sentinel本身被设计为在有多个Sentinel进程协同工作的配置中运行。
多个哨兵进程协同工作有两个优点,一是,当多个哨兵一致认为某个主机不再可用时,将执行故障检测。这降低了误报的概率;二是,即使不是所有的Sentinel进程都在工作,Sentinel也能工作,从而使系统能够抵御故障。毕竟,拥有一个本身就是单点故障的故障转移系统是没有意思的。
实验环境:
主机名 | IP | 职能 | 说明 |
---|---|---|---|
server1 | 192.168.42.127 | 主节点 | redis正常开启 |
serverb | 192.168.43.137 | 从节点 | redis正常开启 |
servera | 192.168.43.147 | 从节点 | redis正常开启 |
(1)在三台服务器均正常开启地条件下,在servera和serverb上配置主从复制:
[root@serverb ~]# vim /etc/redis/6379.conf //从节点的配置文件
slaveof 192.168.43.127 6379 //使用参数,设定主节点
[root@serverb ~]# /etc/init.d/redis_6379 restart
[root@servera ~]# vim /etc/redis/6379.conf //从节点的配置文件
slaveof 192.168.43.127 6379 //使用参数,设定主节点
[root@serverb ~]# /etc/init.d/redis_6379 restart
(2)在三台服务器中编辑sentinel配置文件开启哨兵:
Redis源代码分发包含一个自我记录的配置文件示例,名为sentinel.conf,可用于配置Sentinel。可以将这个配置文件示例,复制到安装路径中,进行修改配置
[root@server1 ~]# cp /soft/redis-5.0.3/sentinel.conf /etc/redis/
[root@server1 ~]# vim /etc/redis/sentinel.conf
protected-mode no #关闭保护模式
sentinel monitor mymaster 127.0.0.1 2 #用来告诉Redis监视一个名为mymaster,地址27.0.0.1和端口6379,法定人数为2的主机
#这个法定人数是需要同意主机不可访问这一事实的哨兵数量,以便真正将主机标记为失败,并在可能的情况下最终启动故障转移过程。
sentinel down-after-milliseconds mymaster 10000 #服务器挂点10000毫秒(10秒后自动切换master
[root@server1 ~]# redis-server /etc/redis/sentinel.conf --sentinel 启动一个运行在 Sentinel 模式下的 Redis 服务器
(3)完成以上步骤后,就可以查看哨兵状态
[root@server1 ~]# redis-cli
127.0.0.1:6379> info ##注意:默认连接6379
[root@server1 ~]# redis-cli -p 26379 #默认情况下,Sentinel使用TCP端口26379运行
127.0.0.1:26379> info