吉刚 發表於 2021-1-16 14:08:00

MongoDB Sharding(二) -- 搭建分片集群

<blockquote>
<p>在上一篇文章中,我们基本了解了分片的概念,本文将着手实践,进行分片集群的搭建</p>
</blockquote>
<p>&nbsp;</p>
<p>首先我们再来了解一下分片集群的架构,分片集群由三部分构成:</p>
<ul>
<li>mongos:查询路由,在客户端程序和分片之间提供接口。本次实验部署2个mongos实例</li>
<li>config:配置服务器存储集群的元数据,元数据反映分片集群的内所有数据和组件的状态和组织方式,元数据包含每个分片上的块列表以及定义块的范围。从3.4版本开始,已弃用镜像服务器用作配置服务器(SCCC),config Server必须部署为副本集架构(CSRS)。本次实验配置一个3节点的副本集作为配置服务器</li>
<li>shard:每个shard包含集合的一部分数据,从3.6版本开始,每个shard必须部署为副本集(replica set)架构。本次实验部署3个分片存储数据。</li>
</ul>
<p><img src="https://img2020.cnblogs.com/blog/823295/202101/823295-20210116130529829-537460884.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p><strong><span style="font-size: 16px">(一)主机信息</span></strong></p>
<p><img src="https://img2020.cnblogs.com/blog/823295/202101/823295-20210116131040587-603187584.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p><strong>(二)配置服务器副本集搭建</strong></p>
<p>配置服务器三个实例的基础规划如下:</p>
<p>member0 192.168.10.80:27017<br>member1   192.168.10.80:27018<br>member2   192.168.10.80:27019</p>
<p>其参数规划如下:</p>
<p><img src="https://img2020.cnblogs.com/blog/823295/202101/823295-20210116131453668-1363832161.png" alt="" loading="lazy"></p>
<p>&nbsp;</p>
<p>&nbsp;接下来,我们一步一步搭建config server的副本集。</p>
<p><span style="color: rgba(0, 0, 0, 1); background-color: rgba(255, 102, 0, 1)">STEP1</span>:解压mongodb安装包到/mongo目录</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(0, 0, 255, 1)">pwd</span>
/<span style="color: rgba(0, 0, 0, 1)">mongo
# </span><span style="color: rgba(0, 0, 255, 1)">ls</span><span style="color: rgba(0, 0, 0, 1)">
bin LICENSE</span>-Community.txt MPL-<span style="color: rgba(128, 0, 128, 1)">2</span> README THIRD-PARTY-NOTICES THIRD-PARTY-NOTICES.gotools</pre>
</div>
<p>&nbsp;<span style="background-color: rgba(255, 102, 0, 1)">STEP2</span>:根据上面参数规划,创建数据存放相关路径</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(51, 153, 102, 1)"># 创建文件路径
</span><span style="color: rgba(0, 0, 255, 1)">mkdir</span> -p /replset/repset1/<span style="color: rgba(0, 0, 0, 1)">data
</span><span style="color: rgba(0, 0, 255, 1)">mkdir</span> -p /replset/repset1/<span style="color: rgba(0, 0, 0, 1)">log
</span><span style="color: rgba(0, 0, 255, 1)">mkdir</span> -p /replset/repset2/<span style="color: rgba(0, 0, 0, 1)">data
</span><span style="color: rgba(0, 0, 255, 1)">mkdir</span> -p /replset/repset2/<span style="color: rgba(0, 0, 0, 1)">log
</span><span style="color: rgba(0, 0, 255, 1)">mkdir</span> -p /replset/repset3/<span style="color: rgba(0, 0, 0, 1)">data
</span><span style="color: rgba(0, 0, 255, 1)">mkdir</span> -p /replset/repset3/<span style="color: rgba(0, 0, 0, 1)">log

# tree </span>/replset/
/replset/<span style="color: rgba(0, 0, 0, 1)">
├── repset1
│&nbsp;&nbsp; ├── data
│&nbsp;&nbsp; ├── log
│&nbsp;&nbsp; └── mongodb.conf
├── repset2
│&nbsp;&nbsp; ├── data
│&nbsp;&nbsp; └── log
└── repset3
    ├── data
    └── log</span></pre>
