目录
一、关系型数据库和 NoSQL 数据库
那么我们为什么要使用 NoSQL 数据库呢?
关系型数据库和NoSQL数据库的特点及优缺点
![](https://i-blog.csdnimg.cn/direct/81835d4c8d054a2a8ecff195f3bf4952.png)
二、redis 介绍
2.1 Redis特性
- 速度快: 10W QPS,基于内存,C语言实现
- 单线程
- 持久化
- 支持多种数据结构
- 支持多种编程语言
- 功能丰富: 支持Lua脚本,发布订阅,事务,pipeline等功能
- 简单: 代码短小精悍(单机核心代码只有23000行左右),单线程开发容易,不依赖外部库,使用简单
- 主从复制
- 支持高可用和分布式
我们单线程为何如此快呢?
- 纯内存
- 非阻塞
- 避免线程切换和竞态消耗
2.2 Redis 应用场景
- Session 共享:常见于web集群中的Tomcat或者PHP中多web服务器session共享
- 缓存:数据查询、电商网站商品信息、新闻内容
- 计数器:访问排行榜、商品浏览数等和次数相关的数值统计场景
- 微博/微信社交场合:共同好友,粉丝数,关注,点赞评论等
- 消息队列:ELK的日志缓存、部分业务的订阅发布系统
- 地理位置: 基于GEO(地理信息定位),实现摇一摇,附近的人,外卖等功能
2.3 缓存的实现流程
数据更新操作流程:
数据读操作流程:
三、redis 安装部署
redis在红帽9里面是可以使用rpm直接dnf 安装的比较方便,但是可能它的版本比较旧了,这里我就详细讲解一下源码安装。
环境准备:
先准备3台Linux虚拟机(红帽9),ip主机名分别为172.25.254.11(redis-node1.haha.com)、172.25.254.21(redis-node2.haha.com)、172.25.254.31(redis-node3.haha.com).
3.1 源码安装
在这里我用的是redis-7.4.0.tar.gz这个源码包,可以去官网去下载。然后就是解压这个源码包
[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
并安装依赖编译包
[root@redis-node1 redis-7.4.0]# dnf install make gcc initscripts-10.11.6-
1.el9.x86_64 -y
然后就是编译和安装:
[root@redis-node1 redis-7.4.0]# make
[root@redis-node1 redis-7.4.0]# make install
3.2启动
这里启动我们需要注释掉其默认的systemd启动。
[root@redis-node1 ~]# vim redis-7.4.0/utils/install_server.sh
将下面的内容注释掉
然后启动一下这个脚本文件
[root@redis-node1 utils] # ./install_server.sh
3.3 简单配置redis
编辑配置文件vim /etc/redis/6379.conf
[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...
然后我们可以查看其监听端口
然后就可以使用redis:通过redis-cli来进入
注意:其他主机的redis配置和一样的操作。
四、redis 的基础操作
示例:
#查看配置
127.0.0.1:6379[1]> CONFIG GET bind
1) "bind"
2) "* -::*"
127.0.0.1:6379[1]> CONFIG GET *
#写入和读取数据
127.0.0.1:6379> SET name lee
OK
127.0.0.1:6379> GET name
"lee"
127.0.0.1:6379> set name lee ex 5
OK
127.0.0.1:6379> get name
"lee"
127.0.0.1:6379> get name
"lee"
127.0.0.1:6379> get name
"lee"
127.0.0.1:6379> get name
"lee"
127.0.0.1:6379> get name
(nil)
#如果没有设定数据过期时间会一直存在, /var/lib/redis/6379/dump.rdb内存快照中
127.0.0.1:6379> set name lee
OK
127.0.0.1:6379> KEYS * #查看所有key
1) "name"
#选择数据库 redisa中有0-15个数据库
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get name
(nil)
127.0.0.1:6379> select 0
127.0.0.1:6379[1]> select 16
(error) ERR DB index is out of range
#移动数据
127.0.0.1:6379> set name lee
OK
127.0.0.1:6379> MOVE name 1
(integer) 1
127.0.0.1:6379> GET name
(nil)
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get name
"lee"
#改变键名
127.0.0.1:6379[1]> RENAME name id
OK
127.0.0.1:6379[1]> get name
(nil)
127.0.0.1:6379[1]> get id
"lee"
#设定数据过期时间
127.0.0.1:6379> set name lee ex 10000
OK
127.0.0.1:6379> get name
"lee"
127.0.0.1:6379> EXPIRE name 3
(integer) 1
127.0.0.1:6379> get name
"lee"
127.0.0.1:6379> get name
(nil)
#删除
127.0.0.1:6379> set name lee
OK
127.0.0.1:6379> get name
"lee"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
#持久化保存
127.0.0.1:6379> PERSIST name
(integer) 0
#判断key是否存在
127.0.0.1:6379> EXISTS name
(integer) 1
127.0.0.1:6379> EXISTS lee
(integer) 0
#清空当前库
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> GET name
(nil)
#清空所有库
127.0.0.1:6379[1]> FLUSHALL
OK
五、Redis 主从复制
5.1 主从复制过程
- slave节点发送同步亲求到master节点
- slave节点通过master节点的认证开始进行同步
- master节点会开启bgsave进程发送内存rbd到slave节点,在此过程中是异步操作,也就是说master节点仍然可以进行写入动作
- slave节点收到rdb后首先清空自己的所有数据
- slave节点加载rdb并进行数据恢复
- 在master和slave同步过程中master还会开启新的bgsave进程把没有同步的数据进行缓存
- 然后通过自有的replactionfeedslave函数把未通过内存快照发动到slave的数据一条一条写入到 slave中
5.2 环境要求:一主两从
5.3 部署
首先在3台虚机上编辑配置文件/etc/redis/6379.conf------关闭 protected模式,并重启[root@redis-node1 & node2 & node3 ~]# vim /etc/redis/6379.conf protected-mode no #关闭protected模式 [root@redis-node1 &node2 & node3 ~]# /etc/init.d/redis_6379 restart Stopping ... Redis stopped Starting Redis server...
然后在两台从节点上面设置各自的主:
[root@redis-node2 & 3 ~]# vim /etc/redis/6379.conf replicaof 172.25.254.11 6379 [root@redis-node2 & 3 ~]# /etc/init.d/redis_6379 restart Stopping ... Waiting for Redis to shutdown ... Redis stopped Starting Redis server...
然后我们可以测试一下,在主上面进行创建变量,可以在从上面查看
在主上面:
然后在从上面可以看到
六 Redis 哨兵
实验环境:还是用上面一主两从的环境来实现高可用架构
6.1 Redis Sentinel 介绍
![](https://i-blog.csdnimg.cn/direct/39d27b57e86d48c8b805139e1ab44bb2.png)
- 每个哨兵(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中的三个定时任务 :
每 10 秒每个 sentinel 对 master 和 slave 执行 info
- 发现slave节点
- 确认主从关系
每 2 秒每个 sentinel 通过 master 节点的 channel 交换信息 (pub/sub)
- 通过sentinel__:hello频道交互
- 交互对节点的“看法”和自身信息
每 1 秒每个 sentinel 对其他 sentinel 和 redis 执行 pi
6.2 哨兵的实验部署
首先在master节点上,就是11上面。
编辑配置文件,将模板配置文件拷贝过去并修改。
[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]# cd /etc/redis/
[root@redis-node1 redis]# cp sentinel.conf sentinel.conf.bak
[root@redis-node1 redis]# scp /etc/redis/sentinel.conf root@172.25.254.21:/etc/redis/
[root@redis-node1 redis]# scp /etc/redis/sentinel.conf root@172.25.254.31:/etc/redis/
然后就是启动哨兵服务了,三个节点都要启动。
redis-sentinel /etc/redis/sentinel.conf
测试:
在开一个master节点终端,在主上面将其shutdown了,
然后就可以在21上面,切换为master。
[root@redis-node2 ~]# redis-cli 127.0.0.1:6379> info replications 127.0.0.1:6379> info replication # Replication role:master connected_slaves:2 slave0:ip=172.25.254.31,port=6379,state=online,offset=211455,lag=1 slave1:ip=172.25.254.11,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
6.3 在整个架构中可能会出现的问题
#在matster中设定
[root@redis-node2 ~]# 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
七、Redis Cluster(无中心化设计)
7.1 工作原理
Redis Cluster特点:
Redis cluster 架构
![](https://i-blog.csdnimg.cn/direct/646f56a6fd0d4a7493853ffed38a07f6.png)
Redis Cluster 部署架构说明
![](https://i-blog.csdnimg.cn/direct/cf3df742b3bb431495cedc527b5802ae.png)
7.2 部署redis cluster
我们在部署之前其每个部署节点要满足以下要求。
- cluster-enabled yes #必须开启集群状态,开启后redis进程会有cluster显示
- cluster-config-file nodes-6380.conf #此文件有redis cluster集群自动创建和维护,不需要任何手动操作
7.2.1 环境要求
需要六台虚拟机,纯净的环境,构建三主三从的架构。IP分别为:172.25.254.(11,21,31,110,120,130)。
7.2.2 部署
实验rpm安装 redis ,六台都要安装 yum install redis -y
然后编辑主配置文件 [root@redis-node1 ~]# vim /etc/redis/redis.conf 添加认证和密码
[root@redis-node1 ~]# vim /etc/redis/redis.conf masterauth "123456" #集群主从认证 requirepass "123456" #redis登陆密码 redis-cli 命令连接redis后要 用“auth 密码”进行认证 cluster-enabled yes #开启cluster集群功能 cluster-config-file nodes-6379.conf #指定集群配置文件 cluster-node-timeout 15000 #节点加入集群的超时时间单位是ms
然后为了方便我们可以将其配置文件复制到其他节点
最后去启动完成,
[root@redis-node1 ~]# systemctl enable --now redis
接下来我们来配置集群cluster
7.2 部署集群
7.2.1 创建redis-cluster
以上就随机分配了三主三从。
7.2.2 检测redis集群状态
7.3 集群扩容
再准备两台虚拟机,IP为172.25.254.(50,150)并将其添加到集群里。
add-node 将50 添加到集群里
分享槽位给50 ,使其能够分享数据。
redis-cli -a 123456 --cluster reshard 172.25.254.11:6379
要注意receiving node 要填50的id,source node 要填all
然后检查一下。
然后添加lslave.
最后就出现了我们四主四从的集群
7.4 集群的维护
这里我们时删除150,50这两个节点首先先删除从150节点,注意id号![]()
然后将50的槽位分配给其他,将50往11上面迁移。
检查一下,发现50没有数据了,然后就可以删除了
这样我们就彻底删除了一个主从,实现更好的维护。