NoSql数据库Redis集群

2024-08-26 23:12
文章标签 集群 redis nosql 数据库

本文主要是介绍NoSql数据库Redis集群,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

-----------------第一部分----------------

一.关系型数据库和Nosql数据库

关系型数据库,是建立在关系模型基础上的数据库,借助于数学思维来处理数据库 中的数据主流的 MySQL、Oracle、MS SQL Server 和 DB2 都属于这类传统数据库

NoSQL 数据库,全称为 Not Only SQL,不适 用的时候也没有必要非使用关系型数据库不可,可以考虑使用更加合适的数据存储。主要分为临时性键 值存储(memcached、Redis)、永久性键值存储(ROMA、Redis)、面向文档的数据库 (MongoDB、CouchDB)、面向列的数据库(Cassandra、HBase),每种 NoSQL 都有其特有的使用 场景及优点。redis还提供了易扩展、高性能、具备数据持久性等功能。 Redis 在高并发、低延迟环境要求比较高的环境使用量非常广泛(比如直播平台,排行榜等)

二.为什么使用Nosql数据库

随着互联网发展,数据量越来越大,对性能要求越来越高,传统数据库存单机(单库)扩展困难查找速度慢。无法满足 日益增长的海量数据存储及其性能要求,所以才会出现了各种不同的 NoSQL 产品,NoSQL 根本性的优 势在于在云计算时代,简单、易于大规模分布式扩展,并且读写性能非常高

redis特性:速度快(基于内存,单线程),持久化(RDB,AOF),开发容易,不依赖外部库,主从复制,扩容,支持高可用和分布式

为什么单线程快?纯内存,非阻塞,避免了线程的切换和竞争消耗

应用场景:

缓存:数据查询、电商网站商品信息、新闻内容

计数器:访问排行榜、商品浏览数等和次数相关的数值统计场景

微博/微信社交场合:共同好友,粉丝数,关注,点赞评论等

消息队列:ELK的日志缓存、部分业务的订阅发布系统

地理位置: 基于GEO(地理信息定位),实现摇一摇,附近的人,外卖等功能

三.关系型数据库和Nosql数据库的对比

 四.面试题

----------------第二部分-------------------

一.源码安装redis(rhel9.1)

#源码安装
[root@server1 ~]# dnf install make gcc initscripts-10.11.6-1.el9.x86_64 -y
[root@server1 ~]# tar xf redis-7.4.0.tar.gz
[root@server1 ~]# cd redis-7.4.0/
[root@server1 redis-7.4.0]# make
[root@server1 redis-7.4.0]# make install
[root@server1 redis-7.4.0]# cd utils/
[root@server1 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@server1 utils]# ./install_server.sh(6379端口)
[root@server1 utils]# vim /etc/redis/6379.conf
bind * -::*
注:也可以关闭下面的保护模式yes变为no
[root@server1 utils]# /etc/init.d/redis_6379 restart
[root@server1 utils]# netstat -nltup \ grep redis
[root@server1 utils]# redis-cli
127.0.0.1:6379> info
若是源码想要安装下一台虚拟机
注意权限问题即可
#复制编译好的redis目录和二进制命令
[root@server1 ~]# scp -r /usr/local/bin/* root@172.25.254.162:/usr/local/bin/
[root@server1 ~]# scp -r redis-7.4.0 root@172.25.254.162:/root[root@server3 ~]# yum install make gcc initscripts-10.11.6-1.el9.x86_64 -y
[root@server3 ~]# cd redis-7.4.0/
[root@server3 redis-7.4.0]# cd utils/
[root@server3 utils]# ./install_server.sh
[root@server3 utils]# vim /etc/redis/6379.conf
bind * -::*
#保护进程改为no,改不改都行(决定用不用密码登录)
[root@server3 utils]# /etc/init.d/redis_6379 restart
[root@server3 utils]# redis-cli
127.0.0.1:6379> quit

二.主从复制

一主两从

slave发送同步请求到master,master认证后,开启一个进程把内存中的数据发送到slave,slave清空自己的数据加载新的数据进行同步,同时master对于新写入的数据会开启一个新进程对其进行缓存,然后通过函数把这些数据一条一条写入到slave中。

配置过程:

vim /etc/redis/6379.conf
protected-mode no #关闭protected模式
/etc/init.d/redis_6379 restart
root@redis-server2 & 3 ~]# vim /etc/redis/6379.conf
replicaof 172.25.254.160 6379
[root@redis-server2 & 3 ~]# /etc/init.d/redis_6379 restart

 测试:

 三:redis哨兵(高可用)

Sentinel 进程是用于监控redis集群中Master主服务器工作的状态,在Master主服务器发生故障的时候, 可以实现Master和Slave服务器的切换,保证系统的高可用

每个哨兵(Sentinel)进程会向其它哨兵(Sentinel)、Master、Slave定时发送消息,以确认对方是否”活” 着,如果发现对方在指定配置时间(此项可配置)内未得到回应,则主观认为对方已离线,当“哨兵群”中的多数Sentinel进程在对Master主服务器做出SDOWN 的 判断则认为master客观下线,会通过一定的选举算法,从剩下的slave从服务器节点中,选一台提升为Master服务器节点,然后自动修改 相关配置,并开启故障转移(failover),Sentinel 机制可以解决master和slave角色的自动切换问题,但单个 Master 的性能瓶颈问题无法解决,类 似于MySQL中的MHA功能

3.1.部署实现

环境:一主两从:master(160),slave(161,162)

