为啥我c 复制对象副本的重复的图片没有变成xxx副本反而是xxxx0,名字多了个0?

  打上马赛克,不管是自己的还是亲朋友好友的装逼图,炫富图,盗别人图装白富美高帅富的,毒鸡汤,炫耀自己魅力的等等都可以晒出来~  看谁的朋友圈最辣眼!  娱乐而已,想看就发。  PS: 那些不让大家发图的道德卫士少哔哔,不想看滚出贴。
楼主发言:20次 发图: | 更多
  发布了图片    
  有点看不懂
  不敢发,怕会被打死,而且太辣眼
  哈哈哈哈哈哈 第一次觉得黎明还是挺帅的  
  沉默不语    
  @你好我是巨蟹座
  沉默不语
  -----------------------------
  你赢了
  @中国腿模网研
20:04:00  发布了图片    —————————————————  。。。话说现在买个苹果手机谁买不起。。手机并不是衡量财富的标准哦  
  看的我突然好想装逼  
  前面几楼是什么情况  
  朋友圈的    
  前几楼怎么回事?和图中那户人家有仇吗?
  还会说自己是仙女只因天上有,人间难得几回见,不知道为啥我朋友圈都是这么自信的妹子很多,天天赞美自己。            
  还会说自己是仙女只因天上有,人间难得几回见,不知道为啥我朋友圈都是这么自信的妹子很多,天天赞美自己。
  马克  
  瑜伽那个到底是多矮?  
  @碧桃仙子
22:31:31  还会说自己是仙女只因天上有,人间难得几回见,不知道为啥我朋友圈都是这么自信的妹子很多,天天赞美自己。  -----------------------  这种自夸的人内心得是多么荒芜啊
  看完这个忽然觉得我朋友圈的朋友好低调。。。。
  发布了图片    
  我空间有个,整天发些自认为漂亮的照片配自恋文字,前几天拍了自己哭的照片  
  还有一个奇葩呀,各种夸自己,说自己微博人气多高,评论一百条啊……我跑去一看,一条微博发了评论100条,80条是自己的回复.........      
  额,朋友圈的一股清流,每天都是这个节奏      
  不会被她们看见吧……哈哈哈好尴尬??  
  还有一个微商天天各种摆拍 天天穿的粉粉的                
  我的图找不到了,文字描述一下:拿出一沓红色毛爷爷,目测上万,然后说自己好穷;拿出一沓毛爷爷,目测几千块,然后我故意在下面评论借钱,马上回我那是别人的钱。分别是两个人,都是我高中同学  
  朋友圈一女生:啊呀呀,不想住这个新买的复式大房子,害怕,要失眠。
    顺带说一句 虽然我也不懂 但我真的好烦有些不懂装懂的成天拿串珠搓来搓去
  发布了图片                    
  @ty_16-10-09 10:21:54
  发布了图片
  -----------------------------
  确定不是仇人?迷之自信
  救命,好多辣眼睛的  
  看到这个帖子忍不住要发我早两天看到我同学发的朋友圈,如图,下面是我回复的。我觉得在我同学的眼里我应该是个喝不起卡士的穷逼  
  @ty_16-10-09 10:21:54
  发布了图片
  -----------------------------
  宝强!你怎么了宝强!
  虽然被绿了,但你要振作起来啊宝强!
  来,把假发摘下来,天涯何处无芳草
  我忘了我发过个啥朋友圈,结果一堆人都以为我卖口红……
    就发了这个照片,结果一堆人说我卖口红……但其实我不是卖口红的!
  我不敢发,朋友圈里一妹子,81年的,今天过生日,说自己“几度重阳,还是少女”,还放了一张P得不是本人的照片
  想在发几个,为什么总显示回复失败呢?  
  一回复图片,就提示回复失败  
  继续发啊 不要停hhhhhhh  
  请继续
  我有个同事,买个科颜氏都要发圈,还配文:女人就该对自己好一点  
  发布了图片    
  发布了图片            
  同一个人的朋友圈!巨能装!        
  哈哈朋友圈有个同学,自拍总是重复发图,自以为很美,呕  
  一直不喜欢微信,总觉得无聊外加浪费时间,所以除了几个必须加的群外其他任何人都不理,每天晚上只开10分钟看看有木有重要的信息,看来俺错过了不少乐趣。。。  看看那近10页的请求加微信的信息,是不是该挑出几个看看是不是确实很搞?
  我就不发图了,怕被熟人看见。  某一天,朋友圈发现某一人发了自拍上书:倒时差。尼玛,据我知道,人家就是去了趟韩国,一个小时的时差而已,你倒XX的时差啊。
        看微博就知道此人为啥发这些朋友圈了    
  @小丑椛椛
  还有一个微商天天各种摆拍 天天穿的粉粉的
  -----------------------------
  色差太大了吧
  一张照片能发很多次,换着法夸自己    
  真的都是些丑货和蠢货
  哈哈哈哈哈哈,说到这个我真的要笑死了。我有一同学,家庭条件一般般吧,基本上每个月都要出国,说自己已经是日本人啦等等。但是,每次出国都只有大量的风景照,没有人物照。但是他蜜月和老婆去香港,就是大量的人物照。这是其一。其二,国庆的时候说自己去美国了,定位也在美国却点不开地址,然后那两天各种刷屏美国说怎样怎样好。而且也全是风景照。中途突然有一天定位的是双流机场,在吐槽吧,说什么该走VIP通道,我就以为回来了嘛,结果第二天又定为的是美国纽约了,说什么午安,纽约。这确定不是手滑????哈哈哈哈哈,我当天自己看了都要笑死了。好久来给你们上个图~  
  辣到我了
  好多都是自己夸自己的啊
  @DaaaaMer
14:19:36  哈哈哈哈哈哈,说到这个我真的要笑死了。我有一同学,家庭条件一般般吧,基本上每个月都要出国,说自己已经是日本人啦等等。但是,每次出国都只有大量的风景照,没有人物照。但是他蜜月和老婆去香港,就是大量的人物照。这是其一。其二,国庆的时候说自己去美国了,定位也在美国却点不开地址,然后那两天各种刷屏美国说怎样怎样好。而且也全是风景照。中途突然有一天定位的是双流机场,在吐槽吧,说什么该走VIP通道,我就以为回来了嘛,结果第二天又定为的是美国纽约了,说什么午安,纽约。这确定不是手滑????哈哈哈哈哈,我当天自己看了都要笑死了。好久来给你们上个图~  -----------------------------  我本来想给你们上图的,他自己把那条机场的朋友圈删了。哈哈哈哈哈~他是去个合肥都要晒机票的,不可能去美国都只有个图和定位。噗呲~我们以前开同学会的时候,我们的一个同学也是从美国回来的,她也给我说过这事,还挺搞笑的。太虚荣了~  
  @DaaaaMer
14:19:36   哈哈哈哈哈哈,说到这个我真的要笑死了。我有一同学,家庭条件一般般吧,基本上每个月都要出国,说自己已经是日本人啦等等。但是,每次出国都只有大量的风景照,没有人物照。但是他蜜月和老婆去香港,就是大量的人物照。这是其一。其二,国庆的时候说自己去美国了,定位也在美国却点不开地址,然后那两天各种刷屏美国说怎样怎样好。而且也全是风景照。中途突然有一天定位的是双流机场,在吐槽吧,说什么该走VIP通道,我就以为回来了嘛,结果第二天又定为的是美国纽约了,说什么午安,纽约。这确定不是手滑????哈哈哈哈哈,我当天自己看了都要笑死了。好久来给你们上个图~   -----------------------------  @DaaaaMer
14:24:31   我本来想给你们上图的,他自己把那条机场的朋友圈删了。哈哈哈哈哈~他是去个合肥都要晒机票的,不可能去美国都只有个图和定位。噗呲~我们以前开同学会的时候,我们的一个同学也是从美国回来的,她也给我说过这事,还挺搞笑的。太虚荣了~  -----------------------------  好了,给你们上图。这是他现在的朋友圈,但是在之前,3号到6号中间的4号还是5号有一条双流机场的定位。在机场发的,现在没有了~    
  最装X的是朋友圈发一大段心灵毒鸡汤,配一堆自拍大头照,尼玛你发自拍就直白滴发,整一堆没用的干什么玩意,哪跟哪都不挨着。。。  还有那种发了一堆乱七八糟的看不懂的火星文,然后地址是一个高大上的地址,再然后自己评论自己:我在XXX喝下午茶!尼玛你这是告诉sei呢?哪个弱智看不懂你图片下边那地址?  还神烦那种吃个鱼香肉丝还得发朋友圈,照片一看跟成都小吃的盖浇饭似得,还加上一句:敲好吃!
  所有的出行都没有人物照,一张都没有。之前发那个QQ空间也是,去日本,一个月“去”几趟那种。然后一个同学去试他,让他带SK2 ,他答应的好好的,问什么价格呀,多大的呀。然后就没有然后了~哈哈哈哈。      
  @ty_16-10-09 10:21:54  发布了图片                    春天的霄霄贾: 10:25:47 都是一个角度ty_:...  -----------------------  卧蚕我没看到,卧槽就看到了,丑人多作怪
  怎么没啦!!看着笑死我了!!!  
  哈哈哈哈红红我朋友圈充斥着卖麻辣小吃的人 以至于每次刷朋友圈我都饿  
  本来就是一个东北小县城出生的 去北京委曲求全找了个伪富二代 忍着婆家各种嫌弃 终于嫁过去了 然后就各种瞧不起东北人 每天各种晒 在美国偷着生了孩子就各种显摆 以前偶尔聊聊 后来发现完全无法交流 最后只好屏蔽朋友圈了          
  此贴有毒
  同一个人 还有好多截图好累懒得翻               
  快让开快让开,这还有谁    
  诺,人家一点都没有在炫富,人家只是实现月入百万的梦想忍不住和大家分享呢
  你们这些,我觉得都还好,
