一,环境准备
* MongoDB安装包 : https://www.mongodb.com/download-center?jmp=nav#community
* MongoDB可视化工具 : https://robomongo.org/download
二,单点搭建
1,Windows单点搭建
a,点击安装文件,持续进行下一步安装(安装模式选择customer模式进行安装)
b,在环境变量中配置MongoDB路径,用mongo -version命令进行查看
c,创建数据及日志存储文件,用于绑定启动
d,服务启动
mongod.exe --dbpath="E:\develop\MongoDB\data" --logpath="E:\develop\MongoDB\log\mongodb.log"e,进入命令控制台
mongo host:portf,服务关闭
// 进入控制台 mongo host:port // 使用admin数据库 use admin // 关闭服务 db.shutdownServer();2,Linux单点搭建
a,解压安装包
tar -zxvf mongodb-linux-x86_64-4.0.2.tgz -C /usr/develop/b,配置环境变量
// 打开配置文件 vim /etc/profile // 文件末尾添加 export PATH=/usr/develop/mongodb-linux-x86_64-4.0.2/bin:$PATH // 不重启情况下引用环境变量 source /etc/profilec,创建日志目录和数据存储目录用于服务启动
// 数据存储目录 mkdir -p /usr/develop/mongodb-linux-x86_64-4.0.2/data // 日志目录 mkdir -p /usr/develop/mongodb-linux-x86_64-4.0.2/log touch mongodb.logd,命令行方式启动
mongod --dbpath="/usr/develop/mongodb-linux-x86_64-4.0.2/data" --logpath="/usr/develop/mongodb-linux-x86_64-4.0.2/log/mongodb.log" --bind_ip=0.0.0.0 --forke,配置文件方式启动
* 创建文件
touch ./mongodb.cfg // 数据存储文件路径 dbpath=/usr/develop/mongodb-linux-x86_64-4.0.2/data // 日志路径 logpaht=/usr/develop/mongodb-linux-x86_64-4.0.2/log/mongodb.log // 日志追加保存 logappend=true // 端口绑定 port=27017 // 主机绑定, 表示绑定当前IP地址 bind_ip=0.0.0.0* 启动服务
mongod -f /usr/develop/mongodb-linux-x86_64-4.0.2/mongodb.cfg三,集群搭建
1,副本集搭建
a, 服务节点详情
IP地址端口主节点192.168.91.12827017从节点192.168.91.12927017仲裁节点192.168.91.13027017b,服务节点配置
* 各节点配置文件
dbpath=[data path](数据存放目录) logpath=[log path](日志存放路径) logappend=true(以追加的方式记录日志) replSet=[name](replica set 的名字) bind_ip=0.0.0.0(绑定的IP地址) port=27017(绑定的端口号) fork=true(以后台方式运行进程)* 主节点文件配置
* 从节点文件配置
* 仲裁节点配置
c,服务节点分别启动
// *表示为主,从,仲裁节点路径 mongod -f /usr/develop/mongodb/replic/*/mongo.cfgd,节点集群化配置
// 切换到admin数据库 use admin // 添加主从仲裁节点的配置信息 // _id值必须与配置的replSet值保持一致 // 仲裁节点配置为arbiterOnly:true // 主从节点根据priority属性的优先级识别 cfg={_id:"replicSet",members:[{_id:0,host:'192.168.91.128:27017',priority:9},{_id:1,host:'192.168.91.129:27017',priority:1},{_id:2,host:'192.168.91.130:27017',arbiterOnly:true}]}; // 引用配置信息 // cfg为配置信息的key值, 可以任意更改 rs.initiate(cfg); // 节点状态查询 rs.status(); // 使从机读写生效 rs.slaveOK();2,数据分片搭建
a,集群架构分析
* 集群采用三台mongos路由服务器,三台configrs配置服务器,以及九台mongod数据数据器组成的三个Shard节点构成
* 集群由三台服务器构建,上述各个服务器在三台服务器上构建不同的文件夹和端口模拟
* 网络截图,截图中展示为两个Shard节点,使用三个进行后续演示
b,集群主机端口配置详情
RouteConfigShard_1Shard_2Shard_3192.168.91.1282705027040270102702027030192.168.91.1292705027040270102702027030192.168.91.1302705027040270102702027030c,各个节点创建数据存储,日志以及配置文件,需要配置三台服务器共15个节点,可以使用sheel进行配置
// * 表示config/route/shard1/shard2/shard3 // 数据存储文件, 路由服务下不需要数据文件 mkdir -p /usr/develop/mongodb/shard/*/data // 日志文件 mkdir -p /usr/develop/mongodb/shard/*/log touch /usr/develop/mongodb/shard/*/log/mongodb.log // 配置文件 touch /usr/develop/mongodb/shard/*/mongo.cfg mkdir -p /usr/develop/mongodb/shard/shard1/data/ mkdir -p /usr/develop/mongodb/shard/shard1/log/ touch /usr/develop/mongodb/shard/shard1/log/mongodb.log touch /usr/develop/mongodb/shard/shard1/mongo.cfg mkdir -p /usr/develop/mongodb/shard/shard2/data/ mkdir -p /usr/develop/mongodb/shard/shard2/log/ touch /usr/develop/mongodb/shard/shard2/log/mongodb.log touch /usr/develop/mongodb/shard/shard2/mongo.cfg mkdir -p /usr/develop/mongodb/shard/shard3/data/ mkdir -p /usr/develop/mongodb/shard/shard3/log/ touch /usr/develop/mongodb/shard/shard3/log/mongodb.log touch /usr/develop/mongodb/shard/shard3/mongo.cfg mkdir -p /usr/develop/mongodb/shard/config/data/ mkdir -p /usr/develop/mongodb/shard/config/log/ touch /usr/develop/mongodb/shard/config/log/mongodb.log touch /usr/develop/mongodb/shard/config/mongo.cfg mkdir -p /usr/develop/mongodb/shard/route/data/ mkdir -p /usr/develop/mongodb/shard/route/log/ // 主语路由服务器不需要数据文件 touch /usr/develop/mongodb/shard/route/log/mongodb.log touch /usr/develop/mongodb/shard/route/mongo.cfgd,配置文件信息
* 数据节点配置文件
dbpath=/usr/develop/mongodb/shard/shard1/data logpath=/usr/develop/mongodb/shard/shard1/log/mongodb.log logappend=true fork=true // 绑定IP需要填写真实IP,(0.0.0.0测试时在集群下只表示127.0.0.1) bind_ip=192.168.91.128 // 伪集群,端口要进行区分表示 port=27010 // 副本集名称, 数据/配置/路由各个节点副本集名称必须一致 replSet=shard1 // 标识当前节点为数据节点 shardsvr=true* 数据节点副本集生效
// 按照每一个Shard启动分别启动三台节点服务器 // 节点启动 mongod -f /usr/develop/shard/shrad1/mongodb.cfg // 进入mongo操作 mongo host:port // 切换到admin数据库 use admin // 配置节点信息, _id值必须与replset值一致, members信息为节点下三台服务器信息 // 27020和27030端口对应的节点副本集同理 cfg={ _id:"shard001", members:[ {_id:0,host:'192.168.91.128:27010'}, {_id:1,host:'192.168.91.129:27010'}, {_id:2,host:'192.168.91.130:27010'} ] }; // 引用配置信息 rs.initiate(cfg); // 副本集节点状态查看 rs.status();* 配置节点配置文件
dbpath=/usr/develop/mongodb/shard/config/data logpath=/usr/develop/mongodb/shard/config/log/mongodb.log logappend=true bind_ip=192.168.91.128 // 注意端口 port=27040 fork=true // 副本集名称 replSet=configrs // 标识当前节点为配置服务节点 configsvr=true* 配置节点副本集生效
// 按照Config分别启动三台节点服务器 // 节点启动 mongod -f /usr/develop/shard/config/mongodb.cfg // 进入mongo操作 mongo host:port // 切换到admin数据库 use admin // 配置节点信息, _id值必须与replSet值一致, members信息为节点下三台服务器信息 cfg={ _id:"configrs", members:[ {_id:0,host:'192.168.91.128:27040'}, {_id:1,host:'192.168.91.129:27040'}, {_id:2,host:'192.168.91.130:27040'} ] }; // 引用配置信息 rs.initiate(cfg); // 副本集节点状态查看 rs.status();* 路由节点配置文件
logpath=/usr/develop/mongodb/shard/route/log/mongodb.log logappend=true port=27050 fork=true bind_ip=192.168.91.128 // 配置服务节点详情, 配置格式为 : configdb=配置副本集名称/host:port,host:port configdb=configrs/192.168.91.128:27040,192.168.91.129:27040,192.168.91.130:27040-- # mongos --help查看configdb的配置方式
* 路由节点副本集生效
// 按照Route分别启动三台节点服务器 // 节点启动以mongs方式启动 mongos -f /usr/develop/shard/route/mongodb.cfge,路由服务器关联数据服务器构建数据分片
// 在任意一台mongos路由服务器进行配置即可 // 添加数据节点 db.runCommand({addshard:"shard1/192.168.91.128:27010,192.168.91.129:27010,192.168.91.130:27010"}) db.runCommand({addshard:"shard2/192.168.91.128:27020,192.168.91.129:27020,192.168.91.130:27020"}) db.runCommand({addshard:"shard3/192.168.91.128:27030,192.168.91.129:27030,192.168.91.130:27030"}) // 配置分片数据库 db.runCommand( { enablesharding :"testchunk"}); // 配置分片集合, 分片方式按照id的哈希值进行分片 db.runCommand( { shardcollection : "testchunk.testtable",key : {"id": "hashed"} } ); // 全部配置完成后,进行集群状态查询 sh.status();f,集群分片测试,从mongos服务器循环插入100000条数据
* 从三个数据节点的各自主机上分别查看数据量
g,至此,mongodb分片集搭建完成,有几个问题需要特别注意
* 路由节点下不需要数据文件夹
* 路由节点启动方式为 mongos
* 路由节点下,集群状态查看使用 sh.status();
* 集群下几点启动顺序 : 配置节点 --> 数据节点 --> 路由几点
四,Java API连接分片集群
a,jar包引入
<!-- mongoDB驱动 --> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.8.1</version> </dependency>b,功能测试
import com.mongodb.MongoClient; import com.mongodb.ServerAddress; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import org.bson.Document; import java.util.ArrayList; import java.util.List; /** * @author pj_zhang * @create 2018-10-23 21:28 **/ public class MongoClusterTest { public static void main(String[] args) { // 添加mongos节点 List<ServerAddress> lstServerAddr = new ArrayList<>(10); ServerAddress serverAddress_1 = new ServerAddress("192.168.91.128", 27050); ServerAddress serverAddress_2 = new ServerAddress("192.168.91.129", 27050); ServerAddress serverAddress_3 = new ServerAddress("192.168.91.130", 27050); lstServerAddr.add(serverAddress_1); lstServerAddr.add(serverAddress_2); lstServerAddr.add(serverAddress_3); // 创建mongo客户端链接 MongoClient mongoClient = new MongoClient(lstServerAddr); // 获取分片后的数据库 MongoDatabase database = mongoClient.getDatabase("testchunk"); // 获取分片后的数据库表 MongoCollection<Document> collection = database.getCollection("testtable"); // 获取表数量 long count = collection.countDocuments(); System.out.println(count); } }* 从下图中可以看到,Java API连接192.168.91.129:27050路由节点进行数据读取
* 数据量为99982是因为之前测试时候循环插入数据从18-100000处理的,上面0-100000只是作为展示,并未执行