mongoDB集群 分片+复制集

关于MongoDB数据库

  • MongoDB 官网https://www.mongodb.com
  • MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
  • MongoDB 可在高负载的情况下,添加更多的节点,可以保证服务器性能。
  • MongoDB 可为Web应用提供可扩展的高性能数据存储解决方案。
  • MongoDB 将数据存储在灵活的json文档中,这意味着可以直接得到从文档到文档的数据、结构等。
  • MongoDB 是免费使用的(MongoDB分 社区版[在所有环境下都免费] 和 企业版[在开发环境免费,生产环境收费]两个版本)。
  • MongoDB 数据库具有可伸缩性和灵活性,可帮助你快速查询和索引你需要数据。

mogodb数据库下载

安装网络拓扑

ip 192.168.204.111 192.168.204.112 192.168.204.113
主机名 mongoDB01 mongoDB02 mongoDB03
mongos 192.168.204.111:10005 192.168.204.112:10005 制粘贴快捷键192.168.204.113:10005
configsvr 192.168.204.111:10004 192.168.204.112:10004 制粘贴快捷键 制粘贴快捷键192.168.204.113:10004
shard1 192.168.204.111:10001【主节点】 192.168.204.112:10001【副本】 192.168.204.113:10001【副本】
shard2 192.168.204.111:10002【副本】 192.168.204.112:10002【主节点】 192.168.204.113:10002【副本】
shard3 192.168.204.111:10003【副本】 192.168.204.112:10003【副本】 192.168.204.113:10003【主节点】¬

安装目录拓扑

ip 192.168.204.111 192.168.204.112 192.168.204.113
/data目录 /data/config
/data/keyfile
/data/mongodb
/data/configsvr
/data/logs
/data/mongos
/data/shard1
/data/shard2
/data/shard3
/data/config
/data/keyfile
/data/mongodb
/data/configsvr
/data/logs
/data/mongos
/data/shard1
/data/shard2
/data/shard3
/data/config
/data/keyfile
/data/mongodb
/data/configsvr
/data/logs
/data/mongos
/data/shard1
/data/shard2
/data/shard3
config目录 /data/config/shard1.conf
/data/config/shard2.conf
/data/config/shard3.conf
/data/config/configsvr.conf
/data/config/mongos.conf
/data/config/shard1.conf
/data/config/shard2.conf
/data/config/shard3.conf
/data/config/configsvr.conf
/data/config/mongos.conf
/data/config/shard1.conf
/data/config/shard2.conf
/data/config/shard3.conf
/data/config/configsvr.conf
/data/config/mongos.conf
执行文件目录 /data/mongodb/bin /data/mongodb/bin /data/mongodb/bin
数据目录 /data/shard1
/data/shard2
/data/shard3
/data/shard1
/data/shard2
/data/shard3
/data/shard1
/data/shard2
/data/shard3

安装部署

修改主机名

hostnamectl set-hostname mongoDB01
hostnamectl set-hostname mongoDB02
hostnamectl set-hostname mongoDB03

创建用户

groupadd mongodb
useradd -g mongodb mongodb
mkdir /data
chown mongodb.mongodb /data -R
su - mongodb

配置文件句柄

  • mongodb推荐配置
-f (file size): unlimited
-t (cpu time): unlimited
-v (virtual memory): unlimited
-n (open files): 64000
-m (memory size): unlimited
-u (processes/threads): 64000

配置

vi /etc/security/limits.conf
mongodb soft nofile 64000
mongodb hard nofile 64000
mongodb soft nproc 32000
mongodb hard nproc 32000

其他配置

echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
echo "never" > /sys/kernel/mm/transparent_hugepage/defrag

安装启动依赖

yum install net-snmp -y

创建目录与文件

mkdir /data/{config,shard1,shard2,shard3,mongos,logs,configsvr} -pv
touch /data/logs/shard{1..3}.log
touch /data/logs/{configsvr,mongos}.log
touch /data/config/shard{1..3}.conf
touch /data/config/{configsvr,mongos}.conf

下载解压mongodb

