使用PowerShell连接到MongoDB

使用PowerShell访问MongoDB

在Windows2016TP4上运行MongoDB,并通过设置在任务计划程序中的PowerShell脚本来写入数据。

ソフト等バージョン備考Windows Server 2016Technical Preview 4(Build 10586)2012R2のHyper-V上で動作PowerShell5.02016TP4標準のままMongoDB3.2.1Windows 64-bit 2008 R2+ legacyMongoDB .NET Driver1.11.0

安装MongoDB。

您可以根据喜好从MongoDB官方网站下载安装程序,但是对于我来说,默认的“Windows 64-bit 2008 R2+”安装程序存在问题,所以我改用了“Windows 64-bit 2008 R2+ legacy”的压缩包版本进行后续操作。
(问题是当我运行mongod.exe时可以正常工作,但使用–install时无法注册mongodb服务。虽然也许可以手动注册,但觉得麻烦就放弃了。另外,文件夹路径“C:\MongoDB\Server\3.2\bin”太深也让我不喜欢。)

download.png

解压已下载的zip文件,并将其放在C:\MongoDB目录下。
同时,在C:\MongoDB\bin的同一位置创建db和log两个文件夹。
创建C:\MongoDB\mongod.cfg文件,并写入以下内容。

systemLog:
    destination: file
    path: C:\MongoDB\log\mongod.log
storage:
    dbPath: C:\MongoDB\db

以管理员身份在命令提示符下执行以下命令。

执行以下命令来在本地启动MongoDB服务:

cd \MongoDB\bin
mongod.exe –config “C:\MongoDB\mongod.cfg” –install
net start mongodb

暂时先确认一下能否通过mongo.exe连接。

为PowerShell准备驱动程序。

要在PowerShell中连接到MongoDB,通常使用MongoDB .NET驱动程序是最常见的方法。但是,最新的v2.x版本已更改了一些方法,因此直接使用可能会有一些麻烦。因此,我选择使用v1.11.0版本。我下载并解压缩了该版本,并将其配置在C:\MongoDB\CSharpDriver-1.11.0路径下。

使用PowerShell将处理器使用率等信息注册到MongoDB。

我已经创建了一个PowerShell脚本,用于从柜台获取下一个信息,并每分钟将其注册到MongoDB中。

    • 日時

 

    • コンピュータ名

 

    • プロセッサ使用率(合計)

 

    • ネットワーク使用量(最大)

 

    ディスク使用量(合計)

将以下内容保存到C:\MongoDB\logging.ps1。

##### プロセッサ使用率などを、1分毎にMongoDBに登録 #####

# ドライバ読み込み
$DRIVER_PATH = "C:\MongoDB\CSharpDriver-1.11.0";
Add-Type -Path "$DRIVER_PATH\MongoDB.Bson.dll";
Add-Type -Path "$DRIVER_PATH\MongoDB.Driver.dll";

# MongoDBの、logsデータベースの、osコレクションに接続
$client = New-Object MongoDB.Driver.MongoClient("mongodb://S2016TP4");
$server = $client.GetServer();
$db = $server.GetDatabase("logs");
$coll = $db.GetCollection("os");

# 前回登録済みの日時を退避しておく変数
$old = "";

# 以下、無限ループ
while(1) {

    # 現在の日時を、分まで文字列化
    $now = Get-Date -UFormat "%Y%m%d %R";

    if($old -eq($now)) {
        ##### 登録済みの日時と同じなら、50ミリ秒待つ
        Start-Sleep -Milliseconds 50

    } else {
        ##### 登録済みの日時と異なるなら、以下を実行

        # 登録用ドキュメントを作成
        [MongoDB.Bson.BsonDocument]$d = @{

            # MongoDBのドキュメントID
            "_id"= [MongoDB.Bson.ObjectId]::GenerateNewId();

            # コンピュータ名を環境変数から取得
            "ComputerName" = $ENV:COMPUTERNAME;

            # 時刻を標準時に変換して設定
            "TimeStamp" = (Get-Date).ToUniversalTime();

            # プロセッサ使用率(合計)を設定
            "Processor_per" = (Get-counter -Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue;

            # ネットワーク使用量(最大)を設定
            "Network_byte" = ((Get-counter -Counter "\Network Interface(*)\Bytes Total/sec").CounterSamples.CookedValue | Measure-Object -Maximum).Maximum;

            # ディスク使用量(合計)を設定
            "Disk_byte" = (Get-counter -Counter "\LogicalDisk(_Total)\Disk Bytes/sec").CounterSamples.CookedValue;

        };
        # コレクションにドキュメントを登録
        $coll.save($d);

        # 登録済み日時を退避
        $old = $now;
    }
}

那么复杂的事情并没有做,我认为只要阅读源代码就能理解,但是我想补充关于Get-Counter的内容。
– 在Counter中所写的咒语是 \对象名 (实例名)\计数器名。
这些值将在性能监视器中选择和添加参数后显示在下图中,因此您可以根据所需的监测信息自由更改它们。

preformanceMoniter1.png
preformanceMoniter2.png

但是,请注意,由于网络接口没有”总计”值,因此只能获取每个网络的值,如上图所示。此外,从系统角度来看,将多个网络的负载相加并没有太多意义,因此我们使用Measure-Object -Maximum仅获取所有实例中的最大值。

将其设定为从任务计划程序启动。

从任务计划程序中注册以启动 powershell.exe,并在 “添加参数” 中写入以下内容。

运行以下命令: “c:\MongoDB\logging.ps1”

task1.png

另外,在注册之后,打开属性,在根据运营管理的需要设置”无论用户是否登录执行” 或者 “使用最高权限执行” 等选项。

task2.png

将登记的文件在一定时间内自动消失的设置

为了防止数据不断增长,我们将设置为一定时间后自动删除数据。最终我们希望设定为一周或者其他任意时间,但为了确认设置是否有效,暂时先设置为3分钟(180秒)。

mongo.exe使用logs数据库,对”os”集合中的”TimeStamp”字段创建索引,索引规则为升序,并设置过期时间为180秒。

在这里,我们对os集合的TimeStamp字段添加了索引,并设置了有效时间。
需要注意的是,MongoDB只能处理标准时间,所以必须自己处理Date类型的.ToUniversalTime()等,否则它的操作也会变得奇怪。

执行结果

我执行了注册的任务,过了一段时间后发现只有过去三分钟的数据已经积累起来了。

robomongo.png

在这里,我们使用Robomongo来显示数据。同时为了测试,我们在另一台机器上同时执行相同的PowerShell。

只需将expireAfterSeconds更改为任意的期限(例如,1天= 86400秒)即可。

广告
将在 10 秒后关闭
bannerAds