我朋友圈有个女人, 每拍一张照就要发给我看, 有一次发一张裸 浴巾的, 然后说,觉得自己好性感哦,怎么会这么性感呢  后来, 又跟我说,那些男人都说她,有一种让人想要爱上的感觉~  我能说上一句话,其实是有个亮点的麻, 需要你们自己找。。。。。。  鉴于隐私 ,我就不爆她的照了 。  另外,那人有小孩子,有老公,但是外面嗯嗯 ,大家懂的
  每次发朋友圈都和写论文似的 糊弄外行还好 可是能不能先百度一下 或者屏蔽一下同学或者懂行的 明明都写错了嘛 她大概忘记自己上学的时候成绩多糟 交不上作业的时候了 想变得高大上不是去趟美术馆发几张照片谢谢备注就可以的好吗 况且还写错了    
      我不知道这个算不算
  我朋友圈怎么都没有这么装的人,瞬间觉得生活无趣了好多
  @ty_16-10-09 10:21:54  发布了图片                    春天的霄霄贾: 10:25:47 都是一个角度ty_:...  -----------------------  高元蛋白hahahahahaha厉害了我的哥
  马  
  我也要吐槽,朋友圈一女的,貌似是个红二代,总是有意无意透露自己多美,多少人追,过节多少人送花。不止一次的发朋友圈说有人请她去做模特,上次发朋友圈,一张银行卡,说是谁的,快拿走,别以为一张银行卡可以打动她。还有说上次去参加朋友婚礼,初中同学问她是不是整容了,怎么现在变得这么漂亮。她在朋友圈说,整你MB,后来这条删了。此女最爱肉色丝袜,在我看来,真的好土鳖,不造她咋想的          
  @我不是你养的猫咪
15:27:01  快让开快让开,这还有谁    -----------------------------  你这个赢了所有人
  @DaaaaMer
14:19:36  哈哈哈哈哈哈,说到这个我真的要笑死了。我有一同学,家庭条件一般般吧,基本上每个月都要出国,说自己已经是日本人啦等等。但是,每次出国都只有大量的风景照,没有人物照。但是他蜜月和老婆去香港,就是大量的人物照。这是其一。其二,国庆的时候说自己去美国了,定位也在美国却点不开地址,然后那两天各种刷屏美国说怎样怎样好。而且也全是风景照。中途突然有一天定位的是双流机场,在吐槽吧,说什么该走VIP通道,我就以为回来了嘛,结果第二天又定为的是美国纽约了,说什么午安,纽约。这确定不是手滑????哈哈哈哈哈,我当天自己看了都要笑死了。好久来给你们上个图~  -----------------------------  @DaaaaMer
14:24:31  我本来想给你们上图的,他自己把那条机场的朋友圈删了。哈哈哈哈哈~他是去个合肥都要晒机票的,不可能去美国都只有个图和定位。噗呲~我们以前开同学会的时候,我们的一个同学也是从美国回来的,她也给我说过这事,还挺搞笑的。太虚荣了~  -----------------------------  @DaaaaMer
14:28:44  好了,给你们上图。这是他现在的朋友圈,但是在之前,3号到6号中间的4号还是5号有一条双流机场的定位。在机场发的,现在没有了~    -----------------------------  我觉得还可以啊 去个美国谁不发
  一般去欧美的
我个人认为发个图片 定位还真正常
  @静默08
  看到这个帖子忍不住要发我早两天看到我同学发的朋友圈,如图,下面是我回复的。我觉得在我同学的眼里我应该是个喝不起卡士的穷逼
  -----------------------------
  这酸奶多钱一个啊、都带装逼功能了
  本来兴冲冲地想去截图,翻了一下无从下手,因为~条条装逼?  反正她每天发5条左右,不管怎样变换花样,主旨永远不变,我漂亮我有酒窝我身材好我有能力我能生娃我能带娃我能照顾老的小的我各种打拼~就差不是迪迦奥特曼了!再看看你们这群屁事不会干的废物!哼哼老子鼻孔朝天~  女战士也会小虚荣呢~  某天发了条圈,写的是,你们怎么可以对我这样好?送我这个?感动哭~  我好奇,送啥,往下一看配图~迪奥香水广告宣传图。  嗯,你没有看错,宣传图。  过了半小时,她自己删除了。  
  没有……我朋友圈没有,真可惜……
  这个,吐槽点是有一女1岁多,又怀了一个,然后她在朋友圈这么说……(爸妈指的是公婆)    
  我也是无聊 再来几张哈哈              
  每天看看这种挺有劲的  
  我都不发朋友圈  
