[转帖]07-rsync企业真实项目备份案例实战(需求收集--服务器配置---客户端配置---报警机制---数据校验---邮件告警)
https://developer.aliyun.com/article/885820?spm=a2c6h.24874632.expert-profile.279.7c46cfe9h5DxWK
rsync企业真实项目备份案例实战
1.环境准备2.需求描述
客户端需求:
1.客户端每天凌晨1点在服务器本地打包备份(系统配置文件、日志文件、其他目录、应用配置文件)
2.客户端备份的数据必须存放至以主机名IP地址当前时间命名的目录中,例如/backup/nfs_192.168.81.210_2020-05-26,其实更好的备份方式/backup/192.168.81.210/nfs_2020-05-26,一会采用后者,要求不只是备份文件,要求连上级目录一并拷过来
3.客户端最后通过rsync推送本地打包好的备份文件至backup服务器
4.客户端服务器本地保留最近7天的数据,避免浪费磁盘空间
分析思路:
1.要备份的文件
系统配置文件:/etc/fstab /etc/hosts /var/spool/cron/root
日志文件:/var/log/messages /var/log/secure
服务配置文件:/etc/rsyncd.conf
2.备份目录:/backup/192.168.81.210/nfs_2020-05-26
3.获取信息
主机名:hostname
ip地址:ifconfig ens33 | awk ‘NR==2{print $2}’ 或者hostname -I | awk ‘{print $2}’
时间:date +%F
目录名:/backup/$(ifconfig ens33 | awk 'NR==2{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 2}̲')/(date +%F)
带目录一起拷贝:cp -p --parents source destion
服务端需求:
1.服务端部署rsync,用户接受客户端推送过来的备份数据
2.服务端需要每天校验客户端推送过来的数据是否完整
3.服务端需要将每天的校验结果通知给管理员
4.服务端仅保留6个月的备份数据,其余全部删除
分析思路:
校验:客户端推送时将校验文件一起推过来,然后使用md5sum -c md5file来校验,如果没有丢失数据会提示ok,要注意md5sum校验时源端数据要和目标端数据路径要保持一致
保留6个月:find 路径 -mtime 180 | xargs rm -rf
3.服务器端配置
3.1.脚本安装rsync守护进程
3.1.1.脚本编写
vim rsyncd_shjc_install.sh
#!/bin/bash
#批量部署rsync
yum -y install rsync &>/dev/null
echo -e "\e[033m1.rsync install... \e[0m" cat > /etc/rsyncd.conf <<EOF
uid = rsync
gid = rsync
port 873
fake super = yes
use chroot = no
transfer logging = yes #记录日志
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync_passwd
log file = /var/log/rsync/rsync.log
[backup]
comment = backup
path = /backup
EOF
echo -e "\e[033m2.rsync config finish... \e[0m" id rsync &> /dev/null
if [ $? -ne 0 ];then
useradd -M -s /sbin/nolog rsync
fi if [ ! -e /backup ];then
mkdir /backup
fi
chown -R rsync:rsync /backup
echo -e "\e[033m3.backup dir finish... \e[0m" echo "rsync_backup:123456" > /etc/rsync_passwd
chmod 600 /etc/rsync_passwd
echo -e "\e[033m4.rsync auth finish... \e[0m" systemctl restart rsyncd
systemctl enable rsyncd &>/dev/null
lsof -i:873 &>/dev/null
if [ $? -eq 0 ];then
echo -e "\e[033m5.rsync finish.....\e[0m"
fi
3.1.2.执行结果
[root@localhost ~]# ./rsyncd_shjc_install.sh
1.rsync install...
2.rsync config finish...
3.backup dir finish...
4.rsync auth finish...
5.rsync finish.....
3.1.3.测试是否能用
[root@jxl ~]# rsync -avz rsync_backup@192.168.81.230::backup /tmp/
receiving incremental file list
./
aa1
aa10
aa2
aa3
aa4
aa5
aa6
aa7
aa8
aa9
initial-setup-ks.cfg sent 240 bytes received 1,696 bytes 3,872.00 bytes/sec
total size is 1,940 speedup is 1.00
4.rsync扩展
增加两个需求
1.增加一个模块
2.每个模块使用不同的登录认证
4.1.增加新的模块
[root@localhost ~]# cat >>/etc/rsyncd.conf <<EOF
>
> [mysql_bak]
> comment = mysql back
> path /mysql_data
> EOF
[root@localhost ~]# mkdir -p /mysql_data
[root@localhost ~]# chown -R rsync:rsync /mysql_data
[root@localhost ~]# systemctl restart rsyncd
4.2.每个模块使用不同的登录名
实现思路很简单,把全局的认证参数放到局部即可
1.编辑配置文件
[root@localhost ~]# vim /etc/rsyncd.conf
uid = rsync
gid = rsync
port 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
log file = /var/log/rsync/rsync.log [backup]
comment = backup
path = /backup
auth users = rsync_backup
secrets file = /etc/rsync_passwd [mysql_bak]
comment = mysql back
path = /mysql_data
auth users = rsync_mysqlbak
secrets file = /etc/rsync_mysqlbak_passwd
2.创建认证文件
bakcup模块
[root@localhost ~]# echo "rsync_backup:123456" > /etc/rsync_passwd mysql_bak模块
[root@localhost ~]# echo "rsync_mysqlbak:123456" > /etc/rsync_mysqlbak_passwd 设置权限
[root@localhost ~]# chmod 600 /etc/rsync*_passwd
[root@localhost ~]# systemctl restart rsyncd
3.验证
bakcup模块
[root@jxl ~]# rsync -avz rsync_backup@192.168.81.230::backup /tmp/
receiving incremental file list
./ sent 27 bytes received 245 bytes 181.33 bytes/sec
total size is 1,940 speedup is 7.13 mysql_bak模块
[root@jxl ~]# rsync -avz rsync_mysqlbak@192.168.81.230::mysql_bak /tmp/
receiving incremental file list
./
mysql01.sql
mysql02.sql
mysql03.sql
mysql04.sql
mysql05.sql
mysql06.sql
mysql07.sql
mysql08.sql
mysql09.sql
mysql10.sql sent 221 bytes received 604 bytes 550.00 bytes/sec
total size is 0 speedup is 0.00
5.客户端配置
初步配置,仅在本地生成目录
5.1.安装rsync包
[root@jxl ~]# yum -y install rsync
5.2.定义密码文件或者变量
如果密码相同强烈建议使用变量,密码不相同一定要用密码文件
--password-file=
export RSYNC_PASSWORD=
5.3.编写脚本,将需要备份的文件拷贝至备份目录
#!/bin/bash
#定义环境变量
export Host=$(hostname)
export IP=$(ifconfig ens33 | awk 'NR==2{print $2}')
export Day=$(date +%F)
export Backup_dir=/backup
export Dest_local_dir=${Backup_dir}/${IP}/${Host}_${Day}
export Dest_rsync_dir=${Backup_dir}/${IP}
export Rsync_ip=192.168.81.230
export Rsync_user=rsync_backup
export Rsync_module=backup
export RSYNC_PASSWORD=123456
#创建备份目录
if [ ! -e $Dest_local_dir ];then
mkdir -p $Dest_local_dir
fi #收集需要备份的文件
#sysconf backup
cp -p --parents /etc/fstab /etc/hosts /var/spool/cron/root $Dest_local_dir
#logs backup
cp -p --parents /var/log/messages /var/log/secure $Dest_local_dir
#serverconf backup
cp -p --parents /etc/rsyncd.conf $Dest_local_dir #推送数据
rsync -avz $Dest_rsync_dir $Rsync_user@$Rsync_ip::$Rsync_module #只保留七天内的文件
find $Dest_rsync_dir -type d -mtime +7 | xargs rm -rf
5.4.执行脚本
[root@web scripts]# sh -n rsyncd_backup.sh
[root@web scripts]# sh -vx rsyncd_backup.sh
5.5.观察本地生成的目录
改个时间在执行一次
[root@web ~]# tree /backup/
/backup/
└── 192.168.81.220
└── web_2020-05-28
├── logs.tar.gz
├── md5_check
├── serverconf.tar.gz
└── sysconf.tar.gz 2 directories, 4 files
5.6.观察rsync服务端生成的目录
[root@backup ~]# tree /backup/
/backup/
└── 192.168.81.220
└── web_2020-05-28
├── logs.tar.gz
├── md5_check
├── serverconf.tar.gz
└── sysconf.tar.gz 2 directories, 4 files
6.客户端/服务端高级脚本配置响应需求
6.1.客户端高级配置
1.客户端每天凌晨1点在服务器本地打包备份
[root@web scripts]# crontab -l
0 1 * * * /usr/bin/bash /scripts/rsyncd_backup.sh
2.脚本内容—打包备份
#将收集的文件打包
#sysconf backup
tar cfzP $Dest_local_dir/sysconf.tar.gz /etc/fstab /etc/hosts /var/spool/cron/root
#logs backup
tar cfzP $Dest_local_dir/logs.tar.gz /var/log/messages /var/log/secure
#serverconf backup
tar cfzP $Dest_local_dir/serverconf.tar.gz /etc/rsyncd.conf
3.客户端备份的数据必须存放至以IP地址/主机名当前时间命名的目录
export Host=$(hostname)
export IP=$(ifconfig ens33 | awk 'NR==2{print $2}')
export Day=$(date +%F)
export Backup_dir=/backup
export Dest_local_dir=${Backup_dir}/${IP}/${Host}_${Day}
export Dest_rsync_dir=${Backup_dir}/${IP} if [ ! -e $Dest_local_dir ];then
mkdir -p $Dest_local_dir
fi
4.客户端最后通过rsync推送本地打包好的备份文件至backup服务器
export Dest_rsync_dir=${Backup_dir}/${IP}
export Rsync_ip=192.168.81.230
export Rsync_user=rsync_backup
export Rsync_module=backup
export RSYNC_PASSWORD=123456 rsync -avz $Dest_rsync_dir $Rsync_user@$Rsync_ip::$Rsync_module
5.客户端服务器本地保留最近7天的数据,避免浪费磁盘空间
#只保留七天内的文件
find $Dest_rsync_dir -type d -mtime +7 | xargs rm -rf
6.2.服务端高级配置
写死情况(不建议使用)
1.服务端需要每天校验客户端推送过来的数据是否完整并通知管理员
#检测web数据是否完整
md5sum -c ${Checkweb_dir}/${Md5sum_file} if [ $? -ne 0 ];then
echo -e "\e[031m${Rsync_web}数据校验不完整\e[0m" | mail -s "check ${Rsync_web} error " 15910468023@163.com
else echo -e "\e[032m${Rsync_web}数据校验完整\e[0m" | mail -s "check ${Rsync_web} ok " 15910468023@163.com
fi #检测nfs数据是否完整
md5sum -c $Checknfs_dir/${Md5sum_file} if [ $? -ne 0 ];then
echo -e "\e[031m${Rsync_nfs}数据校验不完整\e[0m" | mail -s "check ${Rsync_nfs} error " 15910468023@163.com
else
echo -e "\e[032m${Rsync_nfs}数据校验完整\e[0m" | mail -s "check ${Rsync_nfs} ok " 15910468023@163.com
fi
2.服务端仅保留6个月的备份数据,其余全部删除
#删除60天外的数据
find $Backup_rsyncweb_dir -type d -mtime +180 |xargs rm -rf
find $Backup_rsyncnfs_dir -type d -mtime +180 |xargs rm -rf
使用通配符(强烈建议)
[root@backup@scripts]# vim rsyncd_sjjy2.sh
#!/bin/bash
#rsync数据校验
export Backup_dir=/backup
export Result_dir=${Backup_dir}/result
export Day=$(date +%F)
export Md5_file=md5_check
export Result_file=result_${Day}.txt
export Rsync_dir=${Backup_dir}/*/*_${Day}
export Jiaoyanfile_path=$Rsync_dir/${Md5_file}
export Resultfile_path=${Result_dir}/${Result_file}
export Rmdir_dir=${Backup_dir}/*/* #根据校验情况发送邮件
md5sum -c $Jiaoyanfile_path
if [ $? -eq 0 ];then
md5sum -c $Jiaoyanfile_path | tee -a $Resultfile_path
mail -s "rsync backup jiaoyan is ok..." 15910468023@163.com < $Resultfile_path
else
md5sum -c $Jiaoyanfile_path | tee -a $Resultfile_path
mail -s "rsync backup jiaoyan is fail..." 15910468023@163.com < $Resultfile_path
fi #删除6个月之前的文件
find ${Rmdir_dir}/ -type d -mtime +180 | xargs rm -rf
find ${Result_dir}/ -type f -mtime +180 | xargs rm -rf
7.整个脚本内容
客户端
[root@web scripts]# vim rsyncd_backup.sh
#!/bin/bash
#定义环境变量
export Host=$(hostname)
export IP=$(ifconfig ens33 | awk 'NR==2{print $2}')
export Day=$(date +%F)
export Backup_dir=/backup
export Dest_local_dir=${Backup_dir}/${IP}/${Host}_${Day}
export Dest_rsync_dir=${Backup_dir}/${IP}
export Rsync_ip=192.168.81.230
export Rsync_user=rsync_backup
export Rsync_module=backup
export RSYNC_PASSWORD=123456
#创建备份目录
if [ ! -e $Dest_local_dir ];then
mkdir -p $Dest_local_dir
fi #收集需要备份的文件
#sysconf backup
#cp -p --parents /etc/fstab /etc/hosts /var/spool/cron/root $Dest_local_dir
#logs backup
#cp -p --parents /var/log/messages /var/log/secure $Dest_local_dir
#serverconf backup
#cp -p --parents /etc/rsyncd.conf $Dest_local_dir #将收集的文件打包
#sysconf backup
tar cfzP $Dest_local_dir/sysconf.tar.gz /etc/fstab /etc/hosts /var/spool/cron/root
#logs backup
tar cfzP $Dest_local_dir/logs.tar.gz /var/log/messages /var/log/secure
#serverconf backup
tar cfzP $Dest_local_dir/serverconf.tar.gz /etc/rsyncd.conf
#md5校验
md5sum $Dest_local_dir/* > $Dest_local_dir/md5_check #推送数据
rsync -avz $Dest_rsync_dir $Rsync_user@$Rsync_ip::$Rsync_module #只保留七天内的文件
find $Dest_rsync_dir -type d -mtime +7 | xargs rm -rf #Host变量是主机名 IP变量是当前主机的ip地址 Day变量是当前服务器的日期 Backup_dir变量表示本地的备份目录
#Dest_local_dir变量表示存放在备份目录的那个子目录----父目录/IP目录/日期目录
#Dest_rsync_dir变量表示将本地那个目录同步到rsync服务端
#Rsync_ip变量表示远程rsync服务器的ip地址 #Rsync_user变量表示rsync的管理用户 #Rsync_ip变量表示rsync服务器的ip地址
#Rsync_module变量表示rsync的模块名 #RSYNC_PASSWORD变量表示rsync的密码
服务端
[root@backup@scripts]# vim rsyncd_sjjy2.sh
#!/bin/bash
#rsync数据校验
export Backup_dir=/backup
export Result_dir=${Backup_dir}/result
export Day=$(date +%F)
export Md5_file=md5_check
export Result_file=result_${Day}.txt
export Rsync_dir=${Backup_dir}/*/*_${Day}
export Jiaoyanfile_path=$Rsync_dir/${Md5_file}
export Resultfile_path=${Result_dir}/${Result_file}
export Rmdir_dir=${Backup_dir}/*/* #根据校验情况发送邮件
md5sum -c $Jiaoyanfile_path
if [ $? -eq 0 ];then
md5sum -c $Jiaoyanfile_path | tee -a $Resultfile_path
mail -s "rsync backup jiaoyan is ok..." 15910468023@163.com < $Resultfile_path
else
md5sum -c $Jiaoyanfile_path | tee -a $Resultfile_path
mail -s "rsync backup jiaoyan is fail..." 15910468023@163.com < $Resultfile_path
fi #删除6个月之前的文件
find ${Rmdir_dir}/ -type d -mtime +180 | xargs rm -rf
find ${Result_dir}/ -type f -mtime +180 | xargs rm -rf #Backup_dir表示备份目录 Result_dir表示校验结果存放目录 Day表示当前日期
#Md5_file表示md5校验文件名 Result_file表示校验结果文件名 Rsync_dir表示每日rsync增量的目录路径
#Jiaoyanfile_path表示校验文件所在路径 Resultfile_path表示校验结果文件所在路径 Rmdir表示要删哪些目录
8.测试脚本可用
for命令造数据
[root@web scripts]# for i in {1..28};do date -s 2020/01/$i && sh rsyncd_backup.sh ; done
服务端就有了执行服务端脚本验证保留180天
客户端疯狂造数据,180天前的多造一些,180天内的也造一些
for i in {1..28};do date -s 2019/10/$i && sh rsyncd_backup.sh ; done
for i in {1..28};do date -s 2019/11/$i && sh rsyncd_backup.sh ; done
for i in {1..28};do date -s 2019/12/$i && sh rsyncd_backup.sh ; done
for i in {1..28};do date -s 2020/01/$i && sh rsyncd_backup.sh ; done
for i in {1..28};do date -s 2020/02/$i && sh rsyncd_backup.sh ; done
for i in {1..28};do date -s 2020/03/$i && sh rsyncd_backup.sh ; done
for i in {1..28};do date -s 2020/05/$i && sh rsyncd_backup.sh ; done
for i in {1..28};do date -s 2020/06/$i && sh rsyncd_backup.sh ; done 服务端执行脚本
[root@backup scripts]# sh rsyncd_sjjy.sh
验证后只有60天内的数据
9.rsync使用163发送邮件提醒管理员
9.1.服务端配置
安装mailx
[root@backup@scripts]# yum -y install mailx 在配置文件最后加入
[root@backup@scripts]# vim /etc/mail.rc
set from=15910468023@163.com //邮箱地址
set smtp=smtps://smtp.163.com //邮箱smtp地址
set smtp-auth-user=15910468023@163.com //邮箱地址
set smtp-auth-password=CPDBDXEGKVXJZHMB //smtp生成的校验码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
9.2.编写rsync校验脚本
[root@backup@scripts]# vim rsyncd_sjjy2.sh
#!/bin/bash
#rsync数据校验
export Backup_dir=/backup
export Result_dir=${Backup_dir}/result
export Day=$(date +%F)
export Md5_file=md5_check
export Result_file=result_${Day}.txt
export Rsync_dir=${Backup_dir}/*/*_${Day}
export Jiaoyanfile_path=$Rsync_dir/${Md5_file}
export Resultfile_path=${Result_dir}/${Result_file}
export Rmdir_dir=${Backup_dir}/*/* #根据校验情况发送邮件
md5sum -c $Jiaoyanfile_path
if [ $? -eq 0 ];then
md5sum -c $Jiaoyanfile_path | tee -a $Resultfile_path
mail -s "rsync backup jiaoyan is ok..." 15910468023@163.com < $Resultfile_path
else
md5sum -c $Jiaoyanfile_path | tee -a $Resultfile_path
mail -s "rsync backup jiaoyan is fail..." 15910468023@163.com < $Resultfile_path
fi #删除6个月之前的文件
find ${Rmdir_dir}/ -type d -mtime +180 | xargs rm -rf
find ${Result_dir}/ -type f -mtime +180 | xargs rm -rf #Backup_dir表示备份目录 Result_dir表示校验结果存放目录 Day表示当前日期
#Md5_file表示md5校验文件名 Result_file表示校验结果文件名 Rsync_dir表示每日rsync增量的目录路径
#Jiaoyanfile_path表示校验文件所在路径 Resultfile_path表示校验结果文件所在路径 Rmdir表示要删哪些目录
9.3.163邮箱开启smtp并生成校验码
1.进入163邮箱点击设置—POP3/SMTPIMAP
2.选择开启
3.发送短信生成校验码
4.复制校验码到mailx的配置文件中
5.Linux端发送邮件,提示已收到
6.根据rsync校验脚本生成结果并发送到163邮箱
校验正常
校验失败
[转帖]07-rsync企业真实项目备份案例实战(需求收集--服务器配置---客户端配置---报警机制---数据校验---邮件告警)的更多相关文章
- 综合架构之Rsync备份服务,服务端和客户端配置
服务端配置(即备份服务器) ps:客户端配置见下方 配置一个新服务的步骤: 第一步:先将该服务下载 yum install -y rsync 第二步:编写服务配置文件 配置文件:/etc/rsyncd ...
- 删库到跑路?还得看这篇Redis数据库持久化与企业容灾备份恢复实战指南
本章目录 0x00 数据持久化 1.RDB 方式 2.AOF 方式 如何抉择 RDB OR AOF? 0x01 备份容灾 一.备份 1.手动备份redis数据库 2.迁移Redis指定db-数据库 3 ...
- Rsync企业实战之自动异地备份(转)
认真的测试过网上的大多数文章和版本,真正能一次性测试通过的文章太少了,需要反复的推敲,反复的查阅资料,才能真正的测试成功,所以,在此背景下,总结了Rsync,加上自己的理解分享出来: 1. 原理篇 R ...
- [deviceone开发]-企业OA项目开源分享
一.简介 是一个真实的企业OA项目改造的开源项目,几乎涵盖了所有常用的组件,包括环信实现在线聊天等功能,类似微信的朋友圈功能,自定义的智能搜索等,而且这个是真实的通过Http链接后台web服务,里面很 ...
- iOS -数据持久化方式-以真实项目讲解
前面已经讲解了SQLite,FMDB以及CoreData的基本操作和代码讲解(CoreData也在不断学习中,上篇博客也会不断更新中).本篇我们将讲述在实际开发中,所使用的iOS数据持久化的方式以及怎 ...
- openvpn用户管理、linux客户端配置及企业常用真实案例解析
1.给企业用户分配VPN账户的流程: 添加拨号需要密码的用户 # source vars NOTE: If you run ./clean-all, I will be doing a rm -rf ...
- 大数据技术之_09_Flume学习_Flume概述+Flume快速入门+Flume企业开发案例+Flume监控之Ganglia+Flume高级之自定义MySQLSource+Flume企业真实面试题(重点)
第1章 Flume概述1.1 Flume定义1.2 Flume组成架构1.2.1 Agent1.2.2 Source1.2.3 Channel1.2.4 Sink1.2.5 Event1.3 Flum ...
- Linux运维企业架构项目实战系列
Linux运维企业架构项目实战系列 项目实战1—LNMP的搭建.nginx的ssl加密.权限控制的实现 项目实战2—LVS.nginx实现负载均衡系列2.1 项目实战2.1—实现基于LVS负载均衡集群 ...
- Linux Rsync实现文件同步备份(转载)
原文地址:Linux Rsync实现文件同步备份作者:夷北 转自:http://www.mike.org.cn/blog/index.php?load=read&id=639###pp=0 [ ...
- 3、Rsync备份服务实战
1.Rsync基本概述 rsync是一款开源的备份工具,可以在不同主机之间进行同步,可实现全量备份与增量备份,因此非常适合用于架构集中式备份或异地备份等应用. rsync官方地址:传送门http:// ...
随机推荐
- Windows10安装WSL2和Ubuntu的过程
因为在Windows10环境中安装了2个相同的包导致冲突,所以想到了通过WSL2+Docker的方式进行编程开发.因为Docker Desktop直接安装就行了,不做介绍.本文主要介绍WSL2和U ...
- 云图说 | 华为云GPU共享型AI容器,让你用得起,用得好,用的放心
摘要:容器以其独特的技术优势,已经成为业界主流的AI计算框架(如Tensorflow.Caffe)的核心引擎,为了进一步解决企业在AI计算性能与成本上面临的问题,华为云推出了AI容器产品. 容器以其独 ...
- 面试官问我:CSS有哪些属性可以继承?
摘要:本文带大家学习一下关于CSS属性的继承. 本文分享自华为云社区<关于CSS有哪些属性可以继承?>,作者:黛琳ghz. 前言 今天遇到一个很有意思的题目,通过题目可以顺便学习一下关于C ...
- 一文详解TensorFlow模型迁移及模型训练实操步骤
摘要:本文介绍将TensorFlow网络模型迁移到昇腾AI平台,并执行训练的全流程.然后以TensorFlow 1.15训练脚本为例,详细介绍了自动迁移.手工迁移以及模型训练的操作步骤. 本文分享自华 ...
- AI开发效率低,你可以试试华为NAIE AutoML
摘要:为解决AI工程师在开发AI应用场景所遇到的问题,NAIE平台落地AutoML框架(工具)来辅助大家更高效.更迅速解决AI开发问题. 你是不是还在为掌握的AI算法少而烦恼? 你是不是还在为选择某个 ...
- Flask依赖的核心模块werkzeug
Flask的web框架实现 Flask是python Web框架,自然要遵 WSGI 规范,需要同时实现服务端程序+应用程序,并且要丰富完善请求和响应的处理. Flask自身并没有实现WSGI,而是依 ...
- Blazor与Vue标签代码的可维护性对比
通过一个简单示例来进行对比, Vue的ElementUI组件的行内编辑: Blazor的AntDesginBlazor组件的行内编辑: 区别: el-table-column的label属性相当于Co ...
- AIsing Programming Contest 2020 游记 (ABC水题,D思维)
补题链接:Here A - Number of Multiples 水题 B - An Odd Problem 水题 C - XYZ Triplets 水题,注意数组不要开小了 D - Anythin ...
- L2-014 列车调度 (25 分)(set容器应用)
L2-014 列车调度 (25 分) 火车站的列车调度铁轨的结构如下图所示. 两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道.每趟列车从入口可以选择任意 ...
- Codeforces Round #544 (Div. 3)简单题解
复健,时间有限题解比较简陋 A. Middle of the Contest 将小时转成分钟,得到起止时间在一天中的分钟数,取平均值即可,复杂度O(1).平均值转换会时间的时候注意前导0. void ...