Linux 下 Redis 安装与运维
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、自动。
命令 | save | bgsave |
---|---|---|
IO 类型 | 同步 | 异步 |
是否阻塞 | 是 | 是(阻塞发生在 fork,但是 fork 是非常快的) |
复杂度 | O(n) | O(n) |
优点 | 不会消耗额外内存 | 不阻塞客户端命令 |
缺点 | 阻塞客户端命令 | 需要 fork,消耗内存 |
RDB 缺点:耗时、耗性能;不可控,丢失数据(宕机)。
2.AOF方式
AOF 的三种策略:
- always(每次策略,每条写命令都会 fsync 到硬盘),Redis 在执行写命令的时候,会将写命令先写到缓冲区,缓冲区再根据一些策略刷新到我们的硬盘中,这样做是为了提高写入效率,always 根据这样的特性把写命令的日志刷新到缓冲区中,再根据一些策略 fsync 到 AOF 文件中;
- everysec(每秒策略),默认值,缺点是出现了宕机,会丢失 1 秒的数据;
- no(根据操作系统决定的);
命令 | always | everysec | no |
---|---|---|---|
优点 | 不丢失数据 | 每秒一次 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的选择
命令 | RDB | AOF |
---|---|---|
启动优先级 | 低 | 高 |
体积 | 小 | 大 |
恢复速度 | 快 | 慢 |
数据安全性 | 丢数据 | 根据策略决定 |
轻重 | 重 | 轻 |
实际部署中需要根据自己的场景进行选择。
最佳策略:
- 小分片;
- 缓存或者存储;
- 监控(硬盘、内存、负载、网络)
- 足够的内存。
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;单机多实例持久化文件目录可以考虑分盘。
更多推荐
所有评论(0)