Hits : 5764

Frequently asked questions for PIrsynD


FAQ – PIrsyncD


PIrsyncD : Python Inotify Rsync Daemon


top


Τι είναι η python;


Η python είναι μία scripting γλώσσα προγραμματισμού.
Αποτελεί το προγραμματιστικό εργαλείο για την ανάπτυξη του PIrsyncD.


top


Τι είναι το inotify;


To inotify είναι ένα υποσύστημα του πυρήνα το οποίο γράφτηκε με σκοπό να αντικαταστήσει το dnotify.
Το όνομα του υποσυστήματος προκύπτει από τις λέξεις: inode + notify και η λειτουργία του είναι
να ειδοποιεί για οποιαδήποτε αλλαγή αρχείου σε επίπεδο inode.


mini παρουσίαση


top


Τι είναι το rsync;


Το rsync είναι ένα πρόγραμμα με το οποίο μπορούμε να συγχρονίσουμε δύο καταλόγους.
Οι κατάλογοι μπορεί να είναι τοπικοί σε ένα σύστημα ή απομακρυσμένοι σε κάποιο άλλο.


Το βασικό του πλεονέκτημα είναι ότι χρησιμοποιεί έναν αλγόριθμο ώστε να χωρίσει τα αρχεία σε μικρότερα (chunks)
κι ελέγχει την ακεραιότητά τους. Εάν βρεθούν διαφορές τότε αντιγράφει μόνο τις αλλαγές.


top


Τι είναι το daemon;


Η δυνατότητα να τρέχει ένα πρόγραμμα στο παρασκήνιο, χωρίς να διακόπτεται η λειτουργία του.
Στο pirsyncd παρέχει την δυνατότητα συνεχούς παρακολούθησης του kernel stack για inotify events


Ο πυρήνας μου έχει το inotify;


το subsystem παρουσιάστηκε ως patch στην έκδοση 2.6.12 κι από την έκδοση 2.6.13 αποτελεί μέρος του πυρήνα.


Μπορώ να το αφαιρέσω ή να το ενεργοποιήσω εάν δεν το έχω;


Ναι, ως υποσύστημα μπορεί να ενεργοποιηθεί ή απενεργοποιηθεί τροποποιώντας το .config αρχείο από τον πηγαίο κώδικα του πυρήνα.


top


Πως λειτουργεί;


Για κάθε αλλαγή σε επίπεδο inode καταχωρεί το αντίστοιχο event σε ένα kernel stack.
Για να δει κανείς το μέγεθος του kernel stack απλά πληκτρολογεί την εξής εντολή:


cat /proc/sys/fs/inotify/max_queued_events


Η προεπιλεγμένη τιμή είναι 16k (16384)


Γιατί να μην τρέξω ένα rsync κάνοντας χρήση του cron;


Μερικοί από τους λόγους είναι οι εξής:
α. Χρονική απόκριση.
β. Αποδοτικότητα.
γ. Ταχύτητα.
δ. Χρονο-απαίτηση.
ε. Απαίτηση crond.


α. Χρονική απόκριση.


Παρουσιάζεται το εξής πρόβλημα: κάθε πότε θα κάνω rsync μέσω cron;
Εάν πραγματοποιώ ανά μία ώρα τον συγχρονισμό ανάμεσα στους καταλόγους, προκύπτει μία χρονική απόκριση μίας ώρας.
Εάν τρέχω το rsync ανά 5 λεπτά, τότε προκύπτουν τα εξής 2 προβλήματα

  1. Μπορεί να μην έχει ολοκληρωθεί το αρχικό rsync
  2. Μπορεί να ξεκινήσει ένα νέο rsync το οποίο θα έχει λανθασμένο file listing (αρχεία με χρόνο ζωής < 5λεπτών)

β. Αποδοτικότητα.


Μέσω cron, θα εκτελείται συνεχώς το rsync ακόμα κι όταν ΔΕΝ έχουν γίνει καθόλου αλλαγές.
Με αυτό τον τρόπο προσδίδω περισσότερο φόρτο στο σύστημά μου.


γ. Ταχύτητα.


Εάν βάλω το cron entry ανά μία ώρα, αυτό σημαίνει ότι μέχρι να ολοκληρωθεί το rsync θα πάρει περισσότερο χρόνο.
Εάν οι αλλαγές είναι της τάξης των 5GB ανά ώρα τότε κι ανάλογα με το δίκτυο μπορεί να έχω και μέχρι 30 λεπτά καθυστέρηση.


Εάν βάλω το cron entry ανά 5 λεπτά, αυτό σημαίνει ότι κάθε 5 λεπτά το rsync θα προσπαθεί να ξαναδιαβάζει
το file listing τόσο στον αρχικό κατάλογο – όσο και στον προορισμένο κατάλογο, ακόμα κι εάν δεν έχουν γίνει αλλαγές ή έχουν γίνει πάρα πολλές αλλαγές.


δ. Χρονο-απαίτηση.


Το σύστημά μου χάνει την σωστή ώρα. Τι συμβαίνει τότε;


