MongoDB分片集群搭建

IPmongosconfigshare-1share-2
192.168.8.327017270192701027011
192.168.8.427017270192701027011
192.168.8.527017270192701027011

1.下载安装mongodb

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.19.tgz
tar xf mongodb-linux-x86_64-rhel70-4.4.19.tgz -C /data && mv /data/mongodb-linux-x86_64-rhel70-4.4.19/ /data/mongodb_install

2. 创建工作目录

mkdir /data/mongodb/{shard1,shard2,configsvr,mongos}/{db,log,conf}  -p

3.启动config

mongod -f /data/mongodb/configsvr/conf/configsvr.conf

配置文件:configsvr.conf

systemLog:
    destination: file
    logAppend: true
    path: /data/mongodb/configsvr/log/configsvr.log
storage:
    dbPath: /data/mongodb/configsvr/db
    journal:
        enabled: true
processManagement:
   fork: true 
   pidFilePath: /data/mongodb/configsvr/configsvr.pid
net:
    port: 27019
    bindIp: 0.0.0.0 
replication:
    replSetName: config
sharding:
    clusterRole: configsvr

初始化config

mongo --port 27019
rs.initiate(
  {
    _id: "config",
    members: [
      { _id : 0, host : "192.168.8.3:27019" },
      { _id : 1, host : "192.168.8.4:27019" },
      { _id : 2, host : "192.168.8.5:27019" }
    ]
  }
)

4.启动share1分片进程

mongod -f /data/mongodb/shard1/conf/shard1.conf

配置文件:shard1.conf

systemLog:
    destination: file
    logAppend: true
    path: /data/mongodb/shard1/log/shard1.log
storage:
    dbPath: /data/mongodb/shard1/db
    journal:
        enabled: true
processManagement:
    fork: true 
    pidFilePath: /data/mongodb/shard1/shard1.pid
net:
    port: 27010
    bindIp: 0.0.0.0 
replication:
    replSetName: shard1
sharding:
    clusterRole: shardsvr

初始化副本集

mongo --port 27010
rs.initiate(
  {
    _id: "shard1",
    members: [
      { _id : 0, host : "192.168.8.3:27010" },
      { _id : 1, host : "192.168.8.4:27010" },
      { _id : 2, host : "192.168.8.5:27010" }
    ]
  }
)

查看副本集状态

