mysql的主从复制
![](https://img-blog.csdnimg.cn/b49e2c30ff804bfab3080b06376a64a1.png)
1、主库Master节点,接受来自客户端的增、删、改请求,通过IO-thread写入到binlog
2、从库slave节点,请求读取主库的binlog,通过IO-thread写入本地的relay log(中继日志)
3、从库通过sql-thread读取relay-log,并把其中的增删改执行一遍。
mysql的读写分离
![](https://img-blog.csdnimg.cn/a7414506cc9442f4b471a2a470f89121.png)
其中,读通过从节点读,写通过主节点写并同步到从节点,实现了读写分离
为什么需要mysql的缓存方案?
1、读多写少,内存的访问速度是磁盘访问速度的10万倍(数量级倍率),内存的访问速度⼤约是100ns,⽽⼀次磁盘访问⼤约是10ms;访问mysql时访问磁盘的次数跟b+树的⾼度相关;
2. ⼀般⼤部分项⽬中,数据库读操作是写操作的10倍左右;
缓冲层起到很好的提高读性能的作用
缓存层方案
将热点数据用redis缓存并数据库备份,将热点读操作转移到缓存数据库
可以很好的解决读性能。
引入了缓存层,如何解决一致性问题?
由以下几种情况:
1、mysql没有,缓存有
2、mysql有,缓存有,但不一致
3、mysql有,缓存没有
根据业务场景,看我们对一致性的要求:
最终一致性解决方案
如果项目想要做到最终一致性,我们的解决方案:
读:先读缓存,缓存有返回,没有则读mysql,再写redis
写:1、直接写mysql,等待mysql同步到redis
2、先写缓存redis,设置超时时间,再写mysql,最终mysql同步到redis。
强一致性解决方案
读:先读缓存,缓存存在直接返回,缓存不存在,访问mysql获取,再写redis
写:先删除缓存,再写mysql,等待mysql同步到缓存。
上面的方案,假定:mysql时最终的数据源。
同步方案
![](https://img-blog.csdnimg.cn/c6fd936b68444649b34bccd3452f691b.png)
git clone https://gitee.com/mirrors/go-mysql-transfer.git
go-mysql-transfer 实现对mysql数据同步到redis