一、概述

1、Rsync+Sersync 是什么?

1)Sersync使用c++编写基于inotify开发的触发机制;

2)Sersync可以监控所监听的目录发生的变化(包括新建、修改、删除),具体到一个文件名或目录名,然后触发rsync同步,只同步发生改变的文件或目录。如果只是目录下的文件发生变化,则只会同步变化的文件而不会同步目录。只有目录本身发生变化的时候才会同步目录。

3)自带crontab功能,只需在 xml配置文件中开启,即可按您的要求,隔一段时间整体同步一次。无需再额外配置crontab功能。

4)使用多线程进行同步,尤其在同步较大文件时,能够保证多个服务器实时保持同步状 态。

5)有出错处理机制,通过失败队列对出错的文件重新同步,如果仍旧失败,则 每10个小时对同步失败的文件重新同步。

2、Rsync+Inotify-tools  与 Rsync+Sersync 区别

1)Inotify-tools只能记录被监控的目录发生的变化(包括新建、修改、删除),并不能监控是哪个文件或目录发生了改变;

rsync同步的时候会把整个监控的目录整个同步过去,但数据量很大的时候,同步的时间就会很久(rsync同步要遍历整个目录进行文件对比)

2)Sersync可以监控所监听的目录发生的变化(包括新建、修改、删除),具体到一个文件名或目录名,然后触发rsync同步,只同步发生改变的文件或目录。如果只是目录下的文件发生变化,则只会同步变化的文件而不会同步目录。只有目录本身发生变化的时候才会同步目录。

rsync同步的时候之同步发生改变的文件或目录(因为每次发生变化的数据很小,所以速度很快)效率很高。

3、小结

当同步的目录下的数据量很小时,可以使用Rsync+Inotify;当数据很大(几个G甚至更大的时候)、文件数很多时使用Rsync+Sersync。

二、服务部署

1、环境介绍

系统:centos7.2  默认支持了inotify  内核:3.10.0-514.el7.x86_64   版本: jdk-8u111-linux-x64.tar、sersync2.5.4_64bit_binary_stable_final.tar.gz、rsync-3.0.9-17.el7.x86_64

linux内核从2.6.13开始支持inotify。

2、安装

#yum -y install rsync

配置文件

#cat /etc/rsyncd.conf

uid = root
gid = root
use chroot = yes
address = 192.168.1.202
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid

lock file = /var/log/rsync.lock
max connections = 5
motd file = /etc/rsyncd.motd
transfer logging = yes
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300
[config]
        path = /data/mongodb/conf
        comment = copy  config for cluster every node
        read only = no
        dont compress = *.gz *.bz2 *.tgz *.xz *.zip *.rar *.z
        auth users = root            #用户必须为系统用户
        secrets file = /etc/rsyncd.pas
        list = no
        ignore errors

exclude = logs/;slaves;master

hosts allow = 192.168.1.201

hosts deny = *

保存退出;

创建密码文件

#echo "root:666666"  > /etc/rsyncd.pas

root是用户名,666666是密码,用户名与密码之间使用冒号分割,每个用户单独一行。

#chmod 600  /etc/rsyncd.pas

欢迎输出的提示信息:

# cat /etc/rsyncd.motd
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
It's  config  copy!
amazing man!
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

3、启动服务

#rsync --daemon

4、客户端

#yum  -y  install  rsync

rsync同步源的资源表示方式:
用户名@主机地址::共享模块名

rsync://用户名@主机地址/共享模块名

需要创建密码文件:

#echo "666666" >/root/rsyncd.pas

#chmod  600  /root/rsyncd.pas

注意这个密码文件rsync服务的密码文件不一样,这个密码文件只有同步用户的密码!!

#rsync -avzH --delete --password-file=/root/rsyncd.pas root@10.0.0.200::config /myweb

#rsync -avzH --delete --password-file=/root/rsyncd.pas rsync://root@10.0.0.200/config  /myweb

rsync常用参数:

基本格式: rsync [选项] 原始位置 目标位置
-r:递归模式,包含目录及子目录中的所有文件
-l:对于符号链接文件仍然复制为链接文件
-v:显示同步过程的详细信息
-a:递归模式,保留文件的权限、属性信息
-z:在传输文件时进行压缩
-p:保留文件的权限标记
-t:保留文件的时间标记
-g:保留文件的属组标记(仅超级用户)
-o:保留文件的属主标记(仅超级用户)
-H:保留硬连接
-A:保留ACL属性信息
-D:保留设备文件及其他特殊文件
--delete:删除目标位置有而原始位置没有的文件
--checksum:根据校验和来决定是否跳过文件

在需要同步的服务器上面执行相同的操作,将ip换成对应的即可。

三、部署sersync

1、 首先要确定服务器已经部署好了rsync,并且测试能成功同步文件,因为sersync依赖于rsync。

去官网下载包,下载需要FQ。

https://code.google.com/archive/p/sersync/downloads

解压后的目录为GNU-Linux-x86。

#tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz

#mv GNU-Linux-x86/ sersync

#cd sersync;ls

confxml.xml  sersync2

confxml.xml是他的配置文件,sersync2是可执行的bin文件。

2、复制一份配置文件,做个备份再修改。

#cp confxml.xml confxml.xml.bak

#cat confxml.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
    <host hostip="localhost" port="8008"></host>
    <debug start="false"/>
    <fileSystem xfs="true"/>
    <filter start="false">
 <exclude expression="(.*)\.svn"></exclude>
 <exclude expression="(.*)\.gz"></exclude>
 <exclude expression="^info/*"></exclude>
 <exclude expression="^static/*"></exclude>
    </filter>
    <inotify>
 <delete start="true"/>
 <createFolder start="true"/>
 <createFile start="true"/>
 <closeWrite start="true"/>
 <moveFrom start="true"/>
 <moveTo start="true"/>
 <attrib start="true"/>
 <modify start="true"/>
    </inotify>

<sersync>
 <localpath watch="/data/mongodata">
     <remote ip="192.168.1.202" name="config"/>
     <!--<remote ip="192.168.8.39" name="tongbu"/>-->
     <!--<remote ip="192.168.8.40" name="tongbu"/>-->
 </localpath>
 <rsync>
     <commonParams params="-artuz"/>
     <auth start="true" users="root" passwordfile="/root/rsyncd.pas"/>
     <userDefinedPort start="true" port="873"/><!-- port=874 -->
     <timeout start="true" time="300"/><!-- timeout=100 -->
     <ssh start="false"/>
 </rsync>
 <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
 <crontab start="true" schedule="600"><!--600mins-->
     <crontabfilter start="false">
  <exclude expression="*.php"></exclude>
  <exclude expression="info/*"></exclude>
     </crontabfilter>
 </crontab>
 <plugin start="false" name="command"/>
    </sersync>

<plugin name="command">
 <param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix-->
 <filter start="false">
     <include expression="(.*)\.php"/>
     <include expression="(.*)\.sh"/>
 </filter>
    </plugin>

<plugin name="socket">
 <localpath watch="/opt/tongbu">
     <deshost ip="192.168.138.20" port="8009"/>
 </localpath>
    </plugin>
    <plugin name="refreshCDN">
 <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
     <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
     <sendurl base="http://pic.xoyo.com/cms"/>
     <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
 </localpath>
    </plugin>
</head>

红色字体为修改项,参数解释:

1)fileSystem xfs="true" :开启xfs文件系统支持

2)<inotify>
 <delete start="true"/>
 <createFolder start="true"/>
 <createFile start="true"/>
 <closeWrite start="true"/>
 <moveFrom start="true"/>
 <moveTo start="true"/>
 <attrib start="true"/>
 <modify start="true"/>
    </inotify>

这段配置是监控的操作,根据需要定制即可。我这里选择全部行为。

3)<localpath watch="/data/mongodata">             本地监控的目录
     <remote ip="192.168.1.202" name="config"/>   需要同步数据的服务器ip、name是rsync里面配置的module。

