QPS:
  • QPS = 100

    • 用你的笔记本做Web服务器就好
  • QPS = 1k

    • 用一台好点的Web服务器就差不多了
    • 需要考虑Single Point Failure
  • QPS = 1m

    • 需要建设一个1000台Web服务器的集群
    • 需要考虑如何Maintainance(某一台挂了怎么办)
QPS和Web Server (服务器) / Database (数据库)之间的关系
  • 一台Web Server约承受量是1k的QPS(考虑到逻辑处理时间以及数据库查询的瓶颈)

  • 一台SQL Database (MySQL / PosgreSQL) 约承受量是1k的QPS(如果JOIN和INDEX query比较多的话,这个值会更小)

  • 一台NoSQL Database (Cassandra / MongoDB) 约承受量是10k的QPS

  • 一台NoSQL Database (Memcached / Redis) 约承受量是1M的QPS


SQL vs NoSQL

  • easy configuration for scale such as replica and sharding? -> NoSQL

  • high scalability and concurrency -> NoSQL

  • high performance with little machine? -> NoSQL

    • NoSQL support higher QPS for single machine (>10x)
    • 不過在 multiple machines 的情況下, 可對 SQL 去作 sharding & replicas 來增加其 performace 和 availability/reliability. 這邊甚至可混用 cosistent hashing 的架構來作 SQL sharding/replication. 也就是說, 在多台機器可用的環境下, CF NoSQL 和 SQL 的效能是可以作到差不多的.
  • Data 非常不 relational (require no join or few joins)? -> NoSQL

  • Data is unstructural or semi-structural -> NoSQL

  • need transaction, ACID? -> SQL

  • Date 非常 relational (require lots of joins) 或有大量的 columns 要作 index -> SQL

    • 這時用 CF NoSQL 可能要處理大量的 de-normalization, 雖然 disk 便宜, 但 duplicated data 太多的話可能也會爆容量? 而且 update 時要處理 de-norm data 間 consistency 的問題. (reference: http://www.jiuzhang.com/qa/1836/

  • 是否需要支持Transaction?
    • NoSQL不支持Transaction
  • 是否需要丰富的SQL Query?

    • NoSQL的SQL Query不是太丰富
    • 也有一些NoSQL的数据库提供简单的SQL Query支持
  • 是否想偷懒?

    • 大多数Web Framework与SQL数据库兼容得很好•用SQL比用NoSQL少写很多代码
  • 是否需要Sequential ID?

    • SQL为你提供了auto-increment的Sequential ID •也就是1,2,3,4,5 ...
    • NoSQL的ID并不是Sequential的
  • 对QPS的要求有多高?

    • NoSQL的性能更高
  • 对Scalability的要求有多高?
    • SQL需要码农自己写代码来Scale
    • NoSQL这些都帮你做了

Consistent Hashing
  • HashKey mod n,
    • when n ~ number of machines -> inconsistent hash
    • when n is constant, not related to number of machines -> consistent hash
  • Hash Ring: n = 0 ~ 2^64-1
  • 1 physical machine -> 1000 virtual nodes

Backup vs Replica

Backup

  • 一般是周期性的,比如每天晚上进行一次备份

  • 当数据丢失的时候,通常只能恢复到之前的某个时间点

  • Backup不用作在线的数据服务,不分摊读

Replica

  • 是实时的, 在数据写入的时候,就会以复制品的形式存为多份

  • 当数据丢失的时候,可以马上通过其他的复制品恢复

  • Replica用作在线的数据服务,分摊读

SQL Replica

  • "自带”的Replica方式是Master Slave
    • write ahead log: master and slave use log to sync and restore
    • master fail: promote slave to be master
  • "手动”的Replica方式也可以在Consistent Hashing环上顺时针存三份

NoSQL Replica

  • "自带”的Replica方式就是Consistent Hashing环上顺时针存三份
  • "手动”的Replica方式:就不需要手动了,NoSQL就是在Sharding和Replica上帮你偷懒用的!

results matching ""

    No results matching ""