cd /data && wget https://downloads.mongodb.com/linux/mongodb-linux-x86_64-enterprise-rhel70-5.0.5.tgz?_ga=2.39788896.2106998313.1641800429-472117898.1641800429
tar axf mongodb-linux-x86_64-enterprise-rhel70-5.0.5.tgz -C /data/
ln -sv mongodb-linux-x86_64-enterprise-rhel70-5.0.5 /data/mongodb ##方便后期维护升级

设置mongodb环境变量

echo "export PATH=$PATH:/data/mongodb/bin" >> ~/.bash_profile
source ~/.bash_profile

配置分片

shard1

  • shard1.conf配置文件内容如下
cat > /data/config/shard1.conf <<EOF
systemLog:
destination: file
path: /data/logs/shard1.log
logAppend: true
processManagement:
fork: true
pidFilePath: "/data/shard1/shard1.pid"
timeZoneInfo: /usr/share/zoneinfo
net:
port: 10001
bindIp: 192.168.204.x ##需要根据三台主机ip进行更改
storage:
dbPath: "/data/shard1"
journal:
enabled: true
sharding:
clusterRole: shardsvr
replication:
replSetName: "shard1"
EOF

shard2

  • shard2.conf配置文件内容如下
cat > /data/config/shard2.conf << EOF
systemLog:
destination: file
path: /data/logs/shard2.log
logAppend: true
processManagement:
fork: true
pidFilePath: "/data/shard2/shard2.pid"
timeZoneInfo: /usr/share/zoneinfo
net:
port: 10002
bindIp: 192.168.204.x ##需要根据三台主机ip进行更改
storage:
dbPath: "/data/shard2"
journal:
enabled: true
sharding:
clusterRole: shardsvr
replication:
replSetName: "shard2"
EOF

shard3

  • shard3.conf配置文件内容如下
cat > /data/config/shard3.conf <<EOF
systemLog:
destination: file
path: /data/logs/shard3.log
logAppend: true
processManagement:
fork: true
pidFilePath: "/data/shard3/shard3.pid"
timeZoneInfo: /usr/share/zoneinfo
net:
port: 10003
bindIp: 192.168.204.x ##需要根据三台主机ip进行更改
storage:
dbPath: "/data/shard3"
journal:
enabled: true
sharding:
clusterRole: shardsvr
replication:
replSetName: "shard3"
EOF

配置svc

  • configsvr.conf配置文件内容如下
cat > /data/config/configsvr.conf <<EOF
systemLog:
destination: file
path: /data/logs/configsvr.log
logAppend: true
processManagement:
fork: true
pidFilePath: "/data/configsvr/configsvr.pid"
timeZoneInfo: /usr/share/zoneinfo
net:
port: 10004
bindIp: 192.168.204.x ##需要根据三台主机ip进行更改
storage:
dbPath: "/data/configsvr"
journal:
enabled: true
sharding:
clusterRole: configsvr
replication:
replSetName: config
EOF

配置mongodb

  • mongos.conf配置文件内容如下
cat >/data/config/mongos.conf <<EOF
systemLog:
destination: file
path: /data/logs/mongos.log
logAppend: true
processManagement:
fork: true
pidFilePath: /data/mongos/mongos.pid
timeZoneInfo: /usr/share/zoneinfo
net:
port: 10005
bindIp: 192.168.204.x ##需要根据三台主机ip进行更改
sharding:
configDB: config/192.168.204.111:10004,192.168.204.112:10004,192.168.204.113:10004
EOF

启动服务

  • 启动各个机器节点的configsvr
mongod -f /data/config/configsvr.conf

初始化副本集

#连接
mongo 192.168.204.111 --port 10004
#初始化
rs.initiate(
{
_id: "config",
configsvr: true,
members: [
{ _id : 0, host : "192.168.204.111:10004" },
{ _id : 1, host : "192.168.204.112:10004" },
{ _id : 2, host : "192.168.204.113:10004" }
]
}
)
#查看状态
rs.status()

配置复制集

启动shard1

  • 启动三台服务器shard
mongod -f /data/config/shard1.conf

初始化复制集shard1

  • mongodb01机器上操作配置复制集