</div>
<p>&nbsp;<span style="background-color: rgba(255, 102, 0, 1)">STEP3</span>:为3个实例创建参数文件</p>
<p>实例1的参数文件&nbsp;&nbsp;<span class="cnblogs_code">/replset/repset1/mongodb.conf</span>&nbsp;&nbsp;:</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_9361e884-a66e-4ed9-9e8a-895c7f023fe0" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_9361e884-a66e-4ed9-9e8a-895c7f023fe0" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_9361e884-a66e-4ed9-9e8a-895c7f023fe0" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">systemLog:
   destination: </span><span style="color: rgba(0, 0, 255, 1)">file</span><span style="color: rgba(0, 0, 0, 1)">
   logAppend: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
   path: </span>/replset/repset1/log/<span style="color: rgba(0, 0, 0, 1)">mongodb.log

storage:
   dbPath: </span>/replset/repset1/<span style="color: rgba(0, 0, 0, 1)">data
   journal:
   enabled: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">

processManagement:
   fork: </span><span style="color: rgba(0, 0, 255, 1)">true</span># fork and run <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> background
   pidFilePath: </span>/replset/repset1/<span style="color: rgba(0, 0, 0, 1)">mongod.pid# location of pidfile
   timeZoneInfo: </span>/usr/share/<span style="color: rgba(0, 0, 0, 1)">zoneinfo

# network interfaces
net:
   port: </span><span style="color: rgba(128, 0, 128, 1)">27017</span><span style="color: rgba(0, 0, 0, 1)">
   bindIp: </span><span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span><span style="color: rgba(0, 0, 0, 1)">

# shard
sharding:
clusterRole: configsvr

# repliuca set
replication:
replSetName: conf</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>&nbsp;实例2的参数文件 &nbsp;<span class="cnblogs_code">/replset/repset2/mongodb.conf</span>&nbsp;:</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_b858fc3b-90e1-436b-b2fe-d3e41c18ecaa" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_b858fc3b-90e1-436b-b2fe-d3e41c18ecaa" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_b858fc3b-90e1-436b-b2fe-d3e41c18ecaa" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">systemLog:
   destination: file
   logAppend: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
   path: </span>/replset/repset2/log/<span style="color: rgba(0, 0, 0, 1)">mongodb.log

storage:
   dbPath: </span>/replset/repset2/data
<span style="color: rgba(0, 0, 0, 1)">   journal:
   enabled: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">

processManagement:
   fork: </span><span style="color: rgba(0, 0, 255, 1)">true</span># fork and run <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> background
   pidFilePath: </span>/replset/repset2/mongod.pid# location of pidfile
   timeZoneInfo: /usr/share/zoneinfo
<span style="color: rgba(0, 0, 0, 1)">
# network interfaces
net:
   port: </span>27018<span style="color: rgba(0, 0, 0, 1)">
   bindIp: </span>0.0.0.0<span style="color: rgba(0, 0, 0, 1)">

# shard
sharding:
clusterRole: configsvr

# repliuca set
replication:
replSetName: conf
</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>&nbsp;实例3的参数文件&nbsp;&nbsp;<span class="cnblogs_code">/replset/repset3/mongodb.conf</span>&nbsp;:</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_88bde8b5-c91f-42bd-8e0f-afaed2752caa" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_88bde8b5-c91f-42bd-8e0f-afaed2752caa" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_88bde8b5-c91f-42bd-8e0f-afaed2752caa" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">systemLog:
   destination: </span><span style="color: rgba(0, 0, 255, 1)">file</span><span style="color: rgba(0, 0, 0, 1)">
   logAppend: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
   path: </span>/replset/repset3/log/<span style="color: rgba(0, 0, 0, 1)">mongodb.log

storage:
   dbPath: </span>/replset/repset3/<span style="color: rgba(0, 0, 0, 1)">data
   journal:
   enabled: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">

processManagement:
   fork: </span><span style="color: rgba(0, 0, 255, 1)">true</span># fork and run <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> background
   pidFilePath: </span>/replset/repset3/<span style="color: rgba(0, 0, 0, 1)">mongod.pid# location of pidfile
   timeZoneInfo: </span>/usr/share/<span style="color: rgba(0, 0, 0, 1)">zoneinfo

# network interfaces
net:
   port: </span><span style="color: rgba(128, 0, 128, 1)">27019</span><span style="color: rgba(0, 0, 0, 1)">
   bindIp: </span><span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span><span style="color: rgba(0, 0, 0, 1)">

# shard
sharding:
clusterRole: configsvr