4)<auth start="true" users="root" passwordfile="/root/rsyncd.pas"/>      同步的用户和密码文件,这个文件内容只有密码。部署rsync时就创建好了
     <userDefinedPort start="true" port="873"/><!-- port=874 -->               rsync服务监听的端口。

3、启动服务

首先要修改linux内核参数:

#sysctl -p

fs.inotify.max_queued_events = 66666666
fs.inotify.max_user_instances = 65535
fs.inotify.max_user_watches = 66666666

queued_events:如果设置的值太小,会出现"** Event Queue Overflow **"错误,导致监控文件不准确

user_watches:必须保证这个值要远大于所监控目录下的文件数。

#cd  /data/sersync

#./sersync2 -d -r -o ./confxml.xml

另外一台服务器,只需要修改localpath  watch、remote ip、name根据rsync的配置修改即可。必须要与需要同步数据的服务器rsync里面的path、address、modulename[config]一致。

重启服务:

#killall sersync2 && rm  -rf  /var/run/rsyncd.pid && /data/sersync/sersync2 -d -o /data/sersync/confxml.xml 2>&1 >>/dev/null

参数解释:

-d 实时同步

-r 一次全量同步

-o 指定配置文件

4、将服务做成开机启动

#echo "/data/sersync/sersync2 -d -o /data/sersync/confxml.xml  2>& 1 >>/dev/null"  >>/root/.bashrc

#source  /root/.bashrc

当然可以写一个启动脚本:

# cat /etc/init.d/sersync
#!/bin/bash
# chkconfig: 90 89 70
# description:it's create by cuishuai useed to start or stop sersync
sersync="/data/sersync/sersync2"
conf="/data/sersync/confxml.xml"

case $1 in

start)
/data/sersync/sersync2 -d -o /data/sersync/confxml.xml 2>&1 >>/dev/null
num=`ps -ef | grep sersync2 | grep -v grep | wc -l`
if [ $num -ne 0 ];then
echo "sersync start  success!"
fi
;;

stop)
killall sersync2 && rm -rf /var/run/rsyncd.pid
;;

restart)
killall sersync2 && rm -rf /var/run/rsyncd.pid && /data/sersync/sersync2 -d -o /data/sersync/confxml.xml 2>&1 >>/dev/null
;;

*)
echo "Usage $0 start|stop|restart"

esac

5、如果要监控多个目录,同步到多主机,需要创建多个sersync的配置文件,由于需要启动多个进程,注意修改监听端口!!,默认是8008:

# cat spark.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
<host hostip="localhost" port="8008"></host>
<debug start="false"/>
<fileSystem xfs="true"/>
<filter start="false">
<exclude expression="(.*)\.svn"></exclude>
<exclude expression="(.*)\.gz"></exclude>
<exclude expression="^info/*"></exclude>
<exclude expression="^static/*"></exclude>
</filter>
<inotify>
<delete start="true"/>
<createFolder start="true"/>
<createFile start="true"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="true"/>
<modify start="true"/>
</inotify>

<sersync>
<localpath watch="/data/spark-2.2.0-bin-hadoop2.7/conf">
<remote ip="10.10.2.13" name="spark_conf"/>
<remote ip="10.10.6.8" name="spark_conf"/>
</localpath>
<rsync>
<commonParams params="-artuz"/>
<auth start="true" users="root" passwordfile="/root/rsyncd.pas"/>
<userDefinedPort start="true" port="873"/><!-- port=874 -->
<timeout start="true" time="300"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
<crontab start="true" schedule="600"><!--600mins-->

# cat hadoop.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
<host hostip="localhost" port="8009"></host>
<debug start="false"/>
<fileSystem xfs="true"/>
<filter start="false">
<exclude expression="(.*)\.svn"></exclude>
<exclude expression="(.*)\.gz"></exclude>
<exclude expression="^info/*"></exclude>
<exclude expression="^static/*"></exclude>
</filter>
<inotify>
<delete start="true"/>
<createFolder start="true"/>
<createFile start="true"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="true"/>
<modify start="true"/>
</inotify>

