关于读写分离和数据同步

读写分离还能理解,就是两个数据库,一个读一个写,可是写了以后怎么数据同步额,代码能控制吗

阅读 11.1k
5 个回答

代码能控制吗?

代码当然是可以控制的。控制其实主要是两个库的同步的问题,而主要需要同步的操作是写操作,大概办法是:

  • 在写入数据库时,同时将sql语句,推入到一个队列
  • 有专门的进程,负责从队列中取出数据,然后写入到负责读操作的数据库

当然,这个过程,你还得保证操作失败后怎么办之类。还是比较麻烦的。

怎么数据同步?

其实有专门的解决方法。大多数的数据库都支持主从。专门负责你这类需要,即读写分离,主和从之间的数据同步之类。不同数据库,配置不大一样,但都不太麻烦——至少比你自己在代码中实现简单得多,也比一般的代码实现要靠谱得多。

几个主流数据库的解决方案:

对于中小的解决方案,都推荐使用第二类——即数据库已有的主从同步。

mysql 支持master - slave 模式,通过配置mysql就可以实现自动同步,不需要在应用代码层面上实现。master库用于写,slave库用于读。正常情况下两个数据库的同步是十分及时的,有些情况可能会出现写入或更新一条记录,然后无法读取出来或老的,对于那些实时性要求很高的地方,可能读也需要操作master 库。

读写分离这个场景,以主-从为例。
那么,你的问题是代码能控制吗?
1、如果主、从在一个库里
那么用事务包起来,做双写。
2、主、从不在一个库里,甚至是异地机房
那么双写是不可以的,因为不能用事务,会造成一致性上的问题。那么就需要用一些一致性的协议来解决这些问题,例如mysql的主从同步,或者是像阿里开源的canal伪装slave的这种拉取binlog解析,自己做处理的。总之代码一定是非常复杂,并且需要很多一致性中间件来解决。

数据同步可以通过数据库本身的支持,比如mysql的master、slave主从;也可以使用另外的工具,比如oracle的goldengate工具同步。
本质上,应该都是通过执行sql语句的归档日志,把相同的sql在另一个数据库执行,来进行同步的。

MySQL配置好主从后,MySQL会自己使用binlog进行主从同步,不需要额外写代码干预。

对于没有主从机制的数据库,比如PHP内置的SQLite,要实现主从同步,则可以自己用代码控制。思路就是在写操作的时候,程序连接主数据库和从数据库,分别往这两个数据库实例写入同一份数据。

比如用PHP实现SQLite主从和内存数据库思路:
磁盘放一个/png/data.db3作为主数据库,内存放一个/run/shm/app/data.db3作为从数据库和内存数据库.写操作时分别写入/run/shm/app/data.db3和/png/data.db3(实现同步),读操作时访问/run/shm/app/data.db3,速度更快./run/shm/app/data.db3可以看做是缓存,先把数据写入缓存能保证及时读到最新的数据.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