# repliuca set
replication:
replSetName: conf</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>&nbsp;<span style="background-color: rgba(255, 102, 0, 1)">STEP4</span>:启动三个mongod实例</p>
<div class="cnblogs_code">
<pre>mongod -f /replset/repset1/<span style="color: rgba(0, 0, 0, 1)">mongodb.conf
mongod </span>-f /replset/repset2/<span style="color: rgba(0, 0, 0, 1)">mongodb.conf
mongod </span>-f /replset/repset3/<span style="color: rgba(0, 0, 0, 1)">mongodb.conf


<span style="color: rgba(51, 153, 102, 1)"># 查看是成功否启动</span>
# netstat </span>-nltp |<span style="color: rgba(0, 0, 255, 1)">grep</span><span style="color: rgba(0, 0, 0, 1)"> mongod
tcp </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:<span style="color: rgba(128, 0, 128, 1)">27019</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:* LISTEN <span style="color: rgba(128, 0, 128, 1)">28009</span>/<span style="color: rgba(0, 0, 0, 1)">mongod
tcp </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:<span style="color: rgba(128, 0, 128, 1)">27017</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:* LISTEN <span style="color: rgba(128, 0, 128, 1)">27928</span>/<span style="color: rgba(0, 0, 0, 1)">mongod
tcp </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:<span style="color: rgba(128, 0, 128, 1)">27018</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:* LISTEN <span style="color: rgba(128, 0, 128, 1)">27970</span>/mongod</pre>
</div>
<p>&nbsp;<span style="background-color: rgba(255, 102, 0, 1)">STEP5</span>:进入任意一个实例,初始化配置服务器的副本集</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">rs.initiate(
{
    _id: </span>"conf"<span style="color: rgba(0, 0, 0, 1)">,
    configsvr: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
    members: [
      { _id : </span>0, host : "192.168.10.80:27017"<span style="color: rgba(0, 0, 0, 1)"> },
      { _id : </span>1, host : "192.168.10.80:27018"<span style="color: rgba(0, 0, 0, 1)"> },
      { _id : </span>2, host : "192.168.10.80:27019"<span style="color: rgba(0, 0, 0, 1)"> }
    ]
}
)</span></pre>
</div>
<p>&nbsp;<span style="background-color: rgba(255, 102, 0, 1)">&nbsp;STEP6</span>:[可选] 调整节点优先级,以便于确定主节点</p>
<div class="cnblogs_code">
<pre>cfg =<span style="color: rgba(0, 0, 0, 1)"> rs.conf()
cfg.members[</span>0].priority = 3<span style="color: rgba(0, 0, 0, 1)">
cfg.members[</span>1].priority = 2<span style="color: rgba(0, 0, 0, 1)">
cfg.members[</span>2].priority = 1<span style="color: rgba(0, 0, 0, 1)">
rs.reconfig(cfg)</span></pre>
</div>
<p>&nbsp;对于members的定义:n是members数组中的数组位置,数组以0开始,千万不能将其理解为“members._id”的_id值。</p>
<p>查看节点优先级:</p>
<div class="cnblogs_code">
<pre>conf:PRIMARY&gt; rs.config()</pre>
</div>
<p>&nbsp;</p>
<p><strong>(三)分片副本集搭建</strong></p>
<p>分片1副本集成员:<br>member0   192.168.10.81:27017<br>member1   192.168.10.81:27018<br>member2   192.168.10.81:27019</p>
<p>分片2副本集成员:<br>member0   192.168.10.82:27017<br>member1   192.168.10.82:27018<br>member2   192.168.10.82:27019</p>
<p>分片3副本集成员:<br>member0   192.168.10.83:27017<br>member1   192.168.10.83:27018<br>member2   192.168.10.83:27019</p>
<p>&nbsp;</p>
<p>其参数规划如下:</p>
<p><img src="https://img2020.cnblogs.com/blog/823295/202101/823295-20210116132649817-573510342.png" alt="" loading="lazy"></p>
<p>&nbsp;这里一共有3个分片,每个分片都是3个节点的副本集,副本集的搭建过程与上面config server副本集搭建过程相似,这里不再重复赘述,唯一不同的是副本集的初始化。shard副本集的初始化与配置副本集初始化过程相比,少了&nbsp;<span class="cnblogs_code">configsvr: <span style="color: rgba(0, 0, 255, 1)">true</span></span>&nbsp;的参数配置。</p>
<p>三个shard副本集的初始化:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(51, 153, 102, 1)"># shard001</span><br>rs.initiate(
{
    _id: </span>"shard001"<span style="color: rgba(0, 0, 0, 1)">,
    members: [
      { _id : </span>0, host : "192.168.10.81:27017"<span style="color: rgba(0, 0, 0, 1)"> },
      { _id : </span>1, host : "192.168.10.81:27018"<span style="color: rgba(0, 0, 0, 1)"> },
      { _id : </span>2, host : "192.168.10.81:27019"<span style="color: rgba(0, 0, 0, 1)"> }
    ]
}
)
</span></pre>
<pre><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(51, 153, 102, 1)"># shard002</span><br>rs.initiate(
{
    _id: </span>"shard002"<span style="color: rgba(0, 0, 0, 1)">,
    members: [
      { _id : </span>0, host : "192.168.10.82:27017"<span style="color: rgba(0, 0, 0, 1)"> },
      { _id : </span>1, host : "192.168.10.82:27018"<span style="color: rgba(0, 0, 0, 1)"> },
      { _id : </span>2, host : "192.168.10.82:27019"<span style="color: rgba(0, 0, 0, 1)"> }
    ]
}
)

