分类 技术 下的文章

MongoDB 升级

为啥要升级?

更好的性能,和更少的 bug。

2.6 相对于 2.4,得益于引擎的升级,存储时的锁从 db 降为 collection;

3.0 相对于 2.6,如果用了 wiredtiger,存储时的锁可以从 collection 降为 document!

实际试下来发现,性能有极大的优化,锁住的比例降低很多,吞吐率和时间表现都好很多;而且,如果使用 wiredtiger,会发现磁盘占用量少很多(至少节省 1/2)。对升级的结果非常满意。

如何升级?

首先,不能跳跃升级,也就是 2.4 无法直接升级到 3.0,必须 2.4 => 2.6,2.6 => 3.0。稍稍有些麻烦。

基本过程比较简单,都是停止 mongod 进程,用新的 mongod 程序使用原来的配置文件和原来的存储空间启动。

对没有使用 replica 的 mongod,升级过程会导致无法服务,不过,生产环境用 standalone 的情况,很少吧。

对 replica,要一台一台升级,集群内的 mongod 可以是不同的版本,升级过程不会中断服务。为了防止停止一台 mongod 时,无法 vote 出来 primary,停止前要检查一下集群内可用 mongod 数量,必要时需要添加 arbiter 用作投票,整个集群升级完毕后再干掉它。

对 shard,集群内的 replica 按照上面的方式升级;mongos 升级很简单,用新的 mongos 启动即可,但是要注意重启的过程防治有请求打到挂掉的 mongos 上。config 升级前,要停掉 balancer,然后逐个升级。整个升级过程也不会中断服务。

升级后,用户监控或备份的 mms,也要升级,否则可能无法正常工作。 此外,开发语言使用的驱动,也需要做相应升级,否则可能无法正常使用。

切换存储引擎到 wiredtiger,这个非常推荐,一个是能极大减少磁盘占用量,存储锁机制的修改,对性能的提升有极大的好处。stand alone 的机器就别升级了。replica 的机器,需要逐个升级,需要用新的地方数据库存储文件或干掉原来的存储文件,如果使用了旧版的 config 格式,也需要升级到新版,启动 mongod 等待数据传输号即可。

最后,2.4 升级到 3.0,小心操作的话,实际过程很顺利,带来的性能提升非常明显,很棒!

Mongo Ops Manager 部署

Mongo 作为 Nosql 的代表,对开发来说,提供了很大的自由度,但对于运维来说,就非常难受。比如没有图形化的监控工具,比如永远他的投票机制和文档上不一样,比如他的备份方案。

当然,他有数据接口,里面有所有和运维相关的数据,也有现成的监控工具,利用这些工具也能还行。但是,但是请和 ES 比一比...

大约 Mongo 自己也意识到了这个问题,在 3.0 发布的同时,也发布了一个管理、监控和备份的服务 MMS。无法理解 MMS 这个服务,难道要把内网的数据库对公网暴露吗?难道 Mongo 希望别人用一个公网的服务做监控,和 管理 以及 备份?这安全性和速度(数据备份和恢复)怎么保证?

还好 Mongo 将 MMS 背后的工具也 免费 发布了,这里,说的就是我部署的过程。

基本概念

Ops Manager 其实就是 MMS,只是可以自己部署,官方文档在这里

MMS 由 3 大块组件构成

  • MMS HTTP Service
    • 用于监控和管理
    • 需要有一个既能访问 MongoDB 服务,又可以访问 MMSS HTTP Service 的代理
    • 自身需要有一个 MongoDB 服务保存信息
  • Backup HTTP Service
    • 用于备份
    • 备份对象不能是 Standalone 的(独立的,没有做 Replica 或 Sharding,因为它通过 oplog 工作)
    • 需要一个和 MMS HTTP Service 类似作用的代理
    • 需要一个和 MMS HTTP Service 类似作用的 MongoDB 服务
    • 需要磁盘空间保存备份对象的快照(Snapshot)
    • 有一个独立的 Backup daemon 进程,用于生成快照。
  • Backup Alert Service
    • 用于通知,没有详细研究

MMS 服务本身需要使用 MongoDB,这个数据库的版本大于等于被宿主数据库的版本即可。但,备份服务需要有一个和宿主数据库相同的 Mongo 程序放在指定位置,后面会提到。

管理/监控和备份服务,各需要一个代理,这 2 个代理会访问宿主数据库,传递数据,对宿主数据库来说,他们相当于不可见的 Secondary。

数据库备份的快照,最快 6 小时生成一次,不能更快,也无法手动生成。

