1. Redis功能介绍
1.1 数据类型丰富
1.2 支持持久化
1.3 多种内存分配及回收策略
1.4 支持弱事务
1.5 消息队列、消息订阅
1.6 支持高可用
1.7 支持分布式分片集群
1.8 缓存穿透\雪崩
1.9 Redis API
Redis: 优点:高性能读写、多数据类型支持、数据持久化、高可用架构、支持自定义虚拟内存、支持分布式分片集群、单线程读写性能极高 ;
缺点:单机情况下,读写性能较慢。
2.Redis安装部署:
(1)下载:
[root@db01 /data]# wget http://download.redis.io/releases/redis-3.2.12.tar.gz
(2)解压:
[root@db01 /data]# tar xzf redis-3.2.12.tar.gz
[root@db01 /data]# mv redis-3.2.12 redis
(3)安装:
[root@db01 /data]# yum -y install gcc automake autoconf libtool make
[root@db01 /data]# cd redis
[root@db01 /data]# make
(4)修改环境变量:
[root@db01 /data]#vim /etc/profile
export PATH=/data/redis/src:$PATH
source /etc/profile
(5)启动:
[root@db01 /data]# redis-server &
(6)连接测试:
[root@db01 /data]# redis-cli
127.0.0.1:6379> set num 10 ##设置num是10
OK
127.0.0.1:6379> get num ##查看num
10
3. Redis基本管理操作
3.1基础配置文件介绍
[root@db01 ~]#mkdir /data/6379
[root@db01 ~]#cat > /data/6379/redis.conf<<EOF
daemonize yes ##是否后台运行
port 6379 ##默认端口
logfile /data/6379/redis.log ##日志文件位置
dir /data/6379 ##持久化文件存储位置
dbfilename dump.rdb ##RDB持久化数据文件
EOF
3.2 redis安全配置
[root@db01 ~]#vim /data/6379/redis.conf ##在最初配置下,再加入2行
bind 10.0.0.51 127.0.0.1 ##允许远程和本地登录
requirepass 123456 ##密码
验证:
[root@db01 src]# redis-cli -a 123 -h 10.0.0.51 -p 6379
10.0.0.51:6379> set b 2
2
OK
10.0.0.51:6379> get b
2
3.4 redis持久化(内存数据保存到磁盘)
3.4.1 RDB 持久化
(1)介绍
可以在指定的时间间隔内生成数据集的 时间点快照(point-in-time snapshot)。
优点:速度快,适合于用做备份,主从复制也是基于RDB持久化功能实现的。
缺点:会有数据丢失
(2) rdb持久化核心配置参数:
[root@db01 ~]#vim /data/6379/redis.conf
dir /data/6379 ##持久化存储目录
dbfilename dump.rdb ##以及持久化未来的文件名
save 900 1 ##900秒内累计有1个更改,就持久化一次
save 300 10
save 60 10000
3.4.2 AOF 持久化(append-only log file)
(1)介绍
记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集,相当于mysql里面的binlog功能。
AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。
优点:可以最大程度保证数据不丢
缺点:日志记录量级比较大
(2) AOF持久化配置
[root@db01 ~]#vim /data/6379/redis.conf
appendonly yes ##开启
appendfsync everysec ##刷写策略设置每秒刷写
4、Redis数据类型:
4.1 类型分类:
String : 字符类型
Hash: 字典类型
List: 列表
Set: 集合
Sorted set: 有序集合
4.2 数据类型应用场景:
string : 计数器应用 ,session 共享
hash : MySQL数据库缓存,canal mysql 自动 redis
list : 朋友圈
set : 集合操作 : 共同好友,共同喜好、二度好友等功能,
sortset : 排行榜
5. Redis主从复制环境搭建:
5.1 环境准备:
准备两个或两个以上redis实例
[root@db01 ~]#mkdir /data/638{0..2}
配置文件示例:
[root@db01 ~]#cat >> /data/6380/redis.conf <<EOF
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
requirepass 123
masterauth 123 ##主从认证信息,所有主从节点这个项必须一致
EOF
[root@db01 ~]#cat >> /data/6381/redis.conf <<EOF
port 6381
daemonize yes
pidfile /data/6381/redis.pid
loglevel notice
logfile "/data/6381/redis.log"
dbfilename dump.rdb
dir /data/6381
requirepass 123
masterauth 123
EOF
[root@db01 ~]#cat >> /data/6382/redis.conf <<EOF
port 6382
daemonize yes
pidfile /data/6382/redis.pid
loglevel notice
logfile "/data/6382/redis.log"
dbfilename dump.rdb
dir /data/6382
requirepass 123
masterauth 123
EOF
启动服务:
[root@db01 ~]#redis-server /data/6380/redis.conf
[root@db01 ~]#redis-server /data/6381/redis.conf
[root@db01 ~]#redis-server /data/6382/redis.conf
上面设计节点:
主节点:6380
从节点:6381、6382
5.2 开启主从(在6381/6382节点上设置与主节点关系):
[root@db01 ~]#redis-cli -p 6381 -a 123 SLAVEOF 127.0.0.1 6380
[root@db01 ~]#redis-cli -p 6382 -a 123 SLAVEOF 127.0.0.1 6380
5.3 查询主从状态
[root@db01 ~]#redis-cli -p 6380 -a 123 info replication
[root@db01 ~]# redis-cli -p 6381 -a 123 info replication
[root@db01 ~]# redis-cli -p 6382 -a 123 info replication
图示:
6. redis-sentinel(哨兵)
6.1 功能:
1、监控
2、自动选主,切换(6381 slaveof no one)
3、2号从库(6382)指向新主库(6381)
4、应用透明
5、自动处理故障节点
备注:通过哨兵实现高可用功能,相当于mysql的MHA架构
6.2 sentinel搭建过程
6.2.1 准备环境:
[root@db01 ~]#mkdir /data/26380
[root@db01 ~]#cd /data/26380
配置文件:
[root@db01 ~]#cat > /data/26380/sentinel.conf <<EOF
port 26380
dir "/data/26380"
sentinel monitor mymaster(自己起的集群名称) 127.0.0.1 6380 1 ##127.0.0.1 6380是只监控目前主库节点信息,1指的是至少多少台从库同意他宕了才会切换。
sentinel down-after-milliseconds mymaster 5000 ##主库发生宕机,容忍5秒,超过5秒后,就进行切换
sentinel auth-pass mymaster 123 ##连接主库的密码*(所以在做sentinel集群的时候,所有节点密码就需要一致,因为谁都有可能是主库)
EOF
6.2.2 启动
[root@db01 26380]# redis-sentinel /data/26380/sentinel.conf &>/tmp/sentinel.log &
6.2.3 停主库测试(验证哨兵是否起作用):
[root@db01 ~]# redis-cli -p 6380 shutdown
[root@db01 ~]# redis-cli -p 6381 info replication ##看6381状态,是否已经切换到主节点
6.2.4 总结:
哨兵的高可用架构他和mysql中的MHA架构类似,但是又优于MHA架构,他拥有自主处理故障节点能力。当主宕机,主就会从M节点切换到S1节点,然后S2节点会指向新的S1节点。当M节点恢复后,什么也不用进行操作,他会进行自动故障节点处理,只需把它重新加入到架构中即可(修复架构的命令就是启动宕机的服务节点:redis-server /data/6380/redis.conf),此时他会变为从节点。
原理图:
7. redis cluster 分布式集群
7.1 介绍:
高性能:
1、在多分片节点中,将16384个槽位,均匀分布到多个分片节点中
2、存数据时,将key做crc16(key),然后和16384进行取模,得出槽位值(0-16383之间)
3、根据计算得出的槽位值,找到相对应的分片节点的主节点,存储到相应槽位上
4、如果客户端当时连接的节点不是将来要存储的分片节点,分片集群会将客户端连接切换至真正存储节点进行数据存储
高可用:
在搭建集群时,会为每一个分片的主节点,对应一个从节点,实现slaveof的功能,同时当主节点down,实现类似于sentinel的自动failover的功能。
1、redis会有多组分片构成(3组)
2、redis cluster 使用固定个数的slot存储数据(一共16384slot)
3、每组分片分得1/3 slot个数(0-5500 5501-11000 11001-16383)
4、基于CRC16(key) % 16384 ====》值 (槽位号)。
7.2 规划、搭建过程:
6个redis实例,一般会放到3台硬件服务器
注:在企业规划中,分布式集群的搭建,也需要考虑到主从关系,可以使数据落在不同的物理机,防止硬件主机宕机造成的整个分片数据丢失。
端口号:7000-7005
7.2.1 安装集群插件,EPEL源安装ruby支持
[root@db01 ~]# yum install ruby rubygems -y
7.2.2 使用国内源:
[root@db01 ~]# gem sources -l
[root@db01 ~]# gem sources -a http://mirrors.aliyun.com/rubygems/
[root@db01 ~]# gem sources --remove https://rubygems.org/
[root@db01 ~]# gem sources -l
[root@db01 ~]# gem install redis -v 3.3.3
7.2.3 集群节点准备:
[root@db01 ~]#mkdir /data/700{0..5}
[root@db01 ~]#cat > /data/7000/redis.conf <<EOF
port 7000
daemonize yes
pidfile /data/7000/redis.pid
loglevel notice
logfile "/data/7000/redis.log"
dbfilename dump.rdb
dir /data/7000
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
[root@db01 ~]#cat >> /data/7001/redis.conf <<EOF
port 7001
daemonize yes
pidfile /data/7001/redis.pid
loglevel notice
logfile "/data/7001/redis.log"
dbfilename dump.rdb
dir /data/7001
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
[root@db01 ~]#cat >> /data/7002/redis.conf <<EOF
port 7002
daemonize yes
pidfile /data/7002/redis.pid
loglevel notice
logfile "/data/7002/redis.log"
dbfilename dump.rdb
dir /data/7002
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
[root@db01 ~]#cat >> /data/7003/redis.conf <<EOF
port 7003
daemonize yes
pidfile /data/7003/redis.pid
loglevel notice
logfile "/data/7003/redis.log"
dbfilename dump.rdb
dir /data/7003
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
[root@db01 ~]#cat >> /data/7004/redis.conf <<EOF
port 7004
daemonize yes
pidfile /data/7004/redis.pid
loglevel notice
logfile "/data/7004/redis.log"
dbfilename dump.rdb
dir /data/7004
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
[root@db01 ~]#cat >> /data/7005/redis.conf <<EOF
port 7005
daemonize yes
pidfile /data/7005/redis.pid
loglevel notice
logfile "/data/7005/redis.log"
dbfilename dump.rdb
dir /data/7005
protected-mode no
cluster-enabled yes ##打开集群节点功能
cluster-config-file nodes.conf ##专门配置文件
cluster-node-timeout 5000 ##超时时间,超过5000毫秒会切换主从
appendonly yes
EOF
7.2.4 启动节点:
[root@db01 ~]#redis-server /data/7000/redis.conf
[root@db01 ~]#redis-server /data/7001/redis.conf
[root@db01 ~]#redis-server /data/7002/redis.conf
[root@db01 ~]#redis-server /data/7003/redis.conf
[root@db01 ~]#redis-server /data/7004/redis.conf
[root@db01 ~]#redis-server /data/7005/redis.conf
[root@db01 ~]# ps -ef |grep redis
root 8854 1 0 03:56 ? 00:00:00 redis-server *:7000 [cluster]
root 8858 1 0 03:56 ? 00:00:00 redis-server *:7001 [cluster]
root 8860 1 0 03:56 ? 00:00:00 redis-server *:7002 [cluster]
root 8864 1 0 03:56 ? 00:00:00 redis-server *:7003 [cluster]
root 8866 1 0 03:56 ? 00:00:00 redis-server *:7004 [cluster]
root 8874 1 0 03:56 ? 00:00:00 redis-server *:7005 [cluster]
7.2.5 将节点加入集群管理
[root@db01 ~]#redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
--replicas 1 ##每个节点都有一个副本,一主一从架构
127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
主从规划:7000,7001,7002,3台主库;7003,7004,7005,3台从库;
7000myself,他是一个集群管理节点。
7.2.6 集群状态查看:
集群主节点状态
[root@db01 ~]#redis-cli -p 7000 cluster nodes | grep master
集群从节点状态
[root@db01 ~]#redis-cli -p 7000 cluster nodes | grep slave
8. 集群节点管理
8.1 增加新的节点
8.1.1 创建新增节点:
[root@db01 ~]#mkdir /data/7006
[root@db01 ~]#mkdir /data/7007
[root@db01 ~]#cat > /data/7006/redis.conf <<EOF
port 7006
daemonize yes
pidfile /data/7006/redis.pid
loglevel notice
logfile "/data/7006/redis.log"
dbfilename dump.rdb
dir /data/7006
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
[root@db01 ~]#cat > /data/7007/redis.conf <<EOF
port 7007
daemonize yes
pidfile /data/7007/redis.pid
loglevel notice
logfile "/data/7007/redis.log"
dbfilename dump.rdb
dir /data/7007
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
启动:
[root@db01 ~]#redis-server /data/7006/redis.conf
[root@db01 ~]#redis-server /data/7007/redis.conf
8.1.2 添加主节点:
[root@db01 ~]#redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
8.1.3 添加完节点后,进行转移slot(重新分片也就是分槽位):
[root@db01 ~]#redis-trib.rb reshard 127.0.0.1:7000
8.1.4 添加一个从节点:
[root@db01 ~]#redis-trib.rb add-node --slave --master-id $MASTER-ID 127.0.0.1:7007 127.0.0.1:7000
说明: $MASTER-ID ,上面添加的主库node id号(也就是新添加的7006节点)
8.2 删除节点,将需要删除节点slot先移动走,再进行删除:
8.2.1 挪走0-1364(因为有3段,所以下面命令需要执行3次,把三段全部挪走才行):
[root@db01 ~]#redis-trib.rb reshard 127.0.0.1:7000
8.2.2 删除节点:
[root@db01 ~]#redis-trib.rb del-node 127.0.0.1:7006 de07bc7967d3b5953accde8ff2745b3c3f8baf56
[root@db01 ~]#redis-trib.rb del-node 127.0.0.1:7007 236b25da436703cb3eebe3cee64e956e65a1a2f4