Redis 是一个使用 C 语言开发的开源的高性能的 Key-Value 数据库。常用于数据缓存和高访问负载,Redis 通过提供多种 Value 数据类型来适应不同场景下的存储需求,目前 Redis 支持的 Value 数据类型有 string、hash、list、set、zset 类型。据 Redis 官方测试,有 50 个并发程序来执行 10 万次请求,Redis 读的速度达到了 11 万次/秒,写的速度达到了 8.1 万次/秒。

这里 Linux 选择 CentOS 7.2。

1.Redis安装

# yum -y install gcc gcc-c++ autoconf automake   //gcc、gcc-c++的库文件
# wget -P /usr/local http://download.redis.io/releases/redis-5.0.4.tar.gz
# cd /usr/local
# tar -zxvf redis-5.0.4.tar.gz
# In -s redis-5.0.4 redis                 //软链接
# cd redis
# make                                      //编译,将.c文件编译为.o文件
# make PREFIX=/usr/local/redis install     //指定路径安装
# ls                                        //如果存在redis文件夹,则安装成功

其中 /usr/local/redis/bin/ 下包含:

redis-benchmark:性能测试工具
redis-check-aof:aof文件修复工具,redis-check-aof --fix appendonlly.aof
redis-check-dump:rdb文件检查工具,rdb文件为Redis默认数据库文件
redis-check-rdb:rdb文件修复工具 redis-check-rdb --fix dump.rdb
redis-cli:Redis命令行客户端,redis-cli -h 127.0.0.1 -p 6379
redis-sentinel
redis-server:redis服务器启动的命令

Redis 配置启动分为单机配置、主从结构配置和集群配置。一般主从结构就够用了。

1.Redis单机配置

配置启动 Redis:

# cd /usr/local/redis
# mkdir config
# cp redis.conf config
# cd config
// Redis是单线程的,而大多服务器是多核的CPU,所以通常在一台机器上部署很多Redis,单机多实例配置文件可以用端口区分开
# cat redis.conf | grep -v "#" | grep -v "^$" > redis-6381.conf   //去掉注释、去掉空格并重定向到redis-6381.conf
# vim redis-6381.conf

Redis 对外默认端口号是 6379,但是为了安全考虑,一般不使用默认端口。

编辑 Redis 配置文件 redis-6381.conf:

# 绑定你的授权ip地址 (注释表示绑定到所有网络, 生产环境需要绑定授权ip地址, 建议全部走内网)
#bind 127.0.0.1
# 关闭保护模式
protected-mode no
# redis对外端口号
port 6381
# 配置后台启动
daemonize yes
# pidfile路径
pidfile /var/run/redis-6381.pid
# redis系统日志
logfile "redis-6381.log"
# redis工作目录
dir "/opt/soft/redis-6381/data"

## 安全设置
# 设置认证密码 (生产环境密码建议足够复杂, 防止暴力破解)
requirepass 123456
# slave客户端在连接master时需要通过auth, 为防止主从切换, 主从都需要配置
masterauth 123456
# redis的危险命令禁用 (设置为 "")、重命名 (设置为随机字符串)
rename-command FLUSHALL "3206cf8503e840a4a0d913c44e0be80a" # 清空数据库
rename-command FLUSHDB "96459963e8104291a5192b99de007941" # 清空所有记录, 数据库
rename-command CONFIG "" # 客户端连接后可配置服务器
rename-command KEYS "1c1c742a615a402a980be8028dc24016" # 客户端连接后可查看所有存在的键

使用非 root 用户(安全考虑)启动 Redis:

# cd /usr/local/redis/bin/
# redis-server ./redis-6381.conf   //后台启动redis服务器
# ps -ef | grep redis-server | grep 6381      //查看启动是否成功

Redis 其他命令:

# redis-cli shutdown        //停止redis服务器

注意:如果开启的防火墙,还需要开放 Redis 的 6381 端口。

2.Redis主从结构配置

Redis 主从复制的功能非常强大,它可以避免 Redis 单点故障;构建读写分离架构,满足读多写少的应用场景。Redis 主从结构搭建不用安装多个Redis,只需复制多个配置文件,修改即可。在安装好单机版的前提下,复制三份配置文件:

# cd /usr/local/redis-5.0.4