<span style="color: rgba(51, 153, 102, 1)"># shard003</span>
rs.initiate(
{
    _id: </span>"shard003"<span style="color: rgba(0, 0, 0, 1)">,
    members: [
      { _id : </span>0, host : "192.168.10.83:27017"<span style="color: rgba(0, 0, 0, 1)"> },
      { _id : </span>1, host : "192.168.10.83:27018"<span style="color: rgba(0, 0, 0, 1)"> },
      { _id : </span>2, host : "192.168.10.83:27019"<span style="color: rgba(0, 0, 0, 1)"> }
    ]
}
)</span></pre>
</div>
<p>&nbsp;</p>
<p><strong>(四)配置并启动mongos</strong></p>
<p>本次试验在192.168.10.100服务器上启动2个mongos进程,分别使用端口27000和28000。</p>
<p><span style="background-color: rgba(255, 102, 0, 1)">STEP1</span>:配置mongos实例的参数</p>
<p>端口27000参数配置,特别注意,需要先创建涉及到的路径:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">systemLog:
   destination: file
   logAppend: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
   path: </span>/mongo/log/mongos-27000.log
<span style="color: rgba(0, 0, 0, 1)">   
processManagement:
   fork: </span><span style="color: rgba(0, 0, 255, 1)">true</span># fork and run <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> background
   pidFilePath: </span>/mongo/mongod-27000<span style="color: rgba(0, 0, 0, 1)">.pid# location of pidfile
   timeZoneInfo: </span>/usr/share/zoneinfo
<span style="color: rgba(0, 0, 0, 1)">
# network interfaces
net:
   port: </span>27000<span style="color: rgba(0, 0, 0, 1)">
   bindIp: </span>0.0.0.0<span style="color: rgba(0, 0, 0, 1)">

sharding:
configDB: conf</span>/192.168.10.80:27017,192.168.10.80:27018,192.168.10.80:27019</pre>
</div>
<p>&nbsp;端口28000参数配置,特别注意,需要先创建涉及到的路径:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">systemLog:
   destination: file
   logAppend: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
   path: </span>/mongo/log/mongos-28000.log
<span style="color: rgba(0, 0, 0, 1)">   
processManagement:
   fork: </span><span style="color: rgba(0, 0, 255, 1)">true</span># fork and run <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> background
   pidFilePath: </span>/mongo/mongod-28000<span style="color: rgba(0, 0, 0, 1)">.pid# location of pidfile
   timeZoneInfo: </span>/usr/share/zoneinfo
<span style="color: rgba(0, 0, 0, 1)">
# network interfaces
net:
   port: </span>28000<span style="color: rgba(0, 0, 0, 1)">
   bindIp: </span>0.0.0.0<span style="color: rgba(0, 0, 0, 1)">

sharding:
configDB: conf</span>/192.168.10.80:27017,192.168.10.80:27018,192.168.10.80:27019</pre>
</div>
<p>&nbsp;<span style="background-color: rgba(255, 102, 0, 1)">STEP2</span>:启动mongos实例</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(51, 153, 102, 1)"># 启动mongos实例</span>
# mongos </span>-f /mongo/mongos-<span style="color: rgba(128, 0, 128, 1)">27000</span><span style="color: rgba(0, 0, 0, 1)">.conf
# mongos </span>-f /mongo/mongos-<span style="color: rgba(128, 0, 128, 1)">28000</span><span style="color: rgba(0, 0, 0, 1)">.conf

