mongodb 读写性能是否有必要读写分离

现在的位置:
初探mysqlnd与mysqlnd_ms读写分离
mysqlnd不能做什么
虽然mysqlnd是一个PHP扩展,但它却没有提供任何的php函数(或者说是API)给码农们使用。
码农们仍然使用mysql 扩展函数(mysql_connect, mysql_query…),或者mysqli,或者PDO MYSQL来操作数据库。 这些函数都可以通过mysqlnd来与mysql数据库通信。
它是数据库与php函数的中间层。
为什么要使用mysqlnd
原来的libmysql用的好好的,为什么还要搞一个mysqlnd出来呢?
原因一: license问题
libmysql是MYSQL AB公司开发的,现在已经是Oracle集团所属的了,它使用MYSQL license发布。
This ultimately led to MySQL support being disabled by default in PHP
mysqlnd 是php的一部分,使用PHP license发布。
从此 licensing 的问题就算是解决了。
原因二:编译问题
使用libmysql的时候,如果要正常编译php,必须首先安装好mysql。
如果是单纯的一台WEB服务器,装个mysql似乎有点浪费了。
mysqlnd的话,就不必安装mysql,直接可用。
原因三:性能问题
由于mysqlnd是一个php扩展,使用了php memory management system,在内存使用方面效率相当高。
举个例子:
使用libmysql的时候,mysql结果集中的每一行都在内存中储存了二次 !
使用mysqlnd,结果集只会储存一次。
而且它还服从于php.ini中memory_limit的设置。
Using MySQL Native Driver leads to comparable or better performance than using MySQL Client Library。
mysqlnd_ms测试
看了pecl/mysqlnd_ms 插件介绍,决定试一下,这是一款mysql读写分离/负载 均衡 插件
1.下载 mysqlnd_ms 插件
http://pecl.php.net/package/mysqlnd_ms
tar -zxf mysqlnd_ms-1.4.2.tgz
cd mysqlnd_ms-1.4.2/
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --enable-mysqlnd-ms
extension_dir = &/usr/local/php/lib/php/extensions/no-debug-non-zts-/&
extension = &mysqlnd_ms.so&
mysqlnd_ms.enable=1
mysqlnd_ms.config_file=&/usr/local/php/etc/mysql_ms.ini&
mysql_ms.ini:
&cloud&: {
&master&: {
&master_0&: {
&host&: &localhost&,
&socket&: &\/tmp\/mysql.sock&,
&user& : &root&,
&password& : &123456&,
&connect_flags&: 0
&slave&: {
&slave_0&: {
&host&: &192.168.1.200&,
&port&: &3305&,
&user&: &reader&,
&password& : &reader&,
&connect_flags&: 1
配置完成后,可通过 echo phpinfo(); 查看mysqlnd_ms 属性 ,如下图:
php端使连接使用:
if($mysql = mysql_connect(&cloud&, &user&, &password&)){
$sql = &select * from test&;
mysql_select_db('test_slave',$mysql);
mysql_query($sql,$mysql);
echo &connect wrong&;
通过 strace /usr/local/php/bin/php test.php
可以跟踪代码连接的数据库,范例里是select 语句,所以mysqlnd_ms 自动选择了 192.168.1.200 这台机器
connect(3, {sa_family=AF_INET, sin_port=htons(3305), sin_addr=inet_addr("192.168.1.200")}, 16) = -1 EINPROGRESS (Operation now in progress)
如果是insert语句,strace跟踪结果是
connect(3, {sa_family=AF_FILE, path="/tmp/mysql.sock"}, 17) = 0
来源:、blog.csdn.net/dragon8299
【上篇】【下篇】
您可能还会对这些文章感兴趣!
日志总数:159篇
评论总数:7条
分类总数:34个
标签总数:216个
友情链接:2个
网站运行:2006天
最后更新:日MongoDB读写分离的适用性_慕课网吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
MongoDB读写分离的适用性收藏
是否应该读写分离?什么时候要读写分离?读写分离真的能提高承载能力么?本节课将为你揭秘。
第1章 MongoDB读写分离的适用性告诉你MongoDB读写分离的适用性
介绍Linux的发展史、开源软件介绍、Linux的应用领域和学习方法
介绍虚拟机和Linux系统的安装,及分区的概念
介绍命令基本格式和文件处理命令
介绍Linux的文件搜索命令
点亮12星座印记,
楼主英文不错。
点亮12星座印记,
值得学习。
点亮12星座印记,
勤加练习。
点亮12星座印记,
点亮12星座印记,
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或cclo 的BLOG
用户名:cclo
文章数:37
访问量:107579
注册日期:
阅读量:5863
阅读量:12276
阅读量:379805
阅读量:1072213
[匿名]xiaofan:
51CTO推荐博文
环境:mongodb版本:2.4.6,需求:primary压力过大,期望secondary分担读压力前言& & 从应用程序角度来看,使用mongo很像。默认的驱动程序会连接primary节点,并且将所有读写请求都路由到主节点。但也可以通过设置驱动程序的Read Preferences配置其他选项,将读请求路由到其他节点。但需要知道的是将读请求路由到其他节点所带来的问题...... &附:驱动程序连接到常用的连接字符串类似:'mongodb://server1:27017,server2:27017' .具体可以查看相关驱动程序的文档,php可参考:& & 问题是:& & 1: &一致性的考虑,对一致性要求比较高的应用程序是不应该从备份节点读取数据,备份节点通常由于加载问题,网络等原因,而落后于主节点几毫秒,几秒,几分钟 甚至更多。如果应用程序需要读取它自己的写操作(比如,先插入一个文档,再去查询它)那么不应该从备份节点去读取数据,除非针对写操作,使用Write Concern定义w数值,在复制到所有备份节点之后,再返回执行成功与否。总之,如果从一个落后的备份节点读取数据,就要牺牲一致性。如果希望写入操作返回之前被复制到所有的副本集成员,就要牺牲写入速度。& &2: 如果路由到的备份节点,其中一台挂了,那么其他节点将承担其相应的压力,需要注意此时在线节点的负载压力。& &小结论是: 一般是不建议做读写分离,但是我们这里业务,写操作很少,大量的读请求,这里决定做读写分离来分担服务器压力,然后慢慢过度到分片。什么是Read Preference?& & Read Preference 描述了mongodb 如何将请求路由到副本集的节点,默认下,会路由到primary节点Read Preference 的几个模式:& & primary :& 默认的模式,所有读写,都路由到primary节点& & primaryPreferred& :大部分情况,操作从primary节点读数据,除非primary节点不可用& & secondary: 所有操作从secondary节点读取数据& & secondaryPreferred:大多数情况,操作从secondary节点读取数据,除非所有secondary节点不可用.& & nearest:从最小的网络的延迟的那个节点读取数据,不管节点的类型什么是&getLastError?& &&& & 驱动程序在执行一个写操作后,会执行getLastError ,然后通过返回的信息来判断是否执行成功,返回的可以是:& & & &1 :null ,说明执行成功& & & &2 : 一个最后的错误描述& & getLastError 可以有下面的选项来配置write concern:& & & &j or "journal" option:& & & & &它会确认monod实利写入journal数据到磁盘,保证数据在突然关机的情况下不会丢失 栗子:& & & & &&&db.runCommand( { getLastError: 1, j: "true" } )& & & & &note:&If you set journal to true, and the mongod does not have journaling enabled, as with nojournal, then getLastError will provide basic receipt acknowledgment, and will include a jnote field in its return document.& & &w option:& & & & &0 &: 禁用基本的acknowledgment写操作,返回socket异常和网络异常& & & & &1 &: 提供acknowledgment 的写操作,在单机或者副本集的primary节点& & & & &&1 &: 保证写操作成功的应用到副本集指定的节点(包含primary)& & & & &majority : 确认副本集成员多数写入成功& &wtimeout option:&& & & & &设置write concern超时的超时时间,如果不指定或指定为0 在某些情况下可以导致写操作一直block.什么是Write Concern?& & Write concern: 当一个mongodb的写入操作成功执行后什么时候返回给客户端.通过getLastError实现.mongodb 提供不同的等级以方便客户端特殊的请求Write Concern Levels:& & Unacknowledged: mongod不会确认写入是否成功,客户端也不会提示是否报错,除非是网络错误(在此版本之前是默认的级别).设置方法: 在你的驱动程序上设置此指定w为0.& & Acknowledged: mongodb 会确认写入是否成功,客户端也可以获取到网络,复制,或者其他的错误.(目前默认的级别)设置方法:在你的驱动程序上设置此指定w为1.& & 默认的write concern 会调用getLastError( 不带参数)来确认是否执行写入成功,& 所以也可以在副本集中通过修改默认的getLastErrorDefaults来实现 write concern的级别的更改,这里没有修改mongo 的默认配置,是通过修改驱动程序的配置来实现.getLastError:&getLastErrorDefaults: && & Journaled :mongodb 会在数据提交到 journal 后才返回写操作成功.mongod服务必须开启journal,mongodb2.4默认是开启的. 另外在副本集中,只要primary的journal 写入成功就返回.还可以增加mongodb 提交到journal的频率来减小此种方式的延迟:设置:指定w为1并且指定 j=true.& & Replica Acknowledged:可以保证写操作写入到副本集的成员后才返回成功 .&设置w 大于1 , 比如2& 是保证2个成员写入成功后返回.如何设置mongodb的读写分离?1: 应用程序设置write concern 看这里:&& & php栗子:&?php
$m&=&new&MongoClient("mongodb://localhost/?journal=true&w=majority&wTimeoutMS=20000");
?&2: mongodb Replica Sets 修改默认的 getLastError&(getLastErrorDefaults 的设置只会在getLastError 命令没有其他参数的情况下生效):&cfg&=&rs.conf()
cfg.settings&=&{}
cfg.settings.getLastErrorDefaults&=&{w:&3,wtimeout:&6000}
rs.reconfig(cfg)以上配置意思:数据成功写入3个节点后返回,其中包含了primary.最好设置wtimeout,当指定w的数值比副本集的成员多的情况下,写入操作会一直被block. 另外 wtimeout设置为0 意味这一直不超时.参考:本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:未分类┆阅读(0)┆评论(0)我终于深入参与了一个分布式系统了,好多想法不一样了! - 文章 - 伯乐在线
& 我终于深入参与了一个分布式系统了,好多想法不一样了!
过去两个月深入的参与了一个分布式系统的开发,记得之前有人说过“想成为架构师之前,都是从微观架构开始的”。尽管我从没想过将来的某一天要成为一个架构师,或者领域专家,我只是想萌萌哒的编码,写着自己喜欢的Code,和一群志同道合的朋友做出大家喜欢的商品和产品。但是工作久了慢慢的搭架子的事情还是会来到你的面前,因为时间总会把一部分人慢慢推向海边,使得他们成为最早见到阳光的人。
不扯淡了,为什么要说阳光呢,还是因为过去的两(三)个月可能过的太充实也太痛苦了,完成之后,曙光来临的时候整个人是会发光的哦。“深度”参与是因为我终于有机会在搭架子的过程中有了话语权和选择权,同时也会承担70%以上的编码工作。
之前我的自我认知是我可能在软件方面的积累还可以,比如设计模式,架构分层,程序解耦,API入手等方面,但是总觉得我在硬件网络方面积累的太少,太薄了。
不同操纵系统之间的特点;
网络端口管理与分发;
哪些网络协议可以帮助我们更好的完成工作,监控虚拟机的时候是在虚机上加代理好还是用协议去控制;
硬件是否支持分布式,在扩展过程中对于.net C#的兼容怎么样;
什么时候使用多线程,在把线程交给程序调度的时候我们怎么控制和捕捉线程的异常;
日志系统对于整个分散的系统是多么的重要;
何时使用关系数据库,什么时候使用Nosql;
消息队列用擅长的MSMQ还是RabbitMQ.
怎样有效的和其他部门的同事沟通;
用什么样的方式去有效调度不同语言开发的系统;
测试用例对于大系统从零散到完整是多么的重要;
系统标准,代码原则对于后期的维护余扩展是多么的重要;
首先项目详细内容不便多说,简答的说,就是为国内某大型厂商建立一套协调其自身搭建的私有云以及其购买的公有云的一套系统。说牛X一点就是:一套混合云系统。
使用Restful
这是在构建完整个系统最大的收获,之前使用web api的经验只是为电商系统的移动终端提供数据交互的接口,但是在这次项目之后发现Rest接口的不仅作为我们系统向外部系统提供交互的方式,同时在一些开源工具其暴露出来的接口也是基于rest的,可见全世界的程序员对于json对于rest有多么的喜爱;
为什么装上软件配置完成之后使用不了
之前的开发经验由于使用的都是微软的技术包括组建,工具。但是在项目中使用一些开源工具之后,配置成功之后却总也跑不起来,同时由于开源工具已将Exception封装起来,我们很难知道具体是什么样的问题,有的时候调试好久还是跑不起来,很沮丧也很懊恼,结果最后发现是由于公司IT只是将常用的端口打开,其他的都干掉了,如果申请开放端口的话还要走流程,于是对于开发人员有时候有一台外网的开发虚拟机也是相当的有必要的。
使用RabbitMq
个人是非常的喜欢使用Mq的,之前做电商总喜欢在Application层下面放入一层Service,你可以不用但是总会强迫症似的不去不写。为什么不用Msmq呢,原因是有很多了,简单点就是rabbit要比Msmq的协议更加高级,支持的处理功能也更加丰富,最重要的原因是Rabbit在开源语言使用上是占领先地位的,而且我们的系统又要嫁接太多的开源语言系统,最后只能适配他们喽。
之前知道Mq在企业系统间数据交互使用频繁,不但能有效的划分层次,解耦依赖,同时数据交互方式上也相当的便捷。总会有消息没有被消费者使用,那我们就需要程序异步的去处理这个消息队列了。
系统中使用了三种数据存储,MySql,SqlServer,Redis,当然前两种适用于开源和C#,而Redis的使用则是为了那些总是难以找到有效关系和依赖的数据,比如之前只是知道Reids可以作为数据的存储,可以分布式,可以主从复制,但是在这次开发之后更真真的发现Reids或者Nosql对于一个数据规则难以掌握,数据量大的系统是多么的重要,因为有的时候一批的Json串过来之后,难以有效的挖出里面的关系与逻辑,索性就一次性将他们放入Redis中吧,使用时再反序列吧。同时建立读写分离的原则,我们主要将读放在了Redis里面,写到了Mysql,并通过Mysql的触发器实现服务器段数据的主从复制同步。
之前我们的单一系统的时候,比如只是简单的3层架构的话,我们通过Debug可以从头debug到数据库,每一步都是掌握在手底下,每一步都尽收眼底。可是对于这一个层次太深,组建调用较多,同时又是多线程的系统来说,挖到雷的机会,时间,成本都是要考虑的。于是有效的使用日志组件,有效的在代码中埋雷就显的尤为迫切和必要,能够更好的帮助我们找到问题所在。
组件式开发
之前的简单分层系统我们通过Svn或其他的代码管理工具,每次提交都可以Merge看的到,但是当系统庞杂同时系统独立性很强的时候,分组建,分模块开发就显得很重要。因为不想浪费大家一起Merge的时间,我们习惯性每个人有自己的Branch每周2的时候提交代码,大家一起参与,这样减少了好多因为代码管理浪费的时间。
之前小的系统使用测试用例基本就是装B用的,本来小小的系统整套流程脑子一想就可以知道怎么做啦,为什么还要浪费时间。可是在这次开发中充分理解了测试用例的重要性。比如我需要你给我提供多台服务器的监控数据包括CPU信息,IO信息,NEt信息等等,但是你还没有想到怎么样去抓取虚拟信息,不能因为你的问题去影响其他人的进度的,最好的方式从使用者角度获知他希望使用什么样的数据,为其建立API,同时为API建立测试用例并保证测试稳定。而后期我有了监控虚机的方式之后我在建立对应的适配方法适配到对应的API上。
所以首先肯定要保证API的稳定,因为他之上的东西已经稳定了吗,你只好辛苦啦,有效的测试用例可以帮助我们更好的剥离项目逻辑与协调组件系统。
这个主要是每周有时间大家一起参与Code Review,由于开发人员的能力不同资历不同,所以总会在代码的编写上和建立出现太多的不统一。比如命名啦,变量声明啦,有的时候会发现刚毕业的小朋友会将好多的私有变量放在类的顶部,同时一个类里写太多的方法,而且有的方法好长,还没有注释。于是有的时候你想了解一个方法的真正含义,要鼠标各种滚动,到变量声明去了解真正用途,好烦的。
有的时候代码的职责不明确,总是瀑布的思想方式去写代码,比如我们两个功能:一个是发送API请求建立虚拟机,另一个是在虚拟机建立成功时候将操作Log写入db。他们习惯性的将写DB的逻辑放在了发送HTTPRequst的方法里面,这完全是两个逻辑。另一个问题是由于创建虚拟机是需要时间的,同时尽管虚拟机操作成功有可能你写DB的时候网络原因DB失败了。我认为这应该是个原子的操作,两者的状态必须统一,就像是你在手机充值的时候显示银行卡扣金额成功,可是手机充值是出现问题,钱不是白花了吗。所以在这些有特殊逻辑的地方要建立特殊的统一的机制,不能每个人有各自的实现。
之后就是沟通了
由于项目涉及到多个项目组,我们并不是同一个部门,相互也不熟悉,所以沟通上就会有一些需要注意的。首先要了解“对手”,主要是因为如果对方是个技术高手,你不能像个白痴小孩,要有所准备,最起码知道他们用什么开发语言,他们需要关注的业务逻辑,等等,不能让他们得到你是个菜鸟的结论。
由于口头的好多东西可能是没有经过检验的东西,所以前几次达成的协议我们只是做个参考,需要多次沟通之后才能确定结果,比如我们的项目中我们需要和Python组Java组协调消息接口,消息格式的时候。你要知道协调RabbitMQ时候我们需要定义下交互的Exchange,queue name 或者RoteKey等等,同时由于消息格式比较大,需要定义一些关键字或者预设字段的话,需要发邮件进行确认与沟通,避免开发过程中产生误会影响完成的功能返工。
总之这次搭架子的过程收获很多,一时半会也不能想的全面,以后慢慢聊,由于是第一次资历尚浅,好多的技术选型,问题考虑可能不成熟,也希望大家知道更多的能够纠错指导。
下面就说一些我们在架构中使用的一些东西:
开发语言:C#,java,Python;
数据存储:缓存,文件(xml),MSsql,Mysql,Redis;
数据交互:rest,json,RabbitMq;
操作系统:ubuntu,
虚拟机监控:zabbix;
多线程,多层架构,模块式开发,组件式开发;
可能感兴趣的话题
代码,程序、看看了
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线

我要回帖

更多关于 mongodb 读写分离 的文章

 

随机推荐