mmm < mgr < mha < qmha < pxc < 双master < 主从
理论:
假如两台mysql,一主一从,能否保证数据一致性?;我想到有两种方法;一种是通过主库开启无损复制,写的过程中必须确保日志先到达备(从)库,缺点备库挂了,导致主库无法写入;一种是开启gtid和gtid_trace,每次执行sql除了query的操作,查询最新的(gtid或者gtid_execulted)返回给应用,应用将最新的(gtid或者gtid_execulted)存储到(redis上或者zk上),然后通过 引入 zk分布式定时任务框架,定时检查备库gtid_execulted的值是否包含。缺点是:要部署分布式zk应用,引入zk分布式定时任务,native或workbeanch的sql增删改操作,会漏掉一部分检查,万一通过工具执行主库操作,主库挂了,主库对未提交的事物且已经写入日志的事物重新提交,那不是两边又不一致了。。。问题的解决方案,两台mysql,实现数据的一致性???
思考:主库是否能切换到从库上,判断?(错误的思考!)
a: 半同步的最大数量等于失效mysql节点数量
b:允许最大的mysql失效节点 (n-1) / 2
c:成功的mysql节点等于 (n-1) / 2 - 1
d:zk集群组成1台从库
e:集群特性满足 m+1 > m, 提供一致性
f:节点挂机一半mysql,则mysql的rpl_semi_sync_master_clients配置修改成 m - 1,且移除一台mysql从库
g:挂掉的mysql重启后,数据要等待同步完后,才能加入(在线mysql允许切换集合中去)。。。
好麻烦, 能不能简单点啊。。。
再思考。。。
能不能这样啊,每次主库写的时候,要拿到最新的gtid去看从库是否同步了。
无损复制 https://www.sohu.com/a/150571140_610509
开启无损复制:
主库上执行
set global rpl_semi_sync_master_enabled = 1;
set global rpl_semi_sync_master_timeout=100000000; 超时时间记得最大能是1年,4xxxxxxxxxx...秒
set global rpl_semi_sync_master_wait_point=AFTER_SYNC;
set global rpl_semi_sync_master_clients=1
:在my.ini添加半同步插件 plugin_load="rpl_semi_sync_master=semisync_master.dll;rpl_semi_sync_slave=semisync_slave.dll"
show plugins;
//mysql windows版在 plugin目录里存在半同步插件
linux : INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
开启并行复制:http://blog.itpub.net/29990276/viewspace-2057817/
总结:mysql mgr 能做到高可用集群,单主模式,如何通过 java 连接呢?
可以通过 replication协议 连接 mysql mgr
to do
网友评论