有生之年系列----MySQL5.7之多源复制&Nginx中间件(下)-wangwenan6-ITPUB博客
http://blog.itpub.net/29510932/viewspace-1977034/

前文:http://blog.itpub.net/29510932/viewspace-1974937/
-------------------------------------------------------------------------------------正文------------------------------------------------------------------------------------
之前有写了一点验证多源复制的东西,下半篇写点Nginx的东西;
背景:赶
环境:MySQL-5.7.9 x 4,Nging-1.9.7 x 1,五台虚拟机
总体思路:
四个MySQL实例组成双主双从的多源复制结构,Nginx放在前端,对应用层屏蔽DB层细节,同时由Nginx来完成负载均衡/读写分离和“伪HA”

使用的Nginx配置

简单试一下功能,连接的时候指定host,使用TCP的方式去连接61上面的Nginx,可以看到成功的登录了MySQL,

在两台主库上面找一找,发现这个链接发送到了67上面

既然连进来了,通过一个纯粹做请求转发的Nginx之后, 普通的操作应该是没什么问题,试验略过;
连接write的upstream和连接read的upstream没什么本质上的区别,试验略过;
通过Nginx做中间件来实现读写分离的话,只需要在URL中连接不同的端口就可以了,试验略过;
多个连接同时连到这个Nginx的写库(主库),可以看到连接被分到了不同的服务器上,

提问:如果有session连接在某一台主库上,然后那台主库出问题挂掉了,客户端的状态?
解惑:kill主库的mysql进程,模拟down机;

有两个客户端出现了重连的提示,另外两个一切正常;

存活的主库状态,可以看到请求都转到了存活的主库上;

结论:对客户端来说,虽然保持连接的那个主库挂掉了,但是在前端来看,就像是连接超时被断开了一样,并不会感受到端口为13579的主库已经挂掉了;
读库同理,验证略过;

额外发现的断开连接现象在Nginx设置的timeout也会有一定的影响,接上图的状态,一直不去操作这几个客户端,在超时时间之后,会在MySQL端输出如下错误日志;

重新操作一下几个客户端,会看到所有的连接其实都断开了;

解惑:连接建立以后,空闲的时间超过Nginx(proxy_timeout)和MySQL的设置中比较短的那个之后,就会自行断开;
结论:和Nginx+Tomcat的反向代理一样,超时时间的设置也要注意一下;

提问:某一个库(以上面挂掉的那个主库为例)挂掉之后,fail_timeout的时间之后,这个主库恢复了,会不会自动加回列表?
解惑:为了方便测试,改一下fail_timeout的时间,然后关掉主库67,重启Nginx以后,再启动67,等待一段时间,


间隔的时间稍微久了点, 不过重新开启连接以后,可以看到有连接重新进来了,fail_timeout的设置还是ok的,在超过这个时间段以后,Nginx会去检测后端服务器的状况,把启动起来的服务器重新加进来;
结论:Nginx作为一个中间件,可以做到“自动移除挂掉的机器/自动加回恢复的机器”;
PS:如果是启动了,正在恢复数据的话,最好还是把出问题的库从upstream移除比较好;

提问:在upstream的配置中,写的是通过hash的方式去转发连接,那么是否可以像Nginx+Tomcat的反向代理一样,采用权重等其他的方式来转发连接?
解惑:试一下;为了方便看效果,简单改一下Nginx的配置

连接四个客户端以后,看看两个主库的连接;

可以看到连接都转发到了65主库上面去了;
结论:权重的配置是可以生效的,这样的话,可以根据实际要求,用不同配置的MySQL实例来搭建这种类似的架构;

提问:既然使用Nginx作为中间件,可以做到“自动移除挂掉的机器/自动加回恢复的机器”,也对前端屏蔽了后端DB架构上的细节,不会发现某个DB不可用,为什么要描述成“伪HA”?
解惑:个人观点,确实,通过Nginx的中间件,去访问后端的MySQL,确实是具备了HA的样子;某个MySQL实例挂掉了,不会导致整个DB系统无法运行;失败的MySQL实例恢复以后能自动加入;
但是用Nginx做中间件有两个很明显的短板:Nginx的端口是作为对外的唯一出口暴露给应用层的, Nginx本身的HA需要其他方式去保障(不像VIP,就算admin或者worker挂掉了,也不影响数据库访问);
另一个更重要的缺点,就是两个主库全部挂了以后,Nginx本身不能新选举一个从库作为新的master来重新搭建新的主从架构;
这两个短板,尤其是第二个短板,如果是很严格的HA环境和要求,这第二个短板是非常致命的,想要弥补这个,自行开发一套/修改开源工具也许能做到;

