• mongodb简介、安装、搭建复制集以及切片


    一、 简介

    NoSQL数据库四大家族:列存储 Hbase,键值(Key-Value)存储 Redis,图像存储 Neo4j,基于分布式文档存储的数据库MongoDb。

    MongoDB 和关系型数据库对比

    关系型数据库MongoDB
    database(库)database(库)
    table(表)collection(表)
    row(行)document(BSON文档)
    column(列)field(字段)
    index(索引)index(地理索引、全文索引、hash索引)
    join(主外键关联)embedded Document (嵌套文档)
    primary key(指定1至N个列做主键)primary key(指定1至N个列做主键)

     BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文 档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和Binary Data类型。

     二、Linux安装Mongodb

    解压: tar -xvf mongodb-linux-x86_64-4.1.3.tgz

     启动的两种方式:

    1)默认27017的端口启动:./bin/mongod 

    2)指定配置文件的方式启动:./bin/mongod -f mongo_37017.conf

    注意:若启动报目录缺失, 需要创建对应的目录的文件,如: mkdir -p /data/mongo/data/server1

    mongo shell 的启动

    启动mongo shell :./bin/mongo

    指定主机和端口的方式启动 :./bin/mongo --host=主机IP --port=端口

    三、MongoDb的GUI工具

    NoSQLBooster是MongoDB CLI界面中非常流行的GUI工具。它正式名称为MongoBooster。

    默认安装即可。

    四、简单操作

    查看数据库:

             show dbs;

    切换数据库 如果没有对应的数据库则创建:

             use 数据库名;

    创建集合:

             db.createCollection("集合名")

    查看集合:

             show tables;

            show collections;

    删除集合:

             db.集合名.drop();

    删除当前数据库:

             db.dropDatabase();

    聚合操作:

            单目的聚合操作:count() 和 distinct()

            聚合管道(Aggregation Pipeline):

            聚合(aggregate)主要用于统计数据(诸如统计平均值,求和等),并返回计算后的数据结果。

            MapReduce 编程模型:

            MapReduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结 果合并成最终结果(REDUCE)。

    五、索引

    1. 单键索引

    2. 复合索引

    3. 多键索引

    4. 地理空间索引

    5. 全文索引

    6. 哈希索引

    六、索引底层实现原理

            MongoDb使用BSON格式保存数据。与mysql使用B+树不一样,MongoDb用的是B-树,所有节点都有Data域,每个节点既保存数据又保存索引,搜索时相当于二分查找。

            B-树的特点: (1) 多路 非二叉树 (2) 每个节点 既保存数据 又保存索引 (3) 搜索时 相当于二分查找

            B+ 树的特点: (1) 多路非二叉 (2) 只有叶子节点保存数据 (3) 搜索时 也相当于二分查找 (4) 增加了 相邻节点指针

    七、高可用

    7.1 主从复制架构

            主从结构没有自动故障转移功能,需要指定master和slave端,不推荐在生产中使用。 mongodb4.0后不再支持主从复制!

    [main] Master/slave replication is no longer supported

    7.2 复制集replica sets

            原理:一个复制集中Primary节点上能够完成读写操作,Secondary节点仅能用于读操作。Primary节点需要记录所有改变数据库状态的操作,这些记录保存在 oplog 中,这个文件存储在 local 数据库,各个Secondary 节点通过此 oplog 来复制数据并应用于本地,保持本地的数据与主节点的一致。oplog 具有幂等性,即无论执行几次其结果一致,这个比 mysql 的二进制日志更好用。

            复制集数据同步分为初始化同步和keep复制同步。初始化同步指全量从主节点同步数据,如果Primary 节点数据量比较大同步时间会比较长。而keep复制指初始化同步过后,节点之间的实时同步一般是增量 同步。

            初始化同步有以下两种情况会触发: (1) Secondary第一次加入。 (2) Secondary落后的数据量超过了oplog的大小,这样也会被全量复制。

            主节点选举触发的时机:

             第一次初始化一个复制集

            Secondary节点权重比Primary节点高时,发起替换选举

            Secondary节点发现集群中没有Primary时,发起选举 Primary节点不能访问到大部分(Majority)成员时主动降级

            当触发选举时,Secondary节点尝试将自身选举为Primary。主节点选举是一个二阶段过程+多数派协议。

    第一阶段: 检测自身是否有被选举的资格,如果符合资格会向其它节点发起本节点是否有选举资格的 FreshnessCheck,进行同僚仲裁

    第二阶段: 发起者向集群中存活节点发送Elect(选举)请求,仲裁者收到请求的节点会执行一系列合法性检查,如果检查通过,则仲裁者(一个复制集中最多50个节点 其中只有7个具有投票权)给发起者投一票。

    pv0通过30秒选举锁防止一次选举中两次投票。

    pv1使用了terms(一个单调递增的选举计数器)来防止在一次选举中投两次票的情况。

    多数派协议:

            发起者如果获得超过半数的投票,则选举通过,自身成为Primary节点。获得低于半数选票的原因,除了常见的网络问题外,相同优先级的节点同时通过第一阶段的同僚仲裁并进入第二阶段也是一个原因。因此,当选票不足时,会sleep[0,1]秒内的随机时间,之后再次尝试选举。

     7.3 环境搭建

    1. 创建目录: mkdir replica_sets

    2. 进到目录中,解压mongodb: tar -xvf mongodb-linux-x86_64-4.1.3.tgz

    3. 确保当前没有正在运行的monodb

    4. 创建,编写mogo的配置文件:vi mongo_37017.conf

    # 主节点配置

    dbpath=/data/mongo/data/server1

    bind_ip=0.0.0.0

    port=37017

    fork=true

    logpath=/data/mongo/logs/server1.log

    replSet=lagouCluster

    #从节点配置

    dbpath=/data/mongo/data/server2

    bind_ip=0.0.0.0

    port=37018

    fork=true

    logpath=/data/mongo/logs/server2.log

    replSet=lagouCluster

    #从节点配置

    dbpath=/data/mongo/data/server3

    bind_ip=0.0.0.0

    port=37019

    fork=true

    logpath=/data/mongo/logs/server3.log

    replSet=lagouCluster

     5. 创建缺失目录:

    6. 根据配置文件加载启动3个节点:

    ./bin/mongod -f mongo_37017.conf

    ./bin/mongod -f mongo_37018.conf

    ./bin/mongod -f mongo_37019.conf

    7. 初始化节点配置,进入任意一个节点比如37017节点运行如下命令:

    var cfg ={"_id":"lagouCluster",
    ... "protocolVersion" : 1,
    ... "members":[
    ... {"_id":1,"host":"192.168.0.203:37017","priority":10},
    ... {"_id":2,"host":"192.168.0.203:37018"}
    ... ]
    ... }
     

     37017初始化后,该节点由“SECONDARY”变为“PRIMARY”。

    8. 主节点可以进行增删节点操作:

     rs.add("192.168.0.203:37019")

    rs.remove("192.168.0.203:37019")

    9. 插入数据验证结果:

    进入主节点 ----- 插入数据 ------ 进入从节点验证

    注意:默认节点下从节点不能读取数据。调用 rs.slaveOk() 解决。

    37017主节点:

    37018从节点:

    节点说明:

            PRIMARY 节点: 可以查询和新增数据

            SECONDARY 节点:只能查询 不能新增 基于priority 权重可以被选为主节点

            ARBITER 节点: 不能查询数据 和新增数据 ,不能变成主节点 

    7.4 切片

    1)解压并重命名切片目录:

    tar -xvf mongodb-linux-x86_64-4.1.3.tgz

    mv mongodb-linux-x86_64-4.1.3 shard_cluster

    2)进入目录中,创建config文件夹,配置节点集群

    mkdir config

    vi config-17017.conf

    # 数据库文件位置

    dbpath=config/config1

    #日志文件位置

    logpath=config/logs/config1.log

    # 以追加方式写入日志

    logappend=true

    # 是否以守护进程方式运行

    fork = true

    bind_ip=0.0.0.0

    port = 17017

    # 表示是一个配置服务器

    configsvr=true

    #配置服务器副本集名称

    replSet=configsvr

    3)同理配置 config-17018.conf、config-17019.conf

    4)创建缺失目录

     mkdir config1 logs config2 config3

    5)启动节点

    ./bin/mongod -f config/config-17017.conf

    ./bin/mongod -f config/config-17018.conf

    ./bin/mongod -f config/config-17019.conf

    6)进入任一节点,配置节点集群,使用admin,初始化,查看状态

    1. [root@rac1 shard_cluster]# ./bin/mongo --port=17017
    2. MongoDB shell version v4.1.3
    3. connecting to: mongodb://127.0.0.1:17017/
    4. Implicit session: session { "id" : UUID("62ab236a-a0f4-4b74-8064-2b22180f786d") }
    5. MongoDB server version: 4.1.3
    6. Server has startup warnings:
    7. 2023-10-11T22:14:21.557-0400 I CONTROL [initandlisten]
    8. 2023-10-11T22:14:21.557-0400 I CONTROL [initandlisten] ** NOTE: This is a development version (4.1.3) of MongoDB.
    9. 2023-10-11T22:14:21.557-0400 I CONTROL [initandlisten] ** Not recommended for production.
    10. 2023-10-11T22:14:21.557-0400 I CONTROL [initandlisten]
    11. 2023-10-11T22:14:21.557-0400 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
    12. 2023-10-11T22:14:21.557-0400 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
    13. 2023-10-11T22:14:21.557-0400 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
    14. 2023-10-11T22:14:21.557-0400 I CONTROL [initandlisten]
    15. 2023-10-11T22:14:21.558-0400 W CONTROL [initandlisten]
    16. 2023-10-11T22:14:21.558-0400 W CONTROL [initandlisten]
    17. 2023-10-11T22:14:21.558-0400 I CONTROL [initandlisten]
    18. > use admin
    19. switched to db admin
    20. > var cfg ={"_id":"configsvr",
    21. ... "members":[
    22. ... {"_id":1,"host":"192.168.0.203:17017"},
    23. ... {"_id":2,"host":"192.168.0.203:17018"},
    24. ... {"_id":3,"host":"192.168.0.203:17019"}]
    25. ... };
    26. > rs.initiate(cfg)
    27. {
    28. "ok" : 1,
    29. "$gleStats" : {
    30. "lastOpTime" : Timestamp(1697077081, 1),
    31. "electionId" : ObjectId("000000000000000000000000")
    32. },
    33. "lastCommittedOpTime" : Timestamp(0, 0),
    34. "$clusterTime" : {
    35. "clusterTime" : Timestamp(1697077081, 1),
    36. "signature" : {
    37. "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    38. "keyId" : NumberLong(0)
    39. }
    40. },
    41. "operationTime" : Timestamp(1697077081, 1)
    42. }
    43. configsvr:SECONDARY> rs.status()

    7)配置shard集群,先配置shard1,再按相同步骤配置shard2

    cd shard_cluster/

    8) 创建shard目录,在进入创建shard1和shard2目录

    9)进入shard1中,创建并编辑vi shard-37017.conf

    dbpath=shard/shard1/shard1-37017

    bind_ip=0.0.0.0 port=37017

    fork=true

    logpath=shard/shard1/shard1-37017.log

    replSet=shard1

    shardsvr=true

    10)在同样的位置,同理创建vi shard-37018.conf、vi shard-37019.conf

    11)创建缺失文件目录

    mkdir shard1-37017 shard1-37018 shard1-37019

    12)启动shard1集群每隔节点,随机mongo shell进去中一个,进行集群配置,初始化、并查看状态

    1. [root@rac1 shard_cluster]# ./bin/mongo --port 37017
    2. MongoDB shell version v4.1.3
    3. connecting to: mongodb://127.0.0.1:37017/
    4. Implicit session: session { "id" : UUID("e2a51d10-5626-43db-846d-cc2391d71604") }
    5. MongoDB server version: 4.1.3
    6. Server has startup warnings:
    7. 2023-10-11T22:30:19.852-0400 I CONTROL [initandlisten]
    8. 2023-10-11T22:30:19.852-0400 I CONTROL [initandlisten] ** NOTE: This is a development version (4.1.3) of MongoDB.
    9. 2023-10-11T22:30:19.852-0400 I CONTROL [initandlisten] ** Not recommended for production.
    10. 2023-10-11T22:30:19.852-0400 I CONTROL [initandlisten]
    11. 2023-10-11T22:30:19.852-0400 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
    12. 2023-10-11T22:30:19.852-0400 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
    13. 2023-10-11T22:30:19.852-0400 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
    14. 2023-10-11T22:30:19.852-0400 I CONTROL [initandlisten]
    15. 2023-10-11T22:30:19.852-0400 W CONTROL [initandlisten]
    16. 2023-10-11T22:30:19.852-0400 W CONTROL [initandlisten]
    17. 2023-10-11T22:30:19.852-0400 I CONTROL [initandlisten]
    18. > var cfg ={"_id":"shard1",
    19. ... "protocolVersion" : 1,
    20. ... "members":[
    21. ... {"_id":1,"host":"192.168.0.203:37017"},
    22. ... {"_id":2,"host":"192.168.0.203:37018"},
    23. ... {"_id":3,"host":"192.168.0.203:37019"}
    24. ... ]
    25. ... };
    26. > rs.initiate(cfg)
    27. {
    28. "ok" : 1,
    29. "$clusterTime" : {
    30. "clusterTime" : Timestamp(1697077902, 1),
    31. "signature" : {
    32. "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    33. "keyId" : NumberLong(0)
    34. }
    35. },
    36. "operationTime" : Timestamp(1697077902, 1)
    37. }
    38. shard1:SECONDARY> rs.status()

    13)同理shard2集群搭建47017到47019,其中shard2-47017.conf内容如下:

    dbpath=shard/shard2/shard2-47017

    bind_ip=0.0.0.0 port=47017

    fork=true

    logpath=shard/shard2/logs/shard2-47017.log

    replSet=shard2

    shardsvr=true

    14)进入任一节点,配置集群,初始化,查看

    1. [root@rac1 shard_cluster]# ./bin/mongod -f shard/shard2/shard2-47019.conf
    2. about to fork child process, waiting until server is ready for connections.
    3. forked process: 16666
    4. child process started successfully, parent exiting
    5. [root@rac1 shard_cluster]# ./bin/mongo --port 47017
    6. MongoDB shell version v4.1.3
    7. connecting to: mongodb://127.0.0.1:47017/
    8. Implicit session: session { "id" : UUID("c98ecf26-5f82-47c6-a026-8b0beb94bc4f") }
    9. MongoDB server version: 4.1.3
    10. Server has startup warnings:
    11. 2023-10-11T22:37:15.189-0400 I CONTROL [initandlisten]
    12. 2023-10-11T22:37:15.189-0400 I CONTROL [initandlisten] ** NOTE: This is a development version (4.1.3) of MongoDB.
    13. 2023-10-11T22:37:15.189-0400 I CONTROL [initandlisten] ** Not recommended for production.
    14. 2023-10-11T22:37:15.189-0400 I CONTROL [initandlisten]
    15. 2023-10-11T22:37:15.189-0400 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
    16. 2023-10-11T22:37:15.189-0400 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
    17. 2023-10-11T22:37:15.189-0400 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
    18. 2023-10-11T22:37:15.189-0400 I CONTROL [initandlisten]
    19. 2023-10-11T22:37:15.189-0400 W CONTROL [initandlisten]
    20. 2023-10-11T22:37:15.189-0400 W CONTROL [initandlisten]
    21. 2023-10-11T22:37:15.189-0400 I CONTROL [initandlisten]
    22. > var cfg ={"_id":"shard2",
    23. ... "protocolVersion" : 1,
    24. ... "members":[
    25. ... {"_id":1,"host":"192.168.0.203:47017"},
    26. ... {"_id":2,"host":"192.168.0.203:47018"},
    27. ... {"_id":3,"host":"192.168.0.203:47019"}
    28. ... ]
    29. ... };
    30. > rs.initiate(cfg)
    31. {
    32. "ok" : 1,
    33. "$clusterTime" : {
    34. "clusterTime" : Timestamp(1697078414, 1),
    35. "signature" : {
    36. "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    37. "keyId" : NumberLong(0)
    38. }
    39. },
    40. "operationTime" : Timestamp(1697078414, 1)
    41. }
    42. shard2:SECONDARY> rs.status()

    15)配置路由节点,首先创建route目录

    [root@rac1 shard_cluster]# mkdir -p route/logs

    16)配置文件

    [root@rac1 route]# vi route-27017.conf

    port=27017
    bind_ip=0.0.0.0
    fork=true
    logpath=route/logs/route.log
    configdb=configsvr/192.168.0.203:17017,192.168.0.203:17018,192.168.0.203:17019

    17)用mongos启动路由节点,并查看最初的状态

    1. [root@rac1 shard_cluster]# ./bin/mongos -f route/route-27017.conf
    2. about to fork child process, waiting until server is ready for connections.
    3. forked process: 17138
    4. child process started successfully, parent exiting
    5. [root@rac1 shard_cluster]# ./bin/mongo --port 27017
    6. MongoDB shell version v4.1.3
    7. connecting to: mongodb://127.0.0.1:27017/
    8. Implicit session: session { "id" : UUID("69b121a0-4b5d-40a6-8187-cdadcfe11e13") }
    9. MongoDB server version: 4.1.3
    10. Server has startup warnings:
    11. 2023-10-11T22:43:51.014-0400 I CONTROL [main]
    12. 2023-10-11T22:43:51.014-0400 I CONTROL [main] ** NOTE: This is a development version (4.1.3) of MongoDB.
    13. 2023-10-11T22:43:51.014-0400 I CONTROL [main] ** Not recommended for production.
    14. 2023-10-11T22:43:51.014-0400 I CONTROL [main]
    15. 2023-10-11T22:43:51.014-0400 I CONTROL [main] ** WARNING: Access control is not enabled for the database.
    16. 2023-10-11T22:43:51.014-0400 I CONTROL [main] ** Read and write access to data and configuration is unrestricted.
    17. 2023-10-11T22:43:51.014-0400 I CONTROL [main] ** WARNING: You are running this process as the root user, which is not recommended.
    18. 2023-10-11T22:43:51.014-0400 I CONTROL [main]
    19. mongos> sh.status()
    20. --- Sharding Status ---
    21. sharding version: {
    22. "_id" : 1,
    23. "minCompatibleVersion" : 5,
    24. "currentVersion" : 6,
    25. "clusterId" : ObjectId("65275767e63b0b69060b85eb")
    26. }
    27. shards:
    28. active mongoses:
    29. autosplit:
    30. Currently enabled: yes
    31. balancer:
    32. Currently enabled: yes
    33. Currently running: no
    34. Failed balancer rounds in last 5 attempts: 0
    35. Migration Results for the last 24 hours:
    36. No recent migrations
    37. databases:
    38. { "_id" : "config", "primary" : "config", "partitioned" : true }

    18)向路由中添加分片节点

    1. mongos> sh.addShard("shard1/192.168.0.203:37017,192.168.0.203:37018,192.168.0.203:37019");
    2. {
    3. "shardAdded" : "shard1",
    4. "ok" : 1,
    5. "operationTime" : Timestamp(1697078828, 7),
    6. "$clusterTime" : {
    7. "clusterTime" : Timestamp(1697078828, 7),
    8. "signature" : {
    9. "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    10. "keyId" : NumberLong(0)
    11. }
    12. }
    13. }
    14. mongos> sh.addShard("shard2/192.168.0.203:47017,192.168.0.203:47018,192.168.0.203:47019");
    15. {
    16. "shardAdded" : "shard2",
    17. "ok" : 1,
    18. "operationTime" : Timestamp(1697078840, 6),
    19. "$clusterTime" : {
    20. "clusterTime" : Timestamp(1697078840, 6),
    21. "signature" : {
    22. "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    23. "keyId" : NumberLong(0)
    24. }
    25. }
    26. }
    27. mongos> sh.status()
    28. --- Sharding Status ---
    29. sharding version: {
    30. "_id" : 1,
    31. "minCompatibleVersion" : 5,
    32. "currentVersion" : 6,
    33. "clusterId" : ObjectId("65275767e63b0b69060b85eb")
    34. }
    35. shards:
    36. { "_id" : "shard1", "host" : "shard1/192.168.0.203:37017,192.168.0.203:37018,192.168.0.203:37019", "state" : 1 }
    37. { "_id" : "shard2", "host" : "shard2/192.168.0.203:47017,192.168.0.203:47018,192.168.0.203:47019", "state" : 1 }
    38. active mongoses:
    39. "4.1.3" : 1
    40. autosplit:
    41. Currently enabled: yes
    42. balancer:
    43. Currently enabled: yes
    44. Currently running: no
    45. Failed balancer rounds in last 5 attempts: 0
    46. Migration Results for the last 24 hours:
    47. No recent migrations
    48. databases:
    49. { "_id" : "config", "primary" : "config", "partitioned" : true }

    19)创建数据库,创建集合,并开启hash分片

    1. mongos> sh.enableSharding("lagou_resume")
    2. {
    3. "ok" : 1,
    4. "operationTime" : Timestamp(1697078917, 5),
    5. "$clusterTime" : {
    6. "clusterTime" : Timestamp(1697078917, 5),
    7. "signature" : {
    8. "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    9. "keyId" : NumberLong(0)
    10. }
    11. }
    12. }
    13. mongos> sh.shardCollection("lagou_resume.lagou_resume_datas",{"name":"hashed"}
    14. ... )
    15. {
    16. "collectionsharded" : "lagou_resume.lagou_resume_datas",
    17. "collectionUUID" : UUID("84fd313d-c5cd-4d83-9572-bf57873e2827"),
    18. "ok" : 1,
    19. "operationTime" : Timestamp(1697078999, 25),
    20. "$clusterTime" : {
    21. "clusterTime" : Timestamp(1697078999, 25),
    22. "signature" : {
    23. "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    24. "keyId" : NumberLong(0)
    25. }
    26. }
    27. }
    28. mongos> use lagou_resume;
    29. switched to db lagou_resume
    30. mongos> for(var i=1;i<= 1000;i++){
    31. ... db.lagou_resume_datas.insert({"name":"test"+i,
    32. ... salary:(Math.random()*20000).toFixed(2)});
    33. ... }
    34. WriteResult({ "nInserted" : 1 })

    20)去shard1分片和shard2分片查询信息:

    八、安全

    设置用户、密码确保安全性。

    1. 生成密钥文件 并修改权限

    openssl rand -base64 756 > data/mongodb/testKeyFile.file

    chmod 600 data/mongodb/keyfile/testKeyFile.file

    2. 在路由配置文件中 设置密钥文件

    keyFile=data/mongodb/testKeyFile.file

    3. 配置节点集群和分片节点集群开启安全认证和指定密钥文件

    auth=true

    keyFile=data/mongodb/testKeyFile.file

  • 相关阅读:
    时序逻辑设计之计数器
    【配电网优化】配电网潮流计算与经济调度模糊满意度评价【含GUI Matlab源码 2159期】
    python图形界面化编程GUI(五)坦克大战(一)
    想没想过自己做个APP?来,机会来了
    5分钟搞懂MySQL - 行转列
    DeepWalk: Online Learning of Social Representations(2014 ACM SIGKDD)
    天梯赛 L2-046 天梯赛的赛场安排
    JMeter的详细使用及相关问题
    增强AWS ECS监控:批量生产监控设置
    Tlsr8258开发-添加软件定时器
  • 原文地址:https://blog.csdn.net/xhuiting/article/details/133772352