简介mongodb是很出名的nosql数据库了,属于集合-文档型的特有架构nosql数据库,也是被誉为最像关系型数据库的非关系型数据库,但是不支持事务.由于mongodb原生就支持分布式架构,所以部署简单,灵活,可伸缩,自动平衡数据结构等优点,继而性能也非常高.所以搭建mongodb来使用的公司,90%都会使用到mongodb集群.YCSB是Yahoo开发的一个专门用来对新一代数据库进行基准测试的工具。全名是Yahoo! Cloud Serving Benchmark。包括支持的数据库有:cassandra, hbase,mongodb,redis等数据库.YCSB的几大特性:支持常见的数据库读写操作,如插入,修改,删除及读取
多线程支持。YCSB用Java实现,有很好的多线程支持。灵活定义场景文件。可以通过参数灵活的指定测试场景,如100%插入, 50%读50%写等等数据请求分布方式:支持随机,zipfian(只有小部分的数据得到大部分的访问请求)以及最新数据几种请求分布方式可扩展性:可以通过扩展Workload的方式来修改或者扩展YCSB的功能
安装mongodb个人建议直接装二进制版本就算了,方便简单,编译版就显得略麻烦了.现在mongodb最新的正式版本是3.6的,个人觉得太新,这编文章测试用的还是3.2的版本,还请各位知照.总下载地址:
https://www.mongodb.com/download-center?jmp=nav#community
记得是选择community server的版本,然后选取你的操作系统和系统的版本(我这里是rhel的linux),他只显示最新版的下载地址,你要下旧版就要点下面的All Version Binaries.然后就有一堆地址,你自己选择需要的版本吧,例如我要下的是这个地址.下载完成,就开始安装了,因为是二进制版的,很简单就是了.这就安装完成了,后面就是初始化数据库了,初始化之前,必须先有配置文件,二进制版本安装的程序是不带配置文件模板的,所以就要自己编辑了,配置文件存放的位置可以随意,因为启动是需要指定位置的,例如下面这个:配置文件有了,就可以初始化启动了,因为我没有开启认证模式,启动就可以使用了.
============分割线开始=============其实官方是推荐下面这种启动方式,不过我为了方便,就简单化启动了.这种启动方式好处是显然的,对于数据库来说,最怕就是被***提权,然后控制整台机器,所以限制数据库的启动用户是很有意义的.而numa这个功能,对于大内存应用是很不友好的,会变成性能瓶颈,所以无论是sql还是nosql都最好是关闭了这个功能,那性能就更好一些了.
===========分割线结束==============
然后,这个mongodb数据库就可以正常使用的了,当然,我们不是只使用单台mongodb.开头也说了,90%的公司使用mongodb都是会使用到集群,在3.4版本之前,一般就用上面的配置就可以搭建集群,但是在3.4之后,如果不在启动的时候指定这是分片端,则分片集群就不能被正常使用.只有开启了这个参数,分片集群才会正常使用.如果,需要加载到服务启动项,就添加以下脚本:vim /etc/init.d/mongod这样就可以chkconfig或者systemd了
搭建mongodb分片集群先来介绍一下架构,需要三个角色,配置服务器,config端,需要1台或3台,不能是双数,保存集群和分片的元数据,即各分片包含了哪些数据的信息,配置文件指定configsvr选项.
路由服务器,router端,随便多少台都行,本身不保存数据,在启动时从配置服务器加载集群信息,开启mongos进程需要知道配置服务器的地址,指定configdb选项.也可以理解为代理端分片服务器,sharding端,保存真实数据信息,可以是一个副本集也可以是单独的一台服务器,支持主从故障切换.也可以叫数据端.
总共有8台机器,配置是8核16G的虚拟机.10.21.1.205config端(1)+router端(1)10.21.1.206sharding端(1)10.21.1.207sharding端(1)10.21.1.208sharding端(1)10.21.1.209sharding端(1)10.21.1.210sharding端(1)10.21.1.211sharding端(1)10.21.1.212sharding端(1)由于是测试环境,不想纠结太复杂,config端和router端都是一台,当启动router端的时候会抛出一个警告,”只有一台config端的集群建议只用来测试”,是的,我就是用来做测试.
sharding端我不打算详细说了,就按照上面安装mongodb的方式去操作并启动就ok,不需要额外的配置,只需要等配置端把他们地址加载就可以,然后就会自动连接并分配数据块起来,暂时也不需要研究其他东西.就是需要一台台去装就比较麻烦一点,各位自行操作.
1.配置并启动config端:配置服务器也是一个mongod进程,其实也可以按照上面的配置文件来,配置服务器必须开启1个或则3个,开启2个则会报错,所以要注意数量,这里我就设一个就算了.其实和上面只是多了最后一行,标记是config端而已,然后启动.这里就不需要测试了,因为不需要在这里控制config端,然后看router端.
注意:3.4之后的版本使用分片集群,config端必须使用副本集,不然router端无法启动.
2.配置并启动router端:路由服务器本身不保存数据,把日志记录一下即可,他都是直接调用config端来使用.而所有客户端程序想要连接mongodb集群,其实就是连接这个router端的端口来使用,并不是连接config端和sharding端,所以也说是类似于代理的形式.最重要的参数是configdb,指定config端的地址,可以1个或3个,但是不能在其后面带的配置服务器的地址写成localhost或则127.0.0.1,需要设置成其他分片也能访问的地址,即10.21.1.205:20000/20001/20002。否则在添加分片地址的时候会报错.然后是启动:启动完成后会看到个警告,不过这里可以忽略,就是我开头说的,提示你只有一台config的话只建议用来测试.原因就是这台config存储的是各分片的数据块信息,假如这台config挂了,那么各分片之间的数据块就不知道怎么关联了,是一个非常大的安全隐患,所以生产环境一定要保证有3台,最好还是错开在不同的服务器上面,提高安全性.
3.添加和配置分片信息按上面的步骤启动完毕,那就可以开始配置分片了,当然,前提就是那些sharding端都已经全部部署启动完毕.然后,就登录进去操作了:然后,我们来添加分片,sh.addShard(“IP:Port”)这个时候,7个分片都添加完毕,不过,现在还没有数据库,所以还要创建数据库和数据库的片键.创建数据库应该还能理解,片键是什么,下面来简单解析一下:片键必须是一个索引,数据根据这个片键进行拆分分散。通过sh.shardCollection加会自动创建索引。一个自增的片键对写入和数据均匀分布就不是很好,因为自增的片键总会在一个分片上写入,后续达到某个阀值可能会写到别的分片。但是按照片键查询会非常高效。随机片键对数据的均匀分布效果很好。注意尽量避免在多个分片上进行查询。在所有分片上查询,mongos会对结果进行归并排序。也可以说是分片的规则字段了.
=============分割线开始==================
需要特别注意的一点是,有些mongodb是用root启动的,所以数据库的文件权限也是root,这样就可能会造成一种奇葩现象,连接不正常,数据异常等,所以我们要确保数据库文件权限是mongodb的.当然是包括config端的了.=============分割线结束===================
然后,我们就创建数据库并开启分片功能,一条命令就可以,最后再添加个片键就可以用了,命令是sh.enableSharding(“库名”)、sh.shardCollection(“库名.集合名”,{“key”:1})
==============分割线开始==================在mongodb单纯创建数据库和表,并不需要另外的create命令操作,只需要直接插入一条数据就好了,也就代表创建成功不过,我们如果做分片的话,一开始有表是不合适的,因为要做片键,所以才在这里另外来说这个问题.
==============分割线结束==================
这样添加的原因是后面的ycsb测试工具的需要,他会生成一个名为ycsb的数据库,里面有一个usertable集合(表),然后其中有_id这个列,至于hash规则我想就不解析了.然后,在看看状态:好了,至此,mongodb的分片集群已经搭建好,暂时还没有数据,objects显示是0就是没数据了,各分片也没有数据.不过,有时候会因为信息太长而导致显示不全,并提示那么我们就要用下列命令来显示了,三个都可以,然后就显示全部了,但是更长.
4.删除分片信息
最后来看删除分片,有添加,就当然有删除了,虽然不是这里的重点,db.runCommand({“removeshard”:”mmm”})需要注意的是,不能同时删除两个或以上的分片,只有删除完一个后,另一个才可以开始删除.
另外,分片还有迁移功能,可以是整个迁移或迁移某一个块chunks(sh.moveChunk(“db.collection”,{块地址},”新片名称”)),这里不打算展开来说,日常使用中,这种操作也基本上很少涉及,基本上都让均衡器balancer自己去跑就算了.
需要特别注意的是删除主分片,则需要先迁移走数据库到别的分片,这样才能删主分片.
安装删除都完成了,后面来看ycsb要怎么使用了.
搭建ycsb环境ycsb程序本身是python+java的结合体,是不是很奇怪?主要测试的对象是nosql系列数据库:cassandra, hbase,mongodb,redis这些.程序本身也是二进制版,python其实yum一下也行了,主要就是java了.由于java的下载地址经常变,包的容量也不少,所以就只给个官方总地址了,去下java se的包就可以了,虽然已经出了9,但是我还是觉得用8就算了.http://www.oracle.com/technetwork/java/javase/downloads前置的环境安装完毕,就来看怎么安装ycsb了,和java有点像,而且还不用做环境变量,其实我觉得也不能叫安装,直接解压就能用了,现在最新版本是ycsb-0.12.0其他目录暂时就不研究,不过从字面意思可以理解一些,其实就是各种数据库的驱动.后面来看怎么使用了.
使用ycsb
1.使用简介
使用前,我们要先了解他的命令结构,我们才能知道怎么做才能达到效果.有点类似于测试mysql数据库的sysbench第一项,bin/ycsb,就不用解析了,就是命令本身.第二项,load/run/shell,指定这个命令的作用,加载数据/运行测试/交互界面,类似sysbench第三项,mongodb/hbase10/basic..指定这次测试使用的驱动,也就是这次究竟测的是什么数据库,有很多选项,可以ycsb –help看到所有第四项,mongodb.url,指定测试的数据库的认证信息,地址端口和用户密码,这里拿的是mongodb的来做演示第五项,-P workloads/workloada,指定测试的参数文件,默认有6种测试模板,加一个大模板,都可以vim打开来看,大致为:workloada:读写均衡型,50%/50%,Reads/Writesworkloadb:读多写少型,95%/5%,Reads/Writesworkloadc:只读型,100%,Readsworkloadd:读最近写入记录型,95%/5%,Reads/insertworkloade:扫描小区间型,95%/5%,scan/insertworkloadf:读写入记录均衡型,50%/50%,Reads/insertworkload_template:参数列表模板第六项,-s,每10秒打印报告一次到屏幕,可以ycsb –help看到
2.测试参数解析
看了上面的解析,就可以看出来,问题的重点是第五项,-P workloads/workloada,这里编辑好,那压测效果才会出来,那么里面有些什么呢,西面来看看:还有一些参数没列出,然后我们得出自己需要的参数文件,这个是100%纯插入1亿条记录的参数文件,如下所示:每个文档大小大约2KB(fieldlength x fieldcount),数据总大小大概是200G+12G的索引,数量还是比较多,如果是单点,估计是比较难撑,查询也超级慢.但是做了分片的话,程序会自动分配,把他们平均分配到每一个分片中,那么压力就减轻很多了,分布式架构的优势出来了.
3.执行纯插入测试上面我自己写的配置文件,就是为了做插入测试,总共7个分片,插入1亿条数据,花了两个多小时,看来时间还是要预足够.
中间很多行暂时先忽略,因为是会一致输出到运行完毕为止,来看运行解读,每一个项都用分号;来隔开,直接拿例子来说说.这是第二行的数据:第一个分号前的数值:2018-02-02 11:20:00:218 20 sec: 188182 operations;表示”当前的时间,已运行的时间,运行的数据量”三个值,而-s参数默认是每10秒输出一次,直到这1亿数据写完就停止.第二个分号前的数值:13125.59 current ops/sec;表示吞吐量信息,也就是常说的ops值(每秒操作次数),可以用他来做趋势图,看看这个集群的趋势.后面的所有:est completion in 2 hours 56 minutes [INSERT: Count=131051, Max=2009087, Min=35, Avg=6348.01, 90=206, 99=140159, 99.9=1202175, 99.99=1803263]表示预估执行时间,进行了什么操作(这里只有insert),总共操作了多少数据,操作的时间和延时等数据,意义不大,只做参考.
4.执行纯读测试配置文件和上面可以保持大体一致即可,只修改下面这里然后就可以执行了和上面差不多,第一个分号前的数值:2018-02-02 14:14:23:315 20 sec: 136267 operations;表示”当前的时间,已运行的时间,运行的数据量”三个值,而-s参数默认是每10秒输出一次,直到这1亿数据写完就停止.第二个分号前的数值:8354.9 current ops/sec;表示吞吐量信息,也就是常说的ops值(每秒操作次数),可以用他来做趋势图,看看这个集群的趋势.后面的所有:est completion in 4 hours 4 minutes [READ: Count=83543, Max=71231, Min=740, Avg=11962.2, 90=22063, 99=39167, 99.9=52863, 99.99=65919]
表示预估执行时间,进行了什么操作(这里只有read),总共操作了多少数据,操作的时间和延时等数据,意义不大,只做参考.其他测试就不一一细说了,各位自己按实际情况配置这个比例即可.
5.结果解读
上面介绍的其实只是-s输出的结果免费云主机域名,当然那些结果还是很有参考价值的,但是真正的结果其实是下面这些,
关注几个信息:RunTime(ms):数据加载所用时间,单位毫秒(ms)Throughput(ops/sec):吞吐量,即ops(每秒操作次数)Operations:操作的总次数AverageLatency(us):平均响应延时,单位是微秒(us)MinLatency(us):最小响应时间,单位是微秒(us)MaxLatency(us):最大响应时间,单位是微秒(us)95thPercentileLatency(us):95%的操作延时,单位是微秒(us)99thPercentileLatency(us):99%的操作延时,单位是微秒(us)Return=OK:成功返回数,这个值不符合测试要求,则证明测试失败.[READ]开头的代表只读的操作记录,其他还有例如上面的[insert],[UPDATE]等,其他可以理解的就是字面意思,不能理解也不需要太过关注.和其他测试软件一样,这个只能说是基准值,并不是标准值,和真实环境不能全部模拟,所以测试的思维要结合别的测试软件的方法来做.
测试总结经过对5分片/7分片的1亿/3亿数据的测试来看,其实mongodb的OPS并没有明显提升,但是可以看到cpu负载长期属于低状态,而磁盘压力也没有跑满,内存剩余还算多,所以分片的真正意义是提高了并发能力.5分片1亿只读数据图表:单台分片的iops值,
单台分片磁盘利用率,
单台分片cpu使用率,
测试集群ops值,
测试集群平均延时,单位是微秒(us)
7分片1亿只读数据图表:
单台分片的iops值,单台分片磁盘利用率,单台分片cpu使用率,测试集群ops值,测试集群平均延时,单位是微秒(us)
7分片3亿只读数据图表:
单台分片的iops值,单台分片磁盘利用率,单台分片cpu使用率,测试集群ops值,测试集群平均延时,单位是微秒(us)
补充信息1.创建副本集
config端的副本集:一个架构稳定的分片集群,应该需要多个节点副本集,防止一挂全挂现象,这是对数据安全的基本要求.而上面我们也谈到一点,在3.4版本之后,mongos的启动已经强制使用config端的副本集模式,如果没有副本集,你也是启动不起来的,所以这里特别补充一下.首先,说说在3.4情况下,我们的config端必须要建立副本集,所以要在config端设置,就是上面强调的一个参数replSet当然,上面也说了,至少要1个或3个config端,那么我们需要开启三个config端,具体配置不详细解析,也不要吐槽为什么放一起,只是测试而已.三台都可以用了,但是也只是创建了而已,关联关系还是要做初始化,就像mysql的change master的意思一样.
要注意出现 “ok” : 1, 那才是成功初始化,不成功就需要看看哪里出了问题,包括权限.然后再次启动,就ok了,那就可以用了,愉快的使用mongos启动router端吧.
节点分片的副本集:如果是节点分片的副本集则有点不一样,参数是一样要加的.这里倒没有强制你用多少个副本集,两个三个十个都可以,只要你觉得有必要,这里也就不详细描述了.但是关联关系,那当然是必须的.不同的点就是arbiterOnly参数,表示这个成员为仲裁节点,不接收数据.使用他的原因是当副本集发生故障时,需要一个仲裁机制来决定谁顶上来接收新的数据,属于故障切换机制,还是比较严密的.
节点副本集添加分片:
另外,由于创建了副本集,分片添加有点不一样了,删除倒是一样的,按分片名字就好了.
一、redis主从复制原理 和MySQL主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。