环境准备
 
系统系统 centos 7.4
三台服务器:
node1(192.168.80.100)
node2(192.168.80.101)
node3(192.168.80.102)
安装包:yum安装

服务器规划

服务器node1(192.168.80.100) 服务器node2(192.168.80.101) 服务器node3(192.168.80.102)
mongos mongos mongos
config server config server config server
shard server1 主节点 shard server1 副节点 shard server1 仲裁
shard server2 仲裁 shard server2 主节点 shard server2 副节点
shard server3 副节点 shard server3 仲裁 shard server3 主节点
每一台mongodb服务器端口分配:
mongos:20000
config:21000
shard1:27001
shard2:27002
shard3:27003
1、关闭防火墙和SElinux
systemctl    stop  firewalld
setenforce   0
2、配置MongoDB的yum源:
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
3、安装MongoDB:
yum  install -y mongodb-org
4、路径规划并创建(三台服务器都要操作)
分别在每台机器建立conf、mongos、config、shard1、shard2、shard3目录,因为mongos不存储数据,只需要建立日志文件目录即可,日志文件创建完成之后还需要给予权限。

mkdir -p /data/mongodb/logs/    #日志文件路径
 
mkdir /etc/mongodb/    #配置文件路径
 
mkdir /data/mongodb/config/    #config  server数据存储路径
 
mkdir /data/mongodb/shard{1,2,3}   #shard  server数据存储路径
 
touch /data/mongodb/logs/shard{1,2,3}.log   #shard  server日志文件
 
touch /data/mongodb/logs/mongos.log   #mongos日志文件
 
touch /data/mongodb/logs/config.log    #config  server日志文件
 
