作者:北城码农Alex
互联网公司只有解决分布式数据存储的问题,才能支撑更多次亿级用户的涌入。
1、MySQL复制:
包括主从复制和主主复制;
2、数据分片:
数据分片的原理、分片的方案、分片数据库的扩容;
3、数据库分布式部署的几种方案。
一、MySQL复制
1.1、MySQL的主从复制
当应用程序客户端发送一条更新命令到数据库的时候,数据库会把这条更新命令同步记录到Binlog中,然后由另外一个线程从Binlog中读取这条日志,然后通过远程通讯的方式将它复制到从服务器上面去,从服务器获得这条更新日志后,将其加入到自己的Relay log中,然后由另外一个SQL执行线程从Relay log中读取这条新的日志,并把它在本地的数据库中重新执行一遍。
1.2、MySQL的一主多从复制
通过执行日志,让每个从数据库的数据都和主数据库上的数据保持了一致。
这里面的数据更新操作表示的是所有数据库的更新操作,除了不包括SELECT之类的查询读操作,其他的INSERT、DELETE、UPDATE这样的DML写操作,以及CREATE TABLE、DROPT ABLE、ALTER TABLE等DDL操作也都可以同步复制到从数据库上去。
1.3、一主多从复制的优点
也可能会导致整个数据中心的数据服务器都丢失。
所以通常说来很多公司会对数据做冷备,但是进行冷备的时候有一个困难点在于,数据库如果正在进行写操作,冷备的数据就可能不完整,数据文件可能处于损坏状态。
使用一主多从的复制就就可以实现零停机时间的备份。
只需要关闭数据的数据复制进程,文件就处于关闭状态了,然后进行数据文件拷贝,拷贝完成后再重新打开数据复制就可以了。
当这台服务器恢复的时候,重新发请求到这台服务器。
所以,在一主多从的情况下,某一台从服务器宕机不可用,对整个系统的影响是非常小的。
1.4、MySQL的主主复制
所谓的主主复制方案是指两台服务器都当作主服务器,任何一台服务器上收到的写操作都会复制到另一台服务器上。
然后Binlog会将数据日志同步到主服务器B,写入到主服务器的Relay log中,然后执Relay log,获得Relay log中的更新日志,执行SQL操作写入到数据库服务器B的本地数据库中。
B服务器上的更新也同样通过Binlog复制到了服务器A的Relay log中,然后通过Relay log将数据更新到服务器A中。
主主复制可以提高系统的写可用,实现写操作的高可用。
1.5、MySQL的主主失效恢复
当主服务器A失效的时候,写操作会被发送到主服务器B中去,数据从B服务器复制到A服务器。
同步完成后系统才能恢复正常。
这个时候B服务器是用户的主要访问服务器,A服务器当作备份服务器。
1.6、MySQL复制注意事项
如果要对表结构进行更新,应该由运维工程师DBA对所有主从数据库分别手工进行数据表结构的更新操作。
二、数据分片
如果我们数据库的写操作也有大量的并发请求需要满足,或者是我们的数据表特别大,单一的服务器甚至连一张表都无法存储。
解决方案就是数据分片。
2.1、数据分片介绍
-
a.主要目标:将一张数据表切分成较小的片,不同的片存储到不同的服务器上面去,通过分片的方式使用多台服务器存储一张数据表,避免一台服务器记录存储处理整张数据表带来的存储及访问压力。
-
b.主要特点:数据库服务器之间互相独立,不共享任何信息,即使有部分服务器故障,也不影响整个系统的可用性。
第二个特点是通过分片键定位分片,也就是说一个分片存储到哪个服务器上面去,到哪个服服务器上面去查找,是通过分片键进行路由分区算法计算出来的。
在SQL语句里面,只要包含分片键,就可以访问特定的服务器,而不需要连接所有的服务器,跟其他的服务器进行通信。
-
c.主要原理:将数据以某种方式进行切分,通常就是用刚才提到的分片键的路由算法。
通过分片键,根据某种路由算法进行计算,使每台服务器都只存储一部分数据。
2.2、硬编码实现数据分片
假设我们的数据库将数据表根据用户ID进行分片,分片的逻辑是用户ID为奇数的数据存储在服务器2中,用户ID为偶数的数据存储在服务器1中。
那么,应用程序在编码的时候,就可以直接通过用户ID进行哈希计算,通常是余数计算。
如果余数为奇数就连接到服务器2上,如果余数为偶数,就连接到服务器1上,这样就实现了一张用户表分片在两个服务器上。
一个简单的解决办法就是将映射关系存储在外面。
2.3、映射表外部存储
在这个例子中,用户ID=33查找服务器是2,用户ID=94查找服务器也是2,它们根据查找到的用户服务器的编号,连接对应的服务器,将数据写入到对应的服务器分片中。
2.4、数据分片的挑战及解决方案
Mycat是一个专门的分布式数据库中间件,应用程序像连接数据库一样的连接Mycat,而数据分片的操作完全交给了Mycat去完成。
那么,当我们执行一个查询操作”select * from orders where prov=‘wuhan’“的时候,Mycat会根据分片规则将这条SQL操作路由到dn1这个服务器节点上。
dn1执行数据查询操作返回结果后,Mycat再返回给应用程序。
通过使用Mycat这样的分布式数据库中间件,应用程序可以透明的无感知的使用分片数据库。
同时,Mycat还一定程度上支持分片数据库的联合join查询以及数据库事务。
2.5、分片数据库扩容伸缩
但是随着数据的不断增长,可能需要增加第三个第四个第五个甚至更多的服务器。
在增加服务器的过程中,分片规则需要改变。
分片规则改变后,以前写入到原来的数据库中的数据,根据新的分片规则,可能要访问新的服务器,所以还需要进行数据迁移。
因此在实践中通常的做法是数据分片使用逻辑数据库,也就是说一开始虽然只需要两个服务器就可以完成数据分片存储,但是依然在逻辑上把它切分成多个逻辑数据库。
具体的操作办法,本文不用大篇幅进行阐述了。
三、数据库部署方案
3.1、单一服务和单一数据库
应用服务器可能有多个,但是它们完成的功能是单一的功能。
多个完成单一功能的服务器,通过负载均衡对外提供服务。
它们只连一台单一数据库服务器,这是应用系统早期用户量比较低的时候的一种架构方法。
3.2、主从复制实现伸缩
通过主从复制,实现一主多从。
应用服务器的写操作连接主数据库,读操作从从服务器上进行读取。
3.3、两个Web服务及两个数据库
数据的业务分库是一种逻辑上的,是基于功能的一种分割,将不同用途的数据表存储在不同的物理数据库上面去。
每个数据库依然使用主从复制。
通过业务分库的方式,在同一个系统中,提供了更多的数据库存储,同时也就提供了更强大的数据访问能力,同时也使系统变得更加简单,系统的耦合变得更低。
3.4、综合部署方案
比如说类目数据库,也许通过主从复制就能够满足所有的访问要求。
但是如果用户量特别大,进行主从复制或主主复制,还是不能够满足数据存储以及写操作的访问压力,这时候就就可以对用户数据库进行数据分片存储了。
同时每个分片数据库也使用主从复制的方式进行部署。
但是NoSQL数据库因为CAP原理的约束可能会遇到数据不一致的问题。
解决数据不一致的问题,可以通过时间戳合并、客户端判断以及投票这样的几种机制解决,实现最终一致性。
荐
阅
读
1. Java 实现 QQ 登陆
2. 在阿里干了 5 年,面试个小公司挂了…
3. 如何写出让同事无法维护的代码?
4. 史上最烂的项目:苦撑12年,600 多万行代码 ...
在看
本文分享自微信公众号 - Java后端(web_resource)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
相关文章
暂无评论...