ε. Απαίτηση crond.


Θα πρέπει να εκτελείται ένας cron daemon. Τι συμβαίνει σε περίπτωση που σταματήσει να λειτουργεί.


top


Πως προφέρετε το PIrsyncD;


το προφέρω ως εξής: pi(pie) – rsync – d(aemon)
προσπαθώντας να κάνω ένα λογοπαίγνιο με το pi (π) + rsync + daemon


top


Μπορεί να αλλάξει η λειτουργία του PIrsyncD;


Ναι, πάρα πολύ εύκολα. Αντί για rsync μπορεί να τρέχει ένα εξωτερικό πρόγραμμα. Οι δυνατότητες είναι ανάλογες με την φαντασία του κάθε προγραμματιστή.


top


What about large files ?


Ok, you have a lot of large files on your source directory.


A large file sends a lot of IN_MODIFY events, but rsync command synchronize only delta differences.
So this isnt too much overkill for your system, but it is unnecessary for rsync to run.
In PIrsyncD version 20100326 or later, i have added some code to fix these unnecessaries (duplicates) inode events.


top


INOTIFY EVENTS


#define IN_ACCESS               0x00000001      /* File was accessed */
#define IN_MODIFY               0x00000002      /* File was modified */
#define IN_ATTRIB               0x00000004      /* Metadata changed */
#define IN_CLOSE_WRITE          0x00000008      /* Writtable file was closed */
#define IN_CLOSE_NOWRITE        0x00000010      /* Unwrittable file closed */
#define IN_OPEN                 0x00000020      /* File was opened */
#define IN_MOVED_FROM           0x00000040      /* File was moved from X */
#define IN_MOVED_TO             0x00000080      /* File was moved to Y */
#define IN_CREATE               0x00000100      /* Subfile was created */
#define IN_DELETE               0x00000200      /* Subfile was deleted */
#define IN_DELETE_SELF          0x00000400      /* Self was deleted */
#define IN_MOVE_SELF            0x00000800      /* Self was moved */
 
/* the following are legal events.  they are sent as needed to any watch */
#define IN_UNMOUNT              0x00002000      /* Backing fs was unmounted */
#define IN_Q_OVERFLOW           0x00004000      /* Event queued overflowed */
#define IN_IGNORED              0x00008000      /* File was ignored */
 
/* helper events */
#define IN_CLOSE                (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) /* close */
#define IN_MOVE                 (IN_MOVED_FROM | IN_MOVED_TO) /* moves */
 
/* special flags */
#define IN_ONLYDIR              0x01000000      /* only watch the path if it is a directory */
#define IN_DONT_FOLLOW          0x02000000      /* don't follow a sym link */
#define IN_MASK_ADD             0x20000000      /* add to the mask of an already existing watch */
#define IN_ISDIR                0x40000000      /* event occurred against dir */
#define IN_ONESHOT              0x80000000      /* only send event once */
 
#define IN_ALL_EVENTS   (IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE | \
                         IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM | \
                         IN_MOVED_TO | IN_DELETE | IN_CREATE | IN_DELETE_SELF | \
                         IN_MOVE_SELF)

top


PYINOTIFY EVENTS


FLAG_COLLECTIONS = {'OP_FLAGS': {
        'IN_ACCESS'        : 0x00000001,  # File was accessed
        'IN_MODIFY'        : 0x00000002,  # File was modified
        'IN_ATTRIB'        : 0x00000004,  # Metadata changed
        'IN_CLOSE_WRITE'   : 0x00000008,  # Writable file was closed
        'IN_CLOSE_NOWRITE' : 0x00000010,  # Unwritable file closed
        'IN_OPEN'          : 0x00000020,  # File was opened
        'IN_MOVED_FROM'    : 0x00000040,  # File was moved from X 'IN_MOVED_TO'      : 0x00000080,  # File was moved to Y
        'IN_CREATE'        : 0x00000100,  # Subfile was created
        'IN_DELETE'        : 0x00000200,  # Subfile was deleted
        'IN_DELETE_SELF'   : 0x00000400,  # Self (watched item itself)
                                          # was deleted
        'IN_MOVE_SELF'     : 0x00000800,  # Self (watched item itself) was moved
        },
                        'EVENT_FLAGS': {
        'IN_UNMOUNT'       : 0x00002000,  # Backing fs was unmounted
        'IN_Q_OVERFLOW'    : 0x00004000,  # Event queued overflowed
        'IN_IGNORED'       : 0x00008000,  # File was ignored
        },
                        'SPECIAL_FLAGS': {
        'IN_ONLYDIR'       : 0x01000000,  # only watch the path if it is a
                                          # directory
        'IN_DONT_FOLLOW'   : 0x02000000,  # don't follow a symlink
        'IN_MASK_ADD'      : 0x20000000,  # add to the mask of an already
                                          # existing watch
        'IN_ISDIR'         : 0x40000000,  # event occurred against dir 'IN_ONESHOT'       : 0x80000000,  # only send event once
        },
                        }

top