mongoDB集群 分片+复制集
关于MongoDB数据库
- MongoDB 官网https://www.mongodb.com
- MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
- MongoDB 可在高负载的情况下,添加更多的节点,可以保证服务器性能。
- MongoDB 可为Web应用提供可扩展的高性能数据存储解决方案。
- MongoDB 将数据存储在灵活的json文档中,这意味着可以直接得到从文档到文档的数据、结构等。
- MongoDB 是免费使用的(MongoDB分 社区版[在所有环境下都免费] 和 企业版[在开发环境免费,生产环境收费]两个版本)。
- MongoDB 数据库具有可伸缩性和灵活性,可帮助你快速查询和索引你需要数据。
mogodb数据库下载
-
官方下载地址: https://www.mongodb.com/try/download
-
在这里根据自己的需要,选择下载对应系统的MongoDB数据库版本(注:在MongoDB版本中,是偶数:如3.2.x、3.4.x、3.6.x表示正式版【可用于生产环境】,是奇数:3.1.x、3.3.x、3.5.x表示开发版,而OS系统版本:自动给你推荐你当前适合的MongoDB数据库版本)。
-
tgz包下载地址:https://www.mongodb.com/download-center/enterprise/releases
-
https://downloads.mongodb.com/linux/mongodb-linux-s390x-enterprise-rhel72-5.0.5.tgz
安装网络拓扑
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
},
作者:宋城西栅
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!