NoSQL数据库Redis集群重习

关系型数据库和 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

相关推荐
许杰小刀2 小时前
MyBatis-Plus实战:Spring Boot数据库操作效率提升10倍
数据库·spring boot·mybatis
Navicat中国2 小时前
Navicat 结构同步:一键解决多库结构不一致难题
数据库·navicat·结构同步
薿夜2 小时前
SpringSecurity(二)
数据库
宵时待雨2 小时前
优选算法专题1:双指针
数据结构·c++·笔记·算法·leetcode
Stella Blog2 小时前
狂神Java基础学习笔记Day01
java·笔记·学习
tq10862 小时前
时间、决断与主体性:从“存在决定自我”到对“存在即本质”的批判
笔记
Francek Chen3 小时前
【大数据存储与管理】NoSQL数据库:01 NoSQL简介
大数据·数据库·分布式·nosql
老虎06273 小时前
LeetCode热题100 刷题笔记(第五天)双指针法 「 三数之和 」
笔记·算法·leetcode
Database_Cool_3 小时前
【无标题】
数据库·阿里云·ai