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