这是我参与12月更文挑战的第27天,活动详情查看:2021最后一次更文挑战
近些年来,随着各种存储技术飞速发展,出现了很多的存储方案,但是关系数据库由于其acid(持久性、一致性、隔离性、原子性)的特性和强大的sql查询依然占据了主流的位置,因为很多高性能设计的核心部分就是关系数据库的设计。
由于业务的飞速发展,导致单机数据库已经无法满足需求,必须考虑数据库集群来满足需求。高性能数据库集群的常见优化方式就是读写分离与分库分表。
读写分离
读写分离的本质就是将访问的压力分散到集群中的多个节点,但是没有分担存储的压力。
读写分离的基本实现:
-
数据库服务器搭建主从集群
-
主服务器负责读写,从机只负责读
-
主服务器通过复制将数据同步到从机,每台数据服务器存储所有数据
-
业务需要将写请求发到主机、读请求发到从机
需要重点关注的主从复制延迟与分配机制
解决主从复置延迟的常见方案:
-
读从机失败后读一次主机,这样会大大增加主机的请求量
-
写完后的请求发送到主机,这个需要在上游业务处实现,耦合业务
-
关键业务指向主机,非关键业务由从机分担
分配机制指的是如何分配请求,确保读读请求发到从服务器,写请求发送到主服务器,常见有两种方案:
-
程序代码封装,在代码中抽奖出一个数据访问层,实现读写操作分离和与数据库链接的管理。优点是简单方便,缺点是与语言相关,不够通用。
-
中间件封装,即开发专门的中间件系统用来实现与数据库的管理。优点是支持多种编程语言,可以实现业务对服务的无感知,极大降低业务成本,缺点也显而易见,就是成本很高!
综合来说,读写分离适用的场景是单机无法支撑且读比写多的场景,且读写分离后能够针对读写场景进行优化,如表加索引。如果通过缓存等技术优化能够满足,没必要引入。