DBproxy
通过引入数据访问中间件,可以实现对应用透明的分库分表。一个比较好的实践是:逻辑拆分先一步到位,物理拆分慢慢进行。以账户表为例,将用户ID的末两位作为分片维度,可以在逻辑上将数据分成100份,一次性拆到100个分表中。这100个分表可以先位于同一个物理库中,随着系统的发展,逐步拆成2个、5个、10个,乃至100个物理库。数据访问中间件会屏蔽表与库的映射关系,应用层不必感知。
单元化有几个重要的设计原则:
- 核心业务必须是可分片的
- 必须保证核心业务的分片是均衡的,比如支付宝用用户ID作分片维度
- 核心业务要尽量自包含,调用要尽量封闭
- 整个系统都要面向逻辑分区设计,而不是物理部署
数据库的读写操作需要有数据库连接池来保障系统稳定性,因此数据库读写接口仍需要c server来承担(也可以是go等其它有连接池功能的server)。
原因:业务层是不能直连数据库的,连接的是dbproxy,由dbproxy去连接数据库。然而dbproxy层并不具备完善的连接池功能,当请求数突增,比如秒杀场景时,短时产生的大量dbproxy连接请求,超过dbproxy最大连接数配置后,请求会被直接拒绝,造成业务失败。因此我们需要一个连接池功能,能暂存突增的连接请求排队消费。c server基于yapserver框架的多线程模型,在c server启动时就与dbproxy建好了长连接,因此c server到dbproxy层不需要担心连接数问题。当PHP层连接数突增时,基于yapserver框架的c server能够先把请求接下来并排队,而不是直接拒绝请求,这样业务系统更加稳定。