精华内容
下载资源
问答
  • 实现多线程对共有数据的同步操作,主要涉及到多线程和同步。 虽然都是基础,但是这把刀还是要用熟练,等到使用时候才能得心应手。 以下是示例个: /* * 需求:有生产者和消费者,生产者生产一个,消费...

      ------- android培训java培训、期待与您交流! ----------

     

        实现多线程对共有数据的同步操作,主要涉及到多线程和同步。

        虽然都是基础,但是这把刀还是要用熟练,等到使用的时候才能得心应手。

     

        以下是示例个:

     

    /*
     * 需求:有生产者和消费者,生产者生产一个,消费者才能消费一个,但如果消费者不消费,也不能生产。
     * 知识点:同步,多线程,等待唤醒机制,单例设计模式。*/
    package com.gzjzone.jul242015;
    
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    class ProducerConsumerTest {
        public static void main(String[] args) {
            new Thread(new Producer()).start();
            new Thread(new Consumer()).start();
            new Thread(new Producer()).start();    //多生产者。
            new Thread(new Consumer()).start();    //多消费者。
        }
    
    }
    
    class Product{
    //    单例设计模式:饿汉式。
        private Product(){};
        private static Product product = new Product();
        public static Product getProduct(){
            return product;
        }
        private int pro = 0;
        private boolean flag = false;
        
    //    同步设置
        private Lock lock = new ReentrantLock();
        private Condition con_pro = lock.newCondition();
        private Condition con_con = lock.newCondition();
        
        public void setPro(int pro){
            this.pro = pro;
        }
        public void setFlag(boolean flag){
            this.flag = flag;
        }
        public int getPro(){
            return pro;
        }
        public boolean getFlag(){
            return flag;
        }
        public Lock getLock(){
            return lock;
        }
        public Condition getCon_pro(){
            return con_pro;
        }
        public Condition getCon_con(){
            return con_con;
        }
    }
    
    class Producer implements Runnable {
        Product product = Product.getProduct();
        Lock lock = product.getLock();
        Condition con_pro = product.getCon_pro();
        Condition con_con = product.getCon_con();
        public void run() {
            while (true) {
                lock.lock();
                try {
    //                使用while循环判断标记,可以让线程被唤醒后再次判断while的条件标记。
                    while (product.getFlag()) 
                        con_pro.wait();    
                    int pro = product.getPro();
                    System.out.println(Thread.currentThread().getName()+"生产..."+(++pro));
                    product.setPro(pro);
                    product.setFlag(true);
                } catch (InterruptedException e) {
                    System.out.println("中断异常");
                } finally{
                    con_con.signal();;
                    lock.unlock();
                }            
            }
            
        }
    }
    
    class Consumer implements Runnable {
        Product product = Product.getProduct();
        Lock lock = product.getLock();
        Condition con_pro = product.getCon_pro();
        Condition con_con = product.getCon_con();
        public void run() {
            while (true) {
                lock.lock();
                try {
                    while (!(product.getFlag()))
                        con_con.wait();
                    int pro = product.getPro();
                    System.out.println(Thread.currentThread().getName()+"消费..........."+pro--);
                    product.setPro(pro);
                    product.setFlag(false);
                } catch (InterruptedException e) {
                    System.out.println("中断异常");
                } finally{
                    con_pro.signal();
                    lock.unlock();
                }
            }            
        }        
    }

        运行结果为多个线程不断循环生产1个,消费1个,可以看出生产行为和消费行为达到多线程同步,满足需求。

     

        其中关键点求:

        1.产品是生产者和消费者的共用数据,利用单例设计模式创建产品对象,确认唯一性。
        2.设置标记,通过标记来控制生产消费的次序。

     

    展开全文
  • 文章来源:http://blog.chinaunix.net/u/32831/showart_1289758.html公司一套系统的同步使用donotify,不能实现子目录实时同步,通过查资料,发现inotify可以实现子目录实时同步以下为笔记。一、介绍Inotify...
    公司一套系统的同步使用的donotify,不能实现子目录的实时同步,通过查资料,发现inotify可以实现子目录的实时同步,以下为笔记。

    一、介绍
    Inotify 是文件系统事件监控机制,作为 dnotify 的有效替代。dnotify 是较早内核支持的文件监控机制。Inotify 是一种强大的、细粒度的、异步的机制,它满足各种各样的文件监控需要,不仅限于安全和性能。

    inotify 可以监视的文件系统事件包括:
    IN_ACCESS,即文件被访问
    IN_MODIFY,文件被 write
    IN_ATTRIB,文件属性被修改,如 chmod、chown、touch 等
    IN_CLOSE_WRITE,可写文件被 close
    IN_CLOSE_NOWRITE,不可写文件被 close
    IN_OPEN,文件被 open
    IN_MOVED_FROM,文件被移走,如 mv
    IN_MOVED_TO,文件被移来,如 mv、cp
    IN_CREATE,创建新文件
    IN_DELETE,文件被删除,如 rm
    IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己
    IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己
    IN_UNMOUNT,宿主文件系统被 umount
    IN_CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
    IN_MOVE,文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO)
    注:上面所说的文件也包括目录。 


    二、为能在shell下使用inotify特性,需要安装inotify-tools

    1、inotify-tools:The general purpose of this package is to allow inotify's features to be used from within shell scripts.

    下载地址:http://inotify-tools.sourceforge.net/

    编译安装
    ./configure
    make
    make install
    完成后,注意查看manpage,man inotify 、 man inotifywait


    inotifywait 仅执行阻塞,等待 inotify 事件。您可以监控任何一组文件和目录,或监控整个目录树(目录、子目录、子目录的子目录等等)。在 shell 脚本中使用 inotifywaitinotifywatch 收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。

    2、inotify的系统相关参数:
     /proc interfaces
           The following interfaces can be used to limit the amount of kernel memory consumed by inotify:

           /proc/sys/fs/inotify/max_queued_events
                  The value in this file is used when an application calls inotify_init(2) to set an upper  limit  on  the number  of  events  that  can be queued to the corresponding inotify instance.  Events in excess of this limit are dropped, but an IN_Q_OVERFLOW event is always generated.

           /proc/sys/fs/inotify/max_user_instances
                  This specifies an upper limit on the number of inotify instances that can be created per real user ID.

           /proc/sys/fs/inotify/max_user_watches
                  This specifies a limit on the number of watches that can be associated with each inotify instance.


    3、inotifywait 相关的参数(更多,查看manpage):
    inotifywait
    This command simply blocks for inotify events, making it appropriate for use in shell scripts. It can watch any set of files and directories, and can recursively watch entire directory trees.
    -m, --monitor
                  Instead  of  exiting  after receiving a single event, execute indefinitely.  The default behaviour is to exit after the first event occurs.
    -r, --recursive
                  Watch all subdirectories of any directories passed as arguments.  Watches will be set up recursively  to an  unlimited  depth.   Symbolic  links  are  not 

    traversed.  Newly created subdirectories will also be watched.
    -q, --quiet
                  If specified once, the program will be less verbose.  Specifically, it will not state when it  has  completed establishing all inotify watches.
     -e <event>, --event <event>
                  Listen for specific event(s) only.  The events which can be listened for are listed in the  EVENTS  section.  This option can be specified more than once.  If omitted, all events are listened for. use“,”separate multi events


    三、使用
    1.查看是否支持inotify,从kernel 2.6.13开始正式并入内核,RHEL5已经支持。
    看看是否有 /proc/sys/fs/inotify/目录,以确定内核是否支持inotify
    [root@RHEL5 Rsync]# ll /proc/sys/fs/inotify
    total 0
    -rw-r--r-- 1 root root 0 Oct  9 09:36 max_queued_events
    -rw-r--r-- 1 root root 0 Oct  9 09:36 max_user_instances
    -rw-r--r-- 1 root root 0 Oct  9 09:36 max_user_watches

    2.关于递归:
    inotifywait
    This command simply blocks for inotify events, making it appropriate for use in shell scripts. It can watch any set of files and directories, and can recursively watch entire directory trees.


    3.使用:
    #!/bin/sh
    src=/opt/webmail
    des=/tmp
    ip=192.168.7.192

    /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w%f' /
     -e modify,delete,create,attrib /
    ${src} /
    | while read  file
            do
                    rsync -avz --delete --progress ${src} root@${ip}:${des} &&
                    echo "${src} was rsynced"
                    echo "---------------------------------------------------------------------------"
            done
    注:
    当要排出同步某个目录时,为rsync添加--exculde=PATTERN参数,注意,路径是相对路径。详细查看man rsync
    当要排除都某个目录的事件监控的处理时,为inotifywait添加--exclude或--excludei参数。详细查看man inotifywait

    另:
    /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w%f' /
     -e modify,delete,create,attrib /
    ${src} /
    上面的命令返回的值类似于:
    10/03/09 15:31 /wwwpic/1
    这3个返回值做为参数传给read,关于此处,有人是这样写的:
    inotifywait -mrq -e create,move,delete,modify $SRC | while read D E F;do
    细化了返回值。



    说明: 当文件系统发现指定目录下有如上的条件的时候就触发相应的指令,是一种主动告之的而非我用循环比较目录下的文件的异动,该程序在运行时,更改目录内的文件时系统内核会发送一个信号,这个信号会触发运行rsync命令,这时会同步源目录和目标目录。
    --timefmt:指定输出时的输出格式
       --format:  '%T %w%f'指定输出的格式,上面的输出类似于:12/10/08 06:34 /opt/webmail/dovecot-1.1.2/src/test/1


    小脚本,同步到多台主机:
    文件: inotify_rsync.tar.gz
    大小: 1KB
    下载: 下载



    参考:




    关于减少rsync的遍历,未完:
    考虑到被监测的目录每次有一下时间时都会触发rsync,
    modify,delete,create,move
    每次rsync都会遍历源目录,当被监测目录内文件特别多时,会造成系统资源的严重消耗,所以,
    让rsync每次只同步修改的文件。

    因为,如果从监控目录mv走一个目录,那么rsync只会报告找不到你移走的目录而无法删除备份机的应该删除的目录。

    所以,对于删除这个事件,没有办法了,只能同步源目录了。

    将事件分为两部分,modify,create,move事件,触发rsync,只同步修改了的文件。

    delete事件,同步整个源目录。

    关于脚本内容的一些说明:
    rsync.conf里的目录格式一定要注意,没有最后的“/"

    boot.sh
    对于rsync命令的目标地址,是由两部分组成的:
    1、rsync.conf里的dest
    des=`grep '^dest' ${basedir}/rsync.conf| cut -d '=' -f 2 `
    2、被修改了的文件的完全路径,去掉源目录部分,去掉被修改的文件的文件名。
    mb=`echo $file|awk -F "/" '{NF=NF-1;OFS="/";print $0}'|sed "s#$src##g"`




    boot.sh
    #######################################################################################3
    basedir=/EBS/rsync
    destNum=`grep -c '^dest' ${basedir}/rsync.conf`
    src=`grep 'local directory=' ${basedir}/rsync.conf|cut -d '=' -f 2`
    des=`grep '^dest' ${basedir}/rsync.conf| cut -d '=' -f 2 `
    #src_fin=`grep 'local directory=' ${basedir}/rsync.conf|awk -F "/" '{print $NF}'`
    #des_fin=$des/$src_fin


    #
    /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w%f' /
     -e modify,create,move  ${src} | while read  date time file
            do
                    for i in $des
                    do
                            #echo $src
                            echo $file
                            mb=`echo $file|awk -F "/" '{NF=NF-1;OFS="/";print $0}'|sed "s#$src##g"`

                            des_fin=$i$mb
                            echo $des_fin
    echo                    rsync -avz --delete --progress $file $des_fin  
                    done
            done

    ############################################################################################

    rsync。conf
    local directory=/EBS/www/projects
    #dest_here


    相关参考:
    展开全文
  • 3、基本概念为了更好理解和配置MySQL,需要提前了解以下概念,由于我们在项目中使用...视图可以嵌套,但不能索引,也不能有关 联触发器或默认值。并非所有视图都是可更新,如果MySQL不能正确确定被更新基数...

    3、基本概念

    为了更好的理解和配置MySQL,需要提前了解以下概念,由于我们在项目中使用的功能有限,所以仅介绍一些基本概念。

    3.1 视图

    视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询(即:包含一 个SQL查询),仅仅是用来查看存储在别处的数据的一种设施。视图可以嵌套,但不能索引,也不能有关 联的触发器或默认值。并非所有视图都是可更新的,如果MySQL不能正确确定被更新的基数据,则不允 许更新(包括插入和删除)。视图不能更新的情况:(1)分组,使用GROUP BY和HAVING;(2)联接; (3)子查询;(4)并;(5)聚集函数,Min/Count/Sum等;(6)DISTINCT;(7)导出列。

    3.2 存储过程

    存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合(实际上是一种函数),可将其视为批处理文件,虽然它们的作用不仅限于批处理。使用存储过程有3个主要的好处:简单、安全、高性能。比如启动的服务,相关的设定等。

    3.3 触发器

    触发器是MySQL响应DELETE/INSERT/UPDATE语句而自动执行的一条MySQL语句(或位于BEGIN/END间的一组语句)。只有表才支持触发器,视图不支持,临时表也不支持。触发器按每个表每个事件每次地定义,每个表每个事件每次只允许一个触发器,所以每个表最多支持6个触发器(每条INSERT、UPDATE和DELETE的之前和之后)。单一触发器不能与多个事件或多个表关联。

    4、MySQL的结构图

    为了更好的了解和配置MySQL,就必须先了解一下MySQL的体系结构。如下图所示:

    b282240a2e00469fd2f1c1993bb11b3d.png

    ▲MySQL体系架构图

    理解MySQL的体系架构对于成功的配置和调试至关重要。以下将对架构图进行简要的说明:

    ① Connectors指的是不同语言中与SQL的交互接口,例如适用于Java的JDBC,.Netframework的ODBC。

    ② Management Serveices & Utilities:系统管理和控制工具集合,例如备份还原,安全复制等功能。

    ③ Connection Pool:连接池,用于管理缓冲用户连接,线程处理等需要缓存的需求。

    ④ SQL Interface:SQL接口,用于接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface。

    ⑤ Parser:解析器,用于SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。

    ⑥ Optimizer:查询优化器,用于SQL语句在查询之前会使用查询优化器对查询进行优化。他使用的是“选取-投影-联接”策略进行查询。

    ⑦ Cache和Buffer:查询缓存,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等。

    ⑧ Engine:存储引擎,存储引擎是MySql中具体的与文件打交道的子系统。也是Mysql最具有特色的一个地方。Mysql的存储引擎是插件式的。它根据MySql提供的文件访问层的一个抽象接口来定制一种文件访问机制(这种访问机制就叫存储引擎)。现在有很多种存储引擎,各个存储引擎的优势各不一样,最常用的MyISAM,InnoDB,BDB。

    二、MySQL环境准备

    为了便于看到效果,此文中我们将提前安装两个带有MySQL软件的Redhat6.5操作系统作为AB两个数据库服务器。操作系统和MySQL的安装并非此文章的介绍重点,详细安装步骤可以参照此链接(http://www.mysql.com/downloads/)。

    以下架构,简单描述了两台MySQL服务器自动同步数据的过程。

    1、硬件列表

    ▲Master数据库服务器

    ▲ Slave数据库服务器

    2、逻辑部署架构图

    1b3bfe9dcb6e324fe3496b4d1a4434a1.png

    ▲MySQL同步逻辑架构图

    三、MySQL 的数据库同步配置

    1、配置Develop数据库同步

    配置的前提是,我们已经顺利的将MySQL组件安装到了两个不同的系统中,并分别创建了developDB和testingDB同时建议将selinux功能关闭,开放所有的防火墙。通过ssh指令,可以远程登录到安装好的Linux服务器,可以通过如下指令,检查MySQL是否安装及其版本。

    ▲软件及版本检查

    1、首先开始对开发数据库设置开发数据库同步,通过Linux自带的VI工具打开MySQL的配置文件。

    my.cnf,路径为/etc/my.cnf。添加以下内容:

    server-id=1 (mysql标示)

    log-bin=mysql-bin(开启log-bin二进制日志文件,默认存在/var/lib/mysql下日志文 件以mysql-bin为开头)

    binlog-do-db =developDB(developDB为需要同步的数据库名,如需同步多个数据库,可以另起行如binlog-do-db =testing)

    # binlog-ignore-db=db_name (不进行同步日志的数据库,不需要的话注释掉)

    max-binlog-size=104857600(日志的大小,超出会自动生成一个新的)

    master-host=192.168.2.4(同步主机)

    master-user=develop(同步用户)

    master-password=*****(同步用户密码)

    master-port=3306

    replicate-do-db=developDB(同步数据库)

    修改完后保存退出,并重启mysql 如:service mysql restart (重启正常,表示配置没错误)

    2、在作为开发数据库的mysql上建立一个账户专门用于测试数据库来进行数据同步。

    ▲授权访问

    在测试数据库上测试账户develop是否可以访问开发数据库上的mysql。

    mysql -u develop -p -h 192.168.2.4(输入密码***,可以访问说明设置正确)

    2、配置Testing数据库同步

    通过ssh指令,可以远程登录到安装好的另一台Linux服务器,可以通过如下指令,检查MySQL是否安装及其版本。

    ▲软件及版本检查

    1、首先开始对测试数据库设置数据库同步,通过Linux自带的VI工具打开MySQL的配置文件

    my.cnf,路径为/etc/my.cnf。添加如下内容:

    server-id= 2 (mysql标示,不能出现重复)

    log-bin=mysql-bin(开启log-bin二进制日志文件,默认存在/var/lib/mysql下日志文件以mysql-bin为开头)

    binlog-do-db = developDB(developDB为需要同步的数据库名,如需同步多个数据库,可以另起行如binlog-do-db=testing)

    max-binlog-size=104857600(日志的大小,超出会自动生成一个新的

    master-host=192.168.2.3 (同步Master的ip地址)

    master-user=develop(同步所需的账号)

    master-password=***** (同步账号的密码)

    master-port=3306 (mstart 中mysql的访问端口)

    replicate-do-db=developDB (所需同步的数据库名)

    master-connect-retry=60 (主服务器宕机或连接丢失的情况下,从服务器线程重新尝试连接主服务器之前睡眠的秒数。

    log-bin=mysql-bin (开启log-bin二进制日志文件)

    修改完后保存退出,并重启mysql,service mysql restart (重启正常,表示配置没错误)

    2、在作为测试数据库的mysql上建立一个账户专门用于开发数据库来进行数据同步。

    ▲授权访问

    在开发数据库上测试账户develop是否可以访问测试数据库上的mysql。

    mysql -u develop -p -h 192.168.2.3(输入密码***,可以访问说明设置正确)

    3、验证数据库同步

    完成双方数据库同步的配置后,我们需要在不同的主机进行配置验证。首先通过ssh登录开发数据库mysql> 输入show master status;,显示如下信息:

    +------------------+----------+--------------+------------------+

    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

    +------------------+----------+--------------+------------------+

    | mysql-bin.000005 | 189 | developDB | |

    +------------------+----------+--------------+------------------+

    1 row in set (0.00 sec)

    mysql>输入 show slave status\G

    *************************** 1. row ***************************

    Slave_IO_State: Waiting for master to send event

    Master_Host: 192.168.2.3

    Master_User: develop

    Master_Port: 3306

    Connect_Retry: 60

    Master_Log_File: mysql-bin.000005

    Read_Master_Log_Pos: 207

    Relay_Log_File: mysqld-relay-bin.000002

    Relay_Log_Pos: 344

    Relay_Master_Log_File: mysql-bin.000005

    Slave_IO_Running: Yes

    Slave_SQL_Running: Yes

    Replicate_Do_DB: developDB

    Replicate_Ignore_DB:

    Replicate_Do_Table:

    Replicate_Ignore_Table:

    Replicate_Wild_Do_Table:

    Replicate_Wild_Ignore_Table:

    Last_Errno: 0

    Last_Error:

    Skip_Counter: 0

    Exec_Master_Log_Pos: 207

    Relay_Log_Space: 344

    Until_Condition: None

    Until_Log_File:

    Until_Log_Pos: 0

    Master_SSL_Allowed: No

    Master_SSL_CA_File:

    Master_SSL_CA_Path:

    Master_SSL_Cert:

    Master_SSL_Cipher:

    Master_SSL_Key:

    Seconds_Behind_Master: 0

    1 row in set (0.00 sec)

    通过sssh 登录测试数据库输入以下命令:

    mysql> show master status;

    +------------------+----------+--------------+------------------+

    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

    +------------------+----------+--------------+------------------+

    | mysql-bin.000005 | 207 | developDB | |

    +------------------+----------+--------------+------------------+

    1 row in set (0.00 sec)

    mysql> show slave status\G

    *************************** 1. row ***************************

    Slave_IO_State: Waiting for master to send event

    Master_Host: 192.168.2.4

    Master_User: develop

    Master_Port: 3306

    Connect_Retry: 60

    Master_Log_File: mysql-bin.000005

    Read_Master_Log_Pos: 189

    Relay_Log_File: mysqld-relay-bin.000002

    Relay_Log_Pos: 326

    Relay_Master_Log_File: mysql-bin.000005

    Slave_IO_Running: Yes

    Slave_SQL_Running: Yes

    Replicate_Do_DB: developDB

    Replicate_Ignore_DB:

    Replicate_Do_Table:

    Replicate_Ignore_Table:

    Replicate_Wild_Do_Table:

    Replicate_Wild_Ignore_Table:

    Last_Errno: 0

    Last_Error:

    Skip_Counter: 0

    Exec_Master_Log_Pos: 189

    Relay_Log_Space: 326

    Until_Condition: None

    Until_Log_File:

    Until_Log_Pos: 0

    Master_SSL_Allowed: No

    Master_SSL_CA_File:

    Master_SSL_CA_Path:

    Master_SSL_Cert:

    Master_SSL_Cipher:

    Master_SSL_Key:

    Seconds_Behind_Master: 0

    1 row in set (0.00 sec)

    如果两次的命令输入均显示如下内容,就证明我们的配置已经成功并生效。

    Slave_IO_Running: Yes

    Slave_SQL_Running: Yes

    四、测试

    通过前面的配置和验证,两台MySQL服务器已经建立了同步机制并可以正常运行了。下面将通过在双方数据库上添加新的表,来测试另外的服务器上是否可以及时同步过去。

    1、首先登录开发数据库,在数据库developDB中建立一张新表,名字为test。

    mysql>use developDB;

    mysql>create table test(id int);

    完成后,转到测试数据库服务器,通过如下命令查询,是否已经同步。

    mysql>use developDB;

    mysql>show tables;

    +------------------+

    | Tables_in_developDB |

    +------------------+

    | test |

    +------------------+

    1 row in set (0.00 sec)

    由此可以知道,新建表格test已经被同步到测试数据库中。

    2、登录测试数据库服务器,在数据库developDB中建立一张新表,名字为test2。

    mysql>use developDB;mysql>create table test2(id int);

    完成后,转到开发数据库服务器,通过如下命令查询,是否已经同步。

    mysql>use developDB;

    mysql>show tables;

    +------------------+

    | Tables_in_developDB |

    +------------------+

    | test2 |

    +------------------+

    1 row in set (0.00 sec)

    通过测试可以确认,数据库可以进行双向的自动同步,确保数据的冗余和高可用。

    五、总结

    本文主要介绍了MySQL同步的配置及验证,通过配置使其应用到实际的生产环境中。除此之外,也可以利用my.cnf配置文件,实现单向及多主的同步,甚至有选择性的同步。本文中暂时不讨论其他的同步方式,建议参考MySQL的官方文档。

    展开全文
  • 公司一套系统的同步使用donotify,不能实现子目录实时同步,通过查资料,发现inotify可以实现子目录实时同步以下为笔记。一、介绍Inotify 是文件系统事件监控机制,作为 dnotify 有效替代。dnotify 是较早...

     公司一套系统的同步使用的donotify,不能实现子目录的实时同步,通过查资料,发现inotify可以实现子目录的实时同步,以下为笔记。

    一、介绍
    Inotify 是文件系统事件监控机制,作为 dnotify 的有效替代。dnotify 是较早内核支持的文件监控机制。Inotify 是一种强大的、细粒度的、异步的机制,它满足各种各样的文件监控需要,不仅限于安全和性能。

    inotify 可以监视的文件系统事件包括:
    IN_ACCESS,即文件被访问
    IN_MODIFY,文件被 write
    IN_ATTRIB,文件属性被修改,如 chmod、chown、touch 等
    IN_CLOSE_WRITE,可写文件被 close
    IN_CLOSE_NOWRITE,不可写文件被 close
    IN_OPEN,文件被 open
    IN_MOVED_FROM,文件被移走,如 mv
    IN_MOVED_TO,文件被移来,如 mv、cp
    IN_CREATE,创建新文件
    IN_DELETE,文件被删除,如 rm
    IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己
    IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己
    IN_UNMOUNT,宿主文件系统被 umount
    IN_CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
    IN_MOVE,文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO)
    注:上面所说的文件也包括目录。


    二、为能在shell下使用inotify特性,需要安装inotify-tools

    1、inotify-tools:The general purpose of this package is to allow inotify's features to be used from within shell scripts.

    下载地址:http://inotify-tools.sourceforge.net/

    编译安装
    ./configure
    make
    make install
    完成后,注意查看manpage,man inotify 、 man inotifywait


    # inotifywait 仅执行阻塞,等待 inotify 事件。您可以监控任何一组文件和目录,或监控整个目录树(目录、子目录、子目录的子目录等等)。在 shell 脚本中使用 inotifywait。
    # inotifywatch 收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。

    2、inotify的系统相关参数:
    /proc interfaces
    The following interfaces can be used to limit the amount of kernel memory consumed by inotify:

    /proc/sys/fs/inotify/max_queued_events
    The value in this file is used when an application calls inotify_init(2) to set an upper  limit  on  the number  of  events  that  can be queued to the corresponding inotify instance.  Events in excess of this limit are dropped, but an IN_Q_OVERFLOW event is always generated.

    /proc/sys/fs/inotify/max_user_instances
    This specifies an upper limit on the number of inotify instances that can be created per real user ID.

    /proc/sys/fs/inotify/max_user_watches
    This specifies a limit on the number of watches that can be associated with each inotify instance.


    3、inotifywait 相关的参数(更多,查看manpage):
    inotifywait
    This command simply blocks for inotify events, making it appropriate for use in shell scripts. It can watch any set of files and directories, and can recursively watch entire directory trees.
    -m, --monitor
    Instead  of  exiting  after receiving a single event, execute indefinitely.  The default behaviour is to exit after the first event occurs.
    -r, --recursive
    Watch all subdirectories of any directories passed as arguments.  Watches will be set up recursively  to an  unlimited  depth.   Symbolic  links  are  not

    traversed.  Newly created subdirectories will also be watched.
    -q, --quiet
    If specified once, the program will be less verbose.  Specifically, it will not state when it  has  completed establishing all inotify watches.
    -e <event>, --event <event>
    Listen for specific event(s) only.  The events which can be listened for are listed in the  EVENTS  section.  This option can be specified more than once.  If omitted, all events are listened for. use“,”separate multi events


    三、使用
    1.查看是否支持inotify,从kernel 2.6.13开始正式并入内核,RHEL5已经支持。
    看看是否有 /proc/sys/fs/inotify/目录,以确定内核是否支持inotify
    [root@RHEL5 Rsync]# ll /proc/sys/fs/inotify
    total 0
    -rw-r--r-- 1 root root 0 Oct  9 09:36 max_queued_events
    -rw-r--r-- 1 root root 0 Oct  9 09:36 max_user_instances
    -rw-r--r-- 1 root root 0 Oct  9 09:36 max_user_watches

    2.关于递归:
    inotifywait
    This command simply blocks for inotify events, making it appropriate for use in shell scripts. It can watch any set of files and directories, and can recursively watch entire directory trees.


    3.使用:
    #!/bin/sh
    src=/opt/webmail
    des=/tmp
    ip=192.168.7.192

    /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w%f' /
    -e modify,delete,create,attrib /
    ${src} /
    | while read  file
    do
    rsync -avz --delete --progress ${src} root@${ip}:${des} &&
    echo "${src} was rsynced"
    echo "---------------------------------------------------------------------------"
    done
    注:
    当要排出同步某个目录时,为rsync添加--exculde=PATTERN参数,注意,路径是相对路径。详细查看man rsync
    当要排除都某个目录的事件监控的处理时,为inotifywait添加--exclude或--excludei参数。详细查看man inotifywait

    另:
    /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w%f' /
    -e modify,delete,create,attrib /
    ${src} /
    上面的命令返回的值类似于:
    10/03/09 15:31 /wwwpic/1
    这3个返回值做为参数传给read,关于此处,有人是这样写的:
    inotifywait -mrq -e create,move,delete,modify $SRC | while read D E F;do
    细化了返回值。

    注:要取得监控文件发生的事件,在--format处指定%e参数,同时,使用--event参数来指定要监控的事件即可,如--format  '%T %w%f %e' --event modify,delete,create,attrib


    说明: 当文件系统发现指定目录下有如上的条件的时候就触发相应的指令,是一种主动告之的而非我用循环比较目录下的文件的异动,该程序在运行时,更改目录内的文件时系统内核会发送一个信号,这个信号会触发运行rsync命令,这时会同步源目录和目标目录。
    --timefmt:指定输出时的输出格式
    --format:  '%T %w%f'指定输出的格式,上面的输出类似于:12/10/08 06:34 /opt/webmail/dovecot-1.1.2/src/test/1


    小脚本,同步到多台主机:

    文件:    inotify_rsync.tar.gz
    大小:    1KB
    下载:    下载

    更改后,更简单,适用于同步到相同的目录,监控多目录,多文件,同步到多台服务器

    #!/bin/sh

    #set -x


    #var

    src="/usr/local/nginx/html/lib /usr/local/nginx/html/www /usr/local/nginx/html/var/www.work.com.conf.php"

    des_ip="172.18.1.35 172.18.1.36 172.18.1.37 172.18.1.38"



    #function

    inotify_fun ()

    {

    /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y-%H:%M' --format '%T %w%f' /

    -e modify,delete,create,move $1|while read time file

    do

    for ip in $des_ip

    do

    echo "`date +%Y%m%d-%T`: rsync -avzq --delete --progress $1 $ip:`dirname $1`"

    rsync -avzq --delete --progress $1 $ip:`dirname $1`

    echo

    done

    done

    }


    #main

    for a in $src

    do

    inotify_fun $a &

    done




    参考:
    http://www.ibm.com/developerworks/cn/linux/l-ubuntu-inotify/index.html




    关于减少rsync的遍历,未完:
    考虑到被监测的目录每次有一下时间时都会触发rsync,
    modify,delete,create,move
    每次rsync都会遍历源目录,当被监测目录内文件特别多时,会造成系统资源的严重消耗,所以,
    让rsync每次只同步修改的文件。

    因为,如果从监控目录mv走一个目录,那么rsync只会报告找不到你移走的目录而无法删除备份机的应该删除的目录。

    所以,对于删除这个事件,没有办法了,只能同步被删除文件或目录的上级目录了。

    将事件分为两部分,modify,create,move事件,触发rsync,只同步修改了的文件。

    delete事件,同步被删除文件或目录的上级目录(不能越过要同步的根目录)。

    关于脚本内容的一些说明:
    rsync.conf里的目录格式一定要注意,没有最后的“/"

    boot.sh
    对于rsync命令的目标地址,是由两部分组成的:
    1、rsync.conf里的dest
    des=`grep '^dest' ${basedir}/rsync.conf| cut -d '=' -f 2 `
    2、被修改了的文件的完全路径,去掉源目录部分,去掉被修改的文件的文件名。
    mb=`echo $file|awk -F "/" '{NF=NF-1;OFS="/";print $0}'|sed "s#$src##g"`




    boot.sh
    #######################################################################################
    先做个记录,脚本在delete部分还有问题
    #!/bin/sh

    #
    basedir=/home/jason/Rsync
    destNum=`grep -c '^dest' ${basedir}/rsync.conf`
    src=`grep 'local directory=' ${basedir}/rsync.conf|cut -d '=' -f 2`
    des=`grep '^dest' ${basedir}/rsync.conf| cut -d '=' -f 2 `


    #
    inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w%f %e' /
    --event modify,create,move,delete  ${src} | while read  date time file event
    do
    echo $event
    for i in $des
    do

    case $event in
    MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR)
    #echo $src
    no_src_root_file_name=`echo $file|sed "s#$src##g"`
    final_target_dest=$i$no_src_root_file_name


    source : http://blog.chinaunix.net/u/32831/showart_1289758.html

    展开全文
  • 来源:荣文笔记本角落 作者:荣文 更新时间:2010-06-18 | 字体:大 中 小】公司一套系统的同步使用donotify,不能实现子目录实时同步,通过查资料,发现inotify可以实现子目录实时同步以下为笔记。...
  • 公司一套系统的同步使用donotify,不能实现子目录实时同步,通过查资料,发现inotify可以实现子目录实时同步以下为笔记。 一、介绍 Inotify 是文件系统事件监控机制,作为 dnotify 有...
  • 之前网络上收集到的一些关于数据同步的资料 ...表结构不能更改,同步双方的表结构必须一致,一旦表结构发生更改需要重新生成数据库快照。 对于大数据量的同步没有可靠的保证。 网络不稳定的情况下同步也...
  • Windows服务器之间实现文件实时同步? 做公安项目,要实现内外网文件... 1、能从外往里访问,在里面不能访问外面(应该是服务器被屏蔽了,可能是公安部规定“一机多用”) 2、桥梁作用,外网 ===》前置...
  • python实现SVN同步更新(一)2011年4月份毕业,就职于现在公司。科室内利用SVN进行知识共享,但是SVN部署在内网环境下,而大家都有外网(可以连internet网)也访问和更新该知识库需求,这是老板看到了坐在角落...
  • HashMap是不支持同步的不能用于多线程中。而HashTable是同步的,这个日后再论。我们可以使用以下两种方法来实现HashMap的同步: 使用ConcurrentHashMap 使用Collections.synchronizedMap获取同步map 使用...
  • 由于火狐浏览器(firefox)拥有国际版和中国版两个不同服务器,因而互相之间账号独立,不能相互同步书签。而ubuntu系统中自带firefox浏览器是国际版,为了能够和Windows下中文版火狐浏览器共用账号,实现...
  • elasticsearch-jdbc V2.3.2.0版本需要安装。以下使用elasticsearch也是2.3.2测试。 操作系统:CentOS release 6.5 1)elasticsearch 2.4.4安装成功,测试ok。 2)mysql安装成功,能实现增、删、改、查。...
  • 这是主机运行状况测试,用于检查主机系统时钟是否与其 NTP 服务器不同步。该测试检查“ntpdc -c loopinfo”命令报告主机时钟偏差绝对值是否未过大。如果该命令失败或主机 NTP 后台程序未运行,该测试将返回...
  • 逻辑器件的同步设计

    2021-01-19 23:09:48
    但经过重新布线设计后,该设计不能正常工作。出现这些问题,基本上是在设计中出现了异步设计。典型异步电路有以下几种。  (1)组合环路  组合环路是数字逻辑设计中不稳定性和不可靠性常见原因之一。在同步...
  • 高可用是通过设计,减少系统不能提供服务时间,是分布式系统基础也是保障系统可靠性重要手段。而 Redis 作为一款普及率最高内存型中间件,它高可用技术也非常成熟。 Redis 是如何保证系统高可用?它...
  • HashMap的高级用法:同步HashMap是不支持同步的不能用于多线程中。而HashTable是同步的,这个日后再论。我们可以使用以下两种方法来实现HashMap的同步:使用ConcurrentHashMap使用Collections.synchronizedMap获取...
  • 为了实现对临界资源互斥访问,同时保证系统整体性能,需要遵循以下原则: 空闲让进。临界区空闲时,可以允许一个请求进入临界区进程立即进入临界区; 忙则等待。当已有进程进入临界区时,其他试图进入临界区...
  • 但经过重新布线设计后,该设计不能正常工作。出现这些问题,基本上是在设计中出现了异步设计。典型异步电路有以下几种。  (1)组合环路  组合环路是数字逻辑设计中不稳定性和不可靠性最常见原因之一。在同步...
  • 高可用是通过设计,减少系统不能提供服务时间,是分布式系统基础也是保障系统可靠性重要手段。而 Redis 作为一款普及率最高内存型中间件,它高可用技术也非常成熟。 我们本课时面试题是,Redis 是如何...
  • elasticsearch-jdbc V2.3.2.0版本需要安装。以下使用elasticsearch也是2.3.2测试...2)mysql安装成功,能实现增、删、改、查。可供测试数据库为test,表为cc,具体信息如下:mysql> select * from cc;+----+...
  • 高可用是通过设计,减少系统不能提供服务时间,是分布式系统基础也是保障系统可靠性重要手段。而 Redis 作为一款普及率最高内存型中间件,它高可用技术也非常成熟。 我们本课时面试题是,Redis 是...
  • java中的同步机制

    2015-01-28 14:37:23
    在多线程环境下,被synchronized修饰代码段在一段时间内只能被一个线程访问,不能被多个线程同时执行。synchronized既可以加在一段代码上,也可以加在一个方法上。以下是java中的同步机制。 1.当两个并发线程访问...
  • 按照这个含义,最终含义就是 对数据库影响只能是一次性不能重复处理。如何保证其幂等性,通常有以下手段:数据库建立唯一性索引,可以保证最终插入数据库只有一条数据token机制,每次接口请求前先获取一个...
  • ( HashMap类大致相当于Hashtable ,除了它是不同步的,并允许null)。这个类不能保证地图的顺序;特别是,它不能保证订单在一段时间内保持不变。 假设哈希函数在这些存储桶之间正确分散元素,这个实现为基本操作( ...
  • oracle 表同步

    千次阅读 2013-10-11 21:34:45
    数据同步概述 利用oracle的dblink和...可按照要求设置同步的间隔时间,不能时时同步。 2.  数据同步为增量同步,只同步增删改数据,不适合变化频繁的表。 3.  此方案为表数据同步,同步设置需要表有主键。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 678
精华内容 271
关键字:

以下不能实现同步的是