晓夏

YoungCheung

Zhang Sir's technical way

Mongodb4.4.13集群安装实战

浏览量:171

1、环境规划

image.png

image.png

2、创建目录

mkdir -p /data/mongodb/{data,logs,apps,run}
mkdir -p /data/mongodb/data/shard{1,2,3}
mkdir -p /data/mongodb/data/config
mkdir -p /data/mongodb/conf
mkdir -p /tmp/mongodb/configsvr
mkdir -p /tmp/mongodb/shard1
mkdir -p /tmp/mongodb/shard2
mkdir -p /tmp/mongodb/shard3
mkdir -p /tmp/mongodb/mongos

3、创建Keyfile Security

$ openssl rand -base64 756 > /data/mongodb/conf/mongodb.key
$ chmod 400 /data/mongodb/conf/mongodb.key
$ scp -r /data/mongodb/conf/mongodb.key  nodeIP:/data/mongodb/conf/

4、创建配置文件

tee /data/mongodb/conf/configsvr.yml <<-'EOF'
systemLog:
  destination: "file"
  logAppend: true
  path: "/data/mongodb/logs/configsvr.log"
storage:
  dbPath: "/data/mongodb/data/config"
  journal:
    enabled: true
  engine: "wiredTiger"
  wiredTiger:
    engineConfig:
      directoryForIndexes: true
      cacheSizeGB: 2
processManagement:
  fork: true
  pidFilePath: "/data/mongodb/run/configsvr.pid"
  timeZoneInfo: "/usr/share/zoneinfo"
net:
  port: 27019
  bindIp: "::,0.0.0.0"
  maxIncomingConnections: 5000
  unixDomainSocket:
    enabled: true
    pathPrefix: "/tmp/mongodb/configsvr"
    filePermissions: 0700
setParameter:
  enableLocalhostAuthBypass: true
security:
  clusterAuthMode: "keyFile"
  keyFile: "/data/mongodb/conf/mongodb.key"
  authorization: "enabled"
replication:
  replSetName: "replCluster"
sharding:
  clusterRole: "configsvr"
EOF

创建shard配置文件

tee /data/mongodb/conf/shard1.yml <<-'EOF'
systemLog:
  destination: "file"
  logAppend: true
  path: "/data/mongodb/logs/shard1.log"
storage:
  dbPath: "/data/mongodb/data/shard1"
  journal:
    enabled: true
  engine: "wiredTiger"
  wiredTiger:
    engineConfig:
      directoryForIndexes: true
      cacheSizeGB: 2
processManagement:
  fork: true
  pidFilePath: "/data/mongodb/run/shard1.pid"
  timeZoneInfo: "/usr/share/zoneinfo"
net:
  port: 29017
  bindIp: "::,0.0.0.0"
  maxIncomingConnections: 5000
  unixDomainSocket:
    enabled: true
    pathPrefix: "/tmp/mongodb/shard1"
    filePermissions: 0700
setParameter:
  enableLocalhostAuthBypass: true
security:
  clusterAuthMode: "keyFile"
  keyFile: "/data/mongodb/conf/mongodb.key"
  authorization: "enabled"
replication:
  replSetName: "shard1"
sharding:
  clusterRole: "shardsvr"
EOF
tee /data/mongodb/conf/shard2.yml <<-'EOF'
systemLog:
  destination: "file"
  logAppend: true
  path: "/data/mongodb/logs/shard2.log"
storage:
  dbPath: "/data/mongodb/data/shard2"
  journal:
    enabled: true
  engine: "wiredTiger"
  wiredTiger:
    engineConfig:
      directoryForIndexes: true
      cacheSizeGB: 2
processManagement:
  fork: true
  pidFilePath: "/data/mongodb/run/shard2.pid"
  timeZoneInfo: "/usr/share/zoneinfo"
net:
  port: 29018
  bindIp: "::,0.0.0.0"
  maxIncomingConnections: 5000
  unixDomainSocket:
    enabled: true
    pathPrefix: "/tmp/mongodb/shard2"
    filePermissions: 0700
setParameter:
  enableLocalhostAuthBypass: true
security:
  clusterAuthMode: "keyFile"
  keyFile: "/data/mongodb/conf/mongodb.key"
  authorization: "enabled"
replication:
  replSetName: "shard2"
sharding:
  clusterRole: "shardsvr"
