保证一致性的做法就是用某种分布式协议一致性来做:
①.、SAGA或者TCC - 这两种需要业务代码的大量配合.通过业务代码来补偿一致性.
redis在启动之后,从数据库加载数据.
读请求:
不要求强一致性的读请求,走redis,要求强一致性的直接从mysql读取
写请求:
数据首先都写到数据库,之后更新redis(先写redis再写mysql,如果写入失败事务回滚会造成redis中存在脏数据)
在并发不高的情况下,读操作优先读取redis,不存在的话就去访问MySQL,并把读到的数据写回Redis中;写操作的话,直接写MySQL,成功后再写入Redis(可以在MySQL端定义CRUD触发器,在触发CRUD操作后写数据到Redis,也可以在Redis端解析binlog,再做相应的操作)
在并发高的情况下,读操作和上面一样,写操作是异步写,写入Redis后直接返回,然后定期写入MySQL
解决方法:
这种情况应该是先删除缓存,然后在更新数据库,如果删除缓存失败,那就不要更新数据库,如果说删除缓存成功,而更新数据库失败,那查询的时候只是从数据库里查了旧的数据而已,这样就能保持数据库与缓存的一致性.
①.、读请求时长阻塞
由于读请求进行了非常轻度的异步化,所以一定要注意读超时的问题,每个读请求必须在超时间内返回,该解决方案最大的风险在于可能数据更新很频繁,导致队列中挤压了大量的更新操作在里面,然后读请求会发生大量的超时,最后导致大量的请求直接走数据库,像遇到这种情况,一般要做好足够的压力测试,如果压力过大,需要根据实际情况添加机器.
这里还是要做好压力测试,多模拟真实场景,并发量在最高的时候QPS多少,扛不住就要多加机器,还有就是做好读写比例是多少
可能这个服务部署了多个实例,那么必须保证说,执行数据更新操作,以及执行缓存更新操作的请求,都通过nginx服务器路由到相同的服务实例上
某些商品的读请求特别高,全部打到了相同的机器的相同丢列里了,可能造成某台服务器压力过大,因为只有在商品数据更新的时候才会清空缓存,然后才会导致读写并发,所以更新频率不是太高的话,这个问题的影响并不是很大,但是确实有可能某些服务器的负载会高一些.
img
搜索微信号(ID:芋道源码),可以获得各种 Java 源码解析.
并且,回复【书籍】后,可以领取笔者推荐的各种 Java 从入门到架构的书籍.
因为自己项目中需要用到mysql数据同步到es中,查找了相关资料最后决定用canal来做,所以便有了本文,下面一起来看如何使用canal吧
根据 上的原理解释,我们知道 canal 会模拟 mysql slave 的交互协议,伪装自己为 mysql slave,然后向 mysql master 发送 dump 协议.
mysql master 收到 dump 请求,开始推送 binary log 给 slave(也就是 canal),然后 canal 解析 binary log 对象(原始为 byte流).
经 canal 解析过的对象,我们使用起来就非常的方便了.
然后修改 canal 的配置文件 vim conf/example/instance.properties
这三项改成你自己的,比如我的配置如下:
然后保存并退出.(VI 模式下,按 Esc 输入 :wq 回车退出.)
接着,我们检查一下 MySQL 的配置.确定版本和是否开启了 binlog 日志,以及日志格式.
canal 支持 binlog 格式为 ROW 的模式.如果你没开启 binlog,并且格式是非 row 的,建议修改一下 mysql 的配置文件.
执行 mysql –help | grep my.cnf 找到 mysql 的 my.cnf 文件.
然后保存并退出.
接着执行 sudo service mysqld restart 重启 MySQL.
需要注意的是你的 mysql 用户,必须要有 REPLICATION SLAVE 权限.该权限授予 slave 服务器以该账户连接 master 后可以执行 replicate 操作的权利.
如果没有权限,则使用 root 账户登录进 MySQL,执行下面的语句,创建用户,分配权限.
MySQL 启动后,就可以开启 canal 服务了.
开启后,观察 canal 服务的日志,确保服务正常.
查看 canal 的日志
确定没有问题后,开始编写我们的测试程序.
pom.xml 中导入下面的依赖.
使用JAVA进行测试
放入服务器中,依次执行下面命令
然后修改配置文件 :
然后将需要运行存储到es的的yml文件放入到
目录下.例如:
然后开启canal-adapter服务
/usr/local/soft/canal-adapter/bin/startup.sh
查看 canal-adapter 的日志,确定没有问题后修改数据 就可以同步到es了
注意:
加了一个判断后才可以
可以根据各自情况修改.
以上就是土嘎嘎小编为大家整理的怎么保证es跟mysql一致相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!