[root@server1 ~]# cd redis-7.4.0/
[root@server1 redis-7.4.0]# cp sentinel.conf /etc/redis/
[root@server1 redis-7.4.0]# vim /etc/redis/sentinel.conf
sentinel monitor mymaster 172.25.254.160 6379 2
sentinel down-after-milliseconds mymaster 10000 [root@server1 redis-7.4.0]# scp /etc/redis/sentinel.conf root@172.25.254.161:/etc/redis/
[root@server1 redis-7.4.0]# scp /etc/redis/sentinel.conf root@172.25.254.162:/etc/redis/
备份,文件在哨兵调用时会更改配置文件,需要重新做的话得删除文件重新编辑,方便后续恢复就备份下
[root@server1 redis-7.4.0]#scp /etc/redis/sentinel.conf /etc/redis/sentinel.conf.bak
#启动监听服务[root@server1 redis-7.4.0]# redis-sentinel /etc/redis/sentinel.conf
[root@server2 redis-7.4.0]# redis-sentinel /etc/redis/sentinel.conf
[root@server3 redis-7.4.0]# redis-sentinel /etc/redis/sentinel.conf

 模拟master故障,实现自动切换,故障恢复,会以slave的身份加入集群

在生产环境中如果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

4.1.工作原理

在哨兵sentinel机制中,可以解决redis高可用问题,即当master故障后可以自动将slave提升为master, 从而可以保证redis服务的正常使用,但是无法解决redis单机写入的瓶颈问题,即单机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的架构虽然解决了并发的问题,但是又引入了一个新的问题,每个Redis master的高可用 如何解决? 那就是对每个master 节点都实现主从复制,从而实现 redis 高可用性

4.2.部署三主三从

make uninstall

yum install redis -y (8台主机)其中有两台是后面添加节点要用的

八台主机都做,先开启集群功能
[root@server4 ~]# vim /etc/redis/redis.conf
masterauth "123456" #集群主从认证
requirepass "123456" #redis登陆密码 redis-cli 命令连接redis后要
cluster-enabled yes #开启cluster集群功能
cluster-config-file nodes-6379.conf #指定集群配置文件
cluster-node-timeout 15000 #节点加入集群的超时时间单位是ms[root@server4 ~]# systemctl restart redis.service
[root@server4 ~]# redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface
127.0.0.1:6379> info# Cluster
cluster_enabled:1

创建集群:

[root@server1 ~]# redis-cli --cluster create -a 123456 \
> 172.25.254.160:6379 172.25.254.161:6379 172.25.254.162:6379 \
> 172.25.254.170:6379 172.25.254.171:6379 172.25.254.172:6379 \
> --cluster-replicas 1检测集群状态:
[root@server1 ~]# redis-cli -a 123456 --cluster info 172.25.254.160:6379
检测集群:
[root@master1 ~]# redis-cli -a 123456 --cluster check 172.25.254.10:6379 写入数据:
[root@server1 ~]# redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
127.0.0.1:6379> set key1 value1 #被分配到20的hash槽位上
(error) MOVED 9189 172.25.254.161:6379 
[root@server2 ~]# redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
127.0.0.1:6379> set key1 value1
OK

4.3 集群扩容

添加master-----分配卡槽-------添加slave

#添加master
[root@redis-master1 ~]# redis-cli -a 123456 --cluster add-node 
172.25.254.163:6379 172.25.254.160:6379#分配槽位
[root@server1 ~]# redis-cli -a 123456 --cluster reshard 172.25.254.160:6379从所有节点分配4096个节点
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? 009571cb206a89afa6658b60b2d403136056ac09
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#添加salve 
[root@server1 ~]# redis-cli -a 123456 --cluster add-node 
172.25.254.173:6379 172.25.254.160:6379 --cluster-slave --cluster-master-id 
009571cb206a89afa6658b60b2d403136056ac09(163的ID)clsuter集群维护 
添加节点的时候是先添加node节点到集群,然后分配槽位,删除节点的操作与添加节点的操作正好相
反,是先将被删除的Redis node上的槽位迁移到集群中的其他Redis node节点上,然后再将其删除,如
果一个Redis node节点上的槽位没有被完全迁移,删除该node的时候会提示有数据且无法删除。

 

 

4.4.集群缩容

移除slave-----移除卡槽----删除master

redis-cli -a 123456 --cluster del-node 172.25.254.173:6379 346d30e01cea68                                9839f9fd494ed185984f7b5254

 

#移除master163:
redis-cli -a 123456 --cluster del-node 172.25.254.163:6379 b8958a8d135074                                d7b9c31652461ae7430bc4dc48检查集群状态
##redis-cli -a 123456 --cluster check 172.25.254.160:6379

 

这篇关于NoSql数据库Redis集群的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109952

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

HDFS—集群扩容及缩容

白名单:表示在白名单的主机IP地址可以,用来存储数据。 配置白名单步骤如下: 1)在NameNode节点的/opt/module/hadoop-3.1.4/etc/hadoop目录下分别创建whitelist 和blacklist文件 (1)创建白名单 [lytfly@hadoop102 hadoop]$ vim whitelist 在whitelist中添加如下主机名称,假如集群正常工作的节

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是

DM8数据库安装后配置

1 前言 在上篇文章中,我们已经成功将库装好。在安装完成后,为了能够更好地满足应用需求和保障系统的安全稳定运行,通常需要进行一些基本的配置。下面是一些常见的配置项: 数据库服务注册:默认包含14个功能模块,将这些模块注册成服务后,可以更好的启动和管理这些功能;基本的实例参数配置:契合应用场景和发挥系统的最大性能;备份:有备无患;… 2 注册实例服务 注册了实例服务后,可以使用系统服务管理,

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争