<span style="color: rgba(51, 153, 102, 1)"># 查看实例信息</span>
# netstat </span>-nltp|<span style="color: rgba(0, 0, 255, 1)">grep</span><span style="color: rgba(0, 0, 0, 1)"> mongos
tcp </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:<span style="color: rgba(128, 0, 128, 1)">27000</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:* LISTEN <span style="color: rgba(128, 0, 128, 1)">2209</span>/<span style="color: rgba(0, 0, 0, 1)">mongos
tcp </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:<span style="color: rgba(128, 0, 128, 1)">28000</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:* LISTEN <span style="color: rgba(128, 0, 128, 1)">2241</span>/mongos</pre>
</div>
<p>&nbsp;</p>
<p><strong>(五)添加分片到集群配置服务器</strong></p>
<p><span style="background-color: rgba(255, 102, 0, 1)">STEP1</span>:使用mongo连接到mongos</p>
<div class="cnblogs_code">
<pre>mongo --host <span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">10.100</span> --port <span style="color: rgba(128, 0, 128, 1)">27000</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(51, 153, 102, 1)">
# 或者</span>
mongo </span>--host <span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">10.100</span> --port <span style="color: rgba(128, 0, 128, 1)">28000</span></pre>
</div>
<p>&nbsp;<span style="background-color: rgba(255, 102, 0, 1)">STEP2</span>:添加分片到集群</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">sh</span>.addShard( <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">shard001/192.168.10.81:27017,192.168.10.81:27018,192.168.10.81:27019</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">sh</span>.addShard( <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">shard002/192.168.10.82:27017,192.168.10.82:27018,192.168.10.82:27019</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">sh</span>.addShard( <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">shard003/192.168.10.83:27017,192.168.10.83:27018,192.168.10.83:27019</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)<br></span></pre>
</div>
<p>&nbsp;<span style="background-color: rgba(255, 102, 0, 1)">STEP3</span>:查看分片信息</p>
<div class="cnblogs_code">
<pre>mongos&gt;<strong><span style="color: rgba(0, 0, 0, 1)"> sh.status()
</span></strong>--- Sharding Status ---<span style="color: rgba(0, 0, 0, 1)">
sharding version: {
      </span>"_id" : 1<span style="color: rgba(0, 0, 0, 1)">,
      </span>"minCompatibleVersion" : 5<span style="color: rgba(0, 0, 0, 1)">,
      </span>"currentVersion" : 6<span style="color: rgba(0, 0, 0, 1)">,
      </span>"clusterId" : ObjectId("5ffc0709b040c53d59c15c66"<span style="color: rgba(0, 0, 0, 1)">)
}
shards:
      {</span>"_id" : "shard001","host" : "shard001/192.168.10.81:27017,192.168.10.81:27018,192.168.10.81:27019","state" : 1<span style="color: rgba(0, 0, 0, 1)"> }
      {</span>"_id" : "shard002","host" : "shard002/192.168.10.82:27017,192.168.10.82:27018,192.168.10.82:27019","state" : 1<span style="color: rgba(0, 0, 0, 1)"> }
      {</span>"_id" : "shard003","host" : "shard003/192.168.10.83:27017,192.168.10.83:27018,192.168.10.83:27019","state" : 1<span style="color: rgba(0, 0, 0, 1)"> }
active mongoses:
      </span>"4.2.10" : 2<span style="color: rgba(0, 0, 0, 1)">
autosplit:
      Currently enabled: yes
balancer:
      Currently enabled:yes
      Currently running:no
      Failed balancer rounds </span><span style="color: rgba(0, 0, 255, 1)">in</span> last 5 attempts:0<span style="color: rgba(0, 0, 0, 1)">
      Migration Results </span><span style="color: rgba(0, 0, 255, 1)">for</span> the last 24<span style="color: rgba(0, 0, 0, 1)"> hours:
                No recent migrations
databases:
      {</span>"_id" : "config","primary" : "config","partitioned" : <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)"> }

