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 2022-01-11 17:49  无语至极  阅读(206)  评论(0编辑  收藏  举报

导航