mongo --port 10001 --host 192.168.204.111
rs.initiate(
{
_id: "shard1",
members: [
{ _id : 0, host : "192.168.204.111:10001" },
{ _id : 1, host : "192.168.204.112:10001" },
{ _id : 2, host : "192.168.204.113:10001" }
]
}
)
#_id : 0为主
  • 查看是否成功
rs.status()

启动shard2

  • 启动三台服务器shard
mongod -f /data/config/shard2.conf

初始化复制集shard2

rs.initiate(
{
_id: "shard2",
members: [
{ _id : 0, host : "192.168.204.112:10002" },
{ _id : 1, host : "192.168.204.111:10002" },
{ _id : 2, host : "192.168.204.113:10002" }
]
}
)
  • 查看是否成功
rs.status()

启动shard3

  • 启动三台服务器shard
mongod -f /data/config/shard3.conf

初始化复制集shard3

rs.initiate(
{
_id: "shard3",
members: [
{ _id : 0, host : "192.168.204.113:10003" },
{ _id : 1, host : "192.168.204.112:10003" },
{ _id : 2, host : "192.168.204.111:10003" }
]
}
)
  • 查看是否成功
rs.status()

启动mongos

  • 三台服务器启动mongos
mongos -f /data/config/mongos.conf

启用分片

  • 应用程序连接到mongos路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。
  • 登录任意一台服务器
mongo 192.168.204.111 --port 10005
sh.addShard( "shard1/192.168.204.111:10001,192.168.204.112:10001,192.168.204.113:10001")
sh.addShard( "shard2/192.168.204.111:10002,192.168.204.112:10002,192.168.204.113:10002")
sh.addShard( "shard3/192.168.204.111:10003,192.168.204.112:10003,192.168.204.113:10003")

查看分片状态

sh.status()
shards:
{ "_id" : "shard1", "host" : "shard1/192.168.204.111:10001,192.168.204.112:10001,192.168.204.113:10001", "state" : 1, "topologyTime" : Timestamp(1641884187, 2) }
{ "_id" : "shard2", "host" : "shard2/192.168.204.111:10002,192.168.204.112:10002,192.168.204.113:10002", "state" : 1, "topologyTime" : Timestamp(1641884594, 2) }
{ "_id" : "shard3", "host" : "shard3/192.168.204.111:10003,192.168.204.112:10003,192.168.204.113:10003", "state" : 1, "topologyTime" : Timestamp(1641884207, 1) }

数据测试

目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片。连接在mongos上,准备让指定的数据库、指定的集合分片生效。

连接

  • 连接任意mongis节点
mongo 192.168.204.111 --port 10005
use admin

测试数据启动分片

sh.enableSharding("testdb")
#设置集合的名字以及字段,默认自动建立索引,zxl库,haha集合
sh.shardCollection("testdb.haha",{age: 1, name: 1})

配置分片规则

# 为order集合设置分片规则
sh.shardCollection("testdb.order", {"_id": "hashed" })

插入测试数据

use testdb
for (i = 1; i <= 100000; i=i+1){
db.order.insert({'price': 1})
}

查看插入数据库

# db.order.find().count()
40263

查看分片情况

db.order.stats();
"shards" : {
"shard1" : {
"ns" : "testdb.order",
"size" : 499537,
"count" : 13501,
"avgObjSize" : 37,
"storageSize" : 544768,
"freeStorageSize" : 393216,
"capped" : false,
"wiredTiger" : {
"metadata" : {
"formatVersion" : 1
},
"shard2" : {
"ns" : "testdb.order",
"size" : 496244,
"count" : 13412,
"avgObjSize" : 37,
"storageSize" : 565248,
"freeStorageSize" : 409600,
"capped" : false,
"wiredTiger" : {
"metadata" : {
"formatVersion" : 1
},
"shard3" : {
"ns" : "testdb.order",
"size" : 493950,
"count" : 13350,
"avgObjSize" : 37,
"storageSize" : 540672,
"freeStorageSize" : 389120,
"capped" : false,
"wiredTiger" : {
"metadata" : {
"formatVersion" : 1
},

posted on   无语至极  阅读(210)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示