mongos</span>&gt; </pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>(六)启用分片</strong></p>
<p><strong>(6.1)对数据库启用分片</strong><br>分片是以集合为单位进行的,在对一个集合进行分片之前,需要先对其数据库启用分片,对数据库启用分片并不会重新分发数据,只是说明该数据库上的集合可以进行分片操作。</p>
<div class="cnblogs_code">
<pre>sh.enableSharding("lijiamandb");</pre>
</div>
<p>&nbsp;</p>
<p><strong>(6.2)对集合启用分片</strong></p>
<p>如果集合已经存在数据,必须手动创建在分片键上创建索引,然后再对集合进行分片,如果集合为空,MongoDB会在分片的时候自动在分片键上创建索引。<br>mongodb提供了2种策略来对集合进行分片:</p>
<ul>
<li>哈希(hash)分片,对单列使用hash索引作为分片键</li>





</ul>
<div class="cnblogs_code">
<pre>sh.shardCollection("&lt;database&gt;.&lt;collection&gt;",{shard key field : "hashed"}) </pre>
</div>
<ul>
<li>范围(range)分片,可以使用多个字段作为分片键,并将数据划分为由分片键确定的连续范围</li>
</ul>
<div class="cnblogs_code">
<pre>sh.shardCollection("&lt;database&gt;.&lt;collection&gt;",{&lt;shard key field&gt;:1,...} )</pre>
</div>
<p>&nbsp;</p>
<p>例子:对集合user进行hash分片</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接到mongos,进入lijiamandb数据库,对新集合users插入10万条数据</span>
<span style="color: rgba(0, 0, 0, 1)">use lijiamandb

</span><span style="color: rgba(0, 0, 255, 1)">for</span> (i=1;i&lt;100000;i++<span style="color: rgba(0, 0, 0, 1)">){
db.user.insert({
</span>"id"<span style="color: rgba(0, 0, 0, 1)"> : i,
</span>"name" : "name"+<span style="color: rgba(0, 0, 0, 1)">i,
</span>"age" : Math.floor(Math.random()*120<span style="color: rgba(0, 0, 0, 1)">),
</span>"created" : <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Date()
});
}


</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 使用mongostat可以看到,所有数据都写入到了主节点(shard2),每个数据库的主节点可能不同,可以使用sh.status()查看。</span>
# mongostat --port 27000 5 --<span style="color: rgba(0, 0, 0, 1)">discover
         host insert query update </span><span style="color: rgba(0, 0, 255, 1)">delete</span><span style="color: rgba(0, 0, 0, 1)"> getmore command dirty used flushes mapped vsize   res faults qrw arw net_in net_out conn set repl                time
localhost:</span>27000    352    *0   *0   *0       0   704|0                  0   0B356M 32.0M      0 0|0 0|0   224k    140k   10      RTR Jan 15 10:52:32.046<span style="color: rgba(0, 0, 0, 1)">

               host insert query update </span><span style="color: rgba(0, 0, 255, 1)">delete</span><span style="color: rgba(0, 0, 0, 1)"> getmore command dirtyused flushes mapped vsize   res faults qrw arw net_in net_out conn      set repl                time
</span>192.168.10.81:27017   *0    *0   *0   *0       0   2|00.3%0.8%       0      1.90G133M    n/a 0|0 1|0   417b   9.67k   23 shard001SEC Jan 15 10:52:32.061
192.168.10.81:27018   *0    *0   *0   *0       0   3|00.3%0.8%       1      1.93G132M    n/a 0|0 1|01.39k   11.0k   28 shard001PRI Jan 15 10:52:32.067
192.168.10.81:27019   *0    *0   *0   *0       0   2|00.3%0.8%       0      1.95G148M    n/a 0|0 1|0   942b   10.2k   26 shard001SEC Jan 15 10:52:32.070
192.168.10.82:27017    352    *0   *0   *0   4071192|02.5% 11.7%       1      1.99G180M    n/a 0|0 1|01.52m   1.15m   29 shard002PRI Jan 15 10:52:32.075
192.168.10.82:27018   *352    *0   *0   *0   409   441|04.5%8.9%       0      1.96G163M    n/a 0|0 1|0   566k    650k   25 shard002SEC Jan 15 10:52:32.085
192.168.10.82:27019   *352    *0   *0   *0       0   2|04.4%9.7%       0      1.92G168M    n/a 0|0 1|0   406b   9.51k   24 shard002SEC Jan 15 10:52:32.093
192.168.10.83:27017   *0    *0   *0   *0       0   1|00.2%0.6%       1      1.89G130M    n/a 0|0 1|0   342b   9.17k   22 shard003SEC Jan 15 10:52:32.099
192.168.10.83:27018   *0    *0   *0   *0       0   2|00.2%0.6%       0      1.95G139M    n/a 0|0 1|0   877b   9.92k   28 shard003PRI Jan 15 10:52:32.107
192.168.10.83:27019   *0    *0   *0   *0       0   1|00.2%0.6%       0      1.90G133M    n/a 0|0 1|0   342b   9.17k   21 shard003SEC Jan 15 10:52:32.113
    localhost:27000    365    *0   *0   *0       0   731|0                   0   0B356M 32.0M      0 0|0 0|0   233k    145k   10         RTR Jan 15 10:52:37.047