# //安装Redis单机版已经完成master节点了,这里只需要配置salve1与salve2即可。
# // mkdir -p /usr/local/redis/master && cp redis.conf /usr/local/redis/master

# mkdir -p /usr/local/redis/salve1 && cp redis.conf /usr/local/redis/salve1
# mkdir -p /usr/local/redis/salve2 && cp redis.conf /usr/local/redis/salve2

# cd /usr/local/redis/salve1
# vim redis.conf

编辑 redis.conf:

1)绑定你的授权ip地址(69行,注释表示绑定到所有网络):#bind 127.0.0.1
2)关闭保护模式(88行):protected-mode no
3)配置启动端口(92行):port 6380
4)配置后台启动(136行):daemonize yes
5)修改pidfile指向路径(158行):pidfile /usr/local/redis/salve1/redis_salve1.pid
6)设置认证密码(500行):requirepass 123456
7)设置主从(281行,slaveof <masterip> <masterport>):slaveof localhost 6379
8)设置master认证密码(288行):masterauth 123456

然后继续命令:

# ../bin/redis-server ./redis.conf //后台启动redis服务器

以此类推,修改端口 6381 配置并启动 Redis 实例。

# /usr/local/redis/bin/redis-cli -h localhost -p 6379 -a 123456
> info replication                //查看Redis主从关系

3.Redis集群配置

所有 Redis 节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。节点的 fail 是通过集群中超过半数的节点检测生效时才生效。客户端与节点直连,不需要中间 proxy 层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。

redis-cluster(Redis 集群)把所有的物理节点映射到 [0-16383] slot 上,cluster 负责维护 node <-> slot <-> value。

Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,Redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,Redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。

配置 Redis 集群版至少需要有 3 个节点,每个节点有一个备用节点,需要 6 台服务器,如下:

主节点(master):192.168.2.10:6379、192.168.2.11:6379、192.168.2.12:6379
从节点(salve):192.168.2.15:6379、192.168.2.16:6379、192.168.2.17:6379

首先每台服务器安装 Redis 单机版数据库,然后修改每台的 /usr/local/redis/redis.conf 文件:

port 6379
bind 服务器ip           #93行
cluster-enabled yes    #814行

创建集群,Redis 官方提供了 redis-trib.rb 这个 Ruby 脚本。在 Redis 源码文件夹下的 src 目录下。

# cd /usr/local/redis-5.0.4/src
# cp redis-trib.rb /usr/local/redis/
# yum -y install ruby
# yum -y install rubygems              //安装ruby和ruby的包管理器
# yum -y install ruby-devel
# yum -y install rpm-build
# gem install redis                    //安装ruby和redis的接口程序

启动所有的 Redis 实例,然后执行创建集群命令(该命令只需要在一台服务器上运行一次即可):

# redis-trib.rb create --replicas 1 192.168.2.10:6379 192.168.2.11:6379 192.168.2.12:6379 192.168.2.15:6379 192.168.2.16:6379 192.168.2.17:6379

replicas 指定为 1 表示每个主节点有一个从节点。到此集群配置完毕。

# ./bin/redis-cli -p 6379 -c          //使用客户端连接集群

2.Redis运维

1.配置Redis持久化

配置 Redis 持久化有 RDB 方式和 AOF 方式两种。

-说明配置方式注意点
RDB通过快照完成的,当符合一定条件时redis会自动将内存中的所有数据执行快照操作并存储到硬盘上。默认存储在redis根目录的dump.rdb文件(二进制)中。优点:由于存储的有数据快照文件,恢复数据很方便。缺点:会丢失最后一次快照以后更改的所有数据。默认支持,不需要配置。当 Redis 启动时,如果 RDB 持久化和 AOF 持久化都打开了,那么程序会优先使用 AOF 方式来恢复数据集,因为 AOF 方式所保存的数据通常是最完整的。如果 AOF 文件丢失了,则启动之后数据库内容为空。
AOF通过日志文件的方式。编辑 /usr/local/redis/redis.conf ,将509行的appendonly no 修改为 appendonly yes,538-540为同步策略的设置,开启 appendfsync always,注释 appendfsync everysec,always为没修改一次就同步,everysec为每一秒同步,no为不同步,为了安全此处选择 always。如果想把正在运行的 Redis 数据库,从 RDB 切换到 AOF,建议先使用动态切换方式,再修改配置文件,重启数据库(不能直接修改配置文件,重启数据库,否则数据库中数据就为空了)。

