谈谈个人网站的建立(六)—— 数据库同步

先来回顾一下上一篇的小集群架构,tomcat集群,nginx进行反向代理,服务器异地:

由上一篇讲到,部署的时候,将war部署在不同的服务器里,通过spring-session实现了session共享,基本的分布式部署还算是完善了点,但是想了想数据库的访问会不会延迟太大,毕竟一个服务器在北京,一个在深圳,然后试着ping了一下:

果然,36ms。。。看起来挺小的,但是对比一下sql执行语句的时间:

大部分都能在10ms内完成,而最长的语句是insert语句,可见,由于异地导致的36ms延时还是比较大的,捣鼓了一下,最后还是选择换个架构,每个服务器读取自己的数据库,然后数据库底层做一下主主复制,让数据同步。最终架构如下:

一、MySql的复制

数据库复制的基本问题就是让一台服务器的数据与其他服务器保持同步。MySql目前支持两种复制方式:基于行的复制和基于语句的复制,这两者的基本过程都是在主库上记录二进制的日志、在备库上重放日志的方式来实现异步的数据复制。其过程分为三步: (1)master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events); (2)slave将master的binary log events拷贝到它的中继日志(relay log); (3)slave重做中继日志中的事件,将改变反映它自己的数据。

该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。 下一步就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。 SQL slave thread处理该过程的最后一步。SQL线程从中继日志读取事件,更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。 此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。 MySql的基本复制方式有主从复制、主主复制,主主复制即把主从复制的配置倒过来再配置一遍即可,下面的配置则是主从复制的过程,到时候可自行改为主主复制。其他的架构如:一主库多备库、环形复制、树或者金字塔型都是基于这两种方式,可参考《高性能MySql》。

二、配置过程

2.1 创建所用的复制账号

由于是个自己的小网站,就不做过多的操作了,直接使用root账号

2.2 配置master

接下来要对mysql的serverID,日志位置,复制方式等进行操作,使用vim打开my.cnf。

[client]default-character-set=utf8[mysqld]character_set_server=utf8init_connect= SET NAMES utf8datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.socksymbolic-links=0log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid# masterlog-bin=mysql-bin# 设为基于行的复制binlog-format=ROW# 设置server的唯一idserver-id=2# 忽略的数据库,不使用备份binlog-ignore-db=information_schemabinlog-ignore-db=clusterbinlog-ignore-db=mysql# 要进行备份的数据库binlog-do-db=myblog

重启Mysql之后,查看主库状态,show master status。

其中,File为日志文件,指定Slave从哪个日志文件开始读复制数据,Position为偏移,从哪个POSITION号开始读,Binlog_Do_DB为要备份的数据库。

2.3 配置slave

从库的配置跟主库类似,vim /etc/my.cnf配置从库信息。

[client]default-character-set=utf8[mysqld]character_set_server=utf8init_connect= SET NAMES utf8datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.socksymbolic-links=0log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid# slavelog-bin=mysql-bin# 服务器唯一idserver-id=3# 不备份的数据库binlog-ignore-db=information_schemabinlog-ignore-db=clusterbinlog-ignore-db=mysql# 需要备份的数据库replicate-do-db=myblog# 其他相关信息slave-skip-errors=allslave-net-timeout=60# 开启中继日志relay_log         = mysql-relay-bin# log_slave_updates = 1# 防止改变数据read_only         = 1

重启slave,同时启动复制,还需要调整一下命令。

mysql> CHANGE MASTER TO MASTER_HOST = '119.23.46.71', MASTER_USER = 'root', MASTER_PASSWORD = 'helloroot', MASTER_PORT = 3306, MASTER_LOG_FILE = 'mysql-bin.000009', MASTER_LOG_POS = 346180;

可以看见slave已经开始进行同步了。我们使用show slave status\G来查看slave的状态。

其中日志文件和POSITION不一致是合理的,配置好了的话,即使重启,也不会影响到主从复制的配置。

某天在Github上漂游,发现了阿里的canal,同时才知道上面这个业务是叫异地跨机房同步,早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求。不过早期的数据库同步业务,主要是基于trigger的方式获取增量变更,不过从2010年开始,阿里系公司开始逐步的尝试基于数据库的日志解析,获取增量变更进行同步,由此衍生出了增量订阅&消费的业务。下面是基本的原理:

原理相对比较简单:

1.canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议 2.mysql master收到dump请求,开始推送binary log给slave(也就是canal) 3.canal解析binary log对象(原始为byte流)

其中,配置过程如下:https://github.com/alibaba/canal,可以搭配Zookeeper使用。在ZKUI中能够查看到节点:

一般情况下,还要配合阿里的另一个开源产品使用otter,相关文档还是找找GitHub吧,个人搭建完了之后,用起来还是不如直接使用mysql的主主复制,而且异地机房同步这种大企业才有的业务。

公司又要996了,实在是忙不过来,感觉自己写的还是急躁了点,困==

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Spring相关

Spring Security OAuth 2开发者指南译

这是用户指南的支持OAuth 2.0。对于OAuth 1.0,一切都是不同的,所以看到它的用户指南。

551
来自专栏尹磊的专栏

巧用 Nginx 的 geo 模块来记录地理信息

Nginx 提供了 GeoIP 来记录来源 IP 的地理位置信息,但 GeoIP 所依赖的 IP 库是收费项目,免费的模块只能区分国家信息,不大适合在线上使用。

4550
来自专栏Java技术分享

Dubbo详细介绍与安装使用过程

1 Dubbo介绍 1.1 dubbox简介 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟...

2948
来自专栏西枫里博客

阿里短信通知的接入与实现(二)暨云通信短信平台API接口调用

事情变化太快,上线还不到一个月的注册短信验证功能就遇到了平台搬家的尴尬。阿里云发了一个邮件通知。原淘宝短信和阿里云市场短信将迁移到云通信平台,自2018年1月2...

703
来自专栏张戈的专栏

解决Tomcat数据连接池无法释放

近段时间,公司的检测中心报表系统(SMC)的开发人员时不时找到我,说用户老是出现无法登录的情况。前些日子因为手头上有 Jboss 集群的测试工作,发现用户不能登...

2939
来自专栏牛客网

腾讯OMG后台开发面经

2300
来自专栏程序员宝库

手把手教会你小程序登录鉴权

为了方便小程序应用使用微信登录态进行授权登录,微信小程序提供了登录授权的开放接口。乍一看文档,感觉文档上讲的非常有道理,但是实现起来又真的是摸不着头脑,不知道如...

1635
来自专栏Java技术分享

Dubbo详细介绍与安装使用过程

随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

4655
来自专栏杨建荣的学习笔记

初探Redis

大概在2010年的时候,有一次和一个同事聊天,那个时候知道了Redis,对于技术的追随至今,还没有下载一个Redis版本玩玩, 只有1万多行代码,以性...

4039
来自专栏有趣的Python

18- vue django restful framework 打造生鲜超市 -pycharm远程代码调试

Django2.0.2(Django-rest-framework)以及前端vue开发的前后端分离的商城网站 线上演示地址: http://vueshop.mt...

3809

扫描关注云+社区