<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 使用分片键id创建hash分片,因为id上没有hash索引,会报错</span>
sh.shardCollection("lijiamandb.user",{"id":"hashed"<span style="color: rgba(0, 0, 0, 1)">})
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 1 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
{
    </span>"ok" : 0.0<span style="color: rgba(0, 0, 0, 1)">,
    </span>"errmsg" : "Please create an index that starts with the proposed shard key before sharding the collection"<span style="color: rgba(0, 0, 0, 1)">,
    </span>"code" : 72<span style="color: rgba(0, 0, 0, 1)">,
    </span>"codeName" : "InvalidOptions"<span style="color: rgba(0, 0, 0, 1)">,
    </span>"operationTime" : Timestamp(1610679762, 4<span style="color: rgba(0, 0, 0, 1)">),
    </span>"$clusterTime"<span style="color: rgba(0, 0, 0, 1)"> : {
      </span>"clusterTime" : Timestamp(1610679762, 4<span style="color: rgba(0, 0, 0, 1)">),
      </span>"signature"<span style="color: rgba(0, 0, 0, 1)"> : {
            </span>"hash" : { "$binary" : "AAAAAAAAAAAAAAAAAAAAAAAAAAA=", "$type" : "00"<span style="color: rgba(0, 0, 0, 1)"> },
            </span>"keyId" : NumberLong(0<span style="color: rgba(0, 0, 0, 1)">)
      }
    }
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 需要手动创建hash索引</span>
<span style="color: rgba(0, 0, 0, 1)">db.user.ensureIndex()

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 查看索引</span><span style="color: rgba(0, 128, 0, 1)">
/*</span><span style="color: rgba(0, 128, 0, 1)"> 1 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
[
    {
      </span>"v" : 2<span style="color: rgba(0, 0, 0, 1)">,
      </span>"key"<span style="color: rgba(0, 0, 0, 1)"> : {
            </span>"_id" : 1<span style="color: rgba(0, 0, 0, 1)">
      },
      </span>"name" : "_id_"<span style="color: rgba(0, 0, 0, 1)">,
      </span>"ns" : "lijiamandb.user"<span style="color: rgba(0, 0, 0, 1)">
    },
    {
      </span>"v" : 2<span style="color: rgba(0, 0, 0, 1)">,
      </span>"key"<span style="color: rgba(0, 0, 0, 1)"> : {
            </span>"id" : "hashed"<span style="color: rgba(0, 0, 0, 1)">
      },
      </span>"name" : "id_hashed"<span style="color: rgba(0, 0, 0, 1)">,
      </span>"ns" : "lijiamandb.user"<span style="color: rgba(0, 0, 0, 1)">
    }
]

<span style="color: rgba(0, 128, 0, 1)"># 最后再重新分片即可</span>
sh.shardCollection("lijiamandb".user,{"id":"hashed"})</span></pre>
</div>
<p>&nbsp;</p>
<p>到这里,我们分片集群环境已经搭建完成,接下来我们将会学习分片键的选择机制。</p>
<p>&nbsp;</p>
<p>【完】</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<table style="background-color: rgba(44, 180, 55, 1); height: 133px; width: 778px" border="0" align="left">
<tbody>
<tr>
<td>
<p><strong>相关文档合集:</strong></p>
<p>1. MongoDB Sharding(一) -- 分片的概念<br>2. MongoDB Sharding(二) -- 搭建分片集群<br>3. MongoDB Sharding(三) -- zone<br>4. MongoDB Sharding(四) -- 分片集群的维护管理</p>


</td>


</tr>


</tbody>


</table><br><br>
来源:https://www.cnblogs.com/lijiaman/p/14285489.html
頁: [1]
查看完整版本: MongoDB Sharding(二) -- 搭建分片集群