数据库的恢复,详细文档可以看这里,大致过程,是从 MMS 管理网页上,选择快照(Snapshot),下载,按照文档文档提示一步步恢复,期间 不能 相应请求。快照的时间间隔决定最多会有 6 小时的数据丢失,为了解决这个问题,MMS 有一个机制:如果是恢复一天内的,可以指定精确的时间(精确到分钟),但这样 MMS 需要一定的时间生成恢复文件下载链接,而且MMS 服务器需要额外的磁盘空间。

部署

为了方便测试,MMS 提供了测试部署方案,也就是把所有 HTTP 服务,MongoDB 服务,备份 Daemon 服务放在一台服务器上,具体可以看这里

可能是没考虑轻量级用户的需求,Mongo 提供的方案,都是可以容纳几百个 MongoDB 服务(每个服务是一个完整 Sharding 或 Replica)的,要求高可靠性,高性能,因此文档上对机器的要求都比较可怕。对轻量级需求,用一般的服务器就可以了,CPU 内存问题都不需很好,硬盘大一点就可以了(看宿主 Mongo 占用的磁盘大小)。

MMS 强制要求两个数据库都有 Primary Secondary 和 Arbiter 至少一个,否则在启动服务时,会报错。

详细的部署文档在这里。说几个我遇到坑:

  • 如上面所说,至少要一个 Secondary,我没配,MMS 服务没启动起来;
  • 启动 Backup daemon 时,文档写 27017,我觉得文档肯定写错了,将数据库配成了 27018,也就是备份服务用的数据库,启动服务不成功,/opt/mongodb/mms-backup-daemon/logs/daemon.log 里一直有 The application version is unknown. Ensure that the MMS HTTP Service of version XXX was started up before the Backup Daemon. Stopping. 的错误。正确的的配置,应该用 MMS 数据库,也就是 27017,27018 这个数据库,是在 MMS 的网页控制台里配置的。
  • 备份服务需要保存快照,配置文件 rootDirectory 的设置,默认存在这里 /var/lib/mongodb/backup/,但这个地方要有足够的空间
  • 我配置好所有服务和代理后,oplog 传完了半天,都没有开始建 Snapshot,以为要到指定的时间,但是也没有。查了 daemon.log,一直有 Could not find mongod matching major verison 2, minor version 4, and maintenance version >= 9 in /opt/mongodb/mms-backup-daemon/mongodb-releases/这样的提示,按照这里的提示,下载了宿主 Mongo 服务对应版本的程序,放到这里,才开始正常建快照。

搭建好服务后,就可以访问控制台,需要注册账号(竟然还要注册..),按照提示添加代理就可以了,添加代理的过程是最舒服的,完全傻瓜化操作,复制粘贴命令就行,也有验证的按钮可以用。

MMS 是比较新的服务,做的还是不错,问题不多,但有问题时,也很难 Google 出来。

最后,最好不要将这个服务放到公网上,不知道有什么漏洞,一定要放的话,务必限制好端口的访问。

监听FSEvents事件自动同步文件夹

自从用上了Sublime Text2,对Netbeans就各种不爽,内存占用高,打开慢,要装虚拟机。

对于运行环境在公共服务器上的同学来说,Netbeans可以和ftp自动同步很重要,在windows下可以通过Winscp解决,Mac下一直没找到一个好的文件夹自动同步工具,所有FTP工具都是同步,没有自动同步的功能,于是只好继续用Netbeans。

原来公司的同事有一个解决办法,Mac监控文件夹变化并同步,通过rsync与服务器同步,监控的部分通过定时的方式完成,由于rsync实现方式极为巧妙(通过文件块的方式判断文件变化,只传输必要的文件块达到更新的目的),因此这个方案不会占用太多带宽,是可行的。不过不管文件有没有变化,每隔几秒钟和服务器通信一下,依然不是一个那么完美的方式。

曾经琢磨过自己写一个同步的app,监控文件夹变化,然后同步文件,可惜到现在没搞定。这几天研究Mac的文件夹改变监控接口FSEvents API 时,在Github上发现了fswatch,可以通过FSEvents接口监控指定文件夹。再通过rsync同步文件夹。

先编译出可执行文件(需要安装Xcode且安装Command Line Tools),然后建立一个脚本方便运行。

对作者给出的脚本做了些简化,简化后的内容如下:

#!/bin/sh ./fswatch $1 "date +%H:%M:%S && rsync -iru --delete --exclude='.*' $1 $2"

rsync的参数里,i表示显示同步详情,r表示目录递归,u表示按更新文件的方式同步,--exclude='.*'表示忽略所有隐藏文件

运行方式:将脚本和编译出来的可执行文件fswatch放在一个目录下,执行