1.RDB方式

RDB 的三种触发机制:

  • save 命令(同步),如果存在老的 RDB 文件,文件策略:新替换老(会生成一个临时文件,当 save 执行完毕后会将老的进行替换),时间复杂度:O(n);
  • bgsave 命令(异步),利用 Linux 的 fork 函数生成了子进程,子进程完成 RDB 文件的生成,文件策略和时间复杂度跟 save 命令一致;
  • 3、自动。
命令savebgsave
IO 类型同步异步
是否阻塞是(阻塞发生在 fork,但是 fork 是非常快的)
复杂度O(n)O(n)
优点不会消耗额外内存不阻塞客户端命令
缺点阻塞客户端命令需要 fork,消耗内存

RDB 缺点:耗时、耗性能;不可控,丢失数据(宕机)。

2.AOF方式

AOF 的三种策略:

  • always(每次策略,每条写命令都会 fsync 到硬盘),Redis 在执行写命令的时候,会将写命令先写到缓冲区,缓冲区再根据一些策略刷新到我们的硬盘中,这样做是为了提高写入效率,always 根据这样的特性把写命令的日志刷新到缓冲区中,再根据一些策略 fsync 到 AOF 文件中;
  • everysec(每秒策略),默认值,缺点是出现了宕机,会丢失 1 秒的数据;
  • no(根据操作系统决定的);
命令alwayseverysecno
优点不丢失数据每秒一次 fsync,丢 1 秒数据不用管
缺点IO 开销较大,一般的 sata 盘只有几百TPS丢 1 秒数据不可控

随着时间的推移,AOF 文件会逐渐变大,就会出现很多问题,比如使用 AOF 进行恢复的话,它会非常的慢,针对这种问题,Redis 提供了 AOF 重写的策略:

例如将 set hello 1、set hello 2、set hello 3 合并为 set hello 3;将 rpush mylist a、rpush mylist b、rpush mylist c 合并为 rpush mylist a b c;将过期数据删除。

AOF 重写其实就是将过期的、没有用的、重复的以及可以优化的命令进行化简,达到减少磁盘占用量和加快恢复速度的目的。

AOF 重写的两种实现方式:

  • bgrewriteaof 命令;
  • AOP 重写配置;

3.RDB和AOF的选择

命令RDBAOF
启动优先级
体积
恢复速度
数据安全性丢数据根据策略决定
轻重

实际部署中需要根据自己的场景进行选择。

最佳策略:

  • 小分片;
  • 缓存或者存储;
  • 监控(硬盘、内存、负载、网络)
  • 足够的内存。

2.多数据库和事务

Redis 的命令参考 http://www.redis.cn/commands.html

一个 Redis 实例最多可以提供16个数据库(0-15),默认连接第 0 号数据库,也可以通过select 选择数据库:

> select 1                      //选择1号数据库
> move myset 2                  //移动myset到2号数据库

支持事务(所有命令都将串行化执行)的操作:

> multi         //开启事务
> exec          //提交事务
> discard       //回滚事务

3.fork操作

fork 操作是一个同步操作。与 Redis 内存量息息相关,Redis 内存越大,耗时越长(与机器类型有关)。

改善 fork:

  • 优先使用物理机或者高效支持 fork 操作的虚拟化技术;
  • 控制 Redis 实例最大可用内存:maxmemory;
  • 合理配置 Linux 内存分配策略:vm.overcommit_memory=1;
  • 降低 fork 频率,例如放宽 AOF 重写自动触发时机,不必要的全量复制等。

4.子进程开销和优化

CPU 的开销:RDB 和 AOF 文件生成,属于 CPU 密集型。优化:不做 CPU 绑定,不和 CPU 密集型应用部署在一起。

内存的开销:fork 内存开销,copy-on-write。优化:echo never > /sys/kernel/mm/transparent_hugepage/enabled

硬盘的开销:AOF 和 RDB 文件写入,可以结合 iostat,iotop 分析。优化:不要和高硬盘负载服务(存储服务、消息队列等)部署在一起;设置 no-appendfsync-on-rewrite=yes;根据写入量决定磁盘类型,例如SSD;单机多实例持久化文件目录可以考虑分盘。

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