频道栏目
首页 > 网络 > 云计算 > 正文

mongodb分片教程

2019-01-21 13:30:08           
收藏   我要投稿

环境准备

系统系统 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 主节点 Text Text
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数据存储路径

mongodb分片

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   #授权所有日志文件都可以写入


mongodb分片

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/

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服务到此完成。

mongodb分片

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/

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)

mongodb分片

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)启动实例shard1(三台都操作)
mongod -f /etc/mongodb/shard2.conf

mongodb分片

(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)

mongodb分片

9、设置第三个分片副本集
添加配置文件
cp  -p   /etc/mongodb/shard2.conf   /etc/mongodb/shard3.conf
vi /etc/mongodb/shard3.conf
:% s/2/3/g    //把当前文件下的2换成3
 记得把端口上的2改回来

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)


mongodb分片

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为配置服务器的副本集名字

mongodb分片

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

scp /etc/mongodb/mongos.conf root@192.168.80.101:/etc/mongodb/
scp /etc/mongodb/mongos.conf root@192.168.80.102:/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")

mongodb分片

#查看集群状态
mongos> sh.status()

mongodb分片

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<=50;i++){db.user.insert({"id":i,"name":"jack"+i})}
//在python库的user表中循环写入50条数据

mongodb分片

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

mongodb分片

(3)启用数据分片
sh.enablSharding("python")
//数据库分片就有针对性,可以自定义需要分片的库或者表,毕竟也不是所有数据都是需要分片操作的
(4)为表创建的索引
创建索引的规则是不能一致性太高,要具有唯一性,例如序号,比如性别这一类重复性太高的就不适合做索引

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,路由选择功能
不可以存放数据,只能去连接各种节点
相关TAG标签 mongodb 分片 教程
上一篇:docker容器来说微服务优势和不足
下一篇:可重入读写锁ReentrantReadW
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站