追问:存在这么明显/严重的短板,多源复制+Nginx的中间件,到底好用么?
解惑:个人观点,还不错;
1.Nginx的单出口问题,完全可以通过启动多个实例(分开的)指向同一套后端数据库来提高可用性(keepalived也可以)
2.不能选举新Master的问题,在5.7的多源复制功能中,可以横向增加Master的数量,完全靠更多的实例来提高可用性,
这么做,可能会使N主之间的数据一致性受到影响,不过只需要在读库的upstream里面剔除掉这些主库就行了;
3.完全用提高实例数的方式去提高可用性,个别的实例(不管主或者从)挂掉了,基本上不会影响到业务,所表现出来的,只是“某些事务异常中断了”,需要应用层重试,
而不是mha那样,主库挂了需要一段时间来重建主从结构;
-------------------------------------------------------------------------------------尾声------------------------------------------------------------------------------------
总算是写完了,写之前很痛苦,觉得好多东西要整理;写的时候也很痛苦,真正想表达出来的一些时候,觉得好多东西要考证;写完以后也很痛苦,觉得有更多的东西可以尝试;_(:з」∠)_
不管怎么样,这种多源复制+Nginx中间件的做法,走的是一种用数量来提高整个DB系统的可用性的思路,也许能蹭到一点“集群”的边?(倒下了一个主库,还有千千万个主库
--------------------------------------------------------------------------------------赶-------------------------------------------------------------------------------------

 
 

MySQL5.7之多源复制&Nginx中间件(下)【转】的更多相关文章

  1. MySQL5.7之多源复制&Nginx中间件(上)【转】

    有生之年系列----MySQL5.7之多源复制&Nginx中间件(上)-wangwenan6-ITPUB博客http://blog.itpub.net/29510932/viewspace-1 ...

  2. MySql5.7-多源复制(多主单从)

    1.1.主库配置 my.cnf   #确保唯一 server-id=1 #作为Master要开启binlog log-bin=mysql-bin #binlog format有三种形式:Stateme ...

  3. mysql5.7 安装和多源复制实践

    MySQL 5.7发布后,在复制方面有了很大的改进和提升.比如开始支持多源复制(multi-source)以及真正的支持多线程复制了.多源复制可以使用基于二进制日子的复制或者基于事务的复制.下面我们说 ...

  4. MySQL5.7多主一从(多源复制)同步配置

    MySQL5.7多主一从(多源复制)同步配置(抄袭) 原文地址:https://my.oschina.net/u/2399373/blog/2878650 多主一从,也称为多源复制,数据流向: 主库1 ...

  5. MySQL5.7多源复制

    MySQL5.7开始支持多源复制,也就是多主一从的复制架构: 使用多源复制的考虑: 1.灾备作用:将各个库汇总在一起,就算是其他库都挂了(整个机房都无法连接了),还有最后一个救命稻草: 2.备份:直接 ...

  6. MySQL5.7多源复制实践

    MySQL5.7开始新增多源复制功能,即允许一个salve同时复制多个主库的事务,slave会创建通往每个主库的管道.多源复制在应用来自多个源的事务的时候不会对有冲突的事务进行检测. 配置实现 主库支 ...

  7. MySQL5.7 多源复制监控脚本

    #!/bin/bash :<<BLOCK Version : v1.0 2018-12-21 MySQL多源复制检测脚本 监控配置放在 $CONFIG_FILE 中,内容如下 #mysql ...

  8. 初试mysql5.7.2新特性:多源复制(MySQL 5.7 multi-source replication)

    多源复制和多主复制的区别: 多主复制示意图: 多源复制示意图: 在my.cnf中添加crash safe特性参数:master_info_repository=TABLE;relay_log_info ...

  9. Mysql5.7多源复制,过滤复制一段时间后增加复制一个库的实现方法

    多源复制如果是整个实例级别的复制,那不存在下面描述的情况. 如果是对其中一个或多个主实例都是过滤复制,并且运行一段时间后,想在这个源上再增加一个库怎么实现?   主1:192.168.1.10 330 ...

随机推荐

  1. python selenium wait方法

    遇到一个网站运行很慢,所以要等待某个元素显示出来之后再进行操作,自己手上的书上没有例子可以直接用 发现一篇文章:http://www.cnblogs.com/yoyoketang/p/6517477. ...

  2. A New Function LightOJ - 1098()

    题意 求 1 - n的的所有数的因子(不包括自身和1)和 对于一个数 i  ,以i为因子的数的个数为 n/i  因为不能包括自身 所以 减一 即  n/i-1  这样遍历每一个数 累加即可 但复杂度较 ...

  3. oracle 11g 从 dmp 文件中导出 sql 代码 的方法.

    impdp sys/password full=y dumpfile=bg.dmp nologfile=y sqlfile=bg_dmp.sql 备注: bg.dmp 是 dmp 文件,   bg_d ...

  4. 【转】64位Ubuntu 16.04搭建嵌入式交叉编译环境arm-linux-gcc过程图解

    64位Ubuntu 16.04搭建嵌入式交叉编译环境arm-linux-gcc过程图解,开发裸机环境之前需要先搭建其开发环境,毕竟工欲善其事必先利其器嘛.  安装步骤 1.准备工具安装目录 下载 ar ...

  5. JVM 垃圾回收机制和常见算法

    垃圾回收机制:释放那些不再持有引用的对象的内存. 如何判断对象是否需要回收? 引用计数:对象,内存,磁盘空间等被引用次数保存起来,次数为0时将其进行释放. 对象引用遍历:对象应用遍历从一组对象开始,沿 ...

  6. bzoj : 4504: K个串 区间修改主席树

    4504: K个串 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 268  Solved: 110[Submit][Status][Discuss] ...

  7. Python Opencv 色彩平衡

    在平衡良好的照片中,最亮的颜色应该是白色和最暗的黑色. 因此,我们可以通过缩放每个R,G和B通道的直方图来移除图像中的色偏,使得它们跨越完整的0-255比例 网上只有C的代码 修改为Python代码 ...

  8. python学习(24) 使用Xpath解析并抓取美女图片

    Xpath最初用来处理XML解析,同样适用于HTML文档处理.相比正则表达式更方便一些 Xpath基本规则 nodename 表示选取nodename 节点的所有子节点 / 表示当前节点的直接子节点 ...

  9. Python【操作Redis数据库】

    Redis非关系型数据库,数据存放在计算机内存中,无SQL语句.Redis中有多种数据类型,比较常用的数据类型是string类型和hash类型.平时我们使用RedisDesktopManager来对R ...

  10. js正则表达式----replace

    1.分组 '442665319@qq.com'.replace(/(\d+)(@)(\w+)(\.com)/,'[$1]$2[$3]$4') //"[442665319]@[qq].com& ...