分布式Mysql
Contents
大数据量下,数据库的性能优化
- 常说的方向有水平拆分,垂直拆分;水平扩展,垂直扩展
垂直方向
- 强调的是对于个体性能的优化
垂直扩展
- 就是更换性能更强的服务器
垂直拆分
- 在需求方面,设计一张表,即使满足了三范式,也可能分成经常使用的字段和不经常使用的字段,不经常使用的字段可以单独拿出来做一张附属表;
- 对功能模块的划分,在表层面,比如,可以分成用户表,商品表之类的;这是在建表的时候就应该考虑好的东西;
- 在数据库层面,创建独立的用户库,商品库;这是将功能进行细化。
水平方向
- 强调的是对于资源的累计
水平扩展
- 就是添加更多的服务器
水平拆分
- 在表层面,对于一个有较好设计的表,在达到一定的数据量后,可以实行分区,分表操作;
- 在数据库层面,可以实行分库操作;
- 这些扩展的东西的业务功能是与原先一致的,字段是完全的一致的
优化大数据量的时机
- 先是合理地设计每张表,做好查询缓存;
- 然后是主从数据库,读写分离,一主多从,主库负责写,从库负责读;
- 之后才是垂直方向,再是水平方向;
一些问题
跨节点连表,跨节点分页,跨节点聚合
- 多次查询,取出所有数据,再进行查询排序等操作
全局唯一键
- Twitter 的 Snowflake(又名“雪花算法”),这种方案把64-bit分别划分成多段,分开来标示机器、时间等
- Redis生成ID,这主要依赖于Redis是单线程的,所以也可以用生成全局唯一的ID。可以用Redis的原子操作 INCR和INCRBY来实现。
- zookeeper生成唯一ID,zookeeper主要通过其znode数据版本来生成序列号,可以生成32位和64位的数据版本号,客户端可以使用这个版本号来作为唯一的序列号。
- 美团分布式ID生成开源项目:Leaf
分布式事务
- mysql自带的XA提交
- dtm,可参考:分布式事务最经典的七种解决方案