./sync /target/to/local/foo/ user@remote:target/to/remove/foo/

为了可以将所有的终端窗口关掉,我会开一个screen执行它

可执行文件和脚本都打包放在附件里

fswatch-master

478元搞定8个人翻墙的问题

478元 = 379元路由器 + 99元一年VPN

最近么,有很多人要开会,于是正常上网更加困难,Facebook和Twitter不能用就算了,连Gmail也5分钟断一次就让人受不了了,毕竟工作邮件不能用,太耽误效率。每个人都翻墙,不是做技术的,教起来太麻烦,于是在@JimSang的大力push下,找到这个解决办法。分享出来,以备需要。

  1. 购买一个可以刷dd-wrt的路由。dd-wrt是一个自制的路由固件,有很多可以定制的功能,更重要的是,它是个精简的linux,也就是说可以跑一些脚本,可以折腾了。dd-wrt要求硬件稍微好一点,也就是内存大一点,dd-wrt有支持路由列表。我买的是BUFFALO WZR-HP-G300NH2,淘宝、京东、亚马逊、易讯、新蛋上都有,官方说明可以刷dd-wrt。
  2. 下载官方有官方定制过的dd-wrt,没试过,我用的原生也挺好。到dd-wrt的官方FTP,找到最新的稳定版(就是不是testing中的),进去后找到自己的型号。进去后有两个bin文件,webupgrade和webflash,webupgrade是原来是dd-wrt旧版,刷到新的,webflash是原来不是dd-wrt,重新刷,第一次刷下载webflash的版本即可。
  3. 刷机。第一次刷机的时候很紧张,生怕刷成砖,刷下来感觉只要当心点,没那么恐怖。先看两个教程吧,Hardware-specificPeacock Thread-FAQ: EVERYTHING you NEED to know! Really!!。另外要保证家里的电路稳定,不能刷了一半停电,实际刷机用不了多久,最多10分钟,至少这10分钟里不能停电。我的步骤如下
    1. 硬重设(Hard Reset),做法是在保持路由通电的情况下按住reset键30秒,不松开reset键,断电,保持30秒,不松开reset键,通电,保持30秒,前后一共按住reset键90秒。
    2. 网线连接路由,不用无线的原因是无线可能没有有线网络稳定,断开电脑的其它网络。进入刷机页面,上传刚才下载的bin文件,刷机。刷机的过程中,路由会自己折腾,提示灯亮亮灭灭的,保持耐心,别断电。路由提示结束之后,访问一下路由的地址,默认是192.168.1.1,不知道看一下自己电脑分配到的IP地址即可。第一次会提示设置root密码,能正常访问的话表示刷机成功。
    3. 再做一次硬重设,步骤和第一步一样。
  4. 刷机成功了,根据自己的情况,让路由可以连上网络。试一下telnet到路由,账号是root,密码是路由的登录密码。
  5. 设置VPN。我的VPN是PPTP类型的,参考autoddvpn的这篇文章,一步一步设置即可。我在设置的时候遇到几个问题:
    1. 设置路由器时说xxx.cgi不能访问。一开始以为什么文件被我删掉了,后来知道浏览器有bug(我的chrome是有的,据说firefox和IE也有),关掉浏览器的所有窗口,退出进程,重新打开浏览器即可;
    2. autoddvpn的教程里提到要用到jffs,我总是被提示说read-only。只要买的路由不是太坑爹,空间一般是够的。解决方式是,先确保在路由的设置里打开了jffs,保存配置,应用,重启后,再在开启jffs选项的下面,选择清空jffs,再次保存配置,应用,重启。这个清空选项会回去,好像自己的选中操作没有用,其实已经清空了。在/jffs目录下建个文件夹试试看就知道了;
    3. 按照教程做了之后,facebook还是不能访问。教程提供的方案,是针对指定IP,通过VPN访问,其它的IP,不走VPN,这样既可以翻墙,也不影响国内网站的访问速度。facebook有很多IP,教程里的IP可能和你访问facebook的不一样,在route add命令(教程中有),就可以了。当然这不是最好的解决方案,我还在摸索中。

在国外有空间,并且可以ssh的同学,也可以通过ssh隧道的方式开socket端口翻墙。参见这篇文章在DD-WRT下面建立 SSH Tunnel (Socks5 Dynamic Port Forwarding) 翻墙(blogspot的文章,需翻墙)。我还没有试。

感谢打造自动翻墙的路由器这篇文章,Google搜索“路由 vpn 翻墙”,搜索结果中的第一篇文章,我从这篇文章入门,知道dd-wrt,知道Buffalo的路由可以刷dd-wrt。