读写分离还能理解,就是两个数据库,一个读一个写,可是写了以后怎么数据同步额,代码能控制吗
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可以看做是缓存,先把数据写入缓存能保证及时读到最新的数据.
2 回答1.2k 阅读✓ 已解决
1 回答1.5k 阅读
1 回答1k 阅读
1 回答463 阅读
代码能控制吗?
代码当然是可以控制的。控制其实主要是两个库的同步的问题,而主要需要同步的操作是写操作,大概办法是:
当然,这个过程,你还得保证操作失败后怎么办之类。还是比较麻烦的。
怎么数据同步?
其实有专门的解决方法。大多数的数据库都支持主从。专门负责你这类需要,即读写分离,主和从之间的数据同步之类。不同数据库,配置不大一样,但都不太麻烦——至少比你自己在代码中实现简单得多,也比一般的代码实现要靠谱得多。
几个主流数据库的解决方案:
对于中小的解决方案,都推荐使用第二类——即数据库已有的主从同步。