EOF
tee /data/mongodb/conf/shard3.yml <<-'EOF'
systemLog:
  destination: "file"
  logAppend: true
  path: "/data/mongodb/logs/shard3.log"
storage:
  dbPath: "/data/mongodb/data/shard3"
  journal:
    enabled: true
  engine: "wiredTiger"
  wiredTiger:
    engineConfig:
      directoryForIndexes: true
      cacheSizeGB: 2
processManagement:
  fork: true
  pidFilePath: "/data/mongodb/run/shard3.pid"
  timeZoneInfo: "/usr/share/zoneinfo"
net:
  port: 29019
  bindIp: "::,0.0.0.0"
  maxIncomingConnections: 5000
  unixDomainSocket:
    enabled: true
    pathPrefix: "/tmp/mongodb/shard3"
    filePermissions: 0700
setParameter:
  enableLocalhostAuthBypass: true
security:
  clusterAuthMode: "keyFile"
  keyFile: "/data/mongodb/conf/mongodb.key"
  authorization: "enabled"
replication:
  replSetName: "shard3"
sharding:
  clusterRole: "shardsvr"
EOF

创建mongos.yml

tee /data/mongodb/conf/mongos.yml <<-'EOF'
systemLog:
  destination: "file"
  logAppend: true
  path: "/data/mongodb/logs/mongos.log"
processManagement:
  fork: true
  pidFilePath: "/data/mongodb/run/mongos.pid"
  timeZoneInfo: "/usr/share/zoneinfo"
net:
  port: 27017
  bindIp: "::,0.0.0.0"
  maxIncomingConnections: 5000
  unixDomainSocket:
    enabled: true
    pathPrefix: "/tmp/mongodb/mongos"
    filePermissions: 0700
setParameter:
  enableLocalhostAuthBypass: true
security:
  clusterAuthMode: "keyFile"
  keyFile: "/data/mongodb/conf/mongodb.key"
replication:
  localPingThresholdMs: 15
sharding:
  # 出处的replCluster与configsvr.yml中replication.replSetName配置的名称保持一致
  configDB: "replCluster/192.168.137.5:27019,192.168.137.6:27019,192.168.137.7:27019"
EOF

5、启动和初始化相关服务

$ cd /data/mongodb/
$ mongod --config ./conf/configsvr.yml
$ mongo localhost:27019
rs.initiate({_id: "replCluster", configsvr: true, members: [{_id: 0, host: "192.168.137.5:27019"},{_id: 1,host: "192.168.137.6:27019"},{_id: 2,host: "192.168.137.7:27019"}]})
rs.status()


$ mongod --config ./conf/shard1.yml
$ mongo localhost:29017
rs.initiate({_id:"shard1",members:[{_id: 0, host: "192.168.137.5:29017"},{_id: 1,host: "192.168.137.6:29017"},{_id: 2,host: "192.168.137.7:29017"}]})
rs.status()

$ mongod --config ./conf/shard2.yml
$ mongo localhost:29018
rs.initiate({_id:"shard2",members:[{_id: 0, host: "192.168.137.5:29018"},{_id: 1,host: "192.168.137.6:29018"},{_id: 2,host: "192.168.137.7:29018"}]})
rs.status()

$ mongod --config ./conf/shard3.yml
$ mongo localhost:29019
rs.initiate({_id:"shard3",members:[{_id: 0, host: "192.168.137.5:29019"},{_id: 1,host: "192.168.137.6:29019"},{_id: 2,host: "192.168.137.7:29019"}]})
rs.status()

6、启动和初始化mongos

$ mongos --config ./conf/mongos.yml
$ mongo localhost:27017
MongoDB shell version v4.4.13
connecting to: mongodb://localhost:27017/test?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("2a4f50a7-29bf-40c0-8ffc-8c81074f31be") }
MongoDB server version: 4.4.13
mongos> admin = db.getSiblingDB("admin");
admin

#Create the user administrator.
mongos> admin.createUser({user:"admin",pwd:passwordPrompt(),roles:[{role:"userAdminAnyDatabase",db:"admin"}]});
Enter password:
Successfully added user: {
        "user" : "admin",
        "roles" : [
                {
                        "role" : "userAdminAnyDatabase",
                        "db" : "admin"
                }
        ]
}

#Authenticate as the user administrator.
mongos> db.getSiblingDB("admin").auth("admin", passwordPrompt());
Enter password:
1

