设为首页 收藏本站
查看: 1595|回复: 0

[经验分享] MongoDB(4.0)分片——大数据的处理之道

[复制链接]

尚未签到

发表于 2018-10-24 10:50:53 | 显示全部楼层 |阅读模式
什么是分片
  高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。
  MongoDB分片是使用多个服务器存储数据的方法,以支持巨大的数据存储和对数据进行操作。分片技术可以满足MongoDB数据量大量增长的需求,当一台MongoDB服务器不足以存储海量数据或者不足以提供可接受的读写吞吐量时,我们就可以通过在多台服务器上分割数据,使得数据库系统能存储和处理更多的数据。

MongoDB分片优势
  分片为应对高吞吐量与大数据量提够了方法


  • 使用分片减少了每个分片需要处理的请求数,因此,通过水平扩展,群集可以提高自己的存储容量。比如,当插入一条数据时,应用只需要访问存储这条数据的分片。
  • 使用分片减少了每个分片村存储的数据  分片的优势在于提供类似线性增长的架构,提高数据可用性,提高大型数据库查询服务器的性能。当MongoDB单点数据库服务器存储成为瓶颈、单点数据库服务器的性能成为瓶颈或需要部署大型应用以充分利用内存时,可以使用分片技术。

    MongoDB分片群集的组成
  • Shard:分片服务器,用于存储实际的数据块,实际生产环境中一个shard server 角色可以由几台服务器组成一个Peplica Set 承担,防止主机单点故障。
  • Config Server:配置服务器,存储了整个分片群集的配置信息,其中包括chunk信息。
  • Routers:前端路由,客户端由此接入,且让整个群集看上去像单一数据库,前端应用可以透明使用。
环境准备


  • 系统版本:CenTos 7
  • 软件版本:MongoDB4.0
  • 关闭防火墙及selinux  

    systemctl stop firewalld.service  
    setenforce 0

IP:172.16.10.26
IP:172.16.10.27
IP:172.16.10.29
mongos(27017)
mongos(27017)
mongos(27017)
config(30000)
config(30000)
config(30000)
shard1主节点(40001)
shard1副节点(40001)
shard1仲裁节点(40001)
shard2仲裁节点(40002)
shard2主节点(40002)
shard2副节点(40002)
shard1副节点(40003)
shard1仲裁节点(40003)
shard1主节点(40003)
部署MongoDB分片群集
  群集部署的搭建思路,利用三台服务器,分别安装mongodb数据库,每台服务器创建五个实例(mongos、configs、shard1、shard2、shard3)。三台不同的服务器上的相同名称的实例,创建为一个复制集,分别包括主节点,副节点,仲裁节点。mongos不需创建复制集,config不需指定主副节点及仲裁节点,但是要创建复制集。三台服务器的操作步骤略有差别,但是大多是都是重复操作,步骤完全一致。

安装MongoDB数据库

安装支持软件和mongodb
  

yum install openssl-devel -y  
tar zxf mongodb-linux-x86_64-rhel70-4.0.0.tgz -C /usr/local
  
mv /usr/local/mongodb-linux-x86_64-rhel70-4.0.0 /usr/local/mongodb  //解压即完成安装
  

创建数据存储目录和日志存储目录
  路由服务器不存储数据,因此就不需要创建数据存储目录,只需创建config、shard1、shaed2、shard3即可,日志文件创建完成之后还需要给予权限。
  

mkdir -p /data/mongodb/logs/  
mkdir /etc/mongodb/
  
mkdir /data/mongodb/config/
  
mkdir /data/mongodb/shard{1,2,3}
  
touch /data/mongodb/logs/shard{1,2,3}.log
  
touch /data/mongodb/logs/mongos.log
  
touch /data/mongodb/logs/config.log
  
