如何解决数据库读写负载大的问题

一、如何解决读负载大的问题

1、如何解决

(1)为原DB增加slave数据库服务器

(2)进行读写分离,把读请求分担到slave上

2、如何实现读写分离

(1)程序里实现

(2)通过引入MyCat、MySQL Router、ProxySQL、MaxScale等数据库中间件。

 

二、如何解决写负载大的问题

1、如何解决

(1)单纯的分库分表(数据库服务器实例数量不变)

(2)引入微服务概念(数据库服务器实例数量增加)

2、单纯的分库分表

这里,单纯的分库分表指数据库实例数量不变,但是同一个数据库中的数据表分到不同数据库上,比如电商系统数据库分为库存数据库、商品数据库、订单数据库等等。

一张大表按照某种规则分为多张小表,数据的读取和写入也按照该规则分配到相应的分表中,比如订单表,分为order_1、order_2....order_12。

采取该方式,不同业务之间,比如库存和订单业务之间仍然可以进行连表查询。

3、引入微服务概念

将一个数据库分到多个数据库实例上,这些分出来的数据库分布在不同的数据库服务器实例上。

引入微服务的概念,也就是说原来一个电商系统,所有关于电商的,比如用户、库存、商品、订单、后台等都在同一个数据库服务器上,甚至都在同一个数据库内。而分离后,数据落在不同的数据库服务器实例上,比如用户数据库服务器、库存数据库服务器、商品数据库服务器等等。

采取该方式,不同业务之间,比如库存和订单业务之间不可以再连表查询,想要取得或推送其他业务模块的数据,只能通过RPC、gRPC、MQ等方式,也就是说,不同业务服务的数据完全隔离。

4、说明

在实际应用中,通常采用两种方式相结合,也就是说先将业务模块进行拆分,数据库数据表落到相应服务模块的数据库实例上,然后再将一些大表进行分表以及历史数据归档。

最后再对每个服务的数据库也做相应的数据库集群。