#Create Administrative User for Cluster Management
mongos> db.getSiblingDB("admin").createUser({"user":"root","pwd":passwordPrompt(),roles:[{"role":"clusterAdmin","db":"admin"}]});
Enter password:
Successfully added user: {
        "user" : "root",
        "roles" : [
                {
                        "role" : "clusterAdmin",
                        "db" : "admin"
                }
        ]
}

7、添加分片到集群

注意:以下都必须以集群管理员登录进行操作

$ mongo --host 192.168.137.5 --port 27017 -u "root" -p --authenticationDatabase "admin"
MongoDB shell version v4.4.13
Enter password:
connecting to: mongodb://192.168.137.5:27017/?authSource=admin&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("7fa077ee-5ba8-4256-8e78-dc6a4fb9fc01") }
MongoDB server version: 4.4.13
---
The server generated these startup warnings when booting:
        2022-04-19T14:54:46.540+08:00: You are running this process as the root user, which is not recommended
---
mongos> sh.addShard("shard1/192.168.137.5:29017,192.168.137.6:29017,192.168.137.7:29017");
{
        "shardAdded" : "shard1",
        "ok" : 1,
        "operationTime" : Timestamp(1650351575, 3),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1650351576, 1),
                "signature" : {
                        "hash" : BinData(0,"0Isi8A729Q65bpG72CaNNcwC8jE="),
                        "keyId" : NumberLong("7088204486748930069")
                }
        }
}
mongos> sh.addShard("shard2/192.168.137.5:29018,192.168.137.6:29018,192.168.137.7:29018");
{
        "shardAdded" : "shard2",
        "ok" : 1,
        "operationTime" : Timestamp(1650351587, 3),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1650351587, 3),
                "signature" : {
                        "hash" : BinData(0,"LIfpd7Oic2+9l7Dfw/14HEV41i0="),
                        "keyId" : NumberLong("7088204486748930069")
                }
        }
}
mongos> sh.addShard("shard3/192.168.137.5:29019,192.168.137.6:29019,192.168.137.7:29019");
{
        "shardAdded" : "shard3",
        "ok" : 1,
        "operationTime" : Timestamp(1650351593, 2),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1650351593, 2),
                "signature" : {
                        "hash" : BinData(0,"t2mrOOeL3gvshZRb6kMmdSOagTA="),
                        "keyId" : NumberLong("7088204486748930069")
                }
        }
}
mongos> sh.status();
--- Sharding Status ---
  sharding version: {
        "_id" : 1,
        "minCompatibleVersion" : 5,
        "currentVersion" : 6,
        "clusterId" : ObjectId("625e5c6dde34df14051f52b9")
  }
  shards:
        {  "_id" : "shard1",  "host" : "shard1/192.168.137.5:29017,192.168.137.6:29017,192.168.137.7:29017",  "state" : 1 }
        {  "_id" : "shard2",  "host" : "shard2/192.168.137.5:29018,192.168.137.6:29018,192.168.137.7:29018",  "state" : 1 }
        {  "_id" : "shard3",  "host" : "shard3/192.168.137.5:29019,192.168.137.6:29019,192.168.137.7:29019",  "state" : 1 }
  active mongoses:
        "4.4.13" : 1
  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 }


8、创建test库并授权和enableShard

mongos> use test
switched to db test
#Enable Sharding for a Database
mongos> sh.enableSharding("test");
{
        "ok" : 1,
        "operationTime" : Timestamp(1650351729, 4),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1650351729, 4),
                "signature" : {
                        "hash" : BinData(0,"dxCD31CPgO4e22gX3rrHg5LV2/c="),
                        "keyId" : NumberLong("7088204486748930069")
                }
        }
}
#Shard a Collection
mongos> sh.shardCollection("test.user",{"id":1});
{
        "collectionsharded" : "test.user",
        "collectionUUID" : UUID("d283f69d-1ba0-491a-a4f9-8d9088016830"),
        "ok" : 1,
        "operationTime" : Timestamp(1650351740, 5),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1650351740, 5),
                "signature" : {
                        "hash" : BinData(0,"e+etCFvF35U8eINVOD7RXAjnX8M="),
                        "keyId" : NumberLong("7088204486748930069")
                }
        }
}