chmod 777 /data/mongodb/logs/*.log   #授权所有日志文件都可以写入

ll /data/mongodb/logs/

5、config    server配置服务器
mongodb3.4以后要求配置服务器也创建副本集,不然集群搭建不成功。
(1)、添加配置文件
cp  -p   /etc/mongod.conf   /etc/mongodb/config.conf
 
vi   /etc/mongodb/config.conf
修改后内容如下:
systemLog:
  destination: file
  logAppend: true
  path: /data/mongodb/logs/config.log
 
storage:
  dbPath: /data/mongodb/config/
  journal:
    enabled: true
 
processManagement:
  fork: true
  pidFilePath: /data/mongodb/logs/config.pid
  timeZoneInfo: /usr/share/zoneinfo
 
net:
  port: 21000
  bindIp: 0.0.0.0
  maxIncomingConnections: 20000
 
replication:
  replSetName: configs
 
sharding:
  clusterRole: configsvr
	
(2)将配置完的配置文件发送到其它服务器上
scp /etc/mongodb/config.conf root@192.168.80.101:/etc/mongodb/
scp /etc/mongodb/config.conf root@192.168.80.102:/etc/mongodb/

(3)三台服务器启动config实例:
mongod -f /etc/mongodb/config.conf

(4)、配置复制集(任意一台操作即可,建议三台服务器都进入数据库,方便查看角色变更)
mongo 127.0.0.1:21000
 
config={_id:"configs",members:[
{_id:0,host:"192.168.80.100:21000"},
{_id:1,host:"192.168.80.101:21000"},
{_id:2,host:"192.168.80.102:21000"}]}    #创建复制集
 
rs.initiate(config)      #初始化复制集
 
config  server服务到此完成。

7、部署shard1分片服务器
(1)、创建配置文件
cp  -p   /etc/mongod.conf   /etc/mongodb/shard1.conf
 
vi   /etc/mongodb/shard1.conf
修改后的内容如下:
systemLog:
  destination: file
  logAppend: true
  path: /data/mongodb/logs/shard1.log
storage:
  dbPath: /data/mongodb/shard1/
  journal:
    enabled: true
 
processManagement:
  fork: true
  pidFilePath: /data/mongodb/logs/shard1.pid
  timeZoneInfo: /usr/share/zoneinfo
 
net:
  port: 27001
  bindIp: 0.0.0.0
  maxIncomingConnections: 20000
 
replication:
  replSetName: shard1
 
sharding:
  clusterRole: shardsvr
(2)将配置完的配置文件发送到其它服务器上
scp /etc/mongodb/shard1.conf root@192.168.80.101:/etc/mongodb/
scp /etc/mongodb/shard1.conf root@192.168.80.102:/etc/mongodb/

 

(3)启动实例shard1(三台都操作)
mongod -f /etc/mongodb/shard1.conf

(4)登陆任意一台非仲裁节点服务器,初始化副本集
mongo 127.0.0.1:27001
#使用admin数据库
use admin

#定义副本集配置,第三个节点的 "arbiterOnly":true 代表其为仲裁节点。
config = {
       _id : "shard1",
       members : [
            {_id : 1, host : "192.168.80.100:27001" , priority:100},
            {_id : 2, host : "192.168.80.101:27001" , priority:90},
            {_id : 3, host : "192.168.80.102:27001" , arbiterOnly: true }
        ]
    }
 
注:不是在任一台服务器上创建都能成功的,如果选择在预先设置为仲裁节点的服务器上创建复制集会报错
 
#初始化副本集配置
rs.initiate(config)

8、设置第二个分片副本集
 
添加配置文件
cp  -p   /etc/mongod.conf   /etc/mongodb/shard2.conf
 
vi /etc/mongodb/shard2.conf
 
# 配置文件内容
 
systemLog:
  destination: file
  logAppend: true
  path: /data/mongodb/logs/shard2.log
storage:
  dbPath: /data/mongodb/shard2/
  journal:
    enabled: true
 
processManagement:
  fork: true
  pidFilePath: /data/mongodb/logs/shard2.pid
  timeZoneInfo: /usr/share/zoneinfo
 
net:
  port: 27002
  bindIp: 0.0.0.0
  maxIncomingConnections: 20000
 
replication:
  replSetName: shard2
 
sharding:
  clusterRole: shardsvr
(2)将配置完的配置文件发送到其它服务器上
scp /etc/mongodb/shard2.conf root@192.168.80.101:/etc/mongodb/
scp /etc/mongodb/shard2.conf root@192.168.80.102:/etc/mongodb/

(3)启动实例shard2(三台都操作)
mongod -f /etc/mongodb/shard2.conf
(4)
登陆任意一台非仲裁节点服务器,初始化副本集在80.102上作这条命令不然不会成功的
mongo 127.0.0.1:27002
#使用admin数据库
use admin
#定义副本集配置,第一个节点的 "arbiterOnly":true 代表其为仲裁节点。
config = {
       _id : "shard2",
       members : [
            {_id : 1, host : "192.168.80.100:27002" , arbiterOnly: true },
            {_id : 2, host : "192.168.80.101:27002" , priority:2},
            {_id : 3, host : "192.168.80.102:27002" , priority:1}
        ]
    }
#初始化副本集配置
rs.initiate(config)

9、设置第三个分片副本集
添加配置文件
cp  -p   /etc/mongodb/shard2.conf   /etc/mongodb/shard3.conf
vi /etc/mongodb/shard3.conf
 :% s/2/3/g    //把当前文件下的2换成3
 记得把端口上的2改回来
## 配置文件内容
 
systemLog:
  destination: file
  logAppend: true
  path: /data/mongodb/logs/shard3.log
storage:
  dbPath:  /data/mongodb/shard3/
  journal:
    enabled: true
 
processManagement:
  fork: true
  pidFilePath: /data/monodb/logs/shard3.pid
  timeZoneInfo: /usr/share/zoneinfo
 
net:
  port: 27003
  bindIp: 0.0.0.0
  maxIncomingConnections: 20000
 
replication:
  replSetName: shard3
 
sharding:
  clusterRole: shardsvr

将配置完的配置文件发送到其它服务器上
scp /etc/mongodb/shard3.conf root@192.168.80.101:/etc/mongodb/
scp /etc/mongodb/shard3.conf root@192.168.80.102:/etc/mongodb/

(3)启动实例shard3(三台都操作)
mongod -f /etc/mongodb/shard3.conf

(4)
登陆任意一台非仲裁节点服务器,初始化副本集
mongo 127.0.0.1:27003
#使用admin数据库
use admin
#定义副本集配置,第二个节点的 "arbiterOnly":true 代表其为仲裁节点。
config = {
       _id : "shard3",
       members : [
            {_id : 1, host : "192.168.80.100:27003" , priority:1},
            {_id : 2, host : "192.168.80.101:27003" , arbiterOnly: true},
            {_id : 3, host : "192.168.80.102:27003" , priority:2}
        ]
    }
#初始化副本集配置
rs.initiate(config)

10、配置路由服务器 mongos
先启动配置服务器和分片服务器,后启动路由实例启动路由实例:(三台机器)
 
(1)创建配置文件
cp  -p   /etc/mongodb/shard2.conf   /etc/mongodb/mongos.conf
vi /etc/mongodb/mongos.conf
## 配置文件内容
 
systemLog:
  destination: file
  logAppend: true
  path: /data/mongodb/logs/mongos.log
 
processManagement:
  fork: true
  pidFilePath: /data/mongodb/logs/mongos.pid
  timeZoneInfo: /usr/share/zoneinfo
 
net:
  port: 20000
  bindIp: 0.0.0.0
  maxIncomingConnections=20000
 
sharding:
  configDB: configs/192.168.80.100:21000, 192.168.80.101:21000, 192.168.80.102:21000
 
#注意监听的配置服务器,只能有1个或者3个 csReplSet为配置服务器的副本集名字

(2)将配置文件发送到其他服务器
scp /etc/mongodb/mongos.conf root@192.168.80.100:/etc/mongodb/
scp /etc/mongodb/mongos.conf root@192.168.80.101:/etc/mongodb/

(3)启动mongos实例
mongos -f /etc/mongodb/mongos.conf

(4)启用分片
目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到mongos路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。
登陆任意一台mongos
mongo 127.0.0.1:20000
#使用admin数据库
use  admin
#串联路由服务器与分配副本集
sh.addShard("shard1/192.168.80.100:27001,192.168.80.101:27001,192.168.80.102:27001")
sh.addShard("shard2/192.168.80.100:27002,192.168.80.101:27002,192.168.80.102:27002")
#查看集群状态
mongos> sh.status()

11、测试服务器分片功能
目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片。连接在mongos上,准备让指定的数据库、指定的集合分片生效。
mongo 127.0.0.1:20000
(1)设置分片chunk大小
mongos> use config
mongos> db.settings.save({"_id":"chunksize","value":1})   
//设置块大小为1M是方便实验,不然就需要插入海量数据才能分片
(2)模拟写入数据
use python
show   collections
 for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})}
//在python库的user表中循环写入五万条数据

db.user.find()     //查看内容

(3)启用数据分片
sh.enableSharding("python")
//数据库分片就有针对性,可以自定义需要分片的库或者表,毕竟也不是所有数据都是需要分片操作的

(4)为表创建的索引
创建索引的规则是不能一致性太高,要具有唯一性,例如序号,比如性别这一类重复性太高的就不适合做索引
mongos> db.user.createIndex({"id":1})   //以”id“为索引

(5)启用表分片
mongos> sh.shardCollection("python.user",{"id":1})

(6)查看分片情况
mongos> sh.status()

(7)手动添加分片服务器,查看分片情况是否发生变化
use admin
sh.addShard("shard3/192.168.80.100:27003,192.168.80.101:27003,192.168.80.102:27003")

 

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

小结:
config server    复制集configs     分片:configsvr
 
存储节点:
shard1     复制集:shard1  ,分片:shardsvr
shard2       复制集:shard2  ,分片:shardsvr
shard3       复制集:shard3,分片:shardsvr
 
mongos,路由选择功能
不可以存放数据,只能去连接各种节点