最近在学习redis,基础命令已经学习完了;就找了一些服务器基础看了一下,整理了一下
一、 为什么用Redis
简单总结一下:
- 基于内存实现的key-value类型的存储,速度快,性能好
- 支持多种存储类型,有Strings,Hashes,Sets,Lists,Sorted Sets类型
- 支持数据持久化,有Snapshotting,Append-Only File模式的持久化
- 支持主从复制、哨兵和集群
- 支持消息的发布和订阅
- 安全性的支持
- 支持数据过期
二、Redis应用场景
redis应用场景太多了,这里简单说几种:
- 用于热数据的存储:比如商城top10
- 时间过期:短信验证码的时间
- 计数器:由于Redis是单线程且命令的原子性,可用来构建计数器
- 消息的发布和订阅:可用作简单的消息队列
- 缓存:减轻数据库访问压力
- 分布式session:spring 的session可以用redis做服务器
- 分布式锁(redis 官方推荐 Redlock 来实现分布式锁)
三、搭建redis主从复制模式
我们次用redis 5.x 版本;之前的版本略微有点差异。
1. redis的编译和安装
a. 去官网下载 Redis 5.0 版本的源码包;
b. 解压、编译并安装 Redis 5.0
tar -zxvf redis-5.0.0.tar.gz
cd redis-5.0.0
make && make install
这里我把 redis-5.0.0/src
添加到用户变量中,以便于使用,修改用户目录下的 .bashrc
,追加一行内容:
export PATH=$PATH:/usr/local/redis-5.0.0/src
保存文件以后,重新加载配置文件,变量就可以生效了
source .bashrc
2. 创建配置文件
这一步我们需要创建redis的配置文件,这里我们采用 1主2从
的配置方式,三份文件公共部分使用同一个文件,不同部分独立文件,然后复用公共部分的文件。
在 redis-5.0.0
目录下有一个默认的配置文件 redis.config
,这个是redis的默认配置文件
首先,我们在用户目录下创建一个文件夹 master-salver
,用来放配置文件,然后将 reids
的默认配置件赋值过去一份,进入文件作一下修改:
bind 127.0.0.1 # 注释掉此条配置(以便外网访问)
port 7000 # 注释掉此条配置(在单独的文件中配置)
daemonize yes # 原为no,修改为yes;修改为后台运行
pidfile /var/run/redis-6379.pid # 注释掉(在单独的文件中配置)
logfile "" # 注释掉(在单独的文件中配置)
dir ./ # 注释掉(在单独的文件中配置)
replicaof <masterip> <masterport> # 默认是注释,先不用管它
masterauth <master-password> # 默认是注释,先不用管它
requirepass foobared # 默认是注释,先不用管它
然后,创建 redis-6397.conf
,redis-6398.conf
,redis-6399.conf
配置文件,这里讲 6397
用作主服务器,其他两个用作从服务器,添加一下配置:
port 6397 # 配置服务端口号,三分配置文件根据实际情况修改
pidfile /opt/redis-cluster/redis-server-6397/6397.pid # 配置服务pID位置,三个配置文件不同
logfile "/opt/redis-cluster/redis-server-6397/6397.log" # 配置日志文件存储位置,三个配置文件不同
dir /opt/redis-cluster/redis-server-6397/data # 配置数据文件位置,三个配置文件不同
# replicaof <masterip> <masterport> # 主服务器不需要配置,从服务器需要配置主服务器的 ip 和 port
masterauth admin # 配置从服务器到主服务器的密码验证
requirepass admin # 配置登录密码
配置好三份文件后,使用 redis-server redis-6397.conf
,redis-server redis-6398.conf
,redis-server redis-6399.conf
启动服务
使用 ps -ef | grep redis
查看是否三个服务都正常启动,使用 redis-cli -h ip地址 -p 端口 -a 密码
,通过客户端登陆,执行 info replication
,可以查看到主从信息。
验证:
使用客户端分别连接三台服务器,在 6379
上 set
的信息,在其他两台服务器上是可以查看的,其他两台服务器做 set
操作时会报错;说明搭建成功。
三、启用哨兵对主节点监控
因为我们是学习的原因,所以就在同一台服务器上搭建吧。
这里我们启动三个哨兵,对主节点进行监控;同样在 redis-5.0.0
目录下有一个默认的哨兵配置文件 sentinel.config
配置文件,复制这个文件到 master-salver
下,并重命名三份 sentinel-26380.conf
,sentinel-26381.conf
,sentinel-26382.conf
,修改配置文件:
protected-mode no # 关闭保护模式,使外网能访问
port 26380 # 修改端口。三份文件分别不同
daemonize yes # 修改为后台运行。
pidfile /opt/redis-cluster/redis-sentinel-26380/26380.pid # 指定不同pid文件,注意文件夹不存在自己要新建。
logfile "/opt/redis-cluster/redis-sentinel-26380/26380.log" # 配置哨兵日志文件。
dir /opt/redis-cluster/redis-sentinel-26380/data # 配置哨兵工作路径。
sentinel monitor mymaster 192.167.3.145 7000 2 #配置哨兵需要监控的主节点ip和端口,最后的2代表,如果有2个哨兵主观认为主节点down了,那么就客观认为主节点down掉了,开始发起投票选举新主节点的操作。多个主节点配置多个。
sentinel auth-pass master7000 ibethfy # 配置哨兵连接主节点的认证密码。(主节点配置的requirepass)。
sentinel down-after-milliseconds master7000 5000 # 配置多少毫秒后没收到主节点的反馈,则主观认为主节点down了。
sentinel failover-timeout master7000 30000 #failover过期时间。当failover开始后,在此时间内仍然没有触发任何failover操作,当前sentinel将会认为此次failoer失败。
配置好三份文件后,执行 redis-sentinel sentinel-26380.conf
,redis-sentinel sentinel-26381.conf
,redis-sentinel sentinel-26382.conf
分别启动三个哨兵
验证:
kill掉 6397
端口的redis服务(我的主节点是 6397
),一段时间后,使用 info replication
,查看服务信息;此时主节点已经切换为另一个服务了,我们重启 6397
端口的redis服务,这个服务也只能作为从节点。
此时是否从节点的某一个已切换成主节点,另一个从节点属于新主节点的从节点。并测试主节点再次上线后,是否是新主节点的从节点。
哨兵的细节问题,可参考:http://www.redis.cn/topics/sentinel.html。