mongodb分片

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb分片相关的知识,希望对你有一定的参考价值。

环境准备
?
系统系统 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 [email protected]:/etc/mongodb/
scp /etc/mongodb/config.conf [email protected]:/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 [email protected]:/etc/mongodb/
scp /etc/mongodb/shard1.conf [email protected]:/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 [email protected]:/etc/mongodb/
scp /etc/mongodb/shard2.conf [email protected]:/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 [email protected]:/etc/mongodb/
scp /etc/mongodb/shard3.conf [email protected]:/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 [email protected]:/etc/mongodb/
scp /etc/mongodb/mongos.conf [email protected]:/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,路由选择功能
不可以存放数据,只能去连接各种节点

以上是关于mongodb分片的主要内容,如果未能解决你的问题,请参考以下文章

『MongoDB』MongoDB高可用部署架构——分片集群篇(Sharding)

mongoDB分片集群

MongoDB——MongoDB分片集群(Sharded Cluster)两种搭建方式

Docker——基于Docker搭建MongoDB分片集群

Mongodb集群架构之分片架构

MongoDB分片搭建