1.搭建mongo分片式集群主要是用来处理用户行驶的gps数据信息。gps集合的字段有member_id,order_id,longitude,latitude,reporttime这5个数据字段。搭建方式:https://jeremyxu2010.github.io/2018/10/mongodb高可用集群部署/#启用用户认证登录,可以参考mongo中文社区和官方文档。
2.片键及片键选择
设置分片时,需要从集合里面选一个键,用该键的值作为数据拆分的依据,这个键成为片键。片键选择对于分片式集群有非常重大的意义,但在实际接触的案例中往往很多人选择了错误的片键,导致集群性能低下。
chunk定义的是一个连续的片键值范围,文档中的片键字段取值在这个范围内时,文档就属于这个chunk,例如年龄为片键的话,可能chunk会将其拆成100个,即0到99岁年龄。
a.取值基数直接决定了一共有多少个chunk,从而间接影响到分片的数据量/压力分布。选择时应该尽可能选择基数较大(即可选值较多)的字段作为片键
在gps集合里,我选择order_id作为gps集合里的片键,分片集群节点为三个。
3.分片操作
a.use admin ; 切换到admin库
b.db.auth('user','password');身份验证
c.sh.enableSharding('gps') ; 先指定某个分片的数据库
d.sh.shardCollection('gps.gps_data',{'order_id':1}) ; 指定分片的集合和字段,字段得先建好索引,不然mongo会自动帮你建立索引,索引的种类有很多种,可以查看官方文档。
4.查看分片信息及验证
命令sh.status(),可以查看分片后的信息。如下图所示chunks,均匀分布到了三个节点内。如果查看后,分片不成功的话,可能是chunksize的值太大,默认为64M,可以将其改成1M后,即可分片成功。
命令:use config
db.settings.save( { _id:"chunksize", value: 1 } )
简单验证是否分片成功
use databaseName;
db.collectionName.stats().sharded #简单的返回true或者false