Contents

分布式Mysql

大数据量下,数据库的性能优化

  • 常说的方向有水平拆分,垂直拆分;水平扩展,垂直扩展

垂直方向

  • 强调的是对于个体性能的优化

垂直扩展

  • 就是更换性能更强的服务器

垂直拆分

  • 在需求方面,设计一张表,即使满足了三范式,也可能分成经常使用的字段和不经常使用的字段,不经常使用的字段可以单独拿出来做一张附属表;
  • 对功能模块的划分,在表层面,比如,可以分成用户表,商品表之类的;这是在建表的时候就应该考虑好的东西;
  • 在数据库层面,创建独立的用户库,商品库;这是将功能进行细化。

水平方向

  • 强调的是对于资源的累计

水平扩展

  • 就是添加更多的服务器

水平拆分

  • 在表层面,对于一个有较好设计的表,在达到一定的数据量后,可以实行分区,分表操作;
  • 在数据库层面,可以实行分库操作;
  • 这些扩展的东西的业务功能是与原先一致的,字段是完全的一致的

优化大数据量的时机

  • 先是合理地设计每张表,做好查询缓存;
  • 然后是主从数据库,读写分离,一主多从,主库负责写,从库负责读;
  • 之后才是垂直方向,再是水平方向;

一些问题

跨节点连表,跨节点分页,跨节点聚合

  • 多次查询,取出所有数据,再进行查询排序等操作

全局唯一键

  • Twitter 的 Snowflake(又名“雪花算法”),这种方案把64-bit分别划分成多段,分开来标示机器、时间等
  • Redis生成ID,这主要依赖于Redis是单线程的,所以也可以用生成全局唯一的ID。可以用Redis的原子操作 INCR和INCRBY来实现。
  • zookeeper生成唯一ID,zookeeper主要通过其znode数据版本来生成序列号,可以生成32位和64位的数据版本号,客户端可以使用这个版本号来作为唯一的序列号。
  • 美团分布式ID生成开源项目:Leaf

分布式事务

选择更换数据库,那些本身就是分布式的数据库

coffee