1、关系型数据库和 NoSQL 数据库
(1)、数据库主要分为两大类:关系型数据库与 NoSQL 数据库
关系型数据库
,是建立在关系模型基础上的数据库,其借助于集合代数等数学概念和方法来处理数据库 中的数据主流的 MySQL
、
Oracle
、
MS SQL Server
和
DB2
都属于这类传统数据库。
NoSQL
数据库
,全称为
Not Only SQL
,意思就是适用关系型数据库的时候就使用关系型数据库,不适用的时候也没有必要非使用关系型数据库不可,可以考虑使用更加合适的数据存储。主要分为临时性键 值存储(memcached
、
Redis
)、永久性键值存储(
ROMA
、
Redis
)、面向文档的数据库 (MongoDB
、
CouchDB
)、面向列的数据库(
Cassandra
、
HBase
),每种
NoSQL
都有其特有的使用 场景及优点。
(2)、为什么还要用 NoSQL 数据库呢?
主要是由于随着互联网发展,数据量越来越大,对性能要求越来越高,传统数据库存在着先天性的缺 陷,即单机(单库)性能瓶颈,并且扩展困难。这样既有单机单库瓶颈,却又扩展困难,自然无法满足 日益增长的海量数据存储及其性能要求,所以才会出现了各种不同的 NoSQL
产品,
NoSQL
根本性的优势在于在云计算时代,简单、易于大规模分布式扩展,并且读写性能非常高
(3)、RDBMS和NOSQL的特点及优缺点
2、redis
(1)、特性
速度快
: 10W QPS,
基于内存
,C
语言实现
单线程
持久化
支持多种数据结构
支持多种编程语言
功能丰富
:
支持
Lua
脚本
,
发布订阅
,
事务
,pipeline
等功能
简单
:
代码短小精悍
(
单机核心代码只有
23000
行左右
),
单线程开发容易
,
不依赖外部库
,
使用简单
主从复制
支持高可用和分布式
(2)、应用场景
Session
共享:常见于
web
集群中的
Tomcat
或者
PHP
中多
web
服务器
session
共享
缓存:数据查询、电商网站商品信息、新闻内容
计数器:访问排行榜、商品浏览数等和次数相关的数值统计场景
微博
/
微信社交场合:共同好友
,
粉丝数
,
关注
,
点赞评论等
消息队列:
ELK
的日志缓存、部分业务的订阅发布系统
地理位置
:
基于
GEO(
地理信息定位
),
实现摇一摇
,
附近的人
,
外卖等功能
3、Redis的安装
(1)、rpm包方式安装
[root@rd10 ~]# dnf install redis -y
(2)、源码安装
A、redis的安装部署
[root@rd10 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@rd10 utils]# vim /etc/redis/6379.conf
[root@rd10 utils]# /etc/init.d/redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
[root@rd10 ~]# scp -r redis-7.4.0 root@172.25.254.20:/root
[root@rd10 bin]# rsync -al * root@172.25.254.20:/usr/local/bin
[root@rd2 utils]# dnf install initscripts -y
[root@rd2 utils]# ./install_server.sh
[root@rd10 ~]# scp -r redis-7.4.0 root@172.25.254.30:/root
[root@rd10 bin]# rsync -al * root@172.25.254.30:/usr/local/bin
[root@rd3utils]# dnf install initscripts -y
[root@rd3 utils]# ./install_server.sh
4、Redis 主从复制
(1)、主从同步过程
slave
节点发送同步亲求到
master
节点
slave
节点通过
master
节点的认证开始进行同步
master
节点会开启
bgsave
进程发送内存
rbd
到
slave
节点,在此过程中是异步操作,也就是说
master
节点仍然可以进行写入动作
slave
节点收到
rdb
后首先清空自己的所有数据
slave
节点加载
rdb
并进行数据恢复
在
master
和
slave
同步过程中
master
还会开启新的
bgsave
进程把没有同步的数据进行缓存
然后通过自有的
replactionfeedslave
函数把未通过内存快照发动到
slave
的数据一条一条写入到
slave
中
(2)、配置步骤
1.修改mastser节点的配置文件
[root@rd10 & rd2 & rd3 ~]# vim /etc/redis/6379.conf
protected-mode no #关闭protected模式
[root@rd10 & rd2 & rd3 ~]# /etc/init.d/redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...
2.配置slave节点
[root@rd2 & rd3 ~]# vim /etc/redis/6379.conf
replicaof 172.25.254.10 6379
[root@rd2 & rd3 ~]# /etc/init.d/redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
3.测试效果
#在mastser节点
[root@rd10 ~]# redis-cli
127.0.0.1:6379> set name ll
OK
#在slave节点查看
[root@redis-node2 ~]# redis-cli
127.0.0.1:6379> get name
"ll"
B、主从集群
[root@rd2 ~]# vim /etc/redis/6379.conf
[root@rd3 ~]# vim /etc/redis/6379.conf
5、Redis的哨兵(高可用)
sentinel
中的三个定时任务
每
10
秒每个
sentinel
对
master
和
slave
执行
info
发现
slave
节点
确认主从关系
每
2
秒每个
sentinel
通过
master
节点的
channel
交换信息
(pub/sub)
通过
sentinel__:hello
频道交互
交互对节点的
“
看法
”
和自身信息
每
1
秒每个
sentinel
对其他
sentinel
和
redis
执行
pi
(1)、redis实验过程
[root@rd10 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分钟
C、redis哨兵
[root@rd10 ~]# cd redis-7.4.0/
[root@rd10 redis-7.4.0]# cp sentinel.conf /etc/redis/
[root@rd2 ~]# cd redis-7.4.0/
[root@rd2 redis-7.4.0]# cp sentinel.conf /etc/redis/
[root@rd3 ~]# cd redis-7.4.0/
[root@rd3 redis-7.4.0]# cp sentinel.conf /etc/redis/
恢复[root@rd10 redis]# cp sentinel.conf.bak sentinel.conf
[root@rd2 redis]# cp sentinel.conf.bak sentinel.conf
[root@rd3 redis]# cp sentinel.conf.bak sentinel.conf
(2)、redis可能出现的问题
问题:
在生产环境中如果
master
和
slave
中的网络出现故障,由于哨兵的存在会把
master
提出去
当网络恢复后,
master
发现环境发生改变,
master
就会把自己的身份转换成
slave
master
变成
slave
后会把网络故障那段时间写入自己中的数据清掉,这样数据就丢失了。
解决:
master
在被写入数据时会持续连接
slave
,
mater
确保有
2
个
slave
可以写入我才允许写入
如果
slave
数量少于
2
个便拒绝写入
D、哨兵模式存在的问题
6、redis集群
(1)、工作原理
Redis cluster
架构
Redis Cluster
特点如下
1.
所有
Redis
节点使用
(PING
机制
)
互联
2.
集群中某个节点的是否失效,是由整个集群中超过半数的节点监测都失效,才能算真正的失效
3.
客户端不需要
proxy
即可直接连接
redis
,应用程序中需要配置有全部的
redis
服务器
IP
4. redis cluster
把所有的
redis node
平均映射到
0-16383
个槽位
(slot)
上,读写需要到指定的
redis
node
上进行操作,因此有多少个
redis node
相当于
redis
并发扩展了多少倍,每个
redis node
承担
16384/N
个槽位
5. Redis cluster
预先分配
16384
个
(slot)
槽位,当需要在
redis
集群中写入一个
key -value
的时候,会使 用CRC16(key) mod 16384
之后的值,决定将
key
写入值哪一个槽位从而决定写入哪一个
Redis
节点 上,从而有效解决单机瓶颈。
(2)、部署redis cluster
[root@rd10 ~]# 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
redis-cli --cluster 参数说明
[root@rd10 ~]# redis-cli --cluster help
Cluster Manager Commands:
create host1:port1 ... hostN:portN #创建集群
--cluster-replicas <arg> #指定master的副本数
check <host:port> or <host> <port> #检测集群信息
info <host:port> or <host> <port> #查看集群信息
fix <host:port> or <host> <port> #修复集群
reshard <host:port> or <host> <port> #在线热迁移集群指定主机的slots数据
rebalance <host:port> or <host> <port> #平衡各集群主机的slot数量
add-node new_host:new_port existing_host:existing_port #添加主机
del-node host:port node_id #删除主机
import host:port #导入外部redis服务器的数据到
当前集群
E、redis集群
[root@rd10 redis-7.4.0]# make uninstall
[root@rd2 redis-7.4.0]# make uninstall
[root@rd3 redis-7.4.0]# make uninstall
[root@rd10 ~]# yum install redis -y(10,20,30,40,50,60,70,80均执行)
F、集群扩容
[root@rd70 ~]# systemctl start redis
[root@rd80 ~]# systemctl start redis
分配槽位
[root@rd10 ~]# redis-cli -a 123456 --cluster reshard 172.25.254.10:6379
What is the receiving node ID? 009571cb206a89afa6658b60b2d403136056ac09(要添加槽位的ID)
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1: all
添加slave
G、clsuter集群维护
添加节点的时候是先添加
node
节点到集群,然后分配槽位,删除节点的操作与添加节点的操作正好相反,是先将被删除的Redis node
上的槽位迁移到集群中的其他
Redis node
节点上,然后再将其删除,如果一个Redis node
节点上的槽位没有被完全迁移,删除该
node
的时候会提示有数据且无法删除。
删除master