chmod 777 /data/mongodb/logs/*.log
  

创建管理用户,修改目录权限
  

useradd -M -u 8000 -s /sbin/nologin mongo  
chown -R mongo.mongo /usr/local/mongodb
  
chown -R mongo.mongo /data/mongodb
  

设置环境变量
  

echo "PATH=/usr/local/mongodb/bin:$PATH" >> /etc/profile  
source /etc/profile
  

系统内存优化
  

ulimit -n 25000  
ulimit -u 25000
  
sysctl -w vm.zone_reclaim_mode=0
  
echo never > /sys/kernel/mm/transparent_hugepage/enabled
  
echo never > /sys/kernel/mm/transparent_hugepage/defrag  //*注意*这些优化都是临时的,重启失效
  

部署配置服务器

创建配置文件
  

#vim /etc/mongodb/config.conf  
pidfilepath = /data/mongodb//logs/config.pid           //pid文件位置
  
dbpath = /data/mongodb/config/                             //数据文件存放位置
  
logpath = /data/mongodb//logs/config.log               //日志文件位置
  
logappend = true
  
bind_ip = 0.0.0.0                                                     //监听地址
  
port = 30000                                                           //端口号
  
fork = true
  
replSet=configs                                                      //复制集名称
  
configsvr = true
  
maxConns=20000                                                  //最大连接数
  

将配置文件发送到其他服务器
  

scp /etc/mongodb/config.conf root@172.16.10.27:/etc/mongodb/  
scp /etc/mongodb/config.conf root@172.16.10.29:/etc/mongodb/
  

DSC0000.jpg


启动config实例
  

mongod -f /etc/mongodb/config.conf  //三台服务器操作一致  

配置复制集(任一台操作即可)
  

mongo --port 30000                    //建议三台服务器都进入数据库,方便查看角色变更  
config={_id:"configs",members:[{_id:0,host:"172.16.10.26:30000"},{_id:1,host:"172.16.10.27:30000"},{_id:2,host:"172.16.10.29:30000"}]}    //创建复制集
  
rs.initiate(config)                //初始化复制集
  

DSC0001.jpg

DSC0002.jpg


部署shard1分片服务器

创建配置文件
  

#vim /etc/mongodb/shard1.conf  
pidfilepath = /data/mongodb//logs/shard1.pid
  
dbpath = /data/mongodb/shard1/
  
logpath = /data/mongodb//logs/shard1.log
  
logappend = true
  
journal = true
  
quiet = true
  
bind_ip = 0.0.0.0
  
port = 40001
  
fork = true
  
replSet=shard1
  
shardsvr = true
  
maxConns=20000
  

将配置文件发送到其他服务器
  

scp /etc/mongodb/shard1.conf root@172.16.10.27:/etc/mongodb/  
scp /etc/mongodb/shard1.conf root@172.16.10.29:/etc/mongodb/
  

启动shard1实例
  

mongod -f /etc/mongodb/shard1.conf  //三台服务器操作一致  

配置shard1复制集
  在shard分片服务器的创建中,需要注意的点是,不是在任一台服务器上创建都能成功的,如果选择在预先设置为仲裁节点的服务器上创建复制集会报错。以shard1分片服务器为例,可以在172.16.10.26和172.16.10.27服务器上创建复制集,在172.16.10.29上创建则会失败,因为在复制集创建之前,172.16.10.29已经被设置为仲裁节点。
DSC0003.jpg

  

mongo --port 40001    //建议三台服务器都进入数据库,方便查看角色变更  
use admin
  
config={_id:"shard1",members:[{_id:0,host:"172.16.10.26:40001",priority:2},{_id:1,host:"172.16.10.27:40001",priority:1},{_id:2,host:"172.16.10.29:40001",arbiterOnly:true}]}
  
rs.initiate(config)
  

部署shard2分片服务器

创建配置文件
  

#vim /etc/mongodb/shard2.conf  
pidfilepath = /data/mongodb//logs/shard2.pid
  
dbpath = /data/mongodb/shard2/
  
logpath = /data/mongodb//logs/shard2.log
  
logappend = true
  
journal = true
  
quiet = true
  
bind_ip = 0.0.0.0
  
port = 40002
  
fork = true
  
replSet=shard2
  
shardsvr = true
  
maxConns=20000
  

将配置文件发送到其他服务器
  

scp /etc/mongodb/shard2.conf root@172.16.10.27:/etc/mongodb/  
scp /etc/mongodb/shard2.conf root@172.16.10.29:/etc/mongodb/
  

启动shard2实例
  

mongod -f /etc/mongodb/shard2.conf  //三台服务器操作一致  

配置shard复制集(非仲裁节点服务器)
  

mongo --port 40002    //建议三台服务器都进入数据库,方便查看角色变更  
use admin
  
config={_id:"shard2",members:[{_id:0,host:"172.16.10.26:40002",arbiterOnly:true},{_id:1,host:"172.16.10.27:40002",priority:2},{_id:2,host:"172.16.10.29:40002",priority:1}]}
  
rs.initiate(config)
  

部署shard3分片服务器

创建配置文件
  

#vim /etc/mongodb/shard3.conf  
pidfilepath = /data/mongodb//logs/shard3.pid
  
dbpath = /data/mongodb/shard3/
  
logpath = /data/mongodb//logs/shard3.log
  
logappend = true
  
journal = true
  
quiet = true
  
bind_ip = 0.0.0.0
  
port = 40003
  
fork = true
  
replSet=shard3
  
shardsvr = true
  
maxConns=20000
  

将配置文件发送到其他服务器
  

scp /etc/mongodb/shard3.conf root@172.16.10.27:/etc/mongodb/  
scp /etc/mongodb/shard3.conf root@172.16.10.29:/etc/mongodb/
  

启动shard3实例
  

mongod -f /etc/mongodb/shard3.conf  //三台服务器操作一致  

配置shard复制集(非仲裁节点服务器)
  

mongo --port 40003    //建议三台服务器都进入数据库,方便查看角色变更  
use admin
  
config={_id:"shard3",members:[{_id:0,host:"172.16.10.26:40003",priority:1},{_id:1,host:"172.16.10.27:40003",arbiterOnly:true},{_id:2,host:"172.16.10.29:40003",priority:2}]}
  
rs.initiate(config);
  

部署路由服务器

创建配置文件
  

pidfilepath = /data/mongodb/logs/mongos.pid  
logpath=/data/mongodb/logs/mongos.log
  
logappend = true
  
bind_ip = 0.0.0.0
  
port = 27017
  
fork = true
  
configdb = configs/172.16.10.26:30000,172.16.10.27:30000,172.16.10.29:30000
  
maxConns=20000
  

将配置文件发送到其他服务器
  

scp /etc/mongodb/mongos.conf root@172.16.10.27:/etc/mongodb/  
scp /etc/mongodb/mongos.conf root@172.16.10.29:/etc/mongodb/
  

启动mongos实例
  

mongos -f /etc/mongodb/mongos.conf  //三台服务器操作一致*注意*这里是“mongos”而非“mongod”  

启用分片功能
  

mongo    //因为默认端口即是27017,所以此处不接端口号  
mongos> use admin
  
mongos> sh.addShard("shard1/172.16.10.26:40001,172.16.10.27:40001,172.16.10.29:40001")
  
mongos> sh.addShard("shard2/172.16.10.26:40002,172.16.10.27:40002,172.16.10.29:40002")
  
mongos> sh.status()           //查看群集状态
  
//此处先添加两各分片服务器,还有一个,待会添加
  

DSC0004.jpg


测试服务器分片功能

设置分片chunk大小
  

mongos> use config  
switched to db config
  
mongos> db.settings.save({"_id":"chunksize","value":1})   //设置块大小为1M是方便实验,不然就需要插入海量数据
  
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : "chunksize" })
  

模拟写入数据
  

mongos> use python  
switched to db python
  
mongos> show collections
  
mongos> for(i=1;ish.enableSharding("python")  
//数据库分片就有针对性,可以自定义需要分片的库或者表,毕竟也不是所有数据都是需要分片操作的
  

DSC0005.jpg


为表创建的索引
  创建索引的规则是不能一致性太高,要具有唯一性,例如序号,比如性别这一类重复性太高的就不适合做索引
  

mongos> db.user.createIndex({"id":1})   //以”id“为索引  

DSC0006.jpg


启用表分片
  

mongos> sh.shardCollection("python.user",{"id":1})  

DSC0007.jpg


查看分片情况
  

mongos> sh.status()  
--- Sharding Status ---
  ···省略内容
  shards:
  {  "_id" : "shard1",  "host" : "shard1/172.16.10.26:40001,172.16.10.27:40001",  "state" : 1 }
  {  "_id" : "shard2",  "host" : "shard2/172.16.10.27:40002,172.16.10.29:40002",  "state" : 1 }
  ···省略内容
  chunks:
  shard1  3
  shard2  3
  { "id" : { "$minKey" : 1 } } -->> { "id" : 9893 } on : shard1 Timestamp(2, 0)
  { "id" : 9893 } -->> { "id" : 19786 } on : shard1 Timestamp(3, 0)
  { "id" : 19786 } -->> { "id" : 29679 } on : shard1 Timestamp(4, 0)
  { "id" : 29679 } -->> { "id" : 39572 } on : shard2 Timestamp(4, 1)
  { "id" : 39572 } -->> { "id" : 49465 } on : shard2 Timestamp(1, 4)
  { "id" : 49465 } -->> { "id" : { "$maxKey" : 1 } } on : shard2 Timestamp(1, 5)
  

手动添加分片服务器,查看分片情况是否发生变化
  

mongos> use admin  
switched to db admin
  
mongos> sh.addShard("172.16.10.26:40003,172.16.10.27:40003,172.16.10.29:40003")
  
mongos> sh.status()
  
--- Sharding Status ---
  ···省略内容
  shards:
  {  "_id" : "shard1",  "host" : "shard1/172.16.10.26:40001,172.16.10.27:40001",  "state" : 1 }
  {  "_id" : "shard2",  "host" : "shard2/172.16.10.27:40002,172.16.10.29:40002",  "state" : 1 }
  {  "_id" : "shard3",  "host" : "shard3/172.16.10.26:40003,172.16.10.29:40003",  "state" : 1 }
  ···省略内容
  chunks:
  shard1  2
  shard2  2
  shard3  2
  { "id" : { "$minKey" : 1 } } -->> { "id" : 9893 } on : shard3 Timestamp(6, 0)
  { "id" : 9893 } -->> { "id" : 19786 } on : shard1 Timestamp(6, 1)
  { "id" : 19786 } -->> { "id" : 29679 } on : shard1 Timestamp(4, 0)
  { "id" : 29679 } -->> { "id" : 39572 } on : shard3 Timestamp(5, 0)
  { "id" : 39572 } -->> { "id" : 49465 } on : shard2 Timestamp(5, 1)
  { "id" : 49465 } -->> { "id" : { "$maxKey" : 1 } } on : shard2 Timestamp(1, 5)
  

  服务器又对数据进行重新分片,当你再次移除一个分片服务器,此时又会对数据再次进行分片处理,MongoDB对数据的处理非常灵活



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-625838-1-1.html 上篇帖子: 安装配置MongoDB数据库 下篇帖子: MongoDB相关方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表