shard1:SECONDARY> rs.status()
{
	"set" : "shard1",
	"date" : ISODate("2023-03-15T09:43:11.820Z"),
	"myState" : 1,
	"term" : NumberLong(1),
	"syncSourceHost" : "",
	"syncSourceId" : -1,
	"heartbeatIntervalMillis" : NumberLong(2000),
	"majorityVoteCount" : 2,
	"writeMajorityCount" : 2,
	"votingMembersCount" : 3,
	"writableVotingMembersCount" : 3,
	"optimes" : {
		"lastCommittedOpTime" : {
			"ts" : Timestamp(1678873390, 1),
			"t" : NumberLong(1)
		},
		"lastCommittedWallTime" : ISODate("2023-03-15T09:43:10.186Z"),
		"readConcernMajorityOpTime" : {
			"ts" : Timestamp(1678873390, 1),
			"t" : NumberLong(1)
		},
		"readConcernMajorityWallTime" : ISODate("2023-03-15T09:43:10.186Z"),
		"appliedOpTime" : {
			"ts" : Timestamp(1678873390, 1),
			"t" : NumberLong(1)
		},
		"durableOpTime" : {
			"ts" : Timestamp(1678873390, 1),
			"t" : NumberLong(1)
		},
		"lastAppliedWallTime" : ISODate("2023-03-15T09:43:10.186Z"),
		"lastDurableWallTime" : ISODate("2023-03-15T09:43:10.186Z")
	},
	"lastStableRecoveryTimestamp" : Timestamp(1678873360, 4),
	"electionCandidateMetrics" : {
		"lastElectionReason" : "electionTimeout",
		"lastElectionDate" : ISODate("2023-03-15T09:42:40.139Z"),
		"electionTerm" : NumberLong(1),
		"lastCommittedOpTimeAtElection" : {
			"ts" : Timestamp(0, 0),
			"t" : NumberLong(-1)
		},
		"lastSeenOpTimeAtElection" : {
			"ts" : Timestamp(1678873350, 1),
			"t" : NumberLong(-1)
		},
		"numVotesNeeded" : 2,
		"priorityAtElection" : 1,
		"electionTimeoutMillis" : NumberLong(10000),
		"numCatchUpOps" : NumberLong(0),
		"newTermStartDate" : ISODate("2023-03-15T09:42:40.161Z"),
		"wMajorityWriteAvailabilityDate" : ISODate("2023-03-15T09:42:40.689Z")
	},
	"members" : [
		{
			"_id" : 0,
			"name" : "192.168.8.3:27010",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 521,
			"optime" : {
				"ts" : Timestamp(1678873390, 1),
				"t" : NumberLong(1)
			},
			"optimeDate" : ISODate("2023-03-15T09:43:10Z"),
			"lastAppliedWallTime" : ISODate("2023-03-15T09:43:10.186Z"),
			"lastDurableWallTime" : ISODate("2023-03-15T09:43:10.186Z"),
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"electionTime" : Timestamp(1678873360, 1),
			"electionDate" : ISODate("2023-03-15T09:42:40Z"),
			"configVersion" : 1,
			"configTerm" : -1,
			"self" : true,
			"lastHeartbeatMessage" : ""
		},
		{
			"_id" : 1,
			"name" : "192.168.8.4:27010",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 41,
			"optime" : {
				"ts" : Timestamp(1678873380, 1),
				"t" : NumberLong(1)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1678873380, 1),
				"t" : NumberLong(1)
			},
			"optimeDate" : ISODate("2023-03-15T09:43:00Z"),
			"optimeDurableDate" : ISODate("2023-03-15T09:43:00Z"),
			"lastAppliedWallTime" : ISODate("2023-03-15T09:43:10.186Z"),
			"lastDurableWallTime" : ISODate("2023-03-15T09:43:10.186Z"),
			"lastHeartbeat" : ISODate("2023-03-15T09:43:10.160Z"),
			"lastHeartbeatRecv" : ISODate("2023-03-15T09:43:10.690Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncSourceHost" : "192.168.8.3:27010",
			"syncSourceId" : 0,
			"infoMessage" : "",
			"configVersion" : 1,
			"configTerm" : -1
		},
		{
			"_id" : 2,
			"name" : "192.168.8.5:27010",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 41,
			"optime" : {
				"ts" : Timestamp(1678873380, 1),
				"t" : NumberLong(1)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1678873380, 1),
				"t" : NumberLong(1)
			},
			"optimeDate" : ISODate("2023-03-15T09:43:00Z"),
			"optimeDurableDate" : ISODate("2023-03-15T09:43:00Z"),
			"lastAppliedWallTime" : ISODate("2023-03-15T09:43:10.186Z"),
			"lastDurableWallTime" : ISODate("2023-03-15T09:43:10.186Z"),
			"lastHeartbeat" : ISODate("2023-03-15T09:43:10.165Z"),
			"lastHeartbeatRecv" : ISODate("2023-03-15T09:43:11.656Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncSourceHost" : "192.168.8.4:27010",
			"syncSourceId" : 1,
			"infoMessage" : "",
			"configVersion" : 1,
			"configTerm" : -1
		}
	],
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1678873390, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1678873390, 1)
}
shard1:PRIMARY> 

5.启动mongos

mongos -f /data/mongodb/mongos/conf/mongos.conf

配置文件:mongos.conf

systemLog:
    destination: file
    logAppend: true
    path: /data/mongodb/mongos/log/mongos.log
processManagement:
    fork: true 
    pidFilePath: /data/mongodb/mongos/mongos.pid
net:
    port: 27017
    bindIp: 0.0.0.0 
