关系型数据库&nosql
1、复杂的查询
在传统的关系型数据库中查询一个复杂的业务需要写很复杂的 sql 语句。
2、伸缩性
在传统的关系型数据库业务增大系统需要扩容只能是纵向的形式扩展.操作性能也与遇到瓶颈
3、传统数据库遵循 ACID 规则。而 Nosql 一般为分布式而分布式一般遵循 CAP 定理。
ACID
- A (Atomicity) 原子性
- C (Consistency) 一致性
- I (Isolation) 独立性
- D (Durability) 持久性
CAP
- 一致性(Consistency) (所有节点在同一时间具有相同的数据) ;
- 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
- 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)
介绍:
NoSQL 称作 Not Only SQL 的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。
nosql 分类
名称 |
存储 |
---|---|
redis | 键值对(key-value) |
Hbase | 宽列(wide cloumn) |
mongoDb | 文档(document) |
Neo4j | 图(graph) |
Redis 介绍
介绍:Redis 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
Redis 单机版
单机版三个问题:
1、内存容量有限 2、处理能力有限 3、无法高可用。
Redis 多机版
特性:1、复制(Replication)2、哨兵(Sentinel) 3、集群(Cluster)
Redis 多机版特性功能:
复制:扩展系统对于读的能力
哨兵:为服务器提供高可用特性,减少故障停机出现
集群: 扩展内存容量,增加机器,提高性能读写能力和存储以及提供高可用特性
复制
Redis 的复制(replication)功能允许用户根据一个 Redis 服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器(master),而通过复制创建出来的服务器复制品则为从服务器(slave)。只要主从服务器之间的网络连接正常,主从服务器两者会具有相同的数据,主服务器就会一直将发生在自己身上的数据更新同步 给从服务器,从而一直保证主从服务器的数据相同。
特点:
- master/slave 角色
- master/slave 数据相同
- 降低 master 读压力在转交从库
问题:
- 无法保证高可用
- 没有解决 master 写的压力
哨兵
Redis sentinel 是一个分布式系统中监控 redis 主从服务器,并在主服务器下线时自动进
行故障转移。其中三个特性:
- 监控(Monitoring ): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
- 提醒(Notification ): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
- 自动故障迁移(Automatic failover ): 当一个主服务器不能正常工作时, Sentinel会开始一次自动故障迁移操作。
特点:
- 保证高可用
- 监控各个节点
- 自动故障迁移
缺点:
- 主从模式,切换需要时间丢数据(重新选举出master需要时间)
- 没有解决 master 写的压力
集群(proxy 型)
Twemproxy 是一个 Twitter 开源的一个 redis 和 memcache 快速/轻量级代理服务器;
Twemproxy 是一个快速的单线程代理程序,支持 Memcached ASCII 协议和 redis 协议。
特点:
- 多种 hash 算法:MD5、CRC16、CRC32、CRC32a、hsieh、murmur、Jenkins
- 支持失败节点自动删除
- 后端 Sharding 分片逻辑对业务透明,业务方的读写方式和操作单个 Redis 一致
缺点:
- 增加了新的 proxy,需要维护其高可用。
- failover 逻辑需要自己实现,其本身不能支持故障的自动转移
- 可扩展性差,进行扩缩容都需要手动干预
集群(直连型3.0版本之后才支持):
特点:
- 无中心架构(不存在哪个节点影响性能瓶颈),少了 proxy 层。
- 数据按照 slot 存储分布在多个节点,节点间数据共享,可动态调整数据分布。
- 可扩展性,可线性扩展到 1000 个节点,节点可动态添加或删除。
- 高可用性,部分节点不可用时,集群仍可用。通过增加 Slave 做备份数据副本
- 实现故障自动 failover,节点之间通过 gossip 协议交换状态信息,用投票机制完成 Slave到 Master 的角色提升。
缺点:
- 资源隔离性较差,容易出现相互影响的情况。
- 数据通过异步复制,不保证数据的强一致性