企业级NoSql数据库Redis集群

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)、RDBMSNOSQL的特点及优缺点

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值