前一段时间写过一篇zabbix监控MongoDB的文章,正好最近线上要再次监控MongoDB,翻出以前的笔记看了一下,感觉方法太笨,监控的大部分内容不是自己想要的,这激发了这次的一个创作。下面这次监控MongoDB的过程。
一、.思路
1、MongoDB简单介绍,及解释。
2、监控自己想要的值,那么首先要把自己想监控的值用shell正则提取出来。
3、把提取出来的数值做成一个key。(下面包括自定义key的写法介绍)
4、在zabbix web上创建监控项、触发器、图形等。
5、完成对MongoDB的监控并规整文档,总结和问题发现。
1、MongoDB监控介绍,及解释
MongoDB是用C++语言编写的非关系型数据库。特点是高性能、易部署、易使用,存储数据十分方便,主要特性有:
面向集合存储,易于存储对象类型的数据
模式自由
支持动态查询
支持完全索引,包含内部对象
支持复制和故障恢复
使用高效的二进制数据存储,包括大型对象
文件存储格式为BSON(一种JSON的扩展)
那我们通过什么来获取mongoDB的参数呢?
一般情况下mongoDB的端口号为27017,那我们这一通过下面的方法获取mongoDB状态值。
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeytXXXXX
解释:/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo是我的mongo的路径这个根据自己的系统安装通过sudo find / -name mongo查找
192.168.1.20:27017/XXX -uXXXX -pkeytXXXXX 自己的IP地址:端口/库名 -u用户 -p密码
输出结果如下:
MongoDB shell version: 2.0.5
connecting to: test
{
"host" : "TENCENT64.site", --server的hostname
"version" : "2.0.5", --mongo版本
"process" : "mongod", --进程名
"uptime" : 1238418, --启动时间(单位:S)
"uptimeEstimate" : 1230730, --基于MongoDB内部粗粒度定时器的运行时间
"localTime" : ISODate("2012-09-14T09:09:52.657Z"), --server的本地时间
"globalLock" : {
"totalTime" : 1238418105923, --全局锁创建的时间(单位:ms 微秒)
"lockTime" : 75055831911, --全局锁保持的时间(单位:ms 微秒)
"ratio" : 0.06060621332329477, --lockTime和totalTime的比
"currentQueue" : {
"total" : 0, --等待全局锁的队列中操作数目
"readers" : 0, --等待读锁的队列中操作数目
"writers" : 0 --等待写锁的队列中操作数目
},
"activeClients" : {
"total" : 1, --连接到server的当前活动client数目
"readers" : 1, --执行读操作的当前活动client数目
"writers" : 0 --执行写操作的当前活动client数目
}
},
"mem" : {
"bits" : 64, --64位机器
"resident" : 18363, --占用物理内存量。
"virtual" : 478810, --占用的虚拟内存量
"supported" : true, --是否支持扩展内存
"mapped" : 233311, --映射到内存的数据文件大小,很接近于你的所有数据库大小。
"mappedWithJournal" : 466622,
"note" : "virtual minus mapped is large. could indicate a memory leak"
},
"connections" : {
"current" : 737, --当前活动连接量。连接到server的当前活跃连接数目
"available" : 82 --剩余空闲连接量。剩余的可用连接数目
},
"extra_info" : {
"note" : "fields vary by platform",
"heap_usage_bytes" : 3838448, --此过程中所有的堆字节数目。仅适用于Linux
"page_faults" : 31058356 --此过程中访问内存中页面失败的总次数。仅适用于Linux
},
"indexCounters" : {
"btree" : {
"accesses" : 68229146, --Btree索引的访问次数(索引被访问量)
"hits" : 68229146, --内存中的Btree页的数目。(索引命中量)
"misses" : 0, --内存中不存在的Btree也数目。(索引偏差量)(索引内存访问失败次数)
"resets" : 0, --索引计数器被重置为0的次数
"mi***atio" : 0 --索引偏差率(未命中率)
}
},
"backgroundFlushing" : {
"flushes" : 20640, --数据库刷新写到磁盘的次数
"total_ms" : 2453287, --数据库刷新数据到磁盘花费的微秒数
"average_ms" : 118.8608042635659, --执行单次刷新花费的平均微秒数
"last_ms" : 1, --最后一次执行完成刷新数据到磁盘花费的微秒数
"last_finished" : ISODate("2012-09-14T09:09:35.656Z") --当最后一次刷新数据完成时的时间戳
},
"cursors" : {
"totalOpen" : 0, --server为client保持的游标(cursor)总数
"clientCursors_size" : 0, --
"timedOut" : 24 --server启动以来游标(cursor)超时的总数
},
"network" : {
"bytesIn" : NumberLong("1929833164782"), --发送到数据库的数据总量(bytes)
"bytesOut" : 553137147925, --数据库发出的数据总量(bytes)
"numRequests" : 2475184328 --发送到数据库的请求量
},
"opcounters" : {
"insert" : 687531883, --server启动以来总的insert数据量
"query" : 711010343, --server启动以来总的query数据量
"update" : 0, --server启动以来总的update数据量
"delete" : 0, --server启动以来总的delete数据量
"getmore" : 6484, --server启动以来调用任何游标的getMore总次数
"command" : 1287537 --server启动以来执行其他命令的总次数
},
"asserts" : {
"regular" : 0, --server启动以来抛出正规断言(assert 类似于异常处理的形式)总数目
"warning" : 1, --server启动以来抛出的告警总数目
"msg" : 0, --消息断言数目。服务器内部定义的良好字符串错误
"user" : 4, --用户断言数目。用户产生的错误,譬如:磁盘空间满;重复键。
"rollovers" : 0 --server启动以来,assert counters have rolled over的次数
},
"writeBacksQueued" : false, --是否有从mongos执行的retry操作
"dur" : {
"commits" : 30, --上一间隔journal日志发生commit的次数
"journaledMB" : 0, --上一间隔写到journal日志的数据量(单位:MB)
"writeToDataFilesMB" : 0, --上一间隔journal日志写到数据文件的数据量(单位:MB)
"compression" : 0, --
"commitsInWriteLock" : 0, --写锁期间发生commits的次数
"earlyCommits" : 0, --schedule时间前请求commit的次数
"timeMs" : {
"dt" : 3064,
"prepLogBuffer" : 0, --准备写journal日志花费的时间
"writeToJournal" : 0, --写journal日志花费的实际时间
"writeToDataFiles" : 0, --journal日志后写数据文件花费的时间
"remapPrivateView" : 0 --The amount of time spent remapping copy-on-write memory mapped views
}
},
"ok" : 1 --serverStatus是否返回正确
2、监控自己想要的值,那么首先要把自己想监控的值用shell正则提取出来
这里我已经提取完毕直接呈现给大家注意下边的不是脚本,如果想把它变成脚本也没问题。
#物理内存量大小
resident {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep '"resident"' |awk -F "[ ,]+" '{print $3}'
}
#虚拟内存量大小
virtual {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep '"virtual"' |awk -F "[ ,]+" '{print $3}'
}
#活跃客户端数量
totalCreated {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep '"totalCreated"'| awk -F "[ :]+" '{print $2}'
}
#数据库连接数
current {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep '"current"' |awk -F "[ ,]+" '{print $3}'
}
#数据库剩余连接数
available {
/bin/echo "db.serverStatus()"| /data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX |grep '"available"' |awk -F "[ ,]+" '{print $3}'
}#总计创建过多少次连接
totalCreated {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep totalCreated |awk -F "[ ,]+" '{print $3}'
}
#连续正常工作时间
uptimeEstimate {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep '"uptimeEstimate"' |awk -F "[ ,]+" '{print $3}'| sed "s/NumberLong(([0-9]))./\1/g"
}
#到现在总共使用的物理内存,单位MB
resident {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep '"resident"'| awk -F '[ ,]' '{print $3}'
}
#当前Mongodb实例使用的虚拟内存大小,单位MB
virtual {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep '"virtual"'| awk -F '[ ,]' '{print $3}'
}
#本机是否支持内存扩展
supported {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep '"supported"'| awk -F '[ ,]' '{print $3}'
}
#当前实例堆大小,单位bytes
page_faults {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep '"page_faults"'| awk -F '[ ,]' '{print $3}'
}
#加载磁盘内容时发生的页错误的次数
page_faults {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep '"page_faults"' |awk -F '[:]' '{print $2}'|sed 's/^[ \t]*//g'
}
#执行insert次数
insert {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep '"insert"' |awk -F '[ ,]' '{print $3}'|head -n 1
}
#执行query次数
query {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep '"query"' |awk -F '[ ,]' '{print $3}'
}
#执行update次数
update {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep '"update"' |awk -F '[ ,]' '{print $3}'|head -n 1
}
#执行delete次数
delete {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep '"delete"' |awk -F '[ ,]' '{print $3}'|head -n 1
}
#执行getmore次数
getmore {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep '"getmore"' |awk -F '[ ,]' '{print $3}'
}
#执行command次数
command {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep '"command"' |awk -F '[ ,]' '{print $3}'
}
#断言正常次数
regular {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep '"regular"' |awk -F '[ ,]' '{print $3}'
}
#断言告警次数
warning {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep '"warning"' |awk -F '[ ,]' '{print $3}'
}
#断言内部错误次数
mag {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep '"msg"' |awk -F '[ ,]' '{print $3}'
}
#自启动以来用户使用所造成的错误而被断言的次数
user {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep '"user"' |awk -F '[ ,]' '{print $3}'
}
#断言被翻转的次数
rollovers {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep '"rollovers"' |awk -F '[ ,]' '{print $3}'
}
#serverStatus是否返回正确
ok {
/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXX -uXXX -pkeyXXXXX | grep '"ok"' |awk -F '[ ,]' '{print $3}'
}$1
3、把提取出来的数值做成一个key
首先我们再次书序一下key的写法:
UserParameter=Physical_cpu_0_temperature,sensors|grep "id 0"|awk '{print $4}'|awk -F "°" '{print $1}'|awk -F "+" '{print $2}'
变量 Key 命令
其中Physical_cpu_0_temperature就是我们自定义的key。
ok我们开始建立自己的key吧,下边我是在自定义key的时候吧提取参数的正则也写定义到一起了,我也是图个方便。
#UserParameter=MongoDB.Status[],/data/zabbix/scripts/check_mongodb.sh $1 $2 $3
#UserParameter=MongoDB.Status[],/bin/echo "db.serverStatus().$1" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep "\<$2\>" |awk -F : '{print $$2}' |awk -F , '{print $$1}'
UserParameter=MongoDB.byesOut,/bin/echo "db.serverStatus().network" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep "bytesOut" | awk -F : '{print $2}' | awk -F , '{print $1}' | awk -F \" '{print $2}'
UserParameter=MongoDB.bytesIn,/bin/echo "db.serverStatus().network" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep "bytesIn" | awk -F : '{print $2}' | awk -F , '{print $1}' | awk -F \" '{print $2}'
#UserParameter=MongoDB.totalCreated,/data/zabbix/scripts/check_mongodb.sh 27017 connections totalCreated
#UserParameter=MongoDB.available,/data/zabbix/scripts/check_mongodb.sh 27017 connections available
UserParameter=MongoDB.resident,/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep '"resident"' |awk -F "[ ,]+" '{print $3}'
UserParameter=MongoDB.virtual,/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep '"virtual"' |awk -F "[ ,]+" '{print $3}'
UserParameter=MongoDB.totalCreated,/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep '"totalCreated"'| awk -F "[ :]+" '{print $2}'
UserParameter=MongoDB.current,/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep '"current"'| awk -F "[ ,]+" '{print $3}'
UserParameter=MongoDB.available,/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep '"available"'| awk -F "[ ,]+" '{print $3}'
UserParameter=MongoDB.uptimeEstimate,/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep '"uptimeEstimate"'| awk -F "[ ,]+" '{print $3}'| sed "s/NumberLong(([0-9]))./\1/g"
UserParameter=MongoDB.supported,/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep '"supported"'| awk -F "[ ,]" '{print $3}'
UserParameter=MongoDB.page_faults,/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep '"page_faults"'| awk -F "[ ,]" '{print $2}'|sed 's/^[ \t]*//g'
UserParameter=MongoDB.insert,/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep '"insert"'| awk -F "[ ,]" '{print $3}'|head -n 1
UserParameter=MongoDB.query,/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep '"query"'| awk -F "[ ,]" '{print $3}'
UserParameter=MongoDB.update,/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep '"update"'| awk -F "[ ,]" '{print $3}'|head -n 1
UserParameter=MongoDB.delete,/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep '"delete"'| awk -F "[ ,]" '{print $3}'|head -n 1
UserParameter=MongoDB.getmore,/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep '"getmore"'| awk -F "[ ,]" '{print $3}'
UserParameter=MongoDB.command,/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep '"command"'| awk -F "[ ,]" '{print $3}'
UserParameter=MongoDB.regular,/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep '"regular"'| awk -F "[ ,]" '{print $3}'
UserParameter=MongoDB.warning,/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep '"warning"'| awk -F "[ ,]" '{print $3}'
UserParameter=MongoDB.msg,/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep '"msg"'| awk -F "[ ,]" '{print $3}'
UserParameter=MongoDB.user,/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep '"user"'| awk -F "[ ,]" '{print $3}'
UserParameter=MongoDB.rollovers,/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep '"rollovers"'| awk -F "[ ,]" '{print $3}'
UserParameter=MongoDB.ok,/bin/echo "db.serverStatus()" |/data/software/zabbix工具/mongodb-linux-x86_64-ubuntu1604-3.6.7/bin/mongo 192.168.1.20:27017/XXXXX -uXXXXX -pkeyXXXXX | grep '"ok"'| awk -F "[ ,]" '{print $3}'**
4、在zabbix web上创建监控项、触发器、图形等
创建监控项:
添加监控信息,自定义的key值等信息完成监控项的创建:
添加完所有的监控项后如下图:
下边我们添加触发器:
创建触发器:
在添加除点进去添加你要监控的触发条件:
完成触发器的创建。
到此自定义监控MongoDB,清晰明了的结束了,喜欢的点个关注谢谢。
5、完成对MongoDB的监控并规整文档,总结和问题发现
文档整理已经完毕,个人感觉监控一个服务没必要去找什么脚本什么的,要结合自己的生产环境去自定义key监控,同时减轻了zabbix数据库压力,节约资源,也让监控的内容不管自己还是同时能一目了然。
以上内容,如有问题 随时沟通
QQ: 936172842
转载于:https://blog.51cto.com/13120271/2296334