扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
简介
成都创新互联-专业网站定制、快速模板网站建设、高性价比站前网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式站前网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖站前地区。费用合理售后完善,十年实体公司更值得信赖。
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.
然后就有一堆地址,你自己选择需要的版本吧,例如我要下的是这个地址.
#在linux下用wget下载 wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.2.18.tgz?_ga=2.240790083.1507844543.1517391237-2141045386.1517391237
下载完成,就开始安装了,因为是二进制版的,很简单就是了.
#先安装下依赖包,因为他是用c写的,主要就是C的东西了 yum -y install gcc gcc-c++ glibc glibc-devel glib2 glib2-devel #解压压缩包 tar xf mongodb-linux-x86_64-rhel70-3.2.18.tgz #把压缩包放到安装目录 mv mongodb-linux-x86_64-rhel70-3.2.18 /usr/local/ #创建安装目录的软连接 ln -sf /usr/local/mongodb-linux-x86_64-rhel70-3.2.18/ /usr/local/mongodb #创建命令文件的软连接,那就不用加到环境变量了 ln -sf /usr/local/mongodb/bin/* /usr/bin/ #创建用户 useradd mongodb #创建数据目录文件夹 mkdir -p /data/mongodb/data #更改文件夹属主权限 chown -R mongodb:mongodb /data/mongodb/ #修改资源限制参数,添加mongodb相关项 vim /etc/security/limits.conf mongod soft nofile 64000 mongod hard nofile 64000 mongod soft nproc 32000 mongod hard nproc 32000
这就安装完成了,后面就是初始化数据库了,初始化之前,必须先有配置文件,二进制版本安装的程序是不带配置文件模板的,所以就要自己编辑了,配置文件存放的位置可以随意,因为启动是需要指定位置的,例如下面这个:
#编辑配置文件,并指定位置 vim /usr/local/mongodb/mongod_data_40001.conf #数据目录 dbpath=/data/mongodb/data #日志文件 logpath=/data/mongodb/data/mongodb_data.log #日志形式为追加到文件后 logappend=true #端口 port = 40001 #指定访问地址,不指定就是全网,但是在3.6之后必须制定这个参数才能启动.0.0.0.0代表全网匹配 bind_ip = 0.0.0.0 #最大连接数 maxConns = 5000 pidfilepath = /data/mongodb/data/mongo_40001.pid #日志,redo log journal = true #刷写提交机制 journalCommitInterval = 200 #守护进程模式 fork = true #刷写数据到日志的频率 syncdelay = 60 #存储引擎,3.2之后默认就是wiredTiger #storageEngine = wiredTiger #操作日志,单位M oplogSize = 2000 #命名空间的文件大小,默认16M,最大2G。 nssize = 16 unixSocketPrefix = /tmp #指定一个数据库一个文件夹,必须在初始化前配置,在已有数据库上新增这个参数会报错 directoryperdb=true #开启慢查询分析功能,0:关闭,不收集任何数据。1:收集慢查询数据,默认是100毫秒.2:收集所有数据 profile=1 #慢查询的时间,单位ms,超过这个时间将被记录 slowms=200 #是否开启认证模式,不开就不用用户名密码就能登录数据库,测试环境可以不开 #auth = true #关闭认证模式,和上面的冲突 noauth = true #指定集群认证文件,没开认证就不用指定,注释关闭即可,需要用openssl来生成 #keyFile = /data/mongodb/data/keyfile #标识这台mongodb数据库为分片集群使用 #shardsvr = true #副本集名称,这里测的是单台,不设置 #replSet=shard1 #是否config端,做集群的配置端使用,后面详细介绍,这里不需要 #configsvr = true #禁止HTTP状态接口,3.6后不用 nohttpinterface=true #禁止REST接口-在生产环境下建议不要启用MongoDB的REST接口,,3.6后不用 rest=false #打开web监控,和上面相反,这里不开了 #httpinterface=true #rest=true
配置文件有了,就可以初始化启动了,因为我没有开启认证模式,启动就可以使用了.
#开启mongodb的数据端 mongod -f /usr/local/mongodb/mongod_data_40001.conf about to fork child process, waiting until server is ready for connections. forked process: 15808 child process started successfully, parent exiting #来测试一下 mongo --port=40001 MongoDB shell version: 3.2.18 connecting to: 127.0.0.1:40001/test Server has startup warnings: 2018-01-31×××1:12:12.537+0800 I CONTROL [initandlisten] > show dbs local 0.000GB
============分割线开始=============
其实官方是推荐下面这种启动方式,不过我为了方便,就简单化启动了.
#启动之前,要先把文件夹权限确保一下 chown mongodb:mongodb -R /data/mongodb/data/* #然后关闭numa并使用mongodb用户启动 su - mongodb -s /bin/bash -c "numactl --interleave=all /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/mongod_data_40001.conf"
这种启动方式好处是显然的,对于数据库来说,最怕就是被***提权,然后控制整台机器,所以限制数据库的启动用户是很有意义的.
而numa这个功能,对于大内存应用是很不友好的,会变成性能瓶颈,所以无论是sql还是nosql都最好是关闭了这个功能,那性能就更好一些了.
===========分割线结束==============
然后,这个mongodb数据库就可以正常使用的了,当然,我们不是只使用单台mongodb.
开头也说了,90%的公司使用mongodb都是会使用到集群,在3.4版本之前,一般就用上面的配置就可以搭建集群,但是在3.4之后,如果不在启动的时候指定这是分片端,则分片集群就不能被正常使用.
#标识这台mongodb数据库为分片集群使用 shardsvr = true
只有开启了这个参数,分片集群才会正常使用.
如果,需要加载到服务启动项,就添加以下脚本:
vim /etc/init.d/mongod
#!/bin/sh # #mongod - Startup script for mongod # # chkconfig: - 85 15 # description: Mongodb database. # processname: mongod # Source function library . /etc/rc.d/init.d/functions mongod="/usr/local/mongodb/bin/mongod" configfile=" -f /etc/mongod.conf" lockfile=/var/lock/subsys/mongod if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never > /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defrag fi ulimit -f unlimited ulimit -t unlimited ulimit -v unlimited ulimit -n 64000 ulimit -m unlimited ulimit -u 64000 ulimit -l unlimited start() { echo -n $"Starting mongod: " daemon --user mongod "$mongod $configfile" retval=$? echo [ $retval -eq 0 ] && touch $lockfile } stop() { echo -n $"Stopping mongod: " $mongod --shutdown $configfile retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile } restart () { stop start } case "$1" in start) start ;; stop) stop ;; restart|reload|force-reload) restart ;; condrestart) [ -f $lockfile ] && restart || : ;; status) status $mongod retval=$? ;; *) echo "Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}" retval=1 esac exit $retval
这样就可以chkconfig或者systemd了
搭建mongodb分片集群
先来介绍一下架构,需要三个角色,
配置服务器,config端,需要1台或3台,不能是双数,保存集群和分片的元数据,即各分片包含了哪些数据的信息,配置文件指定configsvr选项.
路由服务器,router端,随便多少台都行,本身不保存数据,在启动时从配置服务器加载集群信息,开启mongos进程需要知道配置服务器的地址,指定configdb选项.也可以理解为代理端
分片服务器,sharding端,保存真实数据信息,可以是一个副本集也可以是单独的一台服务器,支持主从故障切换.也可以叫数据端.
总共有8台机器,配置是8核16G的虚拟机.
10.21.1.205 config端(1)+router端(1)
10.21.1.206 sharding端(1)
10.21.1.207 sharding端(1)
10.21.1.208 sharding端(1)
10.21.1.209 sharding端(1)
10.21.1.210 sharding端(1)
10.21.1.211 sharding端(1)
10.21.1.212 sharding端(1)
由于是测试环境,不想纠结太复杂,config端和router端都是一台,当启动router端的时候会抛出一个警告,"只有一台config端的集群建议只用来测试",是的,我就是用来做测试.
sharding端我不打算详细说了,就按照上面安装mongodb的方式去操作并启动就ok,不需要额外的配置,只需要等配置端把他们地址加载就可以,然后就会自动连接并分配数据块起来,暂时也不需要研究其他东西.就是需要一台台去装就比较麻烦一点,各位自行操作.
1.配置并启动config端:
配置服务器也是一个mongod进程,其实也可以按照上面的配置文件来,配置服务器必须开启1个或则3个,开启2个则会报错,
BadValue need either 1 or 3 configdbs
所以要注意数量,这里我就设一个就算了.
#也和上面一样,没有模板,只能自己编辑 vim /usr/local/mongodb/mongod_config_20000.conf #数据目录,目录名字区分于数据节点 dbpath=/data/mongodb/config/ #日志文件 logpath=/data/mongodb/mongodb_config.log #日志追加 logappend=true #端口 port = 20000 #绑定ip,可以限制IP登录,例如bind_ip=10.21.1.208,3.2默认是允许所有ip登入,之后是允许127.0.0.1,只有配置0.0.0.0才是允许所有 bind_ip = 0.0.0.0 #最大连接数 maxConns = 5000 pidfilepath = /data/mongodb/mongo_20000.pid #日志,redo log journal = true #刷写提交机制 journalCommitInterval = 200 #守护进程模式 fork = true #刷写数据到日志的频率 syncdelay = 60 #存储引擎 #storageEngine = wiredTiger #操作日志,单位M oplogSize = 2000 #命名空间的文件大小,默认16M,最大2G。 nssize = 16 #套接字存放位置 unixSocketPrefix = /tmp #指定一个数据库一个文件夹,必须在初始化前配置,在已有数据库上新增这个参数会报错 directoryperdb=true #关闭认证模式,config端可以不需要,也视乎你的需求 noauth = true #是否config端,这里当然是了 configsvr = true #副本集名称,3.4之前可以不做集群,之后都需要设置config集群才可以使用 replSet=configs
其实和上面只是多了最后一行,标记是config端而已,然后启动.
#启动config端 mongod -f /usr/local/mongodb/mongod_config_20000.conf about to fork child process, waiting until server is ready for connections. forked process: 18535 child process started successfully, parent exiting
这里就不需要测试了,因为不需要在这里控制config端,然后看router端.
注意:3.4之后的版本使用分片集群,config端必须使用副本集,不然router端无法启动.
2.配置并启动router端:
路由服务器本身不保存数据,把日志记录一下即可,他都是直接调用config端来使用.而所有客户端程序想要连接mongodb集群,其实就是连接这个router端的端口来使用,并不是连接config端和sharding端,所以也说是类似于代理的形式.
#也和上面一样,没有模板,只能自己编辑 vim /usr/local/mongodb/mongos_route_30000.conf #日志文件 logpath=/data/mongodb/mongodb_route.log #日志追加 logappend=true #端口 port = 30000 #绑定ip,可以限制IP登录,例如bind_ip=10.21.1.208,3.2默认是允许所有ip登入,之后是允许127.0.0.1,只有配置0.0.0.0才是允许所有 bind_ip = 0.0.0.0 #最大连接数 maxConns = 5000 pidfilepath = /data/mongodb/mongo_30000.pid #指定config端地址,不能使用127.0.0.1,会报错,3.4后config必须是集群, #还必须在地址前面带上副本集名称,3.0和3.2可以点,例如:configdb=172.25.33.98:20000,单会提示警告 configdb=configs/172.25.33.98:20000,172.25.33.99:20000,172.25.33.101:20000 #守护进程模式 fork = true
最重要的参数是configdb,指定config端的地址,可以1个或3个,但是不能在其后面带的配置服务器的地址写成localhost或则127.0.0.1,需要设置成其他分片也能访问的地址,即10.21.1.205:20000/20001/20002。否则在添加分片地址的时候会报错.
然后是启动:
#启动方式略有不同,要使用mongos mongos -f /usr/local/mongodb/mongos_route_30000.conf 2018-02-01×××0:27:26.604+0800 W SHARDING [main] Running a sharded cluster with fewer than 3 config servers should only be done for testing purposes and is not recommended for production. about to fork child process, waiting until server is ready for connections. forked process: 6355 child process started successfully, parent exiting
启动完成后会看到个警告,不过这里可以忽略,就是我开头说的,提示你只有一台config的话只建议用来测试.原因就是这台config存储的是各分片的数据块信息,假如这台config挂了,那么各分片之间的数据块就不知道怎么关联了,是一个非常大的安全隐患,所以生产环境一定要保证有3台,最好还是错开在不同的服务器上面,提高安全性.
3.添加和配置分片信息
按上面的步骤启动完毕,那就可以开始配置分片了,当然,前提就是那些sharding端都已经全部部署启动完毕.然后,就登录进去操作了:
#使用客户端像一般登录mongodb那样操作,这里没有认证 mongo --port=30000 --host=10.21.1.205 MongoDB shell version: 3.2.18 connecting to: 10.21.1.205:30000/test Server has startup warnings: 2018-02-01×××0:27:26.619+0800 I CONTROL [main] mongos> #看看现在的状态,现在当然是什么也没有 mongos>sh.status() --- Sharding Status --- sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("5a69925ee61d3e7c0519035a") } shards: active mongoses: "3.2.18" : 1 balancer: Currently enabled: yes Currently running: no Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours: No recent migrations databases:
然后,我们来添加分片,sh.addShard("IP:Port")
#添加分片,如此类推 mongos> sh.addShard("10.21.1.206:40001") { "shardAdded" : "shard0000", "ok" : 1 } mongos> sh.addShard("10.21.1.207:40001") { "shardAdded" : "shard0001", "ok" : 1 } mongos> sh.addShard("10.21.1.208:40001") { "shardAdded" : "shard0002", "ok" : 1 } . . . #全部加完了,看看状态, mongos>sh.status() --- Sharding Status --- sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("5a69925ee61d3e7c0519035a") } shards: { "_id" : "shard0000", "host" : "10.21.1.206:40001" } { "_id" : "shard0001", "host" : "10.21.1.207:40001" } { "_id" : "shard0002", "host" : "10.21.1.208:40001" } { "_id" : "shard0003", "host" : "10.21.1.209:40001" } { "_id" : "shard0004", "host" : "10.21.1.210:40001" } { "_id" : "shard0005", "host" : "10.21.1.211:40001" } { "_id" : "shard0006", "host" : "10.21.1.212:40001" } active mongoses: "3.2.18" : 1 balancer: Currently enabled: yes Currently running: no Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours: No recent migrations databases:
这个时候,7个分片都添加完毕,不过,现在还没有数据库,所以还要创建数据库和数据库的片键.创建数据库应该还能理解,片键是什么,下面来简单解析一下:
片键必须是一个索引,数据根据这个片键进行拆分分散。通过sh.shardCollection加会自动创建索引。一个自增的片键对写入和数据均匀分布就不是很好,因为自增的片键总会在一个分片上写入,后续达到某个阀值可能会写到别的分片。但是按照片键查询会非常高效。随机片键对数据的均匀分布效果很好。注意尽量避免在多个分片上进行查询。在所有分片上查询,mongos会对结果进行归并排序。也可以说是分片的规则字段了.
=============分割线开始==================
需要特别注意的一点是,有些mongodb是用root启动的,所以数据库的文件权限也是root,这样就可能会造成一种奇葩现象,连接不正常,数据异常等,所以我们要确保数据库文件权限是mongodb的.
#关闭mongodb killall mongod #删掉锁文件 rm -rf /data/mongodb/data/*.lock #更改文件夹权限 chown mongodb:mongodb -R /data/mongodb/* #启动 mongod -f /usr/local/mongodb/mongod_data_40001.conf
当然是包括config端的了.
=============分割线结束===================
然后,我们就创建数据库并开启分片功能,一条命令就可以,最后再添加个片键就可以用了,命令是sh.enableSharding("库名")、sh.shardCollection("库名.集合名",{"key":1})
#创建一个ycsb的数据库,并启动他的分片功能 mongos>sh.enableSharding("ycsb") { "ok" : 1 } #添加这个数据库的片键为_id,规则是hash mongos>sh.shardCollection("ycsb.usertable", {_id:"hashed"}) { "collectionsharded" : "ycsb.usertable", "ok" : 1 } ########################################### #假如你已经创建了一个,现在需要重建,那就要先删除旧的数据库了 #mongos> use ycsb #switched to db ycsb #mongos> db.dropDatabase() #{ "dropped" : "ycsb", "ok" : 1 } #mongos> show dbs #config 0.013GB ###########################################
==============分割线开始==================
在mongodb单纯创建数据库和表,并不需要另外的create命令操作,只需要直接插入一条数据就好了,也就代表创建成功
#当前没有新的数据库 > show dbs admin 0.000GB local 0.000GB #单纯切换到数据库,也算是新建数据库的了 > use foo switched to db foo > db foo #但是这个时候,你还是看不到的 > show dbs admin 0.000GB local 0.000GB #插入一条数据,createtmp是要新建的表名, > db.createtmp.insert({"name":"create database"}) WriteResult({ "nInserted" : 1 }) #你就能看到了 > show dbs foo 0.000GB admin 0.000GB local 0.000GB #而且你的表也创建好了 > show collections createtmp
不过,我们如果做分片的话,一开始有表是不合适的,因为要做片键,所以才在这里另外来说这个问题.
==============分割线结束==================
这样添加的原因是后面的ycsb测试工具的需要,他会生成一个名为ycsb的数据库,里面有一个usertable集合(表),然后其中有_id这个列,至于hash规则我想就不解析了.然后,在看看状态:
#看看现在的状态,很长 mongos>sh.status() --- Sharding Status --- sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("5a69925ee61d3e7c0519035a") } shards: { "_id" : "shard0000", "host" : "10.21.1.206:40001" } { "_id" : "shard0001", "host" : "10.21.1.207:40001" } { "_id" : "shard0002", "host" : "10.21.1.208:40001" } { "_id" : "shard0003", "host" : "10.21.1.209:40001" } { "_id" : "shard0004", "host" : "10.21.1.210:40001" } { "_id" : "shard0005", "host" : "10.21.1.211:40001" } { "_id" : "shard0006", "host" : "10.21.1.212:40001" } active mongoses: "3.2.18" : 1 balancer: Currently enabled: yes Currently running: no Failed balancer rounds in last 5 attempts: 5 Last reported error: Connection refused Time of Reported error: Thu Feb 01 2018 14:26:07 GMT+0800 (CST) Migration Results for the last 24 hours: databases: { "_id" : "ycsb", "primary" : "shard0000", "partitioned" : true } ycsb.usertable shard key: { "_id" : "hashed" } unique: false balancing: true chunks: shard0000 2 shard0001 2 shard0002 2 shard0003 2 shard0004 2 shard0005 2 shard0006 2 { "_id" : { "$minKey" : 1 } } -->> { "_id" : NumberLong("-7905747460161236400") } on : shard0000 Timestamp(7, 2) { "_id" : NumberLong("-7905747460161236400") } -->> { "_id" : NumberLong("-6588122883467697000") } on : shard0000 Timestamp(7, 3) { "_id" : NumberLong("-6588122883467697000") } -->> { "_id" : NumberLong("-5270498306774157600") } on : shard0001 Timestamp(7, 4) { "_id" : NumberLong("-5270498306774157600") } -->> { "_id" : NumberLong("-3952873730080618200") } on : shard0001 Timestamp(7, 5) { "_id" : NumberLong("-3952873730080618200") } -->> { "_id" : NumberLong("-2635249153387078800") } on : shard0002 Timestamp(7, 6) { "_id" : NumberLong("-2635249153387078800") } -->> { "_id" : NumberLong("-1317624576693539400") } on : shard0002 Timestamp(7, 7) { "_id" : NumberLong("-1317624576693539400") } -->> { "_id" : NumberLong(0) } on : shard0003 Timestamp(7, 8) { "_id" : NumberLong(0) } -->> { "_id" : NumberLong("1317624576693539400") } on : shard0003 Timestamp(7, 9) { "_id" : NumberLong("1317624576693539400") } -->> { "_id" : NumberLong("2635249153387078800") } on : shard0004 Timestamp(7, 10) { "_id" : NumberLong("2635249153387078800") } -->> { "_id" : NumberLong("3952873730080618200") } on : shard0004 Timestamp(7, 11) { "_id" : NumberLong("3952873730080618200") } -->> { "_id" : NumberLong("5270498306774157600") } on : shard0005 Timestamp(7, 12) { "_id" : NumberLong("5270498306774157600") } -->> { "_id" : NumberLong("6588122883467697000") } on : shard0005 Timestamp(7, 13) { "_id" : NumberLong("6588122883467697000") } -->> { "_id" : NumberLong("7905747460161236400") } on : shard0006 Timestamp(7, 14) { "_id" : NumberLong("7905747460161236400") } -->> { "_id" : { "$maxKey" : 1 } } on : shard0006 Timestamp(7, 15) #看看有什么数据库 mongos> show dbs config 0.007GB ycsb 0.000GB #登进目标数据库 mongos> use ycsb switched to db ycsb #查看数据库的状态 mongos> db.stats() { "raw" : { "10.21.1.206:40001" : { "db" : "ycsb", "collections" : 1, "objects" : 0, "avgObjSize" : 0, "dataSize" : 0, "storageSize" : 4096, "numExtents" : 0, "indexes" : 2, "indexSize" : 8192, "ok" : 1 }, "10.21.1.207:40001" : { "db" : "ycsb", "collections" : 1, "objects" : 0, "avgObjSize" : 0, "dataSize" : 0, "storageSize" : 4096, "numExtents" : 0, "indexes" : 2, "indexSize" : 8192, "ok" : 1 }, "10.21.1.208:40001" : { "db" : "ycsb", "collections" : 1, "objects" : 0, "avgObjSize" : 0, "dataSize" : 0, "storageSize" : 4096, "numExtents" : 0, "indexes" : 2, "indexSize" : 8192, "ok" : 1 }, "10.21.1.209:40001" : { "db" : "ycsb", "collections" : 1, "objects" : 0, "avgObjSize" : 0, "dataSize" : 0, "storageSize" : 4096, "numExtents" : 0, "indexes" : 2, "indexSize" : 8192, "ok" : 1 }, "10.21.1.210:40001" : { "db" : "ycsb", "collections" : 1, "objects" : 0, "avgObjSize" : 0, "dataSize" : 0, "storageSize" : 4096, "numExtents" : 0, "indexes" : 2, "indexSize" : 8192, "ok" : 1 }, "10.21.1.211:40001" : { "db" : "ycsb", "collections" : 1, "objects" : 0, "avgObjSize" : 0, "dataSize" : 0, "storageSize" : 4096, "numExtents" : 0, "indexes" : 2, "indexSize" : 8192, "ok" : 1 }, "10.21.1.212:40001" : { "db" : "ycsb", "collections" : 1, "objects" : 0, "avgObjSize" : 0, "dataSize" : 0, "storageSize" : 4096, "numExtents" : 0, "indexes" : 2, "indexSize" : 8192, "ok" : 1 } }, "objects" : 0, "avgObjSize" : 0, "dataSize" : 0, "storageSize" : 28672, "numExtents" : 0, "indexes" : 14, "indexSize" : 57344, "fileSize" : 0, "extentFreeList" : { "num" : 0, "totalSize" : 0 }, "ok" : 1 }
好了,至此,mongodb的分片集群已经搭建好,暂时还没有数据,objects显示是0就是没数据了,各分片也没有数据.
不过,有时候会因为信息太长而导致显示不全,并提示
too many chunks to print, use verbose if you want to force print
那么我们就要用下列命令来显示了,三个都可以,然后就显示全部了,但是更长.
mongos> sh.status({"verbose":1}) mongos> db.printShardingStatus("vvvv") mongos> printShardingStatus(db.getSisterDB("config"),1)
4.删除分片信息
最后来看删除分片,有添加,就当然有删除了,虽然不是这里的重点, db.runCommand({"removeshard":"mmm"})
#登进管理数据库admin,3.2隐藏了,不过确实存在. mongos> use admin switched to db admin mongos> db admin #删除刚才添加的一个分片,注意state状态,是准备删除,将不会有新数据进入该分片 mongos> db.runCommand({"removeshard":"shard0006"}) { "msg" : "draining started successfully", "state" : "started", "shard" : "shard0006", "note" : "you need to drop or movePrimary these databases", "dbsToMove" : [ ], "ok" : 1 } #这个时候,状态已经改变成draining,但是还没有删除,只是新数据不再写入进去 mongos> sh.status() --- Sharding Status --- sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("5a69925ee61d3e7c0519035a") } shards: { "_id" : "shard0000", "host" : "10.21.1.206:40001" } { "_id" : "shard0001", "host" : "10.21.1.207:40001" } { "_id" : "shard0002", "host" : "10.21.1.208:40001" } { "_id" : "shard0003", "host" : "10.21.1.209:40001" } { "_id" : "shard0004", "host" : "10.21.1.210:40001" } { "_id" : "shard0005", "host" : "10.21.1.211:40001" } { "_id" : "shard0006", "host" : "10.21.1.212:40001", "draining" : true } active mongoses: "3.2.18" : 1 balancer: Currently enabled: yes Currently running: no Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours: . . . #再操作一次,这次将会完全删除, #如果里面没数据,会显示state状态为completed, mongos> db.runCommand({"removeshard":"shard0006"}) { "msg" : "removeshard completed successfully", "state" : "completed", "shard" : "shard0006", "ok" : 1 } #如果有数据,则会等到迁移完才会执行通过,取决于数据量多不多,显示state状态为ongoing mongos> db.runCommand({"removeshard":"shard0006"}) { "msg" : "draining ongoing", "state" : "ongoing", "remaining" : { "chunks" : NumberLong(2128), "dbs" : NumberLong(0) }, "note" : "you need to drop or movePrimary these databases", "dbsToMove" : [ ], "ok" : 1 } #删除完毕后,再次查看,id为shard0006的分片已经被删除, mongos> sh.status() --- Sharding Status --- sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("5a69925ee61d3e7c0519035a") } shards: { "_id" : "shard0000", "host" : "10.21.1.206:40001" } { "_id" : "shard0001", "host" : "10.21.1.207:40001" } { "_id" : "shard0002", "host" : "10.21.1.208:40001" } { "_id" : "shard0003", "host" : "10.21.1.209:40001" } { "_id" : "shard0004", "host" : "10.21.1.210:40001" } { "_id" : "shard0005", "host" : "10.21.1.211:40001" } active mongoses: "3.2.18" : 1 balancer: Currently enabled: yes Currently running: no Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours: . . . #这里显示也没有了该分片地址了 mongos> db.runCommand({ listshards : 1 }) { "shards" : [ { "_id" : "shard0000", "host" : "10.21.1.206:40001" }, { "_id" : "shard0001", "host" : "10.21.1.207:40001" }, { "_id" : "shard0002", "host" : "10.21.1.208:40001" }, { "_id" : "shard0003", "host" : "10.21.1.209:40001" }, { "_id" : "shard0004", "host" : "10.21.1.210:40001" }, { "_id" : "shard0005", "host" : "10.21.1.211:40001" } ], "ok" : 1 }
需要注意的是,不能同时删除两个或以上的分片,只有删除完一个后,另一个才可以开始删除.
另外,分片还有迁移功能,可以是整个迁移或迁移某一个块chunks(sh.moveChunk("db.collection",{块地址},"新片名称")),这里不打算展开来说,日常使用中,这种操作也基本上很少涉及,基本上都让均衡器balancer自己去跑就算了.
需要特别注意的是删除主分片,则需要先迁移走数据库到别的分片,
db.adminCommand({"movePrimary":"ycsb","to":"shard0001"})
这样才能删主分片.
安装删除都完成了,后面来看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
#安装python环境 yum install -y python python-devel #安装java tar xf jdk-8u144-linux-x64.tar.gz mv jdk1.8.0_144/ /usr/local/ ln -sf /usr/local/jdk1.8.0_144/ /usr/local/jdk #创建java环境变量 vim /etc/profile.d/java.sh export JAVA_HOME=/usr/local/jdk export JRE_HOME=/usr/local/jdk/jre export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib export PATH=$PATH:$JAVA_HOME/bin #重载环境变量 source /etc/profile #测试一下 java -version java version "1.8.0_144" Java(TM) SE Runtime Environment (build 1.8.0_144-b01) Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
前置的环境安装完毕,就来看怎么安装ycsb了,和java有点像,而且还不用做环境变量,其实我觉得也不能叫安装,直接解压就能用了,现在最新版本是ycsb-0.12.0
#下载ycsb wget https://github.com/brianfrankcooper/YCSB/releases/download/0.12.0/ycsb-0.12.0.tar.gz #解压 tar xf ycsb-0.12.0.tar.gz #查看目录结构 ll ycsb-0.12.0 total 12 drwxr-xr-x. 4 root root 46 Jan 30 11:23 accumulo-binding drwxr-xr-x. 3 root root 34 Jan 30 11:23 aerospike-binding drwxr-xr-x. 3 root root 34 Jan 30 11:23 arangodb-binding drwxr-xr-x. 3 root root 34 Jan 30 11:23 asynchbase-binding drwxr-xr-x. 3 root root 34 Jan 30 11:23 azuretablestorage-binding drwxr-xr-x. 2 root root 76 Feb 1 18:01 bin drwxr-xr-x. 3 root root 34 Jan 30 11:23 cassandra-binding drwxr-xr-x. 3 root root 34 Jan 30 11:23 couchbase2-binding drwxr-xr-x. 3 root root 34 Jan 30 11:23 couchbase-binding drwxr-xr-x. 3 root root 34 Jan 30 11:23 dynamodb-binding drwxr-xr-x. 3 root root 34 Jan 30 11:23 elasticsearch-binding drwxr-xr-x. 3 root root 34 Jan 30 11:23 geode-binding drwxr-xr-x. 3 root root 34 Jan 30 11:23 googlebigtable-binding drwxr-xr-x. 3 root root 34 Jan 30 11:23 googledatastore-binding drwxr-xr-x. 3 root root 34 Jan 30 11:23 hbase094-binding drwxr-xr-x. 3 root root 34 Jan 30 11:23 hbase098-binding drwxr-xr-x. 3 root root 34 Jan 30 11:23 hbase10-binding drwxr-xr-x. 3 root root 34 Jan 30 11:23 hypertable-binding drwxr-xr-x. 4 root root 46 Jan 30 11:23 infinispan-binding drwxr-xr-x. 4 root root 46 Jan 30 11:23 jdbc-binding drwxr-xr-x. 4 root root 46 Jan 30 11:23 kudu-binding drwxr-xr-x. 2 root root 170 Jan 30 11:23 lib -rw-r--r--. 1 501 games 8082 Jan 21 2015 LICENSE.txt drwxr-xr-x. 3 root root 34 Jan 30 11:23 memcached-binding drwxr-xr-x. 3 root root 34 Jan 30 11:23 mongodb-binding drwxr-xr-x. 4 root root 46 Jan 30 11:23 nosqldb-binding -rw-r--r--. 1 501 games 615 Sep 27 2016 NOTICE.txt drwxr-xr-x. 3 root root &nb
分享名称:mongodb+分片集群+ycsb测试一例
网页地址:http://kswjz.com/article/pipsjs.html
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流