一.企业级NoSql数据库Redis集群
1.1 数据库主要分为两大类:关系型数据库与 NoSQL 数据库
关系型数据库,是建立在关系模型基础上的数据库,其借助于集合代数等数学概念和方法来处理数据库 中的数据主流的 MySQL、Oracle、MS SQL Server 和 DB2 都属于这类传统数据库。
NoSQL 数据库,全称为 Not Only SQL,意思就是适用关系型数据库的时候就使用关系型数据库,不适 用的时候也没有必要非使用关系型数据库不可,可以考虑使用更加合适的数据存储。主要分为临时性键 值存储(memcached、Redis)、永久性键值存储(ROMA、Redis)、面向文档的数据库 (MongoDB、CouchDB)、面向列的数据库(Cassandra、HBase),每种 NoSQL 都有其特有的使用 场景及优点。
1.2 为什么还要用 NoSQL 数据库呢?
主要是由于随着互联网发展,数据量越来越大,对性能要求越来越高,传统数据库存在着先天性的缺 陷,即单机(单库)性能瓶颈,并且扩展困难。这样既有单机单库瓶颈,却又扩展困难,自然无法满足 日益增长的海量数据存储及其性能要求,所以才会出现了各种不同的 NoSQL 产品,NoSQL 根本性的优 势在于在云计算时代,简单、易于大规模分布式扩展,并且读写性能非常高
二.了解redis
2.1 redis简介
Redis 是C语言开发的一个开源高性能键值对的内存数据库 ,可以用来做数据库、缓存、消息中间件等场景,是一种NoSQL(not-only sql,非关系型数据库)的数据库
2.2 redis特点
-
优秀的性能,数据是存储在内存中,读写速度非常快,可支持并发10W QPS
-
单线程但进程,是线程安全的,采用IO 多路复用制
-
可作为分布式锁
-
支持五种数据类型
-
支持数据持久化到磁盘
-
可以作为消息中间件使用,支持消息发布及订阅
2.3 redis应用场景
Session 共享:常见于web集群中的Tomcat或者PHP中多web服务器session共享
缓存:数据查询、电商网站商品信息、新闻内容
计数器:访问排行榜、商品浏览数等和次数相关的数值统计场景
微博/微信社交场合:共同好友,粉丝数,关注,点赞评论等
消息队列:ELK的日志缓存、部分业务的订阅发布系统
地理位置: 基于GEO(地理信息定位),实现摇一摇,附近的人,外卖等功能
三. 缓存
3.1 数据缓存
数据缓存是Redis最重要的一个场景,为缓存而生,在springboot中,一般有两种使用方式:
-
直接通过RedisTemplate使用
-
通过Spring Cache集成Redis(也就是注解的方式)
3.2 使用缓存会遇到的问题
(1) 数据一致性
在分布式环境下,缓存和数据库很容易出现数据一致性问题,如果项目对缓存的要求是强一致性,那就不要使用缓存。
我们只能在项目中使用策略降低缓存与数据库一致性的概率,是无法保障两者的强一致性,一般策略包括缓存更新机制,更新数据库后及时更新缓存、缓存失败时增加重试机制
(2) 缓存雪崩
在了解雪崩溃之前,我们先了解什么是缓存雪崩现象,假设A系统每秒需要处理5000个请求,但数据库每秒只能处理4000个请求,某一天,缓存机器出现了宕机,挂了,这时候所有的请求一下子全部落在数据库上,数据库肯定扛不住,报警挂掉了,这时候如果没有采取缓存设施,数据库又急着用,重新重启数据库,刚重启完成(有可能没启动完),请求又来,数据库立马挂掉。这就是雪崩事件,是Redis缓存中最致命问题之一(有一个是穿透)
出现雪崩事件后不要急不要慌,我们可以在事故前中后三个方面来思考解决方案
-
事故前:redis高可用方案,主从+哨兵,集群方案,避免全盘崩溃
-
事故中:较少数据库的压力,本地Ehcache缓存+限流及降级,避免超过数据库承受压力
-
事故后:做redis持久化,一旦Redis重启,可从磁盘中快速恢复数据
四. redis实验
4.1 redis的源码安装
sql
[root@redis-node1 ~]# tar zxf redis-7.4.0.tar.gz
[root@redis-node1 ~]# cd redis-7.4.0
[root@redis-node1 redis-7.4.0]# dnf install make -y
[root@redis-node1 redis-7.4.0]# dnf install initscripts -y
[root@redis-node1 redis-7.4.0]# dnf install gcc -y
[root@redis-node1 redis-7.4.0]# ll /etc/init.d/
总用量 24
-rw-r--r-- 1 root root 18220 8月 24 2022 functions
-rw-r--r--. 1 root root 1161 9月 23 2022 README
[root@redis-node1 utils]# make
[root@redis-node1 utils]# make install
修改配置文件
protected-mode no
bind * -::*
将10文件复制到20和30(同样修改配置文件后restart)
[root@redis-node1 bin]# scp -r redis-7.4.0 root@172.25.254.20:/root
[root@redis-node1 bin]# rsync -al * root@172.25.254.20:/usr/local/bin
[root@redis-node1 bin]# scp -r redis-7.4.0 root@172.25.254.30:/root
[root@redis-node1 bin]# rsync -al * root@172.25.254.30:/usr/local/bin
4.2 redis的主从集群
在node1中修改配置文件
sql
[root@redis-node1 ~]# vim /etc/redis/6379.conf
protected-mode no
在node2和node3上修改文件
node1
node2
4.3 redis哨兵
sql
[root@redis-node1 ~]# cd redis-7.4.0/
[root@redis-node1 redis-7.4.0]# ls
[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
loglevel notice
sentinel monitor mymaster 172.25.254.10 6379 2
sentinel down-after-milliseconds mymaster 10000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
将修改的文件复制到20和30
[root@redis-node1 redis-7.4.0]# scp /etc/redis/sentinel.conf root@172.25.254.20:/etc/redis/sentinel.conf
[root@redis-node1 redis-7.4.0]# scp /etc/redis/sentinel.conf root@172.25.254.30:/etc/redis/sentinel.conf
备份一个文件(node1,2,3都做)
sql
[root@redis-node1 redis-7.4.0]# cd /etc/redis
[root@redis-node1 redis]# ls
6379.conf sentinel.conf
[root@redis-node1 redis]# cp sentinel.conf sentinel.conf.bak
[root@redis-node1 redis]# ls
6379.conf sentinel.conf sentinel.conf.bak
[root@redis-node1 redis]#
开启哨兵
停掉10的redis
[root@redis-node1 ~]# redis-cli
127.0.0.1:6379> shutdown
(1.20s)
not connected>
查看20
恢复node1的redis node的slave变成了两个
4.4 redis cluster集群
删除源码编译的redis,用rpm下载redis(6台机子)
[root@redis-node1 ~]# yum install redis -y
修改配置文件
sql
masterauth "123456"
requirepass "123456"
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
[root@redis-node1 ~]# systemctl restart redis.service
[root@redis-node1 ~]# redis-cli
127.0.0.1:6379> quit
将修改的配置文件复制到其他主机
sql
[root@redis-node1 ~]# for i in 20 30 110 120 130; do scp /etc/redis/redis.conf root@172.25.254.$i:/etc/redis/redis.conf; done;
6台机子redis启动成功
配置cluster
sql
[root@redis-node1 ~]# redis-cli --cluster create -a 123456 \
> 172.25.254.10:6379 172.25.254.20:6379 172.25.254.30:6379 \
> 172.25.254.110:6379 172.25.254.120:6379 172.25.254.130:6379 \
> --cluster-replicas 1
集群的检测
写数据,数据落到了20上
集群扩容
将50配置好之后加入集群
[root@redis-node1 ~]# redis-cli -a 123456 --cluster add-node 172.25.254.50:6379 172.25.254.10:6379
查看集群状态
加入成功,四台master
给50分配槽位
添加150进入集群(手残少打了一个空格把150加成了master (OvO))
删除50和150要先分配槽位
分配完槽位即可进行删除
查看集群 删除成功