mongo --host 192.168.137.5 --port 27017 -u "admin" -p --authenticationDatabase "admin"
MongoDB shell version v4.4.13
Enter password:
connecting to: mongodb://192.168.137.5:27017/?authSource=admin&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("87083031-dc97-4420-95d4-03469bf86411") }
MongoDB server version: 4.4.13
mongos> use admin
switched to db admin
mongos>
mongos>
mongos>
#根据自己的需求在创建普通用户(不建议创建root权限的用户操作数据库,此处为了操作方便),例如,read或者readWrite权限的用户
mongos> db.getSiblingDB("admin").createUser({"user":"metameeting","pwd":password,roles:[{"role":"readWrite","db":"test"}]});
Enter password:
Successfully added user: {
        "user" : "metameeting",
        "roles" : [
                {
                        "role" : "readWrite",
                        "db" : "test"
                }
        ]
}

9、测试用户写入和查询数据

mongo --host 192.168.137.5 --port 27017 -u "metameeting" -p --authenticationDatabase "admin"
MongoDB shell version v4.4.13
Enter password:
connecting to: mongodb://192.168.137.5:27017/?authSource=admin&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("551e3b7a-4678-40ed-9cc4-c18a521b6f26") }
MongoDB server version: 4.4.13
mongos> use test
switched to db test
mongos> db.test.insert({"test1":"meta1"})
WriteResult({ "nInserted" : 1 })
mongos> db.test.find()
{ "_id" : ObjectId("625e5f7aadd84bbc8eb36730"), "test1" : "meta1" }

10、启动脚本


tee /data/mongodb/cluster.sh <<-'EOF'
#!/bin/bash

hosts=( 192.168.137.5 192.168.137.6 192.168.137.7 )

mongo_start(){
  source ~/.bashrc
  pre_mongod=`ps -ef | grep mongod | grep -v grep`
  pre_mongos=`ps -ef | grep mongos | grep -v grep`
  if [[ !$pre_mongod ]] && [[ !$pre_mongos ]]; then
    for host in ${hosts[@]}
    do
      echo "******** $host configsvr start... ********"
      ssh $host mongod --config /data/mongodb/conf/configsvr.yml
    done
    sleep 2

    for host in ${hosts[@]}
    do
      echo "********** $host shard start... **********"
      ssh $host mongod --config /data/mongodb/conf/shard1.yml
      ssh $host mongod --config /data/mongodb/conf/shard2.yml
      ssh $host mongod --config /data/mongodb/conf/shard3.yml
    done
    sleep 2

    for host in ${hosts[@]}
    do
      echo "********** $host mongos start... **********"
      ssh $host mongos --config /data/mongodb/conf/mongos.yml
    done
  else
    echo "check whether the process has stopped!"
  fi
}

mongo_stop(){
  source ~/.bashrc
  for host in ${hosts[@]}
  do
    echo "************ $host mongos stop... ***********"
    ssh $host "cat /data/mongodb/run/mongos.pid | xargs kill -15"
  done
  sleep 3

  for host in ${hosts[@]}
  do
    echo "************ $host shard stop... ************"
    ssh $host "cat /data/mongodb/run/shard1.pid | xargs kill -15"
    ssh $host "cat /data/mongodb/run/shard2.pid | xargs kill -15"
    ssh $host "cat /data/mongodb/run/shard3.pid | xargs kill -15"
  done
  sleep 3

  for host in ${hosts[@]}
  do
    echo "********** $host configsvr stop... **********"
    ssh $host "cat /data/mongodb/run/configsvr.pid | xargs kill -15"
  done
}

mongo_status(){
  source ~/.bashrc
  for host in ${hosts[@]}
  do
    echo "*************** $host status ***************"
    ssh $host ps -ef | grep mongo* | grep -v grep
  done
}

case $1 in
  start)
    echo "************** start mongodb ***************"
    mongo_start
    echo "************** start finish ****************"
  ;;
  stop)
    echo "************** stop mongodb ****************"
    mongo_stop
    echo "*************** stop finish ****************"
  ;;
  status)
    echo "*********** mongodb-4.4.13 status **********"
    mongo_status
  ;;
  *)
    echo "************* illegal argument *************"
esac
EOF

11、修改密码

./mongo --host xxx --port 27107 -u "admin" -p --authenticationDatabase "admin"
> use admin 
> db.changeUserPassword('user','newpassword'); 
> db.auth('user','newpassword');



神回复

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。