redis安装和高可用配置,持久化,主从模式,哨兵模式,集群模式

安装

官网下载最新版: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

切换主从的三种方法

  1. 修改配置文件,然后使用配置文件启动
    slaveof master-ip master-port
    #replicaof master-ip master-port 
  2. 不修改配置文件,直接在启动时加上参数也可以
    redis-server --port 6380 --slaveof master-ip master-port
    # redis-server --port 6380 --replicaof master-ip master-port
  3. 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

欢迎关注我的公众号

发表回复

您的电子邮箱地址不会被公开。

粤ICP备17041560号-2