使用“←”“→”快捷翻页
<span class="count" title="万
请遵守言论规则,不得违反国家法律法规回复(Ctrl+Enter)截止日期:日
主办:尚天河文化季组委会
公示期至日
主办:广州市网络文化协会
第三届青葱计划
备忘录:Memo
牛奶也重要
景区拍照游客的自我修养
浪矢解忧杂货店
西游记女儿国
小马宝莉大电影
前任3:再见前任
解忧杂货店
遇见你真好
人间至味是清欢
亲爱的王子大人
三生三世十里桃花
那片星空那片海
漂亮的李慧珍
不可能完成的任务
血族 第3季
黑名单 第3季
初代吸血鬼 第3季
破产姐妹 第5季
绿箭侠 第4季
孤独的美食家
小楼又东风
夜空中最闪亮的星
继承者计划
我是演说家
Lady聊聊时尚圈2017
爱情保卫战
歌声的翅膀
你就是奇迹
生活改造家
歌声的翅膀
厉害了奶爸
一周好莱坞
韩剧星天地
周六夜现场
爆《功守道》真相!
游戏也能整疯人
我为什么喜欢陈奕迅?
中国铁路引领刷脸潮流
勇敢面对不怕碰钉子
脑洞大开美妆小妙招
如何做一个合格猫奴
Happy sport陈意涵
打扰一下乐团
拒绝无聊的思想智库
敢于发现创新价值
创业者励志访谈节目
分享科技新鲜事儿!React Native常见问题(01月19日更新) - 简书
React Native常见问题(01月19日更新)
本文今后将只在
进行更新,此处不再维护,请。本文主要收集在React Native(以下简称RN)的编译/运行/开发中的常见问题与参考解决方案,并非完整教程。本文最后更新时间日,对应rn版本0.180.18正式版有一个bug,导致无论在win还是mac下新建的项目都无法正常运行,请参阅从0.18开始,RN默认项目全面转向ES6,语法大变化,请参考此贴学习欢迎加入QQ讨论群,本群同时讨论RN和react.js一般问题Q:RN和React.js是一个东西吗?A:RN和React.js共用一些抽象层,但具体有很多差异,且目标平台不同:RN目前只能开发iOS/Android App,而React.js用于开发web页面。Q:RN有哪些已经上架的案例?A:官方最近推出了一个由爱好者自行提交的页面。Q:RN可以在windows下开发吗?A:对于iOS开发,可以通过虚拟机等方式,但很麻烦也不推荐。做iOS开发,迟早你都需要一台Mac电脑。对于Android开发,理论上没问题。但由于FB的员工基本都用mac,没有怎么管过windows兼容性,所以目前的版本可能在windows上会遇到一些问题。具体搭建方法可参考:@天地之灵 总结的Q:RN所支持的最低iOS和Android版本?A:Android &= 4.1 (API 16) iOS &= 7.0Q:RN和cordova/phonegap是一个东西吗?A:不一样。RN不是一个webview(但包含了webview组件),不能直接复用web页面代码。RN的性能接近原生,超过cordova/phonegap。Q:可以使用现有的js库吗?A:由于RN理论上更接近nodejs的运行环境,所以对nodejs的库兼容更好一些。浏览器端的js库,涉及到DOM、BOM、CSS等功能的模块无法使用,因为RN的环境中没有这些东西。Q:可以使用现有的objc/swift/java库吗?A:可以,但需要参照和进行修改。环境搭建与编译问题Q:创建新项目,react native init xxx命令长时间无响应,或报错shasum check failedA:由于众所周知的网络原因,react-native命令行从npm官方源拖代码时会遇上麻烦。请将npm仓库源替换为国内镜像:
npm config set registry https://registry.npm.taobao.org
npm config set disturl https://npm.taobao.org/dist
另,执行init时切记不要在前面加上sudo(否则新项目的目录所有者会变为root而不是当前用户,导致一系列权限问题,请使用chown修复)。11月1日更新:提供了完整的绿色纯净新项目包。完整打包全部iOS和Android的第三方依赖,只要环境配置正确,无需科学上网漫长等待,即可直接运行。Q:报错EACCES: permission denied, open 'Users/你的用户名/.babel.json'A:执行如下命令:sudo chown 你的用户名 ~/.babel.jsonQ:如何升级RN版本?A:请用编辑器打开项目目录中的package.json,找到类似下面的一行配置"react-native": "0.13.0",将其改为要升级的版本号,如“0.15.0-rc”(当然要先确定这个版本已经发布到npm上了,如果配置中有^或~之类的符号,可以参考这篇来了解其含义。)。然后在当前目录的命令行中执行npm i如果提示权限错误则在前面加上sudo(windows下不需要).npm i执行完毕且成功不报错之后,在项目目录中运行react-native upgrade对于0.14以下版本升级0.14的情况,还需要额外一下。Q:报错:EMFILE, too many open files '......'A:请检查node版本(4.0以上),以及是否安装了watchman(目前只有Mac能装这个)Q:报错:SyntaxError: Use of const in strict modeA:请检查node版本(4.0以上)。Q:Windows下报错:ERROR
Watcher took too long to loadTry running `watchman version` from your terminalA:请参照修改。Q:报错:Invariant Violation:Application XXXX has not been registered.A:请确保index.ios.js中的AppRegistry.registerComponent('项目名',() =& ...);与appDelegate.m中的
RCTRootView*rootView = [[RCTRootViewalloc]initWithBundleURL:jsCodeLocation
moduleName:@"项目名" launchOptions:launchOptions];
或是MainActivity.java中的mReactRootView.startReactApplication(mReactInstanceManager, "项目名", null);都保持一致。Q:应该使用什么IDE开发?A:虽然常用的JS编辑器很多,但由于RN大量使用jsx和es6语法,目前只有sublime text(通过插件)和webstorm(10以上版本)提供了良好的支持。笔者推荐webstorm,因为它有更完善的语法提示和补全。另外虽然主要的业务逻辑是使用js开发,但仍然要依赖于原生的编译/调试环境,所以你还需要同时运行Xcode(iOS)或Android Studio(android)等。开发与调试问题Q:如何开启调试功能?A:点击iOS模拟器顶部的Hardware菜单,选择Shake Gesture(对应真机摇一摇),会自动弹出如下图的菜单。安卓模拟器则是点击菜单键,真机上没有菜单键的,摇一摇即可。选择Debug in Chrome即会启动Chrome作为运行和调试环境(注意此时JS引擎为Chrome的V8,与iOS真机的javascriptCore引擎存在一些差异)。选择Inspect Element即可以像调试网页元素一样查看布局元素的样式,但比较简陋。React Devtools插件可装可不装,它只用来查看布局,不影响调试,且在目前的版本(&0.13)中还无法正常加载。
Q:调试模式下报错:Runtime is not ready. Make sure...或是socket closed.A:有时Chrome进程会失去响应,可以尝试手动将Chrome的React Native Debugger标签切换到前台再Reload模拟器页面。Q:使用ListView时报错:Sticky header index 0 was outside the range {...}A:看起来是个数组越界错误,但多数情况下是由于ListView的子组件渲染错误(如套数据时没有检查undefined等)引起,而非ListView本身的问题。Q:ListView的数据到底应该怎么配?A:参考下图
Q:require静态图片时报找不到模块的错误A:参看下图步骤,尤其需要注意的点是文件名必须和imageset的名字一致。(注:这里演示的是0.14之前版本的添加图片的步骤。0.14之后的图片用法)
Q:使用Image时报错:You are trying to render the global Image variable as a React element. You probably forgot to require Image.A:由于React的Image组件和全局的Image对象重名,所以使用Image组件时一定要记得在文件开头正确引入React的Image组件。Q:在使用Navigator的同时使用ListView或ScrollView,后两者的头部会多出一些空间。A:将automaticallyAdjustContentInsets属性设为{false}.Q:有一些示例代码中有奇怪的问号,比如function foo(x:?string),代表什么意思?A:这是通过一个名为的外部工具为javascript加上强类型检查的功能,不影响编译和运行。Q:报错:Adjacent JSX elements must be wrapped in an enclosing tag.A:render方法中必须只能包含一个根元素。Q:报错:Invariant Violation: onlyChild must be passed a children with exactly one childA:一般是Touchable开头的几个组件,如果没有子元素或者指定多个并列子元素都会报错。Q:如何获取服务器端数据/可以使用Ajax吗?A:可以用ajax,以及大部分现有的ajax库,而且不受浏览器跨域限制。官方推荐用更简单的fetch api来替代传统的ajax.但目前还无法在Chrome中直接观测请求的详情。Q:如何读写文件?如何调用摄像头?如何调用麦克风?等等A:对于官方没有提供的组件或API,请自行在或中搜索第三方实现。如果搜不到相关结果,你只能考虑自己用原生代码实现后进来。Q:如何在原生代码中调用JS方法?A:请参阅官网中一节文档,其中提供了回调Callbacks和监听事件两种方法,且都为异步。//To be continued
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
持续更新中...... 一套企业级的 UI 设计语言和 React 实现。 https://mobile.ant.design/index-cn https://github.com/ant-design/ant-design-mobile Essential cross-...
React Native学习&一& 认识Recat Native 博客原文:http://www.jianshu.com/p/b 前言 React Native 诞生于 2015 年,名副其实的富二代,主要使命是为父出征,与 Apple 和 Googl...
1、react-native run-android出现FAILURE: Build failed with an exception. 细看是这样 What went wrong:Execution failed for task &#39;:app:installDebug&#39;....
日,我降临在一个旅行商人的家庭中,这一刻,他们都欣喜若狂,我也觉得万分幸运。因此,我的生活比大多数同龄人富裕的多。尽管如此,我的父亲还是在我两岁时开始了对我的训练,从家庭琐事到骑马练剑等等,也因为我生活在一个战斗民族吧,所以我不仅...
无 桩 共 享 小 黄 车 微 信 破 码 可 解 锁 环 游 世 界 各 角 落 绿 色 出 行 好 选 择
好益康电子烟以军工品质,而闻名于世界,产品经过128项工序,38项检测,确保每一件都是精品。 盒子将利用烟草降低吸烟者对传统卷烟味道的依赖程度。该产品看起来像一支镂空的钢笔。插入和加热该烟草设备即可产生烟雾。YVX表示,该设备的温度“远远低于”传统卷烟产生的温度。 未来交易...
黑茶的热量有多少?黑茶是一种常见的减肥茶,那么,黑茶的热量有多少,它的减肥效果究竟如何呢?其实不仅仅是黑茶的功效很多,黑茶茶渣的功效也不容小觑哦!一起和小编来看看黑茶的热量及黑茶茶渣的神奇功效吧! 热量:黑茶1大卡/100克。黑茶的热量很低,且减肥效果好,但是朋友们...
盒模型包括哪些属性 ? IE 盒模型和W3C盒模型有什么区别? 两者都是包括margin,border,padding,conten实际内容IE盒模型是包括border,padding,content。而W3C盒模型实际内容就是content W3C盒模型大小:width=...MHA(Master&High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。
在MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过ssh访问,MHA没法保存二进制日志,只进行故障转移而丢失了最新的数据。使用MySQL 5.5的半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来。如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性。
目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,因为至少需要三台服务器,出于机器成本的考虑,淘宝也在该基础上进行了改造,目前淘宝TMHA已经支持一主一从。另外对于想快速搭建的可以参考:
我们自己使用其实也可以使用1主1从,但是master主机宕机后无法切换,以及无法补全binlog。master的mysqld进程crash后,还是可以切换成功,以及补全binlog的。
官方介绍:
图01展示了如何通过MHA Manager管理多组主从复制。可以将MHA工作原理总结为如下:
& & & & & & & & & & & & & & & & &( 图01 )
(1)从宕机崩溃的master保存二进制日志事件(binlog events);
(2)识别含有最新更新的slave;
(3)应用差异的中继日志(relay log)到其他的slave;
(4)应用从master保存的二进制日志事件(binlog events);
(5)提升一个slave为新的master;
(6)使其他的slave连接新的master进行复制;
MHA软件由两部分组成,Manager工具包和Node工具包,具体的说明如下。
Manager工具包主要包括以下几个工具:
masterha_check_ssh
检查MHA的SSH配置状况
masterha_check_repl
检查MySQL复制状况
masterha_manger
masterha_check_status
检测当前MHA运行状态
masterha_master_monitor
检测master是否宕机
masterha_master_switch
控制故障转移(自动或者手动)
masterha_conf_host
添加或删除配置的server信息
Node工具包(这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具:
save_binary_logs
保存和复制master的二进制日志
apply_diff_relay_logs
识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog
去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs
清除中继日志(不会阻塞SQL线程)
为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置MHA的同时建议配置成MySQL 5.5的半同步复制。关于半同步复制原理各位自己进行查阅。(不是必须)
接下来部署MHA,具体的搭建环境如下(所有操作系统均为centos 6.2 64bit,不是必须,server03和server04是server02的从,复制环境搭建后面会简单演示,但是相关的安全复制不会详细说明,需要的童鞋请参考前面的文章,):
Monitor host
192.168.0.20
监控复制组
192.168.0.50
Candicate master
192.168.0.60
192.168.0.70
其中master对外提供写服务,备选master(实际的slave,主机名server03)提供读服务,slave也提供相关的读服务,一旦master宕机,将会把备选master提升为新的master,slave指向新的master
(1)在所有节点安装MHA node所需的perl模块(DBD:mysql),安装脚本如下:
[root@192.168.0.50 ~]# cat install.sh
#!/bin/bash
wget http://xrl.us/cpanm --no-check-certificate
mv cpanm /usr/bin
chmod 755 /usr/bin/cpanm
cat & /root/list && EOF
install DBD::mysql
for package in `cat /root/list`
cpanm $package
[root@192.168.0.50 ~]#
如果有安装epel源,也可以使用yum安装
yum install perl-DBD-MySQL -y
(2)在所有的节点安装mha node:
wget http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.53.tar.gz
tar xf mha4mysql-node-0.53.tar.gz
cd mha4mysql-node-0.53
perl Makefile.PL
make && make install
安装完成后会在/usr/local/bin目录下生成以下脚本文件:
[root@192.168.0.50 bin]# pwd
/usr/local/bin
[root@192.168.0.50 bin]# ll
-r-xr-xr-x 1 root root 15498 Apr 20 10:05 apply_diff_relay_logs
-r-xr-xr-x 1 root root
4807 Apr 20 10:05 filter_mysqlbinlog
-r-xr-xr-x 1 root root
7401 Apr 20 10:05 purge_relay_logs
-r-xr-xr-x 1 root root
7263 Apr 20 10:05 save_binary_logs
[root@192.168.0.50 bin]#
关于上面脚本的功能,上面已经介绍过了,这里不再重复了。
2.安装MHA Manager
MHA Manager中主要包括了几个管理员的命令行工具,例如master_manger,master_master_switch等。MHA Manger也依赖于perl模块,具体如下:
(1)安装MHA Node软件包之前需要安装依赖。我这里使用yum完成,没有epel源的可以使用上面提到的脚本(epel源安装也简单)。注意:在MHA Manager的主机也是需要安装MHA Node。
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install perl-DBD-MySQL -y
安装MHA Node软件包,和上面的方法一样,如下:
wget http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.53.tar.gz
tar xf mha4mysql-node-0.53.tar.gz
cd mha4mysql-node-0.53
perl Makefile.PL
make && make install
(2)安装MHA Manager。首先安装MHA Manger依赖的perl模块(我这里使用yum安装):
yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes -y
安装MHA Manager软件包:
wget http://mysql-master-ha.googlecode.com/files/mha4mysql-manager-0.53.tar.gz
tar xf mha4mysql-manager-0.53.tar.gz
cd mha4mysql-manager-0.53
perl Makefile.PL
make && make install
安装完成后会在/usr/local/bin目录下面生成以下脚本文件,前面已经说过这些脚本的作用,这里不再重复
[root@192.168.0.20 bin]# pwd
/usr/local/bin
[root@192.168.0.20 bin]# ll
-r-xr-xr-x 1 root root 15498 Apr 20 10:58 apply_diff_relay_logs
-r-xr-xr-x 1 root root
4807 Apr 20 10:58 filter_mysqlbinlog
-r-xr-xr-x 1 root root
1995 Apr 20 11:33 masterha_check_repl
-r-xr-xr-x 1 root root
1779 Apr 20 11:33 masterha_check_ssh
-r-xr-xr-x 1 root root
1865 Apr 20 11:33 masterha_check_status
-r-xr-xr-x 1 root root
3201 Apr 20 11:33 masterha_conf_host
-r-xr-xr-x 1 root root
2517 Apr 20 11:33 masterha_manager
-r-xr-xr-x 1 root root
2165 Apr 20 11:33 masterha_master_monitor
-r-xr-xr-x 1 root root
2373 Apr 20 11:33 masterha_master_switch
-r-xr-xr-x 1 root root
3749 Apr 20 11:33 masterha_secondary_check
-r-xr-xr-x 1 root root
1739 Apr 20 11:33 masterha_stop
-r-xr-xr-x 1 root root
7401 Apr 20 10:58 purge_relay_logs
-r-xr-xr-x 1 root root
7263 Apr 20 10:58 save_binary_logs
[root@192.168.0.20 bin]#
复制相关脚本到/usr/local/bin目录(软件包解压缩后就有了,不是必须,因为这些脚本不完整,需要自己修改,这是软件开发着留给我们自己发挥的,如果开启下面的任何一个脚本对应的参数,而对应这里的脚本又没有修改,则会抛错,自己被坑的很惨)
[root@192.168.0.20 scripts]# pwd
/root/mha4mysql-manager-0.53/samples/scripts
[root@192.168.0.20 scripts]# ll
-rwxr-xr-x 1 root root
2012 master_ip_failover
#自动切换时vip管理的脚本,不是必须,如果我们使用keepalived的,我们可以自己编写脚本完成对vip的管理,比如监控mysql,如果mysql异常,我们停止keepalived就行,这样vip就会自动漂移
-rwxr-xr-x 1 root root
2012 master_ip_online_change
#在线切换时vip的管理,不是必须,同样可以可以自行编写简单的shell完成
-rwxr-xr-x 1 root root 11867 Jan
2012 power_manager
#故障发生后关闭主机的脚本,不是必须
-rwxr-xr-x 1 root root
2012 send_report
#因故障切换后发送报警的脚本,不是必须,可自行编写简单的shell完成。
[root@192.168.0.20 scripts]# cp * /usr/local/bin/
[root@192.168.0.20 scripts]#
3.配置SSH登录无密码验证(使用key登录,工作中常用)我的测试环境已经是使用key登录,服务器之间无需密码验证的。关于配置使用key登录,我想我不再重复。但是有一点需要注意:不能禁止 password 登陆,否则会出现错误
4.搭建主从复制环境
注意:binlog-do-db 和 replicate-ignore-db 设置必须相同。 MHA 在启动时候会检测过滤规则,如果过滤规则不同,MHA 不启动监控和故障转移。
(1)在server02上执行备份(192.168.0.50)
[root@192.168.0.50 ~]# mysqldump --master-data=2 --single-transaction -R --triggers -A & all.sql
其中--master-data=2代表备份时刻记录master的Binlog位置和Position,--single-transaction意思是获取一致性快照,-R意思是备份存储过程和函数,--triggres的意思是备份触发器,-A代表备份所有的库。更多信息请自行mysqldump --help查看。
(2)在server02上创建复制用户:
mysql& grant replication slave on *.* to 'repl'@'192.168.0.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql& flush privileges;
Query OK, 0 rows affected (0.00 sec)
(3)查看主库备份时的binlog名称和位置,MASTER_LOG_FILE和MASTER_LOG_POS:
[root@192.168.0.50 ~]# head -n 30 all.sql | grep 'CHANGE MASTER TO'
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000010', MASTER_LOG_POS=112;
[root@192.168.0.50 ~]#
(4)把备份复制到server03和server04,也就是192.168.0.60和192.168.0.70
scp all.sql server03:/data/
scp all.sql server04:/data/
(5)导入备份到server03,执行复制相关命令
mysql & /data/all.sql
mysql& CHANGE MASTER TO MASTER_HOST='192.168.0.50',MASTER_USER='repl', MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000010',MASTER_LOG_POS=112;
Query OK, 0 rows affected (0.02 sec)
Query OK, 0 rows affected (0.01 sec)
查看复制状态(可以看见复制成功):
[root@192.168.0.60 ~]# mysql -e 'show slave status\G' | egrep 'Slave_IO|Slave_SQL'
Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
[root@192.168.0.60 ~]#
(6)在server04(192.168.0.70)上搭建复制环境,操作和上面一样。
mysql & /data/all.sql
mysql& CHANGE MASTER TO MASTER_HOST='192.168.0.50',MASTER_USER='repl', MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000010',MASTER_LOG_POS=112;
Query OK, 0 rows affected (0.07 sec)
Query OK, 0 rows affected (0.00 sec)
查看复制状态:
[root@192.168.0.70 ~]# mysql -e 'show slave status\G' | egrep 'Slave_IO|Slave_SQL'
Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
[root@192.168.0.70 ~]#
(7)两台slave服务器设置read_only(从库对外提供读服务,只所以没有写进配置文件,是因为随时slave会提升为master)
[root@192.168.0.60 ~]# mysql -e 'set global read_only=1'
[root@192.168.0.60 ~]#
[root@192.168.0.70 ~]# mysql -e 'set global read_only=1'
[root@192.168.0.70 ~]#
(8)创建监控用户(在master上执行,也就是192.168.0.50):
mysql& grant all privileges on *.* to 'root'@'192.168.0.%' identified
by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql& flush
privileges;
Query OK, 0 rows affected (0.01 sec)
到这里整个集群环境已经搭建完毕,剩下的就是配置MHA软件了。
(1)创建MHA的工作目录,并且创建相关配置文件(在软件包解压后的目录里面有样例配置文件)。
[root@192.168.0.20 ~]# mkdir -p /etc/masterha
[root@192.168.0.20 ~]# cp mha4mysql-manager-0.53/samples/conf/app1.cnf /etc/masterha/
[root@192.168.0.20 ~]#
修改app1.cnf配置文件,修改后的文件内容如下(注意,配置文件中的注释需要去掉,我这里是为了解释清楚):
[root@192.168.0.20 ~]# cat /etc/masterha/app1.cnf
[server default]
manager_workdir=/var/log/masterha/app1.log
//设置manager的工作目录
manager_log=/var/log/masterha/app1/manager.log
//设置manager的日志
master_binlog_dir=/data/mysql
//设置master 保存binlog的位置,以便MHA可以找到master的日志,我这里的也就是mysql的数据目录
master_ip_failover_script= /usr/local/bin/master_ip_failover
//设置自动failover时候的切换脚本
master_ip_online_change_script= /usr/local/bin/master_ip_online_change
//设置手动切换时候的切换脚本
password=123456
//设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码
设置监控用户root
ping_interval=1
//设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行railover
remote_workdir=/tmp
//设置远端mysql在发生切换时binlog的保存位置
repl_password=123456
//设置复制用户的密码
repl_user=repl
//设置复制环境中的复制用户名
report_script=/usr/local/send_report
//设置发生切换后发送的报警的脚本
secondary_check_script= /usr/local/bin/masterha_secondary_check -s server03 -s server02
shutdown_script=""
//设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放在发生脑裂,这里没有使用)
ssh_user=root
//设置ssh的登录用户名
hostname=192.168.0.50
hostname=192.168.0.60
candidate_master=1
//设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave
check_repl_delay=0
//默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
hostname=192.168.0.70
[root@192.168.0.20 ~]#
(2)设置relay log的清除方式(在每个slave节点上):
[root@192.168.0.60 ~]# mysql -e 'set global relay_log_purge=0'
[root@192.168.0.70 ~]# mysql -e 'set global relay_log_purge=0'
MHA在发生切换的过程中,从库的恢复过程中依赖于relay log的相关信息,所以这里要将relay log的自动清除设置为OFF,采用手动清除relay log的方式。在默认情况下,从服务器上的中继日志会在SQL线程执行完毕后被自动删除。但是在MHA环境中,这些中继日志在恢复其他从服务器时可能会被用到,因此需要禁用中继日志的自动删除功能。定期清除中继日志需要考虑到复制延时的问题。在ext3的文件系统下,删除大的文件需要一定的时间,会导致严重的复制延时。为了避免复制延时,需要暂时为中继日志创建硬链接,因为在linux系统中通过硬链接删除大文件速度会很快。(在mysql数据库中,删除大表时,通常也采用建立硬链接的方式)
MHA节点中包含了pure_relay_logs命令工具,它可以为中继日志创建硬链接,执行SET GLOBAL relay_log_purge=1,等待几秒钟以便SQL线程切换到新的中继日志,再执行SET GLOBAL relay_log_purge=0。
pure_relay_logs脚本参数如下所示:
--user mysql
--password mysql
指定创建relay log的硬链接的位置,默认是/var/tmp,由于系统不同分区创建硬链接文件会失败,故需要执行硬链接具体位置,成功执行脚本后,硬链接的中继日志文件被删除
--disable_relay_log_purge
默认情况下,如果relay_log_purge=1,脚本会什么都不清理,自动退出,通过设定这个参数,当relay_log_purge=1的情况下会将relay_log_purge设置为0。清理relay log之后,最后将参数设置为OFF。
(3)设置定期清理relay脚本(两台slave服务器)
[root@192.168.0.60 ~]# cat purge_relay_log.sh
#!/bin/bash
passwd=123456
log_dir='/data/masterha/log'
work_dir='/data'
purge='/usr/local/bin/purge_relay_logs'
if [ ! -d $log_dir ]
mkdir $log_dir -p
$purge --user=$user --password=$passwd --disable_relay_log_purge --port=$port --workdir=$work_dir && $log_dir/purge_relay_logs.log 2&&1
[root@192.168.0.60 ~]#
添加到crontab定期执行
[root@192.168.0.60 ~]# crontab -l
0 4 * * * /bin/bash /root/purge_relay_log.sh
[root@192.168.0.60 ~]#
purge_relay_logs脚本删除中继日志不会阻塞SQL线程。下面我们手动执行看看什么情况。
[root@192.168.0.60 ~]# purge_relay_logs --user=root --password=123456 --port=3306 -disable_relay_log_purge --workdir=/data/
2014-04-20 15:47:24: purge_relay_logs script started.
Found relay_log.info: /data/mysql/relay-log.info
Removing hard linked relay log files server03-relay-bin* under /data/.. done.
Current relay log file: /data/mysql/server03-relay-bin.000002
Archiving unused relay log files (up to /data/mysql/server03-relay-bin.000001) ...
Creating hard link for /data/mysql/server03-relay-bin.000001 under /data//server03-relay-bin.000001 .. ok.
Creating hard links for unused relay log files completed.
Executing SET GLOBAL relay_log_purge=1; FLUSH LOGS; sleeping a few seconds so that SQL thread can delete older relay log files (if it keeps up); SET GLOBAL relay_log_purge=0; .. ok.
Removing hard linked relay log files server03-relay-bin* under /data/.. done.
2014-04-20 15:47:27: All relay log purging operations succeeded.
[root@192.168.0.60 ~]#
6.检查SSH配置
检查MHA Manger到所有MHA Node的SSH连接状态:
[root@192.168.0.20 ~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf
Sun Apr 20 17:17:39 2014 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sun Apr 20 17:17:39 2014 - [info] Reading application default configurations from /etc/masterha/app1.cnf..
Sun Apr 20 17:17:39 2014 - [info] Reading server configurations from /etc/masterha/app1.cnf..
Sun Apr 20 17:17:39 2014 - [info] Starting SSH connection tests..
Sun Apr 20 17:17:40 2014 - [debug]
Sun Apr 20 17:17:39 2014 - [debug]
Connecting via SSH from root@192.168.0.50(192.168.0.50:22) to root@192.168.0.60(192.168.0.60:22)..
Sun Apr 20 17:17:39 2014 - [debug]
Sun Apr 20 17:17:39 2014 - [debug]
Connecting via SSH from root@192.168.0.50(192.168.0.50:22) to root@192.168.0.70(192.168.0.70:22)..
Sun Apr 20 17:17:39 2014 - [debug]
Sun Apr 20 17:17:40 2014 - [debug]
Sun Apr 20 17:17:40 2014 - [debug]
Connecting via SSH from root@192.168.0.60(192.168.0.60:22) to root@192.168.0.50(192.168.0.50:22)..
Sun Apr 20 17:17:40 2014 - [debug]
Sun Apr 20 17:17:40 2014 - [debug]
Connecting via SSH from root@192.168.0.60(192.168.0.60:22) to root@192.168.0.70(192.168.0.70:22)..
Sun Apr 20 17:17:40 2014 - [debug]
Sun Apr 20 17:17:41 2014 - [debug]
Sun Apr 20 17:17:40 2014 - [debug]
Connecting via SSH from root@192.168.0.70(192.168.0.70:22) to root@192.168.0.50(192.168.0.50:22)..
Sun Apr 20 17:17:40 2014 - [debug]
Sun Apr 20 17:17:40 2014 - [debug]
Connecting via SSH from root@192.168.0.70(192.168.0.70:22) to root@192.168.0.60(192.168.0.60:22)..
Sun Apr 20 17:17:41 2014 - [debug]
Sun Apr 20 17:17:41 2014 - [info] All SSH connection tests passed successfully.
可以看见各个节点ssh验证都是ok的。
7.检查整个复制环境状况。
通过masterha_check_repl脚本查看整个集群的状态
[root@192.168.0.20 ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf
Sun Apr 20 18:36:55 2014 - [info] Checking replication health on 192.168.0.60..
Sun Apr 20 18:36:55 2014 - [info]
Sun Apr 20 18:36:55 2014 - [info] Checking replication health on 192.168.0.70..
Sun Apr 20 18:36:55 2014 - [info]
Sun Apr 20 18:36:55 2014 - [info] Checking master_ip_failover_script status:
Sun Apr 20 18:36:55 2014 - [info]
/usr/local/bin/master_ip_failover --command=status --ssh_user=root --orig_master_host=192.168.0.50 --orig_master_ip=192.168.0.50 --orig_master_port=3306
Bareword "FIXME_xxx" not allowed while "strict subs" in use at /usr/local/bin/master_ip_failover line 88.
Execution of /usr/local/bin/master_ip_failover aborted due to compilation errors.
Sun Apr 20 18:36:55 2014 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln214]
Failed to get master_ip_failover_script status with return code 255:0.
Sun Apr 20 18:36:55 2014 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln383] Error happend on checking configurations.
at /usr/local/bin/masterha_check_repl line 48
Sun Apr 20 18:36:55 2014 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln478] Error happened on monitoring servers.
Sun Apr 20 18:36:55 2014 - [info] Got exit code 1 (Not master dead).
MySQL Replication Health is NOT OK!
发现最后的结论说我的复制不是ok的。但是上面的信息明明说是正常的,自己也进数据库查看了。这里一直踩坑。一直纠结,后来无意中发现火丁笔记的博客,这才知道了原因,原来Failover两种方式:一种是虚拟IP地址,一种是全局配置文件。MHA并没有限定使用哪一种方式,而是让用户自己选择,虚拟IP地址的方式会牵扯到其它的软件,比如keepalive软件,而且还要修改脚本master_ip_failover。(最后修改脚本后才没有这个报错,自己不懂perl也是折腾的半死,去年买了块表)
如果发现如下错误:
Can't exec "mysqlbinlog": No such file or directory at /usr/local/share/perl5/MHA/BinlogManager.pm line 99.
mysqlbinlog version not found!
Testing mysql connection and privileges..sh: mysql: command not found
解决方法如下,添加软连接(所有节点)
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog
ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql
所以先暂时注释master_ip_failover_script= /usr/local/bin/master_ip_failover这个选项。后面引入keepalived后和修改该脚本以后再开启该选项。
[root@192.168.0.20 ~]# grep master_ip_failover /etc/masterha/app1.cnf
#master_ip_failover_script= /usr/local/bin/master_ip_failover
[root@192.168.0.20 ~]#
再次进行状态查看:
Sun Apr 20 18:46:08 2014 - [info] Checking replication health on 192.168.0.60..
Sun Apr 20 18:46:08 2014 - [info]
Sun Apr 20 18:46:08 2014 - [info] Checking replication health on 192.168.0.70..
Sun Apr 20 18:46:08 2014 - [info]
Sun Apr 20 18:46:08 2014 - [warning] master_ip_failover_script is not defined.
Sun Apr 20 18:46:08 2014 - [warning] shutdown_script is not defined.
Sun Apr 20 18:46:08 2014 - [info] Got exit code 0 (Not master dead).
MySQL Replication Health is OK.
已经没有明显报错,只有两个警告而已,复制也显示正常了。8.检查MHA Manager的状态:
通过master_check_status脚本查看Manager的状态:
[root@192.168.0.20 ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 is stopped(2:NOT_RUNNING).
[root@192.168.0.20 ~]#
注意:如果正常,会显示"PING_OK",否则会显示"NOT_RUNNING",这代表MHA监控没有开启。9.开启MHA Manager监控
[root@192.168.0.20 ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover & /dev/null & /var/log/masterha/app1/manager.log 2&&1 &
[root@192.168.0.20 ~]#
启动参数介绍:
--remove_dead_master_conf&&&&& 该参数代表当发生主从切换后,老的主库的ip将会从配置文件中移除。
--manger_log&&&&&&&&&&&&&&&&&&&&&&&&&&& 日志存放位置
--ignore_last_failover&&&&&&&&&&&&&&&&&在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不会进行Failover,之所以这样限制是为了避免ping-pong效应。该参数代表忽略上次MHA触发切换产生的文件,默认情况下,MHA发生切换后会在日志目录,也就是上面我设置的/data产生app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failover。
查看MHA Manager监控是否正常:
[root@192.168.0.20 ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:20386) is running(0:PING_OK), master:192.168.0.50
[root@192.168.0.20 ~]#
可以看见已经在监控了,而且master的主机为192.168.0.50
10.查看启动日志
[root@192.168.0.20 ~]# tail -n20 /var/log/masterha/app1/manager.log
Sun Apr 20 19:12:01 2014 - [info]
Connecting to root@192.168.0.70(192.168.0.70:22)..
Checking slave recovery environment settings..
Opening /data/mysql/relay-log.info ... ok.
Relay log found at /data/mysql, up to server04-relay-bin.000002
Temporary relay log file is /data/mysql/server04-relay-bin.000002
Testing mysql connection and privileges.. done.
Testing mysqlbinlog output.. done.
Cleaning up test file(s).. done.
Sun Apr 20 19:12:01 2014 - [info] Slaves settings check done.
Sun Apr 20 19:12:01 2014 - [info]
192.168.0.50 (current master)
+--192.168.0.60
+--192.168.0.70
Sun Apr 20 19:12:01 2014 - [warning] master_ip_failover_script is not defined.
Sun Apr 20 19:12:01 2014 - [warning] shutdown_script is not defined.
Sun Apr 20 19:12:01 2014 - [info] Set master ping interval 1 seconds.
Sun Apr 20 19:12:01 2014 - [info] Set secondary check script: /usr/local/bin/masterha_secondary_check -s server03 -s server02 --user=root --master_host=server02 --master_ip=192.168.0.50 --master_port=3306
Sun Apr 20 19:12:01 2014 - [info] Starting ping health check on 192.168.0.50(192.168.0.50:3306)..
Sun Apr 20 19:12:01 2014 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn't respond..
[root@192.168.0.20 ~]#
其中"Ping(SELECT) succeeded, waiting until MySQL doesn't respond.."说明整个系统已经开始监控了。11.关闭MHA Manage监控
关闭很简单,使用masterha_stop命令完成。
[root@192.168.0.20 ~]# masterha_stop --conf=/etc/masterha/app1.cnf
Stopped app1 successfully.
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover --manager_log=/data/mamanager.log
[root@192.168.0.20 ~]#
12.配置VIPvip配置可以采用两种方式,一种通过keepalived的方式管理虚拟ip的浮动;另外一种通过脚本方式启动虚拟ip的方式(即不需要keepalived或者heartbeat类似的软件)。
1.keepalived方式管理虚拟ip,keepalived配置方法如下:
(1)下载软件进行并进行安装(两台master,准确的说一台是master,另外一台是备选master,在没有切换以前是slave):
[root@192.168.0.50 ~]# wget http://www.keepalived.org/software/keepalived-1.2.12.tar.gz
tar xf keepalived-1.2.12.tar.gz
cd keepalived-1.2.12
./configure --prefix=/usr/local/keepalived
make install
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
(2)配置keepalived的配置文件,在master上配置(192.168.0.50)
[root@192.168.0.50 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
saltstack@163.com
notification_email_from
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MySQL-HA
vrrp_instance VI_1 {
state BACKUP
interface eth1
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
virtual_ipaddress {
192.168.0.88
[root@192.168.0.50 ~]#
其中router_id MySQL HA表示设定keepalived组的名称,将192.168.0.88这个虚拟ip绑定到该主机的eth1网卡上,并且设置了状态为backup模式,将keepalived的模式设置为非抢占模式(nopreempt),priority 150表示设置的优先级为150。下面的配置略有不同,但是都是一个意思。在候选master上配置(192.168.0.60)
[root@192.168.0.60 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
saltstack@163.com
notification_email_from
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MySQL-HA
vrrp_instance VI_1 {
state BACKUP
interface eth1
virtual_router_id 51
priority 120
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
virtual_ipaddress {
192.168.0.88
[root@192.168.0.60 ~]#
(3)启动keepalived服务,在master上启动并查看日志
[root@192.168.0.50 ~]# /etc/init.d/keepalived start
Starting keepalived:
[root@192.168.0.50 ~]# tail -f /var/log/messages
Apr 20 20:22:16 192 Keepalived_healthcheckers[15334]: Opening file '/etc/keepalived/keepalived.conf'.
Apr 20 20:22:16 192 Keepalived_healthcheckers[15334]: Configuration is using : 7231 Bytes
Apr 20 20:22:16 192 kernel: IPVS: Connection hash table configured (size=4096, memory=64Kbytes)
Apr 20 20:22:16 192 kernel: IPVS: ipvs loaded.
Apr 20 20:22:16 192 Keepalived_healthcheckers[15334]: Using LinkWatch kernel netlink reflector...
Apr 20 20:22:19 192 Keepalived_vrrp[15335]: VRRP_Instance(VI_1) Transition to MASTER STATE
Apr 20 20:22:20 192 Keepalived_vrrp[15335]: VRRP_Instance(VI_1) Entering MASTER STATE
Apr 20 20:22:20 192 Keepalived_vrrp[15335]: VRRP_Instance(VI_1) setting protocol VIPs.
Apr 20 20:22:20 192 Keepalived_vrrp[15335]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 192.168.0.88
Apr 20 20:22:20 192 Keepalived_healthcheckers[15334]: Netlink reflector reports IP 192.168.0.88 added
Apr 20 20:22:25 192 Keepalived_vrrp[15335]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 192.168.0.88
发现已经将虚拟ip 192.168.0.88绑定了网卡eth1上。(4)查看绑定情况
[root@192.168.0.50 ~]# ip addr | grep eth1
3: eth1: &BROADCAST,MULTICAST,UP,LOWER_UP& mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 192.168.0.50/24 brd 192.168.0.255 scope global eth1
inet 192.168.0.88/32 scope global eth1
[root@192.168.0.50 ~]#
在另外一台服务器,候选master上启动keepalived服务,并观察
[root@192.168.0.60 ~]# /etc/init.d/ tail -f /var/log/messages
Starting keepalived:
Apr 20 20:26:18 192 Keepalived_vrrp[9472]: Registering gratuitous ARP shared channel
Apr 20 20:26:18 192 Keepalived_vrrp[9472]: Opening file '/etc/keepalived/keepalived.conf'.
Apr 20 20:26:18 192 Keepalived_vrrp[9472]: Configuration is using : 62976 Bytes
Apr 20 20:26:18 192 Keepalived_vrrp[9472]: Using LinkWatch kernel netlink reflector...
Apr 20 20:26:18 192 Keepalived_vrrp[9472]: VRRP_Instance(VI_1) Entering BACKUP STATE
Apr 20 20:26:18 192 Keepalived_vrrp[9472]: VRRP sockpool: [ifindex(3), proto(112), unicast(0), fd(10,11)]
Apr 20 20:26:18 192 Keepalived_healthcheckers[9471]: Netlink reflector reports IP 192.168.80.138 added
Apr 20 20:26:18 192 Keepalived_healthcheckers[9471]: Netlink reflector reports IP 192.168.0.60 added
Apr 20 20:26:18 192 Keepalived_healthcheckers[9471]: Netlink reflector reports IP fe80::20c:29ff:fe9d:6a9e added
Apr 20 20:26:18 192 Keepalived_healthcheckers[9471]: Netlink reflector reports IP fe80::20c:29ff:fe9d:6aa8 added
Apr 20 20:26:18 192 Keepalived_healthcheckers[9471]: Registering Kernel netlink reflector
Apr 20 20:26:18 192 Keepalived_healthcheckers[9471]: Registering Kernel netlink command channel
Apr 20 20:26:18 192 Keepalived_healthcheckers[9471]: Opening file '/etc/keepalived/keepalived.conf'.
Apr 20 20:26:18 192 Keepalived_healthcheckers[9471]: Configuration is using : 7231 Bytes
Apr 20 20:26:18 192 kernel: IPVS: Registered protocols (TCP, UDP, AH, ESP)
Apr 20 20:26:18 192 kernel: IPVS: Connection hash table configured (size=4096, memory=64Kbytes)
Apr 20 20:26:18 192 kernel: IPVS: ipvs loaded.
Apr 20 20:26:18 192 Keepalived_healthcheckers[9471]: Using LinkWatch kernel netlink reflector...
从上面的信息可以看到keepalived已经配置成功。注意:
上面两台服务器的keepalived都设置为了BACKUP模式,在keepalived中2种模式,分别是master-&backup模式和backup-&backup模式。这两种模式有很大区别。在master-&backup模式下,一旦主库宕机,虚拟ip会自动漂移到从库,当主库修复后,keepalived启动后,还会把虚拟ip抢占过来,即使设置了非抢占模式(nopreempt)抢占ip的动作也会发生。在backup-&backup模式下,当主库宕机后虚拟ip会自动漂移到从库上,当原主库恢复和keepalived服务启动后,并不会抢占新主的虚拟ip,即使是优先级高于从库的优先级别,也不会发生抢占。为了减少ip漂移次数,通常是把修复好的主库当做新的备库。
(5)MHA引入keepalived(MySQL服务进程挂掉时通过MHA 停止keepalived):
要想把keepalived服务引入MHA,我们只需要修改切换是触发的脚本文件master_ip_failover即可,在该脚本中添加在master发生宕机时对keepalived的处理。
编辑脚本/usr/local/bin/master_ip_failover,修改后如下,我对perl不熟悉,所以我这里完整贴出该脚本(主库上操作,192.168.0.50)。
在MHA Manager修改脚本修改后的内容如下(参考资料比较少):
#!/usr/bin/env perl
use warnings FATAL =& 'all';
use Getopt::L
$ssh_user,
$orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip,
$new_master_port
my $vip = '192.168.0.88';
my $ssh_start_vip = "/etc/init.d/keepalived start";
my $ssh_stop_vip = "/etc/init.d/keepalived stop";
GetOptions(
'command=s'
=& \$command,
'ssh_user=s'
=& \$ssh_user,
'orig_master_host=s' =& \$orig_master_host,
'orig_master_ip=s'
=& \$orig_master_ip,
'orig_master_port=i' =& \$orig_master_port,
'new_master_host=s'
=& \$new_master_host,
'new_master_ip=s'
=& \$new_master_ip,
'new_master_port=i'
=& \$new_master_port,
exit &main();
sub main {
print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
if ( $command eq "stop" || $command eq "stopssh" ) {
my $exit_code = 1;
print "Disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
warn "Got Error: $@\n";
exit $exit_code;
exit $exit_code;
elsif ( $command eq "start" ) {
my $exit_code = 10;
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
$exit_code = 0;
exit $exit_code;
exit $exit_code;
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
#`ssh $ssh_user\@cluster1 \" $ssh_start_vip \"`;
# A simple system call that enable the VIP on the new master
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
# A simple system call that disable the VIP on the old_master
sub stop_vip() {
return 0 &unless &($ssh_user);
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
sub usage {
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
现在已经修改这个脚本了,我们现在打开在上面提到过的参数,再检查集群状态,看是否会报错。
[root@192.168.0.20 ~]# grep 'master_ip_failover_script' /etc/masterha/app1.cnf
master_ip_failover_script= /usr/local/bin/master_ip_failover
[root@192.168.0.20 ~]#
[root@192.168.0.20 ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf
Sun Apr 20 23:10:01 2014 - [info] Slaves settings check done.
Sun Apr 20 23:10:01 2014 - [info]
192.168.0.50 (current master)
+--192.168.0.60
+--192.168.0.70
Sun Apr 20 23:10:01 2014 - [info] Checking replication health on 192.168.0.60..
Sun Apr 20 23:10:01 2014 - [info]
Sun Apr 20 23:10:01 2014 - [info] Checking replication health on 192.168.0.70..
Sun Apr 20 23:10:01 2014 - [info]
Sun Apr 20 23:10:01 2014 - [info] Checking master_ip_failover_script status:
Sun Apr 20 23:10:01 2014 - [info]
/usr/local/bin/master_ip_failover --command=status --ssh_user=root --orig_master_host=192.168.0.50 --orig_master_ip=192.168.0.50 --orig_master_port=3306
Sun Apr 20 23:10:01 2014 - [info]
Sun Apr 20 23:10:01 2014 - [warning] shutdown_script is not defined.
Sun Apr 20 23:10:01 2014 - [info] Got exit code 0 (Not master dead).
MySQL Replication Health is OK.
可以看见已经没有报错了。哈哈&/usr/local/bin/master_ip_failover添加或者修改的内容意思是当主库数据库发生故障时,会触发MHA切换,MHA Manager会停掉主库上的keepalived服务,触发虚拟ip漂移到备选从库,从而完成切换。当然可以在keepalived里面引入脚本,这个脚本监控mysql是否正常运行,如果不正常,则调用该脚本杀掉keepalived进程。
2.通过脚本的方式管理VIP。这里是修改/usr/local/bin/master_ip_failover,也可以使用其他的语言完成,比如php语言。使用php脚本编写的failover这里就不介绍了。修改完成后内容如下,而且如果使用脚本管理vip的话,需要手动在master服务器上绑定一个vip(发现修改修改对perl竟然有感觉了。难道我适合学Perl?^_^)
[root@192.168.0.50 ~]# /sbin/ifconfig eth1:1 192.168.0.88/24
通过脚本来维护vip的测试我这里就不说明了,童鞋们自行测试,脚本如下(测试通过)
#!/usr/bin/env perl
use warnings FATAL =& 'all';
use Getopt::L
$ssh_user,
$orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip,
$new_master_port
my $vip = '192.168.0.88/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth1:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth1:$key down";
GetOptions(
'command=s'
=& \$command,
'ssh_user=s'
=& \$ssh_user,
'orig_master_host=s' =& \$orig_master_host,
'orig_master_ip=s'
=& \$orig_master_ip,
'orig_master_port=i' =& \$orig_master_port,
'new_master_host=s'
=& \$new_master_host,
'new_master_ip=s'
=& \$new_master_ip,
'new_master_port=i'
=& \$new_master_port,
exit &main();
sub main {
print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
if ( $command eq "stop" || $command eq "stopssh" ) {
my $exit_code = 1;
print "Disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
warn "Got Error: $@\n";
exit $exit_code;
exit $exit_code;
elsif ( $command eq "start" ) {
my $exit_code = 10;
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
$exit_code = 0;
exit $exit_code;
exit $exit_code;
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
sub stop_vip() {
&return 0 &unless &($ssh_user);
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
sub usage {
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
为了防止脑裂发生,推荐生产环境采用脚本的方式来管理虚拟ip,而不是使用keepalived来完成。到此为止,基本MHA集群已经配置完毕。接下来就是实际的测试环节了。通过一些测试来看一下MHA到底是如何进行工作的。下面将从MHA自动failover,我们手动failover,在线切换三种方式来介绍MHA的工作情况。
一.自动Failover(必须先启动MHA Manager,否则无法自动切换,当然手动切换不需要开启MHA Manager监控。各位童鞋请参考前面启动MHA Manager)
测试环境再次贴一下,文章太长,自己都搞晕了。
Monitor host
192.168.0.20
监控复制组
192.168.0.50
Candicate master
192.168.0.60
192.168.0.70
自动failover模拟测试的操作步骤如下。(1)使用sysbench生成测试数据(使用yum快速安装)
yum install sysbench -y
在主库(192.168.0.50)上进行sysbench数据生成,在sbtest库下生成sbtest表,共100W记录。
[root@192.168.0.50 ~]# sysbench --test=oltp --oltp-table-size=1000000 --oltp-read-only=off --init-rng=on --num-threads=16 --max-requests=0 --oltp-dist-type=uniform --max-time=1800 --mysql-user=root --mysql-socket=/tmp/mysql.sock --mysql-password=123456 --db-driver=mysql --mysql-table-engine=innodb --oltp-test-mode=complex prepare
(2)停掉slave sql线程,模拟主从延时。(192.168.0.60)
mysql& stop slave io_
Query OK, 0 rows affected (0.08 sec)
另外一台slave我们没有停止io线程,所以还在继续接收日志。
(3)模拟sysbench压力测试。
在主库上(192.168.0.50)进行压力测试,持续时间为3分钟,产生大量的binlog。
[root@192.168.0.50 ~]# sysbench --test=oltp --oltp-table-size=1000000 --oltp-read-only=off --init-rng=on --num-threads=16 --max-requests=0 --oltp-dist-type=uniform --max-time=180 --mysql-user=root --mysql-socket=/tmp/mysql.sock --mysql-password=123456 --db-driver=mysql --mysql-table-engine=innodb --oltp-test-mode=complex run
sysbench 0.4.12:
multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 16
Initializing random number generator from timer.
Doing OLTP test.
Running mixed OLTP test
Using Uniform distribution
Using "BEGIN" for starting transactions
Using auto_inc on the id column
Threads started!
Time limit exceeded, exiting...
(last message repeated 15 times)
OLTP test statistics:
queries performed:
transactions:
(5.92 per sec.)
deadlocks:
(0.00 per sec.)
read/write requests:
(112.56 per sec.)
other operations:
(11.85 per sec.)
Test execution summary:
total time:
total number of events:
total time taken by event execution:
per-request statistics:
95 percentile:
Threads fairness:
events (avg/stddev):
67.3750/1.49
execution time (avg/stddev):
181.9032/0.11
(4)开启slave(192.168.0.60)上的IO线程,追赶落后于master的binlog。
mysql& start slave io_
Query OK, 0 rows affected (0.00 sec)
(5)杀掉主库mysql进程,模拟主库发生故障,进行自动failover操作。
[root@192.168.0.50 ~]# pkill -9 mysqld
(6)查看MHA切换日志,了解整个切换过程,在192.168.0.20上查看日志:
[root@192.168.0.20 ~]# cat /var/log/masterha/app1/manager.log
Mon Apr 21 20:15:45 2014 - [warning] Got error on MySQL select ping: 2006 (MySQL server has gone away)
Mon Apr 21 20:15:45 2014 - [info] Executing seconary network check script: /usr/local/bin/masterha_secondary_check -s server03 -s server02 --user=root --master_host=server02 --master_ip=192.168.0.50 --master_
Creating /tmp if not exists..
Checking output directory is accessible or not..
Binlog found at /data/mysql, up to mysql-bin.000018
Mon Apr 21 20:15:48 2014 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Mon Apr 21 20:15:48 2014 - [info] Reading application default configurations from /etc/masterha/app1.cnf..
Mon Apr 21 20:15:48 2014 - [info] Reading server configurations from /etc/masterha/app1.cnf..
ble from server03. OK.
Monitoring server server02 is reachable, Master is not reachable from server02. OK.
Mon Apr 21 20:15:46 2014 - [info] Master is not reachable from all other monitoring servers. Failover should start.
Mon Apr 21 20:15:46 2014 - [warning] Got error on MySQL connect: 2013 (Lost connection to MySQL server at 'reading initial communication packet', system error: 111)
Mon Apr 21 20:15:46 2014 - [warning] Connection failed 1 time(s)..
Mon Apr 21 20:15:47 2014 - [warning] Got error on MySQL connect: 2013 (Lost connection to MySQL server at 'reading initial communication packet', system error: 111)
Mon Apr 21 20:15:47 2014 - [warning] Connection failed 2 time(s)..
Mon Apr 21 20:15:48 2014 - [warning] Got error on MySQL connect: 2013 (Lost connection to MySQL server at 'reading initial communication packet', system error: 111)
Mon Apr 21 20:15:48 2014 - [warning] Connection failed 3 time(s)..
Mon Apr 21 20:15:48 2014 - [warning] Master is not reachable from health checker!
Mon Apr 21 20:15:48 2014 - [warning] Master 192.168.0.50(192.168.0.50:3306) is not reachable!
Mon Apr 21 20:15:48 2014 - [warning] SSH is reachable.
Mon Apr 21 20:15:48 2014 - [info] Connecting to a master server failed. Reading configuration file /etc/masterha_default.cnf and /etc/masterha/app1.cnf again, and trying to connect to all servers to check server status..
Mon Apr 21 20:15:48 2014 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Mon Apr 21 20:15:48 2014 - [info] Reading application default configurations from /etc/masterha/app1.cnf..
Mon Apr 21 20:15:48 2014 - [info] Reading server configurations from /etc/masterha/app1.cnf..
Mon Apr 21 20:15:48 2014 - [info] Dead Servers:
Mon Apr 21 20:15:48 2014 - [info]
192.168.0.50(192.168.0.50:3306)
Mon Apr 21 20:15:48 2014 - [info] Alive Servers:
Mon Apr 21 20:15:48 2014 - [info]
192.168.0.60(192.168.0.60:3306)
Mon Apr 21 20:15:48 2014 - [info]
192.168.0.70(192.168.0.70:3306)
Mon Apr 21 20:15:48 2014 - [info] Alive Slaves:
Mon Apr 21 20:15:48 2014 - [info]
192.168.0.60(192.168.0.60:3306)
Version=5.5.19-ndb-7.2.4-gpl-log (oldest major version between slaves) log-bin:enabled
Mon Apr 21 20:15:48 2014 - [info]
Replicating from 192.168.0.50(192.168.0.50:3306)
Mon Apr 21 20:15:48 2014 - [info]
Primary candidate for the new Master (candidate_master is set)
Mon Apr 21 20:15:48 2014 - [info]
192.168.0.70(192.168.0.70:3306)
Version=5.5.19-ndb-7.2.4-gpl-log (oldest major version between slaves) log-bin:enabled
Mon Apr 21 20:15:48 2014 - [info]
Replicating from 192.168.0.50(192.168.0.50:3306)
Mon Apr 21 20:15:48 2014 - [info] Checking slave configurations..
Mon Apr 21 20:15:48 2014 - [info] Checking replication filtering settings..
Mon Apr 21 20:15:48 2014 - [info]
Replication filtering check ok.
Mon Apr 21 20:15:48 2014 - [info] Master is down!
Mon Apr 21 20:15:48 2014 - [info] Terminating monitoring script.
Mon Apr 21 20:15:48 2014 - [info] Got exit code 20 (Master dead).
Mon Apr 21 20:15:48 2014 - [info] MHA::MasterFailover version 0.53.
Mon Apr 21 20:15:48 2014 - [info] Starting master failover.
Mon Apr 21 20:15:48 2014 - [info]
Mon Apr 21 20:15:48 2014 - [info] * Phase 1: Configuration Check Phase..
Mon Apr 21 20:15:48 2014 - [info]
Mon Apr 21 20:15:48 2014 - [info] Dead Servers:
Mon Apr 21 20:15:48 2014 - [info]
192.168.0.50(192.168.0.50:3306)
Mon Apr 21 20:15:48 2014 - [info] Checking master reachability via mysql(double check)..
Mon Apr 21 20:15:48 2014 - [info]
Mon Apr 21 20:15:48 2014 - [info] Alive Servers:
Mon Apr 21 20:15:48 2014 - [info]
192.168.0.60(192.168.0.60:3306)
Mon Apr 21 20:15:48 2014 - [info]
192.168.0.70(192.168.0.70:3306)
Mon Apr 21 20:15:48 2014 - [info] Alive Slaves:
Mon Apr 21 20:15:48 2014 - [info]
192.168.0.60(192.168.0.60:3306)
Version=5.5.19-ndb-7.2.4-gpl-log (oldest major version between slaves) log-bin:enabled
Mon Apr 21 20:15:48 2014 - [info]
Replicating from 192.168.0.50(192.168.0.50:3306)
Mon Apr 21 20:15:48 2014 - [info]
Primary candidate for the new Master (candidate_master is set)
Mon Apr 21 20:15:48 2014 - [info]
192.168.0.70(192.168.0.70:3306)
Version=5.5.19-ndb-7.2.4-gpl-log (oldest major version between slaves) log-bin:enabled
Mon Apr 21 20:15:48 2014 - [info]
Replicating from 192.168.0.50(192.168.0.50:3306)
Mon Apr 21 20:15:49 2014 - [info] ** Phase 1: Configuration Check Phase completed.
Mon Apr 21 20:15:49 2014 - [info]
Mon Apr 21 20:15:49 2014 - [info] * Phase 2: Dead Master Shutdown Phase..
Mon Apr 21 20:15:49 2014 - [info]
Mon Apr 21 20:15:49 2014 - [info] Forcing shutdown so that applications never connect to the current master..
Mon Apr 21 20:15:49 2014 - [info] Executing master IP deactivatation script:
Mon Apr 21 20:15:49 2014 - [info]
/usr/local/bin/master_ip_failover --orig_master_host=192.168.0.50 --orig_master_ip=192.168.0.50 --orig_master_port=3306 --command=stopssh --ssh_user=root
IN SCRIPT TEST====/etc/init.d/keepalived stop==/etc/init.d/keepalived start===
Disabling the VIP on old master: 192.168.0.50
Mon Apr 21 20:15:49 2014 - [info]
Mon Apr 21 20:15:49 2014 - [warning] shutdown_script is not set. Skipping explicit shutting down of the dead master.
Mon Apr 21 20:15:49 2014 - [info] * Phase 2: Dead Master Shutdown Phase completed.
Mon Apr 21 20:15:49 2014 - [info]
Mon Apr 21 20:15:49 2014 - [info] * Phase 3: Master Recovery Phase..
Mon Apr 21 20:15:49 2014 - [info]
Mon Apr 21 20:15:49 2014 - [info] * Phase 3.1: Getting Latest Slaves Phase..
Mon Apr 21 20:15:49 2014 - [info]
Mon Apr 21 20:15:49 2014 - [info] The latest binary log file/position on all slaves is mysql-bin.000018:112
Mon Apr 21 20:15:49 2014 - [info] Latest slaves (Slaves that received relay log files to the latest):
Mon Apr 21 20:15:49 2014 - [info]
192.168.0.60(192.168.0.60:3306)
Version=5.5.19-ndb-7.2.4-gpl-log (oldest major version between slaves) log-bin:enabled
Mon Apr 21 20:15:49 2014 - [info]
Replicating from 192.168.0.50(192.168.0.50:3306)
Mon Apr 21 20:15:49 2014 - [info]
Primary candidate for the new Master (candidate_master is set)
Mon Apr 21 20:15:49 2014 - [info]
192.168.0.70(192.168.0.70:3306)
Version=5.5.19-ndb-7.2.4-gpl-log (oldest major version between slaves) log-bin:enabled
Mon Apr 21 20:15:49 2014 - [info]
Replicating from 192.168.0.50(192.168.0.50:3306)
Mon Apr 21 20:15:49 2014 - [info] The oldest binary log file/position on all slaves is mysql-bin.000018:112
Mon Apr 21 20:15:49 2014 - [info] Oldest slaves:
Mon Apr 21 20:15:49 2014 - [info]
192.168.0.60(192.168.0.60:3306)
Version=5.5.19-ndb-7.2.4-gpl-log (oldest major version between slaves) log-bin:enabled
Mon Apr 21 20:15:49 2014 - [info]
Replicating from 192.168.0.50(192.168.0.50:3306)
Mon Apr 21 20:15:49 2014 - [info]
Primary candidate for the new Master (candidate_master is set)
Mon Apr 21 20:15:49 2014 - [info]
192.168.0.70(192.168.0.70:3306)
Version=5.5.19-ndb-7.2.4-gpl-log (oldest major version between slaves) log-bin:enabled
Mon Apr 21 20:15:49 2014 - [info]
Replicating from 192.168.0.50(192.168.0.50:3306)
Mon Apr 21 20:15:49 2014 - [info]
Mon Apr 21 20:15:49 2014 - [info] * Phase 3.2: Saving Dead Master's Binlog Phase..
Mon Apr 21 20:15:49 2014 - [info]
Mon Apr 21 20:15:49 2014 - [info] Fetching dead master's binary logs..
Mon Apr 21 20:15:49 2014 - [info] Executing command on the dead master 192.168.0.50(192.168.0.50:3306): save_binary_logs --command=save --start_file=mysql-bin.000018
--start_pos=112 --binlog_dir=/data/mysql --output_file=/tmp/saved_mas}

我要回帖

更多关于 c 复制对象副本 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信