企业级NoSql数据库Redis集群详解

目录

一、关系型数据库和 NoSQL 数据库

那么我们为什么要使用 NoSQL 数据库呢?

关系型数据库和NoSQL数据库的特点及优缺点

二、redis 介绍

2.1 Redis特性

2.2 Redis 应用场景 

2.3 缓存的实现流程

三、redis 安装部署

环境准备:

3.1 源码安装

3.2启动

3.3  简单配置redis 

四、redis 的基础操作

 五、Redis 主从复制

5.1 主从复制过程

 5.2 环境要求:一主两从

5.3 部署

六 Redis 哨兵 

6.1 Redis Sentinel 介绍

6.2 哨兵的实验部署 

6.3 在整个架构中可能会出现的问题

七、Redis Cluster(无中心化设计)

7.1 工作原理

Redis Cluster特点:

Redis cluster 架构

Redis Cluster 部署架构说明

7.2 部署redis cluster

7.2.1 环境要求

7.2.2 部署

7.2 部署集群

7.2.1 创建redis-cluster

 7.2.2 检测redis集群状态

7.3 集群扩容

7.4 集群的维护


一、关系型数据库和 NoSQL 数据库

关系型数据库,是建立在关系模型基础上的数据库,其借助于集合代数等数学概念和方法来处理数据库中的数据主流的 MySQL Oracle MS SQL Server DB2 都属于这类传统数据库。
NoSQL 数据库 ,全称为 Not Only SQL,意思就是适用关系型数据库的时候就使用关系型数据库,不适用的时候也没有必要非使用关系型数据库不可,可以考虑使用更加合适的数据存储。主要分为临时性键值存储( memcached Redis )、永久性键值存储( ROMA Redis)、面向文档的数据库 ( MongoDB CouchDB )、面向列的数据库( Cassandra HBase ),每种 NoSQL 都有其特有的使用场景及优点。

那么我们为什么要使 NoSQL 数据库呢?

主要是由于随着互联网发展,数据量越来越大,对性能要求越来越高,传统数据库存在着先天性的缺陷,即单机(单库)性能瓶颈,并且扩展困难。这样既有单机单库瓶颈,却又扩展困难,自然无法满足日益增长的海量数据存储及其性能要求,所以才会出现了各种不同的 NoSQL 产品, NoSQL 根本性的优势在于在云计算时代,简单、易于大规模分布式扩展,并且读写性能非常高。

关系型数据库和NoSQL数据库的特点及优缺点

二、redis 介绍

Redis 是一个开源的、遵循 BSD 协议的、基于内存的而且目前比较流行的键值数据库 (key-value
database) ,是一个非关系型数据库, redis 提供将内存通过网络远程共享的一种服务,提供类似功能的 还有 memcached ,但相比 memcached redis还提供了易扩展、高性能、具备数据持久性等功能。 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进程发送内存rbdslave节点,在此过程中是异步操作,也就是说master节点仍然可以进行写入动作
  • slave节点收到rdb后首先清空自己的所有数据
  • slave节点加载rdb并进行数据恢复
  • masterslave同步过程中master还会开启新的bgsave进程把没有同步的数据进行缓存
  • 然后通过自有的replactionfeedslave函数把未通过内存快照发动到slave的数据一条一条写入到 slave

 5.2 环境要求:一主两从

redis-node1 master
redis-node2 slave
redis-node3 slave
注意每台上面的防火墙selinux都要关闭。

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 介绍

Sentinel 进程是用于监控 redis 集群中 Master 主服务器工作的状态,在 Master主服务器发生故障的时候, 可以实现 Master Slave 服务器的切换,保证系统的高可用,此功能在 redis2.6+ 的版本已引用, Redis的哨兵模式到了 2.8 版本之后就稳定了下来。一般在生产环境也建议使用 Redis 2.8 版本的以后版本

  • 每个哨兵(Sentinel)进程会向其它哨兵(Sentinel)MasterSlave定时发送消息,以确认对方是否活” 着,如果发现对方在指定配置时间(此项可配置)内未得到回应,则暂时认为对方已离线,也就是所谓的” 主观认为宕机” (主观:是每个成员都具有的独自的而且可能相同也可能不同的意识),英文名称: Subjective Down,简称SDOWN
  • 有主观宕机,对应的有客观宕机。当 哨兵群 中的多数 Sentinel 进程在对 Master 主服务器做出 SDOWN 的 判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的 Master Server下线判 断,这种方式就是 客观宕机 ”( 客观 : 是不依赖于某种意识而已经实际存在的一切事物 ),英文名称是: Objectively Down , 简称 ODOWN
  • 通过一定的vote算法,从剩下的slave从服务器节点中,选一台提升为Master服务器节点,然后自动修改 相关配置,并开启故障转移(failover
  • Sentinel 机制可以解决masterslave角色的自动切换问题,但单个 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 在整个架构中可能会出现的问题

问题:
在生产环境中如果 master slave 中的网络出现故障,由于哨兵的存在会把 master 提出去
当网络恢复后, master 发现环境发生改变, master 就会把自己的身份转换成 slave
master 变成 slave 后会把网络故障那段时间写入自己中的数据清掉,这样数据就丢失了。
解决:
master 在被写入数据时会持续连接 slave mater 确保有 2 slave 可以写入我才允许写入
如果 slave 数量少于 2 个便拒绝写入。
#在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 工作原理

在哨兵 sentinel 机制中,可以解决 redis 高可用问题,即当 master 故障后可以自动将 slave 提升为 master, 从而可以保证 redis 服务的正常使用,但是无法解决 redis 单机写入的瓶颈问题,即单机 redis写入性能受限于单机的内存大小、并发数量、网卡速率等因素。
redis 3.0 版本之后推出了无中心架构的 redis cluster 机制,在无中心的 redis集群当中,其每个节点保存当前节点数据和整个集群状态 , 每个节点都和其他所有节点连接

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节点上,从而有效解决单机瓶颈。

Redis cluster 架构

假如三个主节点分别是: A, B, C 三个节点,采用哈希槽 (hash slot) 的方式来分配 16384 slot 的话它们三个节点分别承担的 slot 区间可以是:
节点 A 覆盖 0 5460
节点 B 覆盖 5461 10922
节点 C 覆盖 10923 16383

Redis Cluster 部署架构说明

7.2 部署redis cluster

我们在部署之前其每个部署节点要满足以下要求。

1. 每个 redis node 节点采用相同的硬件配置、相同的密码、相同的 redis 版本。
2. 每个节点必须开启的参数
  • cluster-enabled yes  #必须开启集群状态,开启后redis进程会有cluster显示
  • cluster-config-file nodes-6380.conf #此文件有redis cluster集群自动创建和维护,不需要任何手动操作
3. 所有 redis 服务器必须没有任何数据
4. 先启动为单机 redis 且没有任何 key value

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 集群的维护

添加节点的时候是先添加 node节点到集群,然后分配槽位,删除节点的操作与添加节点的操作正好相 反,是先将被删除的 Redis node 上的槽位迁移到集群中的其他 Redis node节点上,然后再将其删除,如果一个 Redis node 节点上的槽位没有被完全迁移,删除该 node 的时候会提示有数据且无法删除。
这里我们时删除150,50这两个节点
首先先删除从150节点,注意id号

然后将50的槽位分配给其他,将50往11上面迁移。

检查一下,发现50没有数据了,然后就可以删除了

这样我们就彻底删除了一个主从,实现更好的维护。

  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左水水%

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值