minio分布式解决方案
一、软件版本
- minio版本:minio.RELEASE.2021-07-12T02-44-53Z
- mc版本:mc:RELEASE.2021-07-27T06-46-19Z
- nginx版本:v1.20.1
- keepalived版本:v2.2.2(如果已经有SLB则无需部署)
二、部署解决方案
2.1 服务器规划
minio集群服务器规划为一共10台服务器分别为8台minio,2台nginx代理,服务器配置如下:
服务器角色 | 数量 | CPU/内存 | 数据磁盘 |
---|---|---|---|
minio服务器 | 8 | 8C16G | 4块1.5T磁盘 |
nginx代理服务器 | 2 | 4C8G | 无 |
minio扩容资源(后期扩容) | 8 | 8C16G | 4块1.5T磁盘 |
minio备份资源 | 不限 | 不限 | 需要满足存放minio集群所有对象数据的空间容量 |
注意事项
- minio服务节点如果使用虚拟机,需要调度虚拟机到不同的物理宿主机,避免资源竞争。
- minio服务器4块数据磁盘需申请独立的磁盘,在物理底层要相互独立避免遇到磁盘io竞争,导致minio性能直线下降(性能下降严重,数据量大时会导致集群不可用)
- minio数据磁盘最大不超过2T,如果使用lvm逻辑卷,逻辑卷大小也不要超过2T,过大的磁盘或文件系统会导致后期io延迟较高导致minio性能降低
- minio集群一共8节点每个节点4块数据磁盘,磁盘只要存活16/2,minio集群数据就是安全的,在节点数剩余8/2+1时节点可以正常读写
- 如果使用lvm方式扩展集群容量,请在部署阶段minio数据目录就使用lvm。
- 如果需要备份minio集群数据,请准备存放minio集群所有对象数据的空间容量(1.5T*4*8=48T/2=24T)集群一共容量的一半存储空间服务器,配置内存CPU配置不需要太高。
- 如果网络环境允许请把minio集群节点配置双网卡,节点通信网络与客户端访问网络分开避免网络瓶颈
- nginx服务器使用2台服务器实现代理服务器的高可用,nginx+keepalived来实现,如果有SLB可以直接使用自己的SLB服务,无需keepalived服务。
- minio服务器系统中不要安装updatedb程序,如安装请排除扫描minio数据目录,会导致磁盘io延迟过高,会导致cpu负载过高,从而降低minio性能
#修改方法
[zhangzhuo@minio1 ~]$ cat /etc/updatedb.conf
#在这里添加排除的目录
PRUNEPATHS = "/afs /media /mnt /net /sfs /tmp /udev /var/cache/ccache /var/lib/yum/yumdb /var/spool/cups /var/spool/squid /var/tmp /data1"
2.2 部署步骤
2.2.1 服务器优化脚本
#!/bin/bashcat > sysctl.conf <<EOF
# maximum number of open files/file descriptors
fs.file-max = 4194303# use as little swap space as possible
vm.swappiness = 1# prioritize application RAM against disk/swap cache
vm.vfs_cache_pressure = 50# minimum free memory
vm.min_free_kbytes = 1000000# follow mellanox best practices https://community.mellanox.com/s/article/linux-sysctl-tuning
# the following changes are recommended for improving IPv4 traffic performance by Mellanox# disable the TCP timestamps option for better CPU utilization
net.ipv4.tcp_timestamps = 0# enable the TCP selective acks option for better throughput
net.ipv4.tcp_sack = 1# increase the maximum length of processor input queues
net.core.netdev_max_backlog = 250000# increase the TCP maximum and default buffer sizes using setsockopt()
net.core.rmem_max = 4194304
net.core.wmem_max = 4194304
net.core.rmem_default = 4194304
net.core.wmem_default = 4194304
net.core.optmem_max = 4194304# increase memory thresholds to prevent packet dropping:
net.ipv4.tcp_rmem = "4096 87380 4194304"
net.ipv4.tcp_wmem = "4096 65536 4194304"# enable low latency mode for TCP:
net.ipv4.tcp_low_latency = 1# the following variable is used to tell the kernel how much of the socket buffer
# space should be used for TCP window size, and how much to save for an application
# buffer. A value of 1 means the socket buffer will be divided evenly between.
# TCP windows size and application.
net.ipv4.tcp_adv_win_scale = 1# maximum number of incoming connections
net.core.somaxconn = 65535# maximum number of packets queued
net.core.netdev_max_backlog = 10000# queue length of completely established sockets waiting for accept
net.ipv4.tcp_max_syn_backlog = 4096# time to wait (seconds) for FIN packet
net.ipv4.tcp_fin_timeout = 15# disable icmp send redirects
net.ipv4.conf.all.send_redirects = 0# disable icmp accept redirect
net.ipv4.conf.all.accept_redirects = 0# drop packets with LSR or SSR
net.ipv4.conf.all.accept_source_route = 0# MTU discovery, only enable when ICMP blackhole detected
net.ipv4.tcp_mtu_probing = 1EOFecho "Enabling system level tuning params"
sysctl --quiet --load sysctl.conf && rm -f sysctl.conf# `Transparent Hugepage Support`*: This is a Linux kernel feature intended to improve
# performance by making more efficient use of processor’s memory-mapping hardware.
# But this may cause https://blogs.oracle.com/linux/performance-issues-with-transparent-huge-pages-thp
# for non-optimized applications. As most Linux distributions set it to `enabled=always` by default,
# we recommend changing this to `enabled=madvise`. This will allow applications optimized
# for transparent hugepages to obtain the performance benefits, while preventing the
# associated problems otherwise. Also, set `transparent_hugepage=madvise` on your kernel
# command line (e.g. in /etc/default/grub) to persistently set this value.echo "Enabling THP madvise"
echo madvise | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
2.2.2 minio服务器部署
minio数据磁盘
- 把数据磁盘格式化为ext4或xfs
- 创建minio数据目录,挂载数据磁盘到数据目录
- 并写入到/etc/fstab文件实现永久挂载
minio配置文件
cat /etc/default/minio.conf
MINIO_ROOT_USER=minio
MINIO_ROOT_PASSWORD=minio123
MINIO_PROMETHEUS_AUTH_TYPE="public"
MINIO_VOLUMES="http://minio{1...8}:9000/data/minio{1...4}"
MINIO_OPTS='--console-address \":9001\"'
注意事项
- MINIO_ROOT_USER管理员用户名,MINIO_ROOT_PASSWORD管理员密码
- 如果minio服务器IP地址连续可以直接写IP地址写法,不连续在本地hosts配置主机解析使用上面的方法例如:
MINIO_VOLUMES="http://10.100.16.{1...8}:9000/data1/minio"
- 推荐使用hosts地址映射,后期维护集群也比较简单
- MINIO_PROMETHEUS_AUTH_TYPE表示监控不需要授权验证
- MINIO_OPTS控制台端口
minio启动service文件
[root@minio1 default]# cat /etc/systemd/system/minio.service
[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-noline.target
After=network-noline.target[Service]
WorkingDirectory=/usr/local/minioUser=root
Group=root
EnvironmentFile=-/etc/default/minio.conf
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]";then echo \"Variable MINIO_VOLUEMS not set in /etc/default/minio\";exit 1;fi"
ExecStart=/usr/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
Restart=always[Install]
WantedBy=multi-user.target
2.2.3 部署nginx代理服务器
nginx配置文件示例,不加密
user nginx;
worker_processes auto;error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;events {worker_connections 4096;
}http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;sendfile on;keepalive_timeout 65;# include /etc/nginx/conf.d/*.conf;upstream minio {server 10.202.40.183:9000;server 10.202.40.83:9000;server 10.202.41.126:9000;server 10.202.41.174:9000;}upstream console {ip_hash;server 10.202.40.183:9001;server 10.202.40.83:9001;server 10.202.41.126:9001;server 10.202.41.174:9001;}server {listen 9000;listen [::]:9000;server_name localhost;# To allow special characters in headersignore_invalid_headers off;# Allow any size file to be uploaded.# Set to a value such as 1000m; to restrict file size to a specific valueclient_max_body_size 0;# To disable bufferingproxy_buffering off;location / {proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_connect_timeout 300;# Default is HTTP/1, keepalive is only enabled in HTTP/1.1proxy_http_version 1.1;proxy_set_header Connection "";chunked_transfer_encoding off;proxy_pass http://minio;}}server {listen 9001;listen [::]:9001;server_name localhost;# To allow special characters in headersignore_invalid_headers off;# Allow any size file to be uploaded.# Set to a value such as 1000m; to restrict file size to a specific valueclient_max_body_size 0;# To disable bufferingproxy_buffering off;location / {proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_set_header X-NginX-Proxy true;# This is necessary to pass the correct IP to be hashedreal_ip_header X-Real-IP;proxy_connect_timeout 300;# Default is HTTP/1, keepalive is only enabled in HTTP/1.1proxy_http_version 1.1;proxy_set_header Connection "";chunked_transfer_encoding off;proxy_pass http://console;}}
}
keepalived服务配置文件
- 如果环境已经有SLB服务,可以使用自己的SLB服务无需使用keepalived服务
- 配置keepalived服务时请确定一个VIP地址
- keepalived需要在2台nginx都安装并确定一个MASTER角色
- nginx健康监测这里使用监测脚本监控,需安装psmisc软件包,请把脚本放置在固定目录并填写脚本的绝对路径设置执行权限
监测脚本
[14:14:51 root@centos7 ~]#cat check_nginx_minio.sh
#!/bin/bash
/usr/bin/killall -0 nginx && [ 200 == `curl -I http://127.0.0.1:9000/minio/health/cluster | head -n1 | awk '{print $2}'` ] && exit
systemctl restart nginx && [ 200 == `curl -I http://127.0.0.1:9000/minio/health/cluster | head -n1 | awk '{print $2}'` ] && exit
keepalived具体配置
vrrp_script check_nginx {script "/root/check_nginx_minio.sh" interval 5weight -30fall 3rise 2 timeout 2
}
vrrp_instance minio_lb {state MASTER interface eth0 virtual_router_id 80 priority 100 advert_int 1 authentication { auth_type PASSauth_pass 1111 }unicast_src_ip 192.168.10.71unicast_peer{192.168.10.72}virtual_ipaddress { 192.168.10.100/24 dev eth0 label eth0:1}track_script {check_nginx}
}
2.3 mc工具配置
mc
将所有的配置信息都存储在~/.mc/config.json
文件中
mc config host add <ALIAS> <YOUR-S3-ENDPOINT> <YOUR-ACCESS-KEY> <YOUR-SECRET-KEY> [--api API-SIGNATURE]#示例
mc config host add minio http://192.168.10.100:9000 minio minio123 --api s3v4
三、备份方案
由于预计数据量过大,这里使用rclone工具进行数据同步,把minio集群bucket的对象数据同步到备份服务器,备份服务器配置可以低一些,但是存储空间需要满足minio集群存储空间的一半(如果minio集群存储空间一共48T那备份服务器需要24T的空间来备份数据)
- rclone版本为1.56.0
- 第一次进行全量同步,之后进行增量同步
- 是否使用md5校验来确定是否同步数据,根据自身需求选择,md5校验会cpu消耗较高,但是确定对象文件是否改变要比其他方式更准确
- 建议在业务负载较低时执行备份
- 数据量大时不建议进行备份,本身minio集群已经实现高可用
具体备份方法
#配置rclone工具
[root@minio01 ~]# cat ~/.config/rclone/rclone.conf
[minio]
type = s3
evn_auth = false
access_key_id = minio
secret_access_key = minio123
region = us-east-1
endpoint = http://192.168.10.100:9000#验证是否可以正常使用
[root@minio01 ~]# rclone lsd minio:-1 2021-09-13 02:56:25 -1 s3testqwer1#备份命令
[root@minio01 ~]# rclone sync minio:/s3testqwer1 minio/ #全量备份
[root@minio01 ~]# rclone sync minio:/s3testqwer1 minio/ --checksum #使用md5判断文件是否需要重新同步,即增量备份
其他备份参数,根据自己需求可以添加
- --buffer-size=SIZE 加速 sync命令,使用内存缓存大小
- --bwlimit UP:DOWN 上传下载限速b|k|M|G,在业务需要时可根据需求设置
- --checksum 通过md5判断文件是否有需要同步,消耗cpu比较高
- --update --use-server-modtime 通过mtime判断文件是否需要同步
--transfers=N
- 并行文件数,默认为4,根据内存,以及带宽调整
推荐同步备份数据命令
rclone sync minio:/bucket名称 /data/minio --transfers=8 --update -v --log-file=rclone.log
推荐恢复备份数据命令
rclone sync /data/minio minio:/bucket名称 --transfers=8 --update -v --log-file=rclone.log
四、扩容方案
4.1 通过一个相同规格的集群扩容(对等扩容)
扩容推荐在集群容量使用到70%时进行扩容。
扩容需要准备一个跟原有minio服务器相同规格的集群,进行服务器初始化以及安装minio,但是配置文件需要进行修改,所有minio服务器全部修改,重启所有服务,之后在nginx代理中添加新服务器。
修改后配置文件示例:
cat /etc/default/minio.conf
MINIO_ROOT_USER=minio
MINIO_ROOT_PASSWORD=minio123
MINIO_PROMETHEUS_AUTH_TYPE="public"
MINIO_VOLUMES="http://minio{1...8}:9000/data/minio{1...4} http://minio{9...16}:9000/data/minio{1...4}"
MINIO_OPTS='--console-address \":9001\"'
注意
- 集群扩容时,需准备一个跟之前相同的集群或之前集群倍数的资源。比如之前为8节点16数据盘可以扩展16节点32数据盘
- 扩容节点的数据盘大小配置要跟原有集群一致
4.2 通过lvm逻辑卷扩容
- 使用lvm逻辑卷进行扩容minio集群,可以实现在节点增加硬盘来进行扩容minio集群
- 如果通过lvm逻辑卷扩容,部署集群时minio数据目录需要使用lvm逻辑卷
- lvm逻辑卷单个的大小不要超过2T,文件系统过大会导致minio集群io降低
例如:集群部署时使用4块1T的磁盘使用逻辑卷的方式部署四个数据目录,之后扩容时在安装4块1T磁盘把四个数据目录扩容到2T,相应的minio集群容量也扩充1倍
逻辑卷创建,扩容示例
逻辑卷创建
#创建PV
#pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
#创建卷组
#vgcreate minio /dev/sdbVolume group "minio" successfully created
#创建逻辑卷
lvcreate -l 100%FREE -n minio minio
Logical volume "minio" created.#格式化挂载
mkfs.xfs /dev/minio/minio
mount /dev/minio/minio /mnt/
扩容逻辑卷
#添加磁盘到pv
#pvcreate /dev/sdc
Physical volume "/dev/sdc" successfully created.
#把pv添加到卷组
#vgextend minio /dev/sdc
Volume group "minio" successfully extended
#扩容逻辑卷
lvresize -r -l +100%FREE /dev/minio/minio
五、minio节点故障恢复数据
minio集群有纠删码机制,即使在集群数据盘挂掉一半的情况下,你集群中数据也是安全的。但是如果集群想要正常读写你需要有N/2+1的节点数才可以正常读写如果现有minio集群由于节点损坏或节点物理故障需更换节点时,请直接进行更换节点。
注意事项
- 如果更换节点旧节点数据量较大,在节点更换时可以正常使用请先备份原有节点数据到新节点,避免同步的数据过多导致网络带宽被占用
- 如果数据量小,可以不进行备份数据,直接进行更换,节点启动完毕会自动同步数据
- 如果节点挂掉时集群还在读写数据,会导致集群挂掉的节点与其他minio节点数据不同,这里在恢复节点后需修复数据(自动修复,无需人为干预)
- 最好部署minio集群时使用hosts文件做地址解析,避免更换节点时修改minio配置文件参数
5.1 更换旧的minio节点
更换的新节点没有数据
更换步骤
#验证当前节点状态,已经挂掉一个节点
[root@minio01 ~]# mc admin info minio
● minio2:9000Uptime: offlineDrives: 0/2 OK ● minio1:9000Uptime: 16 minutes Version: 2021-07-12T02:44:53ZNetwork: 1/2 OK Drives: 2/2 OK 9.5 GiB Used, 1 Bucket, 10,000 Objects
2 drives online, 2 drives offline
#修改hosts文件
[root@minio01 ~]# vim /etc/hosts
192.168.10.51 minio1
192.168.10.52 minio2#在新节点与旧节点重启服务
[root@minio01 ~]# systemctl restart minio
[root@minio02 ~]# systemctl status minio#验证集群状态
[root@minio01 ~]# mc admin info minio
● minio2:9000Uptime: 1 minute Version: 2021-07-12T02:44:53ZNetwork: 2/2 OK Drives: 2/2 OK ● minio1:9000Uptime: 2 minutes Version: 2021-07-12T02:44:53ZNetwork: 2/2 OK Drives: 2/2 OK 9.5 GiB Used, 1 Bucket, 10,000 Objects
4 drives online, 0 drives offline
注意事项
- 更换节点时需要停止minio集群客户端的读写
- 更换的新节点所有配置信息要和旧节点保持一致,包括minio版本,配置文件,hosts解析文件,数据目录位置以及大小
验证更换的新节点是否有数据
更换的节点在启动后,会自动进行同步数据
5.2 集群在读写时节点损坏修复数据
在写入数据时挂掉一个节点
数据写完后正常节点的数据
数据写完后错误节点的数据
启动挂掉的节点,验证集群状态
这里可以看到集群状态已经恢复正常
故障节点启动后,会自动修复数据,数据修复后数据目录
注意事项
- 节点数据量大时数据恢复的时间可能较长,推荐如果数据相差较大,可以在nginx代理服务器取消节点的数据代理转发,不让节点进行写操作,只进行同步操作,之后同步完成在打开代理
- 数据恢复过程无需手动维护
六、minio监控
minio监控推荐使用Prometheus+grafana进行监控
6.1 Prometheus配置文件
[zhangzhuo@gs-server-10562 ~]$ cat /usr/local/prometheus/prometheus.yml
scrape_configs:#这里为minio集群监控指标收集- job_name: minio-jobmetrics_path: /minio/v2/metrics/clusterscheme: httpstatic_configs:- targets: ['10.201.60.115:9000']#这里为minio节点node_exporter主机监控指标- job_name: nodestatic_configs:- targets: ['10.201.60.115:9100','10.201.82.139:9100','10.201.83.162:9100','10.201.83.159:9100','10.201.50.61:9100','10.201.60.142:9100','10.201.60.183:9100','10.201.60.175:9100',]
**minio集群grafana模板:**MinIO Dashboard dashboard for Grafana | Grafana Labs
**minio节点主机grafana模板:**Node Exporter Quickstart and Dashboard dashboard for Grafana | Grafana Labs
七、集群dome测试数据
测试说明
- minio节点配置为8C16G
- 集群为8台minio服务器节点,集群总数据量达到16T
- 测试软件为cosbench,共36个测试进程分布在四台压测客户端,读写时长为30分钟经过多次测试
- 读写测试一同进行,读写比例为各占50%
测试结果数据
读写测试结果
集群监控
集群节点负载数据
节点名称 | CPU15分负载值 | 内存使用 | 磁盘读写速率 | 磁盘延迟 |
---|---|---|---|---|
minio1 | 5.3 | 14.33G | 16M/s | 450ms |
minio2 | 13.68 | 13.66G | 15M/s | 963ms |
minio3 | 13.35 | 15.24G | 15M/s | 955ms |
minio4 | 14.12 | 14.26G | 16M/s | 988ms |
minio5 | 14.71 | 14G | 14.28M/s | 999ms |
minio6 | 4.76 | 13.54G | 15.35M/s | 887ms |
minio7 | 17.29 | 14.1G | 13.34M/s | 994ms |
minio8 | 17.59 | 15.69G | 13.84M/s | 997ms |
测试结果
- 在读写过程,读写速率平均在50-60M/s左右,总计集群读写性能在100M/s左右
- 在高负载情况下,minio服务节点内存使用率比较高,即使增加内存也并没有多少性能提升
- 在测试中有2个minio节点cpu负载比较低,其余的cpu负载高的原因为磁盘 io延迟过高,提升方法使用单独的物理磁盘做minio节点数据盘
- 在集群数据量多的情况下minio集群的web控制端基本无法使用,但是不影响集群正常读写数据
minio分布式解决方案相关推荐
- Day134-136.尚品汇:平台属性接口、SPU、跨域问题、配置持久化、MinIO 分布式文件存储系统
目录 Day 02 商品后台管理系统 1. 商品基本知识 2. 回顾Mybatis 3. 添加平台属性接口 (多表查询) Day 03 完成后台平台属性管理.SPU 1. 修改平台属性 2. gate ...
- SpringBoot笔记:SpringBoot集成MinIO分布式文件系统
文章目录 搭建MinIO集群 SpringBoot集成 添加依赖 添加配置 获取MinioClient MinioUtils完整工具类 测试代码 搭建MinIO集群 首先搭建MinIO的分布式集群,集 ...
- Minio分布式集群示例:8个节点,每节点1块盘
启动一个分布式Minio实例,你只需要把硬盘位置做为参数传给minio server命令即可,然后,你需要在所有其它节点运行同样的命令. 注意 分布式Minio里所有的节点需要有同样的access秘钥 ...
- minio分布式搭建_分布式存储Minio集群环境搭建
MinIO 分布式集群搭建 分布式 Minio 可以让你将多块硬盘(甚至在不同的机器上)组成一个对象存储服务.由于硬盘分布在不同的节点上,分布式 Minio 避免了单点故障. Minio 分布式模式可 ...
- 《深入理解分布式事务》第五章 强一致性分布式解决方案
<深入理解分布式事务>第五章 强一致性分布式解决方案 文章目录 <深入理解分布式事务>第五章 强一致性分布式解决方案 一.强一致性事务概述 1.典型方案 2.适用场景 3.优缺 ...
- SpringCloud→分布式解决方案、包含主要工具、启动流程、web发展阶段、实现配置中心
SpringCloud SpringCloud简介 SpringCloud分布式解决方案 SpringCloud启动流程 web发展阶段 配置中心 配置中心MAVEN引入依赖 模拟服务端开启配置中心 ...
- docker-compose部署MinIO分布式集群
docker-compose部署MinIO分布式集群 文章目录 docker-compose部署MinIO分布式集群 概述 纠删码 部署 配置 概述 MinIO是全球领先的对象存储先锋,目前在全世界有 ...
- Minio分布式对象存储的部署与使用
一.部署 下载Minio直接Github搜索即可,minio/minio: Multi-Cloud Object Storage 1.1 单机部署 单机部署命令,指定静态端口9001. 一般会占用两个 ...
- 手把手教你搭建MinIO分布式集群
手把手教你搭建MinIO分布式集群 要求: MinIO集群规格:2节点2个磁盘. Minio域名:test_minio.com 数据目录:/opt/minio/data1,/opt/minio/dat ...
最新文章
- centos6.8 搭建postfix/dovecot邮件服务器
- 元宇宙大比拼:苹果Apple, Facebook,微软,英伟达,iwemeta
- iOS总结:项目中的各种小坑汇总
- Unknown SSL protocol error in connection to xxx:443
- [置顶] export命令-linux
- 用姓名字段统计人数_基于 Wide amp; Deep 网络和 TextCNN 的敏感字段识别
- python request返回的响应_Python爬虫库requests获取响应内容、响应状态码、响应头...
- Activity管理笔记
- exchange2013 OWA界面使用公有计算机或私有计算机选项
- jpeg 转rgb c 语言_威刚推出SE770G移动固态硬盘 主打高速传输和RGB灯效
- 【我的世界Minecraft-MC】常见及各种指令大杂烩【2022.8版】
- 刷卡芯片CI520可直接PIN对PIN替换CV520支持SPI通讯接口
- 用Python通过摄像头进行视频录制
- 波动率曲面(完整版)
- tensorflow 一些概念
- 2018/12/22 JSJ_JC_03
- 基于WIN10搭建ES伪集群的实践
- ossec开源入侵检测系统安装配置
- .INF文件格式说明
- 前端页面如何为图片添加黑色半透明遮罩