sharding:
    configDB: config/192.168.8.3:27019,192.168.8.4:27019,192.168.8.5:27019

加入第一个分片

mongo --port 27017
mongos> sh.addShard( "shard1/192.168.8.3:27010,192.168.8.4:27010,192.168.8.5:27010")
{
	"shardAdded" : "shard1",
	"ok" : 1,
	"operationTime" : Timestamp(1678874879, 6),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1678874879, 6),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}

查看分片状态

mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
  	"_id" : 1,
  	"minCompatibleVersion" : 5,
  	"currentVersion" : 6,
  	"clusterId" : ObjectId("6411968a502e5b96b4848a9c")
  }
  shards:
        {  "_id" : "shard1",  "host" : "shard1/192.168.8.3:27010,192.168.8.4:27010,192.168.8.5:27010",  "state" : 1 }
  active mongoses:
        "4.4.19" : 3
  autosplit:
        Currently enabled: yes
  balancer:
        Currently enabled:  yes
        Currently running:  no
        Failed balancer rounds in last 5 attempts:  0
        Migration Results for the last 24 hours: 
                No recent migrations
  databases:
        {  "_id" : "config",  "primary" : "config",  "partitioned" : true }

为了使集合支持分片,需要先开启database的分片功能

mongos> sh.enableSharding("market_test")
{
	"ok" : 1,
	"operationTime" : Timestamp(1678875165, 3),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1678875165, 3),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}

执行shardCollection命令,对集合执行分片初始化

mongos> sh.shardCollection("market_test.emp",{_id: 'hashed'})
{
	"collectionsharded" : "market_test.emp",
	"collectionUUID" : UUID("e69e4e2a-c246-4a94-9095-fb1797c1405c"),
	"ok" : 1,
	"operationTime" : Timestamp(1678875275, 8),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1678875275, 8),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}

查看分片状态

mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
  	"_id" : 1,
  	"minCompatibleVersion" : 5,
  	"currentVersion" : 6,
  	"clusterId" : ObjectId("6411968a502e5b96b4848a9c")
  }
  shards:
        {  "_id" : "shard1",  "host" : "shard1/192.168.8.3:27010,192.168.8.4:27010,192.168.8.5:27010",  "state" : 1 }
  active mongoses:
        "4.4.19" : 3
  autosplit:
        Currently enabled: yes
  balancer:
        Currently enabled:  yes
        Currently running:  no
        Failed balancer rounds in last 5 attempts:  0
        Migration Results for the last 24 hours: 
                No recent migrations
  databases:
        {  "_id" : "config",  "primary" : "config",  "partitioned" : true }
                config.system.sessions
                        shard key: { "_id" : 1 }
                        unique: false
                        balancing: true
                        chunks:
                                shard1	1024
                        too many chunks to print, use verbose if you want to force print
        {  "_id" : "market_test",  "primary" : "shard1",  "partitioned" : true,  "version" : {  "uuid" : UUID("161e6787-dae1-4a6f-af46-f368cb0997f5"),  "lastMod" : 1 } }
                market_test.emp
                        shard key: { "_id" : "hashed" }
                        unique: false
                        balancing: true
                        chunks:
                                shard1	2
                        { "_id" : { "$minKey" : 1 } } -->> { "_id" : NumberLong(0) } on : shard1 Timestamp(1, 0) 
                        { "_id" : NumberLong(0) } -->> { "_id" : { "$maxKey" : 1 } } on : shard1 Timestamp(1, 1) 
mongos> 

插入数据测试

mongos>use market_test
for (var i =0; i < 10000; i++) {
db.emp.insert({i: i});
}
mongos> db.emp.find().count()
10000

查询数据分布

mongos> db.emp.getShardDistribution()

Shard shard1 at shard1/192.168.8.3:27010,192.168.8.4:27010,192.168.8.5:27010
 data : 322KiB docs : 10000 chunks : 2
 estimated data per chunk : 161KiB
 estimated docs per chunk : 5000

Totals
 data : 322KiB docs : 10000 chunks : 2
 Shard shard1 contains 100% data, 100% docs in cluster, avg obj size on shard : 33B

6.创建第二个分片

mongod -f /data/mongodb/shard2/conf/shard2.conf

配置文件:shard2.conf

systemLog:
    destination: file
    logAppend: true
    path: /data/mongodb/shard2/log/shard1.log
storage:
    dbPath: /data/mongodb/shard2/db
    journal:
        enabled: true
processManagement:
    fork: true 
    pidFilePath: /data/mongodb/shard2/shard1.pid
net:
    port: 27011
    bindIp: 0.0.0.0 
replication:
    replSetName: shard2
sharding:
    clusterRole: shardsvr

初始化复制集

mongo --port 27011
rs.initiate(
  {
    _id: "shard2",
    members: [
      { _id : 0, host : "192.168.8.3:27011" },
      { _id : 1, host : "192.168.8.4:27011" },
      { _id : 2, host : "192.168.8.5:27011" }
    ]
  }
)

mongos加入第二个分片

mongo --port 27017
mongos> sh.addShard( "shard2/192.168.8.3:27011,192.168.8.4:27011,192.168.8.5:27011")
{
	"shardAdded" : "shard2",
	"ok" : 1,
	"operationTime" : Timestamp(1678876049, 1),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1678876049, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}

查看数据分片信息,数据分布在两个分片上

mongos> use market_test
mongos> db.emp.getShardDistribution()

Shard shard1 at shard1/192.168.8.3:27010,192.168.8.4:27010,192.168.8.5:27010
 data : 322KiB docs : 10000 chunks : 1
 estimated data per chunk : 322KiB
 estimated docs per chunk : 10000

Shard shard2 at shard2/192.168.8.3:27011,192.168.8.4:27011,192.168.8.5:27011
 data : 160KiB docs : 4967 chunks : 1
 estimated data per chunk : 160KiB
 estimated docs per chunk : 4967

Totals
 data : 482KiB docs : 14967 chunks : 2
 Shard shard1 contains 66.81% data, 66.81% docs in cluster, avg obj size on shard : 33B
 Shard shard2 contains 33.18% data, 33.18% docs in cluster, avg obj size on shard : 33B

7.开启用户认证

[root@master-1 mongos]# mongo --port 27017
mongos> use admin
switched to db admin
mongos> db.createUser({user:"root",pwd:"123456",roles:[{role:"root",db:"admin"}]})
Successfully added user: {
	"user" : "root",
	"roles" : [
		{
			"role" : "root",
			"db" : "admin"
		}
	]
}

创建keyfile文件

mkdir /data/mongodb/keyfile
openssl rand -base64 756 > /data/mongodb/keyfile/keyfile
chmod 600 /data/keyfile/keyfile
scp /data/mongodb/keyfile/keyfile 192.168.8.4:/data/mongodb/keyfile/
scp /data/mongodb/keyfile/keyfile 192.168.8.5:/data/mongodb/keyfile/

停止所有mongo进程

[root@master-3 data]# ps -ef | grep mongo
[root@master-3 data]# kill 进程号

修改配置文件,添加认证,在每个配置文件里添加配置 config 和shard 添加

security:
  keyFile: /data/mongodb/keyfile/keyfile
  authorization: enabled

mongos 添加

security:
  keyFile: /data/mongodb/keyfile/keyfile

8.重新启动mongodb集群,mongodb的启动顺序是,先启动配置服务器,在启动分片,最后启动mongos

mongod -f /data/mongodb/configsvr/conf/configsvr.conf
mongod -f /data/mongodb/shard1/conf/shard1.conf
mongod -f /data/mongodb/shard2/conf/shard2.conf
mongos -f /data/mongodb/mongos/conf/mongos.conf

9.登录验证

[root@master-1 conf]# mongo --port 27017
mongos> show dbs;
mongos> use admin
switched to db admin
mongos> db.auth("root","123456")
mongos> show dbs;
admin        0.000GB
config       0.003GB
market_test  0.001GB

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值