安装
官网下载最新版:https://redis.io/download
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
tar xzf redis-5.0.5.tar.gz
cd redis-5.0.5
安装编译依赖并make,这里以centos为例,Debian系也差不多:
yum install -y gcc
make MALLOC=libc
【问题】
如果出现 cc: error: ../deps/hiredis/libhiredis.a: No such file or directory 类似这样的错误
则进入redis下的deps下的运行如下命令,就OK了。
make lua hiredis linenoise
如果是Debian或者ubuntu系统,可以使用软件仓库安装
sudo apt-get update
sudo apt-get install redis-server
测试安装成功
启动服务
redis-server #启动redis(默认端口6379,无密码)
客户端连接
redis-cli #连接本机redis
连接成功后输入 ping, 如果返回pong那就是ok了
Redis高可用配置
Redis高可用的方案包括持久化、主从复制(及读写分离)、哨兵和集群。
- 持久化:持久化是 最简单的 高可用方法。它的主要作用是 数据备份,即将数据存储在 硬盘,保证数据不会因进程退出而丢失。
- 复制:复制是高可用 Redis 的基础,哨兵 和 集群 都是在 复制基础 上实现高可用的。复制主要实现了数据的多机备份以及对于读操作的负载均衡和简单的故障恢复。缺陷是故障恢复无法自动化、写操作无法负载均衡、存储能力受到单机的限制。
- 哨兵:在复制的基础上,哨兵实现了 自动化 的 故障恢复。缺陷是 写操作 无法 负载均衡,存储能力 受到 单机 的限制。
- 集群:通过集群,Redis 解决了 写操作 无法 负载均衡 以及 存储能力 受到 单机限制 的问题,实现了较为 完善 的 高可用方案。
持久化
持久化的功能:Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘;当下次Redis重启时,利用持久化文件实现数据恢复。除此之外,为了进行灾难备份,可以将持久化文件拷贝到一个远程位置。
Redis持久化分为RDB持久化和AOF持久化
- RDF:RDB持久化是将当前进程中的数据生成快照保存到硬盘(因此也称作快照持久化),保存的文件后缀是rdb;当Redis重新启动时,可以读取快照文件恢复数据。
- AOF:AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中(有点像MySQL的binlog);当Redis重启时再次执行AOF文件中的命令来恢复数据。
由于AOF持久化的实时性更好,即当进程意外退出时丢失的数据更少,因此AOF是目前主流的持久化方式,不过RDB持久化仍然有其用武之地。
RDF持久化
RDB文件可以通过两个命令来生成:
- SAVE:阻塞redis的服务器进程,直到RDB文件被创建完毕。
- BGSAVE:派生(fork)一个子进程来创建新的RDB文件,记录接收到BGSAVE当时的数据库状态,父进程继续处理接收到的命令,子进程完成文件的创建之后,会发送信号给父进程,而与此同时,父进程处理命令的同时,通过轮询来接收子进程的信号。
RDF持久化的redis.conf配置,自动保存的策略
# 以下配置表示的条件:
# 服务器在900秒之内被修改了1次
save 900 1
# 服务器在300秒之内被修改了10次
save 300 10
# 服务器在60秒之内被修改了10000次
save 60 10000
如果要关闭rdf,注释上面的save配置,也可以用命令 config set save ""
配置关闭。
AOF相关配置
#AOF 和 RDB 持久化方式可以同时启动并且无冲突。
#如果AOF开启,启动redis时会加载aof文件,这些文件能够提供更好的保证。
#开启AOF
appendonly yes
# 只增文件的文件名称。(默认是appendonly.aof)
# appendfilename appendonly.aof
#redis支持三种不同的写入方式:
# no:不调用,之等待操作系统来清空缓冲区当操作系统要输出数据时。很快。
# always: 每次更新数据都写入仅增日志文件。慢,但是最安全。
# everysec: 每秒调用一次。折中。
appendfsync everysec
# 设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入.官方文档建议如果你有特殊的情况可以配置为'yes'。但是配置为'no'是最为安全的选择。
no-appendfsync-on-rewrite no
# 自动重写只增文件。
# redis可以自动的调用‘BGREWRITEAOF’来重写日志文件,如果日志文件增长了指定的百分比。
# 当前AOF文件大小是上次日志重写得到AOF文件大小的二倍时,自动启动新的日志重写过程。
auto-aof-rewrite-percentage 100
# 当前AOF文件启动新的日志重写过程的最小值,避免刚刚启动Reids时由于文件尺寸较小导致频繁的重写。
auto-aof-rewrite-min-size 64mb
关闭aof的命令:config set appendfsync no
主从复制
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
这里为了方便,直接用一台机器模拟不同端口,实现多redis。
首先进入redis目录,新建配置文件存放的目录
mkdir 802{1,2}
cp redis.conf 8021
cp redis.conf 8022
分别进入8021和8022 的目录,修改 redis.conf,以下是主机和从机都需配置的
例如主机master的redis.conf修改下面的信息
bind 127.0.0.1 # 修改为对应的IP地址,按服务器情况修改
dir /home/jam/work/redis/ms/redis/8021 # 设置文件目录,会生成aof文件,需要修改
pidfile /home/jam/work/redis/ms/redis/8021/redis-server.pid # pid 文件,需要修改
port 8201 #端口,需要修改
从机配置
bind 127.0.0.1 # 修改为对应的IP地址,按服务器情况修改
dir /home/jam/work/redis/ms/redis/8022 # 设置文件目录,会生成aof文件,需要修改
pidfile /home/jam/work/redis/ms/redis/8022/redis-server.pid # pid 文件,需要修改
port 8202 #端口,需要修改
从机模式还需要配置,例如在8022的redis.conf添加下面一行
slaveof 127.0.01 8021
先运行主机
src/redis-server 8021/redis.conf
再运行从机
src/redis-server 8022/redis.conf
登录主机查看信息
src/redis-cli -h127.0.0.1 -p 8021
输入info
,可以看到
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=8022,state=online,offset=294,lag=1
master_replid:af2e954359a7a0b6ce3d2497c7619f03944a7dd9
master_replid2:0000000000000000000000000000000000000000
登录从机机查看信息
src/redis-cli -h127.0.0.1 -p 8021
输入info
,可以看到
# Replication
role:slave
master_host:127.0.01
master_port:8021
master_link_status
数据测试
主机插入数据
127.0.0.1:8021> set name jam
OK
从机获取数据
127.0.0.1:8022> get name
"jam"
主从切换
关闭主机
127.0.0.1:8021> shutdown
从机会发现主机下线
55097:S 30 Jul 2019 11:16:27.787 * MASTER <-> REPLICA sync started
55097:S 30 Jul 2019 11:16:27.787 # Error condition on socket for SYNC: Connection refused
从机切换成主机
127.0.0.1:8022> slaveof no one
OK
输入 info
获取信息,发现已经切换成master了
# Replication
role:master
connected_slaves:0
master_replid:00b0ab68b26e95c1926204bcb2a3bb2cd7f541bc
切换主从的三种方法
- 修改配置文件,然后使用配置文件启动
slaveof master-ip master-port #replicaof master-ip master-port
- 不修改配置文件,直接在启动时加上参数也可以
redis-server --port 6380 --slaveof master-ip master-port # redis-server --port 6380 --replicaof master-ip master-port
- redis-cli 连接后直接命令修改
设置为从机redis> SLAVEOF master-ip master-port
设置为主机
redis> SLAVEOF no noe
备注:
slaveof
可以使用replicaof
替换
哨兵模式
Redis 的 主从复制 模式下,一旦 主节点 由于故障不能提供服务,需要手动将 从节点 晋升为 主节点,同时还要通知 客户端 更新 主节点地址,这种故障处理方式从一定程度上是无法接受的。Redis 2.8 以后提供了 Redis Sentinel 哨兵机制 来解决这个问题。
配置
一个稳健的 Redis Sentinel 集群,应该使用至少 三个 Sentinel 实例,并且保证讲这些实例放到 不同的机器 上,甚至不同的 物理区域。使用本机三个不同端口的实例进行测试。
首先在redis目录下,新建三个目录存放配置文件,以端口命名
mkdir 802{1,2,3}
cp redis.conf sentinel.conf 8021
cp redis.conf sentinel.conf 8022
cp redis.conf sentinel.conf 8023
分别进入三个目录修改redis.conf文件
主节点
daemonize yes #后台运行
pidfile /home/jam/work/redis/ms/redis-sentinel/8021/redis-8021.pid #同一台机器需要修改
logfile /home/jam/work/redis/ms/redis-sentinel/8021/redis-8021.log
port 8021 #端口,同一台机器需要修改
bind 0.0.0.0 #绑定的ip,多机器需要修改
dir /home/jam/work/redis/ms/redis-sentinel/8021
从节点(分别配置8022和8023,配置8023的时候替换8022就行)
daemonize yes
pidfile /home/jam/work/redis/ms/redis-sentinel/8022/redis-8022.pid #需要修改
logfile /home/jam/work/redis/ms/redis-sentinel/8022/redis-8022.log
port 8022 #需要修改
bind 0.0.0.0 #多机器需要修改
dir /home/jam/work/redis/ms/redis-sentinel/8022
slaveof 127.0.0.1 8021
修改哨兵配置文件 sentinel.conf
# 哨兵sentinel实例运行的端口,默认26379
port 28021
# 禁止保护模式
protected-mode no
# 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,127.0.0.1代表监控的主服务器,
# 8021代表端口,2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
sentinel monitor mymaster 127.0.0.1 8021 2
# sentinel author-pass定义服务的密码,mymaster是服务名称,123456是Redis服务器密码
# sentinel auth-pass <master-name> <password>
# sentinel auth-pass mymaster 123456
pidfile /var/run/redis-sentinel-8021.pid
启动redis和哨兵
# 启动Redis服务器进程
src/redis-server 8021/redis.conf
src/redis-server 8022/redis.conf
src/redis-server 8023/redis.conf
# 启动哨兵进程
src/redis-sentinel 8021/sentinel.conf
src/redis-sentinel 8022/sentinel.conf
src/redis-sentinel 8023/sentinel.conf
先查看主从模式是否成功
127.0.0.1:8021> ping
PONG
查看info
信息,如果是两从一主就是启动完成了
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=8022,state=online,offset=140,lag=0
slave1:ip=127.0.0.1,port=8023,state=online,offset=140,lag=0
使用 ps -ef | grep redis
查看进程
$ ps -ef | grep redis
jam 3509 1 0 14:23 ? 00:00:00 src/redis-server *:8021
jam 3812 1 0 14:23 ? 00:00:00 src/redis-server *:8022
jam 4020 1 0 14:23 ? 00:00:00 src/redis-server *:8023
jam 11980 1 0 14:25 ? 00:00:00 src/redis-sentinel *:28021 [sentinel]
jam 12179 1 0 14:25 ? 00:00:00 src/redis-sentinel *:28022 [sentinel]
jam 12332 1 0 14:26 ? 00:00:00 src/redis-sentinel *:28023 [sentinel]
可以看到3个redis服务和3个哨兵模式已经启动了。
查看8021/sentinel.conf文件,在文件结尾,可以看到配置文件已经修改了
# Generated by CONFIG REWRITE
protected-mode no
sentinel known-replica mymaster 127.0.0.1 8023
sentinel known-replica mymaster 127.0.0.1 8022
sentinel known-sentinel mymaster 127.0.0.1 28023 c8c0fb1f247e01f0b7703b7a22c2fadbcf07a059
sentinel known-sentinel mymaster 127.0.0.1 28022 7441418203cdb8ca469fc4e7581085542eea9385
sentinel current-epoch 0
故障切换
使用ps -ef | grep redis
查看主结点pid,然后使用kill -9 pid
结束进程。
连接从机8023
src/redis-cli -p 8023
然后使用info
命令查看信息
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=8022,state=online,offset=117751,lag=1
可以看到8021下线,8023成为了新的master。
重新启动8021
src/redis-server 8021/redis.conf
查看info
信息,会发现8021已经变成了从机了
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=8022,state=online,offset=147487,lag=1
slave1:ip=127.0.0.1,port=8021,state=online,offset=0,lag=1
如果打开8021的redis.conf,会发现配置文件已经被修改了
# Generated by CONFIG REWRITE
replicaof 127.0.0.1 8023
REPLICAOF hostname port
这个是SLAVEOF的别名,将使当前服务器停止对原主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步。
集群模式
集群模式将由下篇文章写。
ref.
https://www.cnblogs.com/kismetv/p/9236731.html
https://juejin.im/post/5b7d226a6fb9a01a1e01ff64
欢迎关注我的公众号