目录
一.redis介绍
Redis
是一个开源的、遵循
BSD
协议的、基于内存的而且目前比较流行的键值数据库
(key-value
database)
,是一个非关系型数据库,
redis
提供将内存通过网络远程共享的一种服务,提供类似功能的还有
memcached
,但相比
memcached
,
redis
还提供了易扩展、高性能、具备数据持久性等功能。
Redis
在高并发、低延迟环境要求比较高的环境使用量非常广泛。
<1>.redis特性
1.速度快
: 10W QPS,
基于内存
,C
语言实现
2.单线程
3.持久化
4.支持多种数据结构
5.支持多种编程语言
6.功能丰富
:
支持
Lua
脚本
,
发布订阅
,
事务
,pipeline
等功能
7.简单
:
代码短小精悍
(
单机核心代码只有
23000
行左右
),
单线程开发容易
,
不依赖外部库
,
使用简单
8.主从复制
9.支持高可用和分布式
<2>.redis应用场景
1.Session
共享:常见于
web
集群中的
Tomcat
或者
PHP
中多
web
服务器
session
共享
2.缓存:数据查询、电商网站商品信息、新闻内容
3.计数器:访问排行榜、商品浏览数等和次数相关的数值统计场景
4.微博
/
微信社交场合:共同好友
,
粉丝数
,
关注
,
点赞评论等
5.消息队列:
ELK
的日志缓存、部分业务的订阅发布系统
6.地理位置
:
基于
GEO(
地理信息定位
),
实现摇一摇
,
附近的人
,
外卖等功能
二.redis部署(源码安装)
在一台主机中不能即用
rpm
安装也用源码安装
1.解压源码包
[root@redis-node1 ~]# tar zxf redis-7.4.0.tar.gz
[root@redis-node1 ~]# ls
redis-7.4.0 redis-7.4.0.tar.gz
2.安装编译工具
[root@redis-node1 redis-7.4.0]# dnf install make gcc initscripts-10.11.6-1.el9.x86_64 -y
3.执行编译命令
[root@redis-node1 redis-7.4.0]# make
[root@redis-node1 redis-7.4.0]# make install
4.启动redis
[root@redis-node1 redis-7.4.0]# cd utils/
[root@redis-node1 utils]# ./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server
This systems seems to use systemd. #提示系统使用的是systemd的初始化方式
Please take a look at the provided example service unit files in this directory,and adapt and install them. Sorry!
5.解决报错问题
[root@redis-node1 utils]# vim install_server.sh
#bail if this system is managed by systemd
#_pid_1_exe="$(readlink -f /proc/1/exe)"
#if [ "${_pid_1_exe##*/}" = systemd ]
#then
# echo "This systems seems to use systemd."
# echo "Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!"
# exit 1
#fi
[root@redis-node1 utils]# ./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379] #端口号
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] #配置文件
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] #日志
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] #数据目录
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server] #命令路径
Selected config:
Port : 6379
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
6.配置redis
[root@redis-node1 utils]# vim /etc/redis/6379.conf
bind * -::*
[root@redis-node1 utils]# /etc/init.d/redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...
[root@redis-node1 utils]# netstat -antlpe | grep redis
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 0 62525 38015/redis-server
tcp6 0 0 :::6379 :::* LISTEN 0 62526 38015/redis-server
7.查看信息
[root@redis-node1 utils]# redis-cli
127.0.0.1:6379> info
三.redis的基本操作
config get * | 查看配置 |
select 1 | 选择数据库 |
flushdb | 清空当前数据库 |
flushall | 清空所有数据库 |
move key 1 | 移动key |
del key | 删除 |
rename oldkey newkey | 改名 |
expire key 10 | 设置过期时间 |
persist key | 设置持久化 |
keys user* | 查询 |
exists key | 判断是否存在 |
四.redis主从
<1>.实验环境
在配置多台
redis
时建议用复制的方式节省编译时间
redis-node1 master
redis-node2 slave
redis-node3 slave
<2>.配置主从同步
1.
修改
mastser
节点的配置文件
[root@redis-node1 ~]# vim /etc/redis/6379.conf
protected-mode no #关闭protected模式
[root@redis-node1 ~]# /etc/init.d/redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...
2.配置slave节点
[root@redis-node2 & 3 ~]# vim /etc/redis/6379.conf
protected-mode no #关闭protected模式
[root@redis-node2 & 3 ~]# vim /etc/redis/6379.conf
replicaof 172.25.254.100 6379
[root@redis-node2 & 3 ~]# /etc/init.d/redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
3.
测试
#在mastser节点
[root@redis-node1 ~]# redis-cli
127.0.0.1:6379> set name liu
OK
#在slave节点查看
[root@redis-node2 ~]# redis-cli
127.0.0.1:6379> get name
"liu"
<3>.主从同步过程
1.slave
节点发送同步请求到
master
节点
2.slave
节点通过
master
节点的认证开始进行同步
3.master
节点会开启
bgsave
进程发送内存
rbd
到
slave
节点,在此过程中是异步操作,也就是说
master
节点仍然可以进行写入动作
4.slave
节点收到
rdb
后首先清空自己的所有数据
5.slave
节点加载
rdb
并进行数据恢复
6.在
master
和
slave
同步过程中
master
还会开启新的
bgsave
进程把没有同步的数据进行缓存
7.然后通过自有的
replactionfeedslave
函数把未通过内存快照发动到
slave
的数据一条一条写入到
slave
中
五.redis哨兵(高可用)
<1>.redis哨兵
Sentinel
进程是用于监控
redis
集群中
Master
主服务器工作的状态,在
Master
主服务器发生故障的时候, 可以实现Master
和
Slave
服务器的切换,保证系统的高可用,此功能在
redis2.6+
的版本已引用,
Redis
的
哨兵模式到了
2.8
版本之后就稳定了下来。一般在生产环境也建议使用
Redis
的
2.8
版本的以后版本。
每个哨兵
(Sentinel)
进程会向其它哨兵
(Sentinel)
、
Master
、
Slave
定时发送消息,以确认对方是否
”
活
”着,如果发现对方在指定配置时间
(
此项可配置
)
内未得到回应,则暂时认为对方已离线,也就是所谓的
”
主观认为宕机
” (
主观
:
是每个成员都具有的独自的而且可能相同也可能不同的意识
)
,英文名称:
Subjective Down
,简称
SDOWN。
有主观宕机,对应的有客观宕机。当
“
哨兵群
”
中的多数
Sentinel
进程在对
Master
主服务器做出
SDOWN
的判断,并且通过
SENTINEL is-master-down-by-addr
命令互相交流之后,得出的
Master Server
下线判
断,这种方式就是
“
客观宕机
”(
客观
:
是不依赖于某种意识而已经实际存在的一切事物
)
,英文名称是:
Objectively Down
, 简称
ODOWN。
通过一定的
vote
算法,从剩下的
slave
从服务器节点中,选一台提升为
Master
服务器节点,然后自动修改相关配置,并开启故障转移(
failover
)。
Sentinel
机制可以解决
master
和
slave
角色的自动切换问题,但单个
Master
的性能瓶颈问题无法解决
,
类似于
MySQL
中的
MHA
功能。
Redis Sentinel
中的
Sentinel
节点个数应该为大于等于
3
且最好为奇数。
sentinel
中的三个定时任务
1.每
10
秒每个
sentinel
对
master
和
slave
执行
info
- 发现
slave
节点
- 确认主从关系
2.每
2
秒每个
sentinel
通过
master
节点的
channel
交换信息
(pub/sub)
- 通过
sentinel__:hello
频道交互
- 交互对节点的
“
看法
”
和自身信息
3.每
1
秒每个
sentinel
对其他
sentinel
和
redis
执行
pi
<2>.实验过程
1.在master节点中
[root@redis-node1 ~]# cd redis-7.4.0/
[root@redis-node1 redis-7.4.0]# cp sentinel.conf /etc/redis/
[root@redis-node1 redis-7.4.0]# vim /etc/redis/sentinel.conf
protected-mode no #关闭保护模式
port 26379 #监听端口
daemonize no #进入不打入后台
pidfile /var/run/redis-sentinel.pid #sentinel进程pid文件
loglevel notice #日志级别
sentinel monitor mymaster 172.25.254.100 6379 2 #创建sentinel监控监控master主机,2表示必须得到2票
sentinel down-after-milliseconds mymaster 10000 #master中断时长,10秒连不上视为master下线
sentinel parallel-syncs mymaster 1 #发生故障转移后,同时开始同步新master数据的slave数量
sentinel failover-timeout mymaster 180000 #整个故障切换的超时时间为3分钟
[root@redis-node1 redis-7.4.0]# scp /etc/redis/sentinel.conf root@172.25.254.200:/etc/redis/
[root@redis-node1 redis-7.4.0]# scp /etc/redis/sentinel.conf root@172.25.254.201:/etc/redis/
2.启动服务
/etc/redis/sentinel.conf
文件在用哨兵程序调用后会更改其配置文件,如果需要重新做需要删掉文
件重新编辑。
[root@redis-node1 redis-7.4.0]# redis-sentinel /etc/redis/sentinel.conf
3.测试
[root@redis-node1 ~]# redis-cli
127.0.0.1:6379> SHUTDOWN
[root@redis-node2 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.25.254.201,port=6379,state=online,offset=211455,lag=1
slave1:ip=172.25.254.100,port=6379,state=online,offset=211455,lag=1
master_failover_state:no-failover
master_replid:d42fd72f3dfae94c84ca722ad1653417495ef4fd
master_replid2:290c3407108cc6120086981b7149a6fa377594c4
master_repl_offset:211598
second_repl_offset:185931
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:150986
repl_backlog_histlen:60613
<3>.可能出现的问题
1.问题:
在生产环境中如果
master
和
slave
中的网络出现故障,由于哨兵的存在会把
master
提出去,
当网络恢复后,
master
发现环境发生改变,
master
就会把自己的身份转换成
slave,
master
变成
slave
后会把网络故障那段时间写入自己中的数据清掉,这样数据就丢失了。
2.解决:
master
在被写入数据时会持续连接
slave
,
mater
确保有
2
个
slave
可以写入我才允许写入如果
slave
数量少于
2
个便拒绝写入。
[root@redis-node1 ~]# redis-cli
127.0.0.1:6379> CONFIG GET min-slaves-to-write
1) "min-slaves-to-write"
2) "0"
127.0.0.1:6379> CONFIG set min-slaves-to-write 2
OK
127.0.0.1:6379> CONFIG GET min-slaves-to-write
1) "min-slaves-to-write"
2) "2"
如果要永久保存写到配置文件中
/etc/redis/6379.conf