<sersync>
<localpath watch="/data/hadoop-2.7.3/etc/hadoop">
<remote ip="10.10.2.13" name="hadoop_conf"/>
<remote ip="10.10.5.8" name="hadoop_conf"/>
</localpath>
<rsync>
<commonParams params="-artuz"/>
<auth start="true" users="root" passwordfile="/root/rsyncd.pas"/>
<userDefinedPort start="true" port="873"/><!-- port=874 -->
<timeout start="true" time="300"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
<crontab start="true" schedule="600"><!--600mins-->

启动多个进程:

#/data/sersync2 -d -o  /data/sersync/spark.xml

#/data/sersync2 -d -o  /data/sersync/hadoop.xml

至此,整个的rsync+sersync同步机制就完成了。

附上rsync+inotify搭建:

rsync远程同步:

可以在不同主机之间镜像同步整个目录树,支持增量备份,保持链接和权限,且采用优化的同步算法,传输前进行压缩因此非常适用于异地备份、镜像服务器等。官网:http://rsync.samba.org/

1、在远程同步任务中,负责发起rsync同步操作的客户机称为发起端。
2、负责相应来自客户机的rsync同步操作的服务器称为同步源
3、在同步过程中,同步源负责提供文档的原始位置,发起端应对该位置具有读取权限

下行同步案例:

配置rsync源服务器
ip:10.0.0.200
1、以源目录/var/www/html、备份账号backuper为例
   [root@localhost ~]# yum -y install rsync
   [root@localhost ~]# yum -y install httpd
   [root@localhost ~]# ls /var/www/html/
  
2、建立/etc/rsync.conf配置文件
  uid = nobody
gid = nobody
use chroot = yes
address = 10.0.0.200
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
max connections = 5
motd file = /etc/rsyncd.motd
transfer logging = yes
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300
[wwwroot]
        path = /var/www/html
        comment = document root of www.azui.com
        read only = yes
        dont compress = *.gz *.bz2 *.tgz *.xz *.zip *.rar *.z
        auth users = backuper            #用户必须为系统用户
        secrets file = /etc/rsyncd.secrets
        list = no

exclude = logs/;slaves;master

hosts allow = 10.0.0.250

hosts deny = *
        ignore errors

3、为备份账户创建数据文件
  [root@localhost ~]# useradd backuper
  [root@localhost ~]# echo '123' | passwd --stdin backuper >/dev/null
  [root@localhost ~]# vim /etc/rsyncd.secrets
  baackuper:123
  [root@localhost ~]# chmod 600 /etc/rsyncd.secrets   #必须改否则客户端同步时会报错
  [root@localhost ~]# vim /etc/rsyncd.motd
   ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       wellcom to www.azui.com
      2016-09-12  15:32
      2017-09-18
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

4、启动与关闭rsync服务
  [root@localhost ~]# rsync --daemon  
5、rsync命令的使用

基本格式: rsync [选项] 原始位置 目标位置
-r:递归模式,包含目录及子目录中的所有文件
-l:对于符号链接文件仍然复制为链接文件
-v:显示同步过程的详细信息
-a:递归模式,保留文件的权限、属性信息
-z:在传输文件时进行压缩
-p:保留文件的权限标记
-t:保留文件的时间标记
-g:保留文件的属组标记(仅超级用户)
-o:保留文件的属主标记(仅超级用户)
-H:保留硬连接
-A:保留ACL属性信息
-D:保留设备文件及其他特殊文件
--delete:删除目标位置有而原始位置没有的文件
--checksum:根据校验和来决定是否跳过文件

!!!客户端使用rsync服务
ip:10.0.0.250

rsync同步源的资源表示方式:
用户名@主机地址::共享模块名

rsync://用户名@主机地址/共享模块名

执行以下操作访问rsync同步源,下载到本地/tmp目录下进行备份
rsync -avz backuper@10.0.0.200::/wwwroot  /tmp

rsync -avz rsync://backuper@10.0.0.200/wwwroot  /tmp

--delete的使用:
[root@localhost myweb]# rsync -avz --delete --password-file=/tmp/rsyncd.secrets backuper@10.0.0.200::wwwroot /myweb

由于在客户端需要设置crontab周期计划任务,所以也要建立密码文件
[root@localhost tmp]# vim /tmp/rsyncd.secrets
123  #服务器上设置的密码。只写密码前面什么都不能有
[root@localhost tmp]# chmod 600 /tmp/rsyncd.secrets
[root@localhost myweb]# crontab -e
0 22 * * * /usr/bin/rsync -avz --password-file=/tmp/rsyncd.secrets backuper@10.0.0.200::wwwroot /myweb.$(date +%F/%R)
[root@localhost myweb]# chkconfig crond on

配置rsync+inotify实时同步:上行同步

Linux内核从2.6.13版本开始提供了inotify通知接口,用来监控文件系统的各种变化情况,如文件存取、删除、移动、修改等。利用这一机制,可以非常方便的实现文件异动警告、增量备份
rsync工具与inotify机制组合相结合,实现实时同步-只要原始位置的文档发生变化,则立即启动增量备份操作,否则处于静默等待状态。这样就避免了按固定周期备份是存在的延迟性、周期过密等问题。

发起端:配置
10.0.0.250

1、调整inotify内核参数
 [root@localhost ~]# vim /etc/sysctl.conf
  fs.inotify.max_queued_events = 16384
  fs.inotify.max_user_instances = 1024
  fs.inotify.max_user_watches = 1048576
[root@localhost ~]# sysctl -p
2、安装inotify-tools
 [root@localhost ~]# tar xf inotify-tools-3.14.tar.gz
 [root@localhost ~]# cd inotify-tools-3.14
 [root@localhost ~]# ./configure && make && make install
[root@localhost ~]# inotifywait -mrq -e modify,create,move,delete /var/www/html/   监控
3、编写触发式同步脚本
  [root@localhost ~]# vim /opt/inotify_rsync.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,move,delete,attrib /var/www/html"
RSYNC_CMD="rsync -azH --delete  /var/www/html/ backuper@10.0.0.200:/var/www/html"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
        do
          if [ $(pgrep rsync |wc -l) -le 0 ] ;then
                $RSYNC_CMD
          fi
       done
[root@localhost ~]# chmod +x /opt/inotify_rsync.sh
[root@localhost ~]# yum -y install openssh-clients
[root@localhost ~]# ssh-keygen
[root@localhost ~]# ssh-copy-id backuper@10.0.0.200

另外一端服务器:10.0.0.200
[root@localhost ~]# vim /etc/rsyncd.conf
 把read only = yes 注释掉。
[root@localhost ~]# rm -rf /var/run/rsyncd.pid
[root@localhost ~]# rsync --daemon --config=/etc/rsyncd.conf
[root@localhost ~]# chown -R backuper:backuper /var/www/html/

4、验证

在发起端的/var/www/html下新建文件,然后去10.0.0.200服务器上的/var/www/html下查看。

文件触发式实时同步 Rsync+Sersync Rsync+Inotify-tools的更多相关文章

  1. Rsync+lsync实现触发式实时同步

    使用rsync+lsync实现触发式实时同步 服务器信息 centos6.5 主:192.168.5.4 搭建lsync 从:192.168.5.3 搭建rsync 1.1 从服务器设置 # yum ...

  2. inotify+rsync sersync+rsync实时同步服务

    中小型网站搭建-数据实时的复制-inotify/sersync inotify是一种强大的,细粒度的.异步的文件系统事件监控机制(软件),linux内核从2.6.13起,加入inotify支持,通过i ...

  3. Rsync+sersync(inotify)实现数据实时双向同步

    目录 Rsync+Sersync数据实时同步(双向) 服务介绍 节点声明 编译环境配置 安装Rsync 编辑Rsync配置文件 配置文件解析 配置密码文件 启动rsync验证 安装sersync服务 ...

  4. Linux之sersync数据实时同步

    sersync其实是利用inotify和rsync两种软件技术来实现数据实时同步功能的,inotify是用于监听sersync所在服务器上的文件变化,结合rsync软件来进行数据同步,将数据实时同步给 ...

  5. [转]通过rsync+inotify-tools+ssh实现触发式远程实时同步

    文件的同步镜像在很多地方都需要用到,因此rsync这款免费软件得到了广泛的应用,包括在Windows平台上,都已经有了支持rsync的“cwRsyncServer”. 但是,我们一般都是通过结合cro ...

  6. 数据文件实时同步(rsync + sersync2)

    因近期项目需求,需要同步云端服务器的数据给**方做大数据分析. 思路: 起初只要数据同步,准备开放数据采集接口.但实时性较差,会有延迟. 故而寻觅各种解决方案,最终确定使用 rsync 进行文件同步, ...

  7. Rsync + sersync 实时同步备份

    一      Rsync + Sersync  实时同步介绍 1.Rsync 服务搭建介绍 云机上搭建Rsync server,在本地搭建Rsync Clinet. 2. Sersync 服务搭建介绍 ...

  8. centos7服务搭建常用服务配置之二:Rsync+sersync实现数据实时同步

    目录 1.RSYNC数据备份 1.1 rsync服务简介 1.2 rsync特点和优势 1.3 rysnc运行模式简介 1.4 数据同步方式 2 Rsync实验测试 2.1 实验环境说明 2.2 服务 ...

  9. sersync实现触发式同步

    金山的一个居于inotify+rsync进行二次开发实现文件同步的小工具sersync,能够很方便的实现文件触发式同步 Inotify 是基于inode级别的文件系统监控技术,是一种强大的.细粒度的. ...

随机推荐

  1. Python学习-3.Python的模块加载

    Python中使用import关键字进行模块加载. 先在Visual Studio中建立PythonModuleLoad项目作为演示. 1.同目录加载 建立SameFolder.py文件 写入代码: ...

  2. 如何充分利用 Windows Phone 高清屏幕

    Nokia 最近发布两款6寸大屏手机:Lumia 1520 和 Lumia 1320.为了支持这种设备 WP 升级了操作系统GDR3 支持了 1080P 的高清分辨率(1520),虽然GER3 是提供 ...

  3. Jenkins中执行docker命令报错

    Cannot connect to the Docker daemon. Is the docker daemon running on this host?   在配置Jenkins从Gitlab自 ...

  4. Redis 慢查询

    Redis 慢查询   许多存储系统提供慢查询日志帮助开发和运维人员定位系统的慢操作.慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阈值就将这条命令的相关信息记录下来Redis提供 ...

  5. CSharp如何自定义鼠标样式

    一.如何设置鼠标样式? 在CSharp的WinForm开发中,可以通过下面的API设置鼠标样式: //把鼠标样式设置为十字(系统自带的一种鼠标样式) this.Cursor = Cursors.Cro ...

  6. NETSDK1061错误解决

    NETSDK1061错误解决 在vs生成和运行都正常,发布的时候报错 .netcore控制台项目引用另一个类库 错误信息 NETSDK1061: 项目是使用 Microsoft.NETCore.App ...

  7. 巧用XML配置校验导入Excel的列数据格式

    <?xml version="1.0"?> <ColumnsSeting xmlns:xsd="http://www.w3.org/2001/XMLSc ...

  8. 构建NetCore应用框架之实战篇(四):BitAdminCore框架1.0登录功能细化及技术选型

    本篇承接上篇内容,如果你不小心点击进来,建议从第一篇开始完整阅读,文章内容继承性连贯性. 构建NetCore应用框架之实战篇系列 一.BitAdminCore框架1.0版本 1.1.0版本是指最小版本 ...

  9. C# Po3协议读取邮件内容遇到的问题

    背景:最近在做一个小工具,读取PO3协议邮件服务器的指定人员的邮件,东西做出来了,弄了一个While死循环,20秒执行一次, 结果运行了3天,周一来IT人员找上门来了,你的电脑什么情况,怎么一个小时下 ...

  10. 修改ActiveReports验证文字“给不能为 null 的参数指定一个 null 值”

    转:http://gcdn.gcpowertools.com.cn/showtopic-13759.html ActiveReports官方网站:http://www.gcpowertools.com ...