REDIS 安装配置
REDIS 安装配置
REDIS 介绍
Redis是一个开源,基于内存存储,支持多种数据结构存储的键值对 (key-value) 数据库。Redis可以将内存中的数据通过快照、日志方式保存到硬盘中,从而保证服务器故障,仍能够恢复内存中的数据。
Redis 特性
值支持多种数据结构
Redis虽然以键值对(key-value)的方式保存数据,但其值可以由以下多种数据结构组成- string #字符串
- hash #哈希,JESON格式
- list #列表,类似于数组
- set #无序集合
- zset(sorted_set) #有序集合
- Bitmaps #位图
- hyperloglog
- geo #地理信息定位
内存存储
Redis 执行命令的速度非常快,官方给出的数据是读写性能可以达到10万/秒,Redis执行速度如此快的原因主要是:- 所有的数据均存储于内存中
- Redis是用C语言实现的,C语言编写的程序更接近于操作系统和底层硬件,效率自然高效
- Redis 代码精简高效
数据持久化
通常将数据存储于内存中是不安全的,就像 memcached,一旦服务器故障,内存中的数据就可能丢失,Redis 提供了两种持久化的方式:RDB 和 AOF将内存中的数据保存到硬盘中。保证数据的可持久性。主从复制
Redis 可将主节点中的数据同步到一个或多个从节点中去,主从复制是实现高可用和分布式的基础高可用和分布式
Redis从2.8版本开始提供了高可用解决方案 Redis Sentinel,保证Redis节点故障发现,故障转移,从3.0版本开始提供分布式实现 Redis Cluster。Redis支持的客户端语言众多
Redis提供了简单的TCP通信协议,很多编程语言很方便的接入到Redis。比如:Java,PHP,Python,C,C++
redis 安装配置
redis 安装和启动
通过源码安装
- 源码官网下载地址
- 安装
# 1. 使用wget下载
wget http://download.redis.io/releases/redis-3.2.11.tar.gz
tar -xf redis-3.2.11.tar.gz
# 2. 解压
# 3. 建立一个 redis目录的软链接,便于系统版本的升级
ln -s redis-3.2.11 redis
# 4. 进入redis目录
cd redis
# 5. 编译安装
make && makeinstall
# 安装后的命令
[22@root local]# ls -1 /usr/local/bin/
redis-benchmark #Redis基准测试工具
redis-check-aof #REDIS AOF 持久化检测和修复工具
redis-check-rdb #Redis RDB 持久化检测和修复工具
redis-cli #redis客户端工具
redis-sentinel #启动redis sentinel
redis-server #启动redis
- 启动
[22@root local]# redis-server --help
Usage: ./redis-server [/path/to/redis.conf] [options]
./redis-server - (read config from stdin)
./redis-server -v or --version
./redis-server -h or --help
./redis-server --test-memory <megabytes>
Examples:
./redis-server (run the server with default conf)
./redis-server /etc/redis/6379.conf
./redis-server --port 7777
./redis-server --port 7777 --slaveof 127.0.0.1 8888
./redis-server /etc/myredis.conf --loglevel verbose
Sentinel mode:
./redis-server /etc/sentinel.conf --sentinel
通过yum安装
- Redis已被收录到epel源,所以只需要配置好epel源,即可通过yum方式安装redis
yum -y install redis
- 启动
systemctl start redis
redis 客户端工具 redis-cli
redis-cli
是 redis的客户端工具,可以远程或本地连接到Redis服务器,对Redis服务器进行配置,数据的读写操作等,redis-cli
可以使用两种连接方式
方式一:交互房式 (长连接)
# redis-cli [-h <host>] [-p <port>] [-a <address>]
[20@root ~]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> set name zhubiao
OK
127.0.0.1:6379> get name
"zhubiao"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> quit
方式二:命令行方式 (短连接)
# redis-cli [-h <host>] [-p <port>] [-a <address>] {command}
[20@root ~]# redis-cli -h 127.0.0.1 -p 6379 set name moretz
OK
[20@root ~]# redis-cli -h 127.0.0.1 -p 6379 get name
"moretz"
[20@root ~]# redis-cli -h 127.0.0.1 -p 6379 del name
redis 配置文件 redis.conf
- yum方式安装的配置文件路径
[20@root ~]# vim /etc/redis.conf
- 配置文件组成部分
[20@root ~]# cat /etc/redis.conf | egrep -o '###[^#]+###'
### INCLUDES ### 导入子配置文件段
### NETWORK ### 网络设置段
### GENERAL ###
### SNAPSHOTTING ### RDB持久化存储设置段
### REPLICATION ### 主从复制设置段
### SECURITY ### 安全相关设置段
### LIMITS ###
### APPEND ONLY MODE ### AOF持久化存储设置段
### LUA SCRIPTING ###
### REDIS CLUSTER ### REDIS集群设置段
### SLOW LOG ###
### LATENCY MONITOR ###
### EVENT NOTIFICATION ###
### ADVANCED CONFIG ### 高级配置段
- 配置文件解释
### INCLUDES ###
# 导入外部子配置文件
include /path/to/local.conf
### NETWORK ###
bind 192.168.1.100 10.0.0.1 #监听地址
port 6379 #监听地址
protected-mode yes #是否启用包含机制
tcp-backlog 511 #当服务器连接数到达最大时,后续队列的长度
timeout 0 #当客户端多长时间没有发送请求,则自动断开连接
tcp-keepalive 300 #保持长连接的时间
### GENERAL ###
daemonize no #是否以后台方式运行 redis 服务, 对于 systemd 系统由systemd管理并运行在前台,此项设置为 no
pidfile /var/run/redis/redis.pid #默认pid文件的存放路径和文件名
loglevel notice #日志记录级别
logfile /var/log/redis/redis.log #日志文件路径,为空则输出到屏幕
syslog-ident redis
syslog-facility local0
database 16 #设置数据库个数,默认16个,从0-15,可通过 select NUM 切换
### SNAPSHOTTING ###
# 设置Redis RDB持久化相关的参数
# 以下三个参数条件满足其中任意一个,都会触发Redis自动进行一次快照(snapshotting)操作,将内存中数据备份到磁盘中。60s内有10000个key/value变化,300s内有10个key/value变化,900s内有1个key/value变化
save 900 1
save 300 10
save 60 10000
save "" #禁用RDB持久化
stop-writes-on-bgsave-error yes #当启用RDB后,当同步到磁盘出错时,将停止客户端的请求服务
rdbcompression yes #是否启用压缩,对于存储于磁盘中的快照
rdbcheksum yes #是否启用快照压缩
dbfilename #RDB快照文件名
dir /var/lib/redis 快照文件路径
### REPLICATION ###
# redis提供主从同步复制功能
# 设置从节点
slaveof <masterip> <masterport> #主节点的地址和端口
masterauth <master-password> #若主服务器启用了认证功能,此处需设置主服务器的密码
slave-serve-stale-data yes #当从服务器失去月主服务器的连接时,或者主从同步正在进行,从服务器是否响应客户端的请求
slave-read-only yes #从服务器只读
repl-diskless-sync no|Disk-backed|Diskless
#Disk-backend 主服务器创建新进程,创建RDB快照写于磁盘中,然后同步到从服务器
#Diskless 主服务器创建新进程,直接将RDB快照发送给从服务器,不写入磁盘
repl-diskless-sync-delay 5 #使用无磁盘传输时,设置传输延迟时间
repl-ping-slave-period 10 #从服务器发送ping给主服务器的间隔时间
repl-timeout 60 #
repl-disable-tcp-nodelay no #主从同步是否实时进行
repl-backlog-size 1mb #主从同步缓存区大小
repl-backlog-ttl 3600 #主服务器连接从服务器同步数据多长时间仍无法同步,就情况缓存区中的数据
slave-priority 100 #从服务器优先级,数值越小优先级越高,当主服务器宕机后,从服务器优先级高的将优先被选举为主服务器
# 下面两项设置当3个从服务器连接延迟大于10s,主服务器将聚集客户端的请求
min-slaves-to-write 3
min-slaves-max-lag 10
### SECURITY ###
requirepass foobared #设置客户端连接用户验证所需输入的密码
rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 #重命名命令CONFIG名字
### LIMITS ###
maxclients 10000 #最大并发连接数
maxmemory <bytes> #设置可使用的最大内存数,超过此值将移除内存中的部分数据,移除规则由 maxmemory-policy 规则定义
maxmemory-policy
# volatile-lru -> remove the key with an expire set using an LRU algorithm
# allkeys-lru -> remove any key according to the LRU algorithm
# volatile-random -> remove a random key with an expire set
# allkeys-random -> remove a random key, any key
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)
# noeviction -> don't expire at all, just return an error on write operations
maxmemory-samples 5 #LRU 和 最小TTL算法并不是全部遍历内存中所有键值进行计算然后才移除,而是取样,这里设置样本的大小。
### APPEND ONLY MODE ###
# 设置AOF持久化存储方式的参数
appendonly no #是否启用AOF持久化存储
appendfilename "appendonly.aof" #AOF文件名
appendfsync everysec|aways|no
#everysec 每秒一次将数据写入AOF文件
#aways 当有写操作时就立即将内存中命令写入AOF文件
#no 由操作系统决定
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100 #大于AOF基础大小100%进行AOF重写
auto-aof-rewrite-min-size 64mb #大于64mb进行AOF重写
aof-load-truncated yes
### REDIS CLUSTER ###
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
cluster-slave-validity-factor 10
cluster-migration-barrier 1
cluster-require-full-coverage yes
redis 持久化
Redis 支持 RDB和 AOF (Append Only File) 两种持久化存储机制,持久化功能实现了将内存中的数据保存到磁盘中,避免因 Redis 进程退出而导致的内存数据丢失。当Redis服务重启时可以利用存储于磁盘中的RDB或AOF文件加载数据,默认配置文件中开启了RDB,我们可以配置同时开启RDB和AOF,服务重启时优先读取AOF进行数据的加载,若未开启AOF功能,则加载RDB快照文件。
一、RDB
RDB 持久化是将当前进程中的数据生成快照,然后保存到磁盘中的过程。
触发RDB有两种方式:
- 手动触发
- 执行命令
save
:阻塞当前Reidis进程,执行RDB持久化存储,对于内存中数据量大时,会长时间阻塞Redis主进程,影响对外提供服务,建议线上不要使用此命令。 - 执行命令
bgsave
: Redis主进程 fork 一个子进程执行RDB,阻塞仅发生在fork子进程阶段,而fork子进程速度很快,不影响线上业务。
- 执行命令
> save
cat /var/log/redis/redis.log
3560:M 16 Nov 16:09:19.502 * DB saved on disk
> bgsave
cat /var/log/redis/redis.log
3560:M 16 Nov 16:10:10.272 * Background saving started by pid 3643
3643:C 16 Nov 16:10:10.277 * DB saved on disk
3643:C 16 Nov 16:10:10.279 * RDB: 0 MB of memory used by copy-on-write
3560:M 16 Nov 16:10:10.309 * Background saving terminated with success
- 自动触发
有以下几种情形时Redis内部自动触发RDB持久化存储机制,Redis 自动触发使用的是bgsave命令
- 根据配置文件中定义的触发条件,当条件满足时,自动触发RDB持久化机制
# 当指定时间内,超出指定数量的键值对发生改变,则执行bgsave命令。
/etc/redis.conf
save 900 1
save 300 10
save 60 10000
- 当主节点执行全量备份时,主节点执行
bgsave
生成RGB文件发送给从服务器 - 默认情况下执行 shutdown 命令时,如果没有开启AOF功能,则自动执行
bgsave
命令
设定RDB的存储路径及文件名
- 通过配置文件
dbfilename "dump.rdb"
dir "/var/lib/redis"
- 通过
redis-cli
交互式
# 创建新目录,存储RDB文件
[20@root ~]# mkdir /app/rdb
# 修改属主属组
[20@root ~]# chown redis:redis /app/rdb
# 启动redis-cli交互式
[20@root ~]# redis-cli
# 创建RDB文件路径,此路径也是AOF文件的存储路径
127.0.0.1:6379> config set dir /app/rdb
# 设置RDB文件名
127.0.0.1:6379> config set dbfilename "snapshotting.rdb"
执行bgsave命令,触发RDB持久化机制,将RDB保存于新指定的路径中,否则可能需要重启服务才会生效
127.0.0.1:6379> bgsave
# 将内存中的配置保存于配置文件中
127.0.0.1:6379> config rewrite
RDB持久化的优缺点
- 优点: RDB是 Redis 线程某个时间点上的数据快照,并且支持压缩存储,适合备份和全量复制,此外加载RDB文件恢复数据比AOF快得多
- 缺点: RDB不能做到实时将缓冲区中的数据同步到磁盘上
二、AOF
为了解决 RDB 不能实时持久化的功能,我们需要开启AOF,AOF是将Redis的写操作以命令的方式保存于AOF日志文件中,当下次启动服务时(也可以收到加载)自动加载AOF文件,重新执行文件内的命令达到数据恢复的功能。
- AOF持久化配置
# 开启AOF持久化功能
appendonly yes
# 设置AOF文件名
appendfilename "appendonly.aof"
# 控制AOF缓冲区中的数据同步到磁盘中的方式,always频率太高,对Redis响应影响较大,默认为everysec,比较合理。
appendfsync always|everysec|no
always #执行写入命令时立即同步
everysec #每秒同步一次
no #由操作系统决定
- AOF重写机制配置
随着命令不断写入AOF文件中,AOF文件会越来越大,为了解决这个问题,需要重新将内存中的数据以写命令的方式重新保存于AOF文件中,覆盖原来的内容。AOF重写将原来多条重复的命令合并为一条,将已过期的写数据命令删除,AOF重写触发的条件如下:
手动触发
# 执行 bgrewriteaof 命令
127.0.0.1:6379> bgrewriteaof
自动触发
# 当前文件大小与前次重写时文件大小的比值,超过此比值后触发重写
auto-aof-rewrite-percentage 100
# AOF重写触发的最小文件大小
auto-aof-rewrite-min-size 64mb
redis 复制
复制是将主节点上的数据同步到一个或多个从节点上的过程,复制是解决故障转移和负载均衡的基础。复制是单向的,只能主节点到从节点,默认情况下Redis服务器都为主节点,只需配置从节点的IP和端口指向主节点即可,下面通过一个实验演示主从复制的配置
- 节点地址
主节点:172.18.17.20
从节点:172.18.17.21
- 配置主节点
vim /etc/redis.conf
bind 172.18.17.20
requirepass 123
- 配置从节点
# 通过配置文件
vim /etc/redis.con
bind 172.18.17.23
slaveof 172.18.17.20 6379
masterauth 123
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority 100
# 通过命令
172.18.17.21:6379> slaveof 172.18.17.21 6379
172.18.17.21:6379> config set masterauth 123
# 断开与主节点的连接
172.18.17.21:6379> slaveof no one
# 从节点连接移动到另外一个新的主节点
172.18.17.23:6379> slaveof 172.18.17.21 6379
172.18.17.23:6379> config set masterauth 456
- 查看主从节点状态信息
# 主节点客户端连接
172.18.17.20:6379> client list
id=3 addr=172.18.17.20:40016 fd=6 name= age=279 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
id=5 addr=172.18.17.23:40557 fd=5 name= age=193 idle=1 flags=S db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=replconf
# 主节点 replication 信息
172.18.17.20:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.18.17.23,port=6379,state=online,offset=477,lag=0
master_repl_offset:477
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:476
# 从节点 replication 信息
172.18.17.23:6379> info replication
# Replication
role:slave
master_host:172.18.17.20
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:561
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0