关系型数据库和 NoSQL 数据库
数据库主要分为两大类:关系型数据库与 NoSQL 数据库
关系型数据库是建立在关系模型基础上的数据库,其借助于集合代数等数学概念和方法来处理数据中数据主流的 MySQL、Oracle、MS SQL Server 和 DB2 都属于这类传统数据库。
NoSQL 数据库,全称为 Not Only SQL,意思就是适用关系型数据库的时候就使用关系型数据库,不适用的时候也没有必要非使用关系型数据库不可,可以考虑使用更加合适的数据存储。主要分为临时性键值存储(memcached、Redis)、永久性键值存储(ROMA、Redis)、面向文档的数据库(MongoDB、CouchDB)、面向列的数据库(Cassandra、HBase),每种 NoSQL 都有其特有的使用场景及优点。
为什么还要用 NoSQL 数据库呢?
主要是由于随着互联网发展,数据量越来越大,对性能要求越来越高,传统数据库存在着先天性的缺陷,即单机(单库)性能瓶颈,并且扩展困难。这样既有单机单库瓶颈,却又扩展困难,自然无法满足日益增长的海量数据存储及其性能要求,所以才会出现了各种不同的 NoSQL 产品,NoSQL 根本性的优势在于在云计算时代,简单、易于大规模分布式扩展,并且读写性能非常高
RDBMS和NOSQL的特点及优缺点:
redis简介
什么是redis
Redis (Remote Dictionary Server)
在2009年发布,开发者是意大利的萨尔瓦多·桑菲利波普(Salvatore Sanfilippo),他本想为自己的公司开发一个用于替换MySQL的产品Redis,但是没有想到他把Redis开源后大受欢迎,短短几年,Redis就有了很大的用户群体,目前国内外使用的公司众多,比如:阿里,百度,新浪微博,知乎网,GitHub,Twitter 等。
Redis是一个开源的、遵循BSD协议的、基于内存的而且目前比较流行的键值数据库(key-value database),是一个非关系型数据库,redis 提供将内存通过网络远程共享的一种服务,提供类似功能的还有memcached,但相比memcached,redis还提供了易扩展、高性能、具备数据持久性等功能。
Redis 在高并发、低延迟环境要求比较高的环境使用量非常广泛
Redis特性
速度快: 10W QPS,基于内存,C语言实现
单线程
持久化
支持多种数据结构
支持多种编程语言
功能丰富: 支持Lua脚本,发布订阅,事务,pipeline等功能
简单: 代码短小精悍(单机核心代码只有23000行左右),单线程开发容易,不依赖外部库,使用简单
主从复制
支持高可用和分布式
单线程为何如此快?
纯内存
非阻塞
避免线程切换和竞态消耗
Redis应用场景
Session 共享:常见于web集群中的Tomcat或者PHP中多web服务器session共享
缓存:数据查询、电商网站商品信息、新闻内容
计数器:访问排行榜、商品浏览数等和次数相关的数值统计场景
微博/微信社交场合:共同好友,粉丝数,关注,点赞评论等
消息队列:ELK的日志缓存、部分业务的订阅发布系统
地理位置: 基于GEO(地理信息定位),实现摇一摇,附近的人,外卖等功能
缓存的实现流程
数据更新操作流程
数据读操作流程
Redis安装部署
redis-node1 ~]# dnf install make gcc initscripts -y 安装依赖
# wget https://download.redis.io/releases/redis-7.4.8.tar.gz
# tar zxf redis-7.4.8.tar.gz
# cd redis-7.4.8/
# make && make install
# cd utils/
# vim install_server.sh
# ./install_server.sh
# chkconfig redis_6379 on 开机启动
# cp systemd-redis_server.service /lib/systemd/system/redisd.service
# vim /lib/systemd/system/redisd.service
# systemctl daemon-reload
# systemctl start redis_6379.service
# scp /root/redis-7.4. 8 .tar.gz root@172.25.254.20:/root/
redis-node2和3 ~]# systemctl daemon-reload
# systemctl start redis_6379.service
# netstat -antlpe | grep redis
Redis主从复制
Redis主节点配置
node1 ~]# vim /etc/redis/redis.conf
# systemctl restart redis_6379.service
配置Redis从节点
node2和3 ~]# vim /etc/redis/redis.conf
查看状态并测试
node1 ~]# redis-cli
node2 ~]# redis-cli
测试数据同步性
node1 ~]> set name lee
> get name
node2 ~]> get name
> set test 123
Redis的基本操作
# redis-cli
> select 1 【选择库】
查看配置
> CONFIG GET bind 【查看bind配置】
> CONFIG GET * 【查看所有】
写入和读取数据
> SET name lee 【设置名称数据】
> GET name
> set name lee ex 5
> get name 【5秒后过期】
> KEYS * 【查看所有key数据】
移动数据
> set name lee
> MOVE name 1 【移动数据】
> GET name
> select 1
> get name
设定数据过期时间
> EXPIRE name 3 【更改name变3秒过期】
删除
> del name
改变键名
> RENAME name id 【修改name数据变id】
> get name
> get id 【查看id】
持久化保存
> PERSIST name
判断key是否存在
> EXISTS name 【查看name是否存在】
清空库
> flushdb 【清空当前库】
> FLUSHAL 【清空所有】
主从同步过程
slave节点发送同步亲求到master节点
slave节点通过master节点的认证开始进行同步
master节点会开启bgsave进程发送内存rbd到slave节点,在此过程中是异步操作,也就是说master节点仍然可以进行写入动作
slave节点收到rdb后首先清空自己的所有数据
slave节点加载rdb并进行数据恢复
在master和slave同步过程中master还会开启新的bgsave进程把没同步的数据缓存
然后通过自有的replactionfeedslave函数把未通过内存快照发动到slave的数据一条一条写入到slave中
Redis的哨兵(高可用)
redis 主节点
node1 ~]# cd redis-7.4.8/
# cp -p sentinel.conf /etc/redis/
# 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.10 6379 2 #创建sentinel监控监控master主机,
2表示必须得到2票
sentinel down-after-milliseconds mymaster 10000 #master中断时长,10秒连不上视为下线
sentinel parallel-syncs mymaster 1 #发生故障转移后,同时开始同步新 master数据的slave数量
sentinel failover-timeout mymaster 180000 #整个故障切换的超时时间为3分钟
在从节点关闭protected-mode模式
node2和3 ~]# vim /etc/redis/redis.conf
# systemctl restart redis_6379.service
在主节点复制sentinel.conf到从节点
node1 ~]# scp /etc/redis/sentinel.conf root@172.25.254.20:/etc/redis/
# scp /etc/redis/sentinel.conf root@172.25.254. 3 0:/etc/redis/
所有节点开启哨兵
node1-3 ~]# redis-sentinel /etc/redis/sentinel.conf
测试故障切换
node1 ~]# redis-cli
node2 ~]# redis-cli
node1 ~]# /etc/init.d/redis_6379 start
在整个架构中可能会出现的问题
在生产环境中如果master和slave中的网络出现故障,由于哨兵的存在会把master提出去,当网络恢复后,master发现环境发生改变,master就会把自己的身份转换成slave
master变成slave后会把网络故障那段时间写入自己中的数据清掉,这样数据就丢失了。
解决:
master在被写入数据时会持续连接slave,mater确保有2个slave可以写入我才允许写入,如果slave数量少于2个便拒绝写入
# redis-cli
> CONFIG GET min-slaves-to-write
> CONFIG set min-slaves-to-write 2
> CONFIG GET min-slaves-to-write
当一个从库挂掉了
如果要永久保存写到配置文件中/etc/redis/6379.conf
部署redis cluster
修改所有节点配置文件
# vim /etc/redis/6379.conf
# /etc/init.d/redis_6379 stop
启动集群
# redis-cli --cluster create 172.25.254.10:6379 172.25.254.20:6379 172.25.254.30:6379 172.25.254.40:6379 172.25.254.50:6379 172.25.254.60:6379 --cluster-replicas 1
查看集群状态
# redis-cli --cluster info 172.25.254.10:6379
# redis-cli cluster info
# redis-cli --cluster check 172.25.254.10:6379
集群扩容
# redis-cli --cluster add-node 172.25.254.70:6379 172.25.254.10:6379
# redis-cli --cluster check 172.25.254.10:6379
分配solt给新加入的主机
给新主机添加slave
# redis-cli --cluster add-node 172.25.254.80:6379 172.25.254.10:6379 --cluster-slave --cluster-master-id dfabfe07170ac9b5d20a5a7a70c836877bd64504
# redis-cli --cluster check 172.25.254.10:6379
集群缩容
# redis-cli --cluster reshard 172.25.254.10:6379
删除70和80节点
# redis-cli --cluster del-node 172.25.254.10:6379 dfabfe07170ac9b5d20a5a7a70c836877bd64504
# redis-cli --cluster del-node 172.25.254.10:6379 1176ee294e6b5071ca57e93374d04ac22028daed
# redis-cli --cluster check 172.25.254.10:6379
































































