顺便说下,如果 mysql 也水平扩展的话,那事务,锁怎么处理?以前可能都在单台 web 服务器加锁或者加事务,但是水平扩展有多台了,就锁不住了。大家都是怎么一个方案?
事务肯定不能用 mysql 自带的了,哪个事务只支持单个数据库内部事务。 拆分要重新设计表结构,以及业务流程,设置重新设计数据库,避免跨库事务,如果非要跨的话,需要自己写代码来保证数据的一致性。
关系型数据库在水平扩展上都非常痛苦,不是一句话两句话能说清楚的。
方案一是 MySQL 的复制,一个 Master 数据库,多个 Salve,然后利用 MySQL 的异步复制能力实现读写分离,这个方案目前应用比较广泛,但是不怎么好玩。
方案二是 MySQL 的 Sharding 策略,很不巧的是 MySQL 在设计之初就没有考虑过很好的支持自动 Sharding。特别是构建一个自动基于应用的数据分区和负载均衡,以及单点故障处理等等,用 MySQL 实现 Sharding 的话,Sharding 逻辑在你的应用内手动实现的并维护,要手动 Sharding 非常不容易,而且规划好避免每个单机 MySQL 实例的负载过重,以及不同 Sharding 中的数据迁移相当费事,可谓困难重重。这些在后面发展起来的 NoSQL 就处理的很好,比如 MongoDB,甚至自动 Sharding 成了 MongoDB 的核心功能。