环境准备 系统系统 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,路由选择功能 不可以存放数据,只能去连接各种节点