Окунев Дмитрий Юрьевич

Updated for clsync-0.4

1 -++ Введение 1 +++ Введение
2 - 2 +
3 -Достаточно типичной задачей в системной администрировании является поддержание определённых файлов в синхронном состоянии на большом количестве узлов. 3 +Достаточно типичной задачей в системной администрировании является поддержание определённых файлов в синхронном состоянии на большом количестве узлов.
4 - 4 +
5 -В рамках рассмотренных ниже примеров синхронизация будет производится по схеме master-slave для файлов из директории /opt/global (на master-узле) в директорию /opt/production (на slave-узлах). 5 +В рамках рассмотренных ниже примеров синхронизация будет производится по схеме master-slave для файлов из директории /opt/global (на master-узле) в директорию /opt/production (на slave-узлах).
6 - 6 +
7 -++ Установка clsync 7 +++ Установка clsync
8 - 8 +
9 -Установить clsync можно следующим образом: 9 +Установить clsync можно следующим образом:
10 - 10 +
11 - # Debian 11 + # Debian
12 - apt-get install clsync 12 + apt-get install clsync
13 - 13 +
14 - # Gentoo 14 + # Gentoo
15 - layman -a bircoph 15 + layman -a bircoph
16 - emerge --sync 16 + emerge --sync
17 - emerge clsync 17 + emerge clsync
18 - 18 +
19 - # FreeBSD 19 + # FreeBSD
20 - git clone https://github.com/xaionaro/clsync 20 + git clone https://github.com/xaionaro/clsync
21 - cd clsync/freebsd/usr/ports/sysutils/clsync && make install clean 21 + cd clsync/freebsd/usr/ports/sysutils/clsync && make install clean
22 - 22 +
23 - # Other 23 + # Other
24 - pushd /tmp 24 + pushd /tmp
25 - git clone https://github.com/xaionaro/clsync 25 + git clone https://github.com/xaionaro/clsync
26 - cd clsync 26 + cd clsync
27 - autoreconf -fi 27 + autoreconf -fi
28 - ./configure 28 + ./configure
29 - make install 29 + make install
30 - 30 +
31 -++ pdcp 31 +++ pdcp
32 - 32 +
33 -pdcp - это утилита позволяющая производить копирование файла на множество узлов посредством ssh. 33 +pdcp - это утилита позволяющая производить копирование файла на множество узлов посредством ssh.
34 - 34 +
35 -Установка (на master-узле): 35 +Установка (на master-узле):
36 - 36 +
37 - # Debian: 37 + # Debian:
38 - apt-get install pdsh 38 + apt-get install pdsh
39 - # Gentoo: 39 + # Gentoo:
40 - emerge pdsh 40 + emerge pdsh
41 - # FreeBSD 41 + # FreeBSD
42 - cd /usr/ports/sysutils/pdsh && make install clean 42 + cd /usr/ports/sysutils/pdsh && make install clean
43 - 43 +
44 -Подготовка (обычно этот этап не требуется, так как такие кластера делаются методом клонирования системы, однако для наглядности пример команд с master-узла): 44 +Подготовка (обычно этот этап не требуется, так как такие кластера делаются методом клонирования системы, однако для наглядности пример команд с master-узла):
45 - 45 +
46 - ssh-keygen -t ecdsa -b 521 46 + ssh-keygen -t ecdsa -b 521
47 - # Копирование ключей на все узлы 47 + # Копирование ключей на все узлы
48 - for HOST in $(seq 16 31); do 48 + for HOST in $(seq 16 31); do
49 - IP=192.168.0."$host" 49 + IP=192.168.0."$host"
50 - echo "$IP n${HOST}.example.org n${HOST}" >> /etc/hosts 50 + echo "$IP n${HOST}.example.org n${HOST}" >> /etc/hosts
51 - echo "$HOST" >> /etc/machines 51 + echo "$HOST" >> /etc/machines
52 - ssh-copy-id "$IP" 52 + ssh-copy-id "$IP"
53 - done 53 + done
54 - 54 +
55 -Запуск на master-узле: 55 +Запуск на master-узле:
56 - 56 +
57 - clsync -M direct -S $(which pdcp) -W /opt/global -b -Y syslog -- -a %FILE-LIST% 57 + clsync -M simple -S $(which pdcp) -W /opt/global -b -Y syslog -- -a %INCLUDE-LIST% %INCLUDE-LIST%
58 - 58 +
59 -Готово, можно попробовать: 59 +Готово, можно попробовать:
60 - 60 +
61 - date >> /opt/global/test.log 61 + date >> /opt/global/test.log
62 - 62 +
63 -++ uftp 63 +++ uftp
64 - 64 +
65 -uftp - это утилита позволяющая организовывать передачу файлов посредством multicast, что может быть удобным при передаче больших объёмов информации на очень большое количество узлов. 65 +uftp - это утилита позволяющая организовывать передачу файлов посредством multicast, что может быть удобным при передаче больших объёмов информации на очень большое количество узлов.
66 - 66 +
67 -Установка зависимостей (на всех узлах) 67 +Установка зависимостей (на всех узлах)
68 - 68 +
69 - # Debian: 69 + # Debian:
70 - apt-get install libssl-dev 70 + apt-get install libssl-dev
71 - 71 +
72 -Установка (на всех узлах): 72 +Установка (на всех узлах):
73 - 73 +
74 - wget 'http://sourceforge.net/projects/uftp-multicast/files/source-tar/uftp-4.3.tar' 74 + wget 'http://sourceforge.net/projects/uftp-multicast/files/source-tar/uftp-4.3.tar'
75 - tar -xvf uftp-4.3.tar 75 + tar -xvf uftp-4.3.tar
76 - cd uftp 76 + cd uftp
77 - make install 77 + make install
78 - 78 +
79 -Подготовка (на всех узлах): 79 +Подготовка (на всех узлах):
80 - 80 +
81 - mkdir -p /opt/global /opt/production 81 + mkdir -p /opt/global /opt/production
82 - # Linux 82 + # Linux
83 - echo net.ipv4.igmp_max_memberships=256 >> /etc/sysctl.conf 83 + echo net.ipv4.igmp_max_memberships=256 >> /etc/sysctl.conf
84 - sysctl -f 84 + sysctl -f
85 - 85 +
86 -Запуск на slave-узлах: 86 +Запуск на slave-узлах:
87 - 87 +
88 - uftpd -M 248.225.233.1 -D /opt/production 88 + uftpd -M 248.225.233.1 -D /opt/production
89 - # если у вас настроено использование pdsh, то тогда: 89 + # если у вас настроено использование pdsh, то тогда:
90 - # pdsh -a echo uftpd -M 248.225.233.1 -D /opt/production \> /etc/rc.local # или в другое место, в зависимости от вашей системы 90 + # pdsh -a echo uftpd -M 248.225.233.1 -D /opt/production \> /etc/rc.local # или в другое место, в зависимости от вашей системы
91 - # pdsh -a uftpd -M 248.225.233.1 -D /opt/production 91 + # pdsh -a uftpd -M 248.225.233.1 -D /opt/production
92 - 92 +
93 -Доподготовка master-узла: 93 +Запуск на master-узле:
94 - 94 +
95 - cat > /root/uftp-handler.c << EOF 95 + clsync --mode=direct --sync-handler=uftp --watch-dir=/opt/global --background=1 --output=syslog -- -M 248.225.233.1 %INCLUDE-LIST%
96 - #include <stdlib.h> 96 +
97 - #include <unistd.h> 97 +Готово, можно попробовать:
98 - #include <string.h> 98 +
99 - #include <sys/types.h> 99 + date >> /opt/global/test.log
100 - #include <sys/wait.h>  
101 -  
102 - #include <clsync/clsync.h>  
103 - #include <clsync/configuration.h>  
104 - #include <clsync/malloc.h>  
105 - #include <clsync/error.h>  
106 -  
107 - struct ctx *ctx_p;  
108 -  
109 - int clsyncapi_init(struct ctx *_ctx_p, struct indexes *_indexes_p) {  
110 - ctx_p = _ctx_p;  
111 - return 0;  
112 - }  
113 -  
114 - int clsyncapi_sync(int n, api_eventinfo_t *ei) {  
115 - size_t argv_size;  
116 - char **argv;  
117 -  
118 - debug(3, "n == %i", n);  
119 -  
120 - if(n == 0)  
121 - return 0;  
122 -  
123 - argv_size = n+5; // "uftp" + "-M" + ip-address + n*path + NULL  
124 - argv = xmalloc(argv_size * sizeof(char *));  
125 - argv[0] = "/usr/local/bin/uftp";  
126 - argv[1] = "-M";  
127 - argv[2] = "248.225.233.1";  
128 -  
129 - int i = 3;  
130 - int j = 0;  
131 - while (i < n) {  
132 - if(ei[j].path_len)  
133 - argv[i++] = (char*)ei[j].path;  
134 - j++;  
135 - }  
136 -  
137 - argv[i++] = NULL;  
138 -  
139 - int pid = clsyncapi_fork(ctx_p);  
140 - switch(pid) {  
141 - case -1:  
142 - critical("got error while clsyncapi_fork()");  
143 - case 0:  
144 - execv(argv[0], argv);  
145 - critical("got error while execv()");  
146 - }  
147 -  
148 - int status;  
149 - if(waitpid(pid, &status, 0) != pid)  
150 - critical("got error while waitpid()");  
151 -  
152 - int exitcode = WEXITSTATUS(status);  
153 - free(argv);  
154 - return exitcode;  
155 - }  
156 - EOF  
157 -  
158 - gcc -march=native -O2 -funswitch-loops -fpredictive-commoning -fgcse-after-reload -ftree-vectorize -ftree-loop-linear -ftree-loop-im -fweb -frename-registers -fomit-frame-pointer -fexcess-precision=fast -pipe --std=gnu11 -Wall -fPIC -shared -Wl,-O1,--as-needed /root/uftp-handler.c -o /root/uftp-handler.so  
159 -  
160 -  
161 -Запуск на master-узле:  
162 -  
163 - clsync --mode=so --sync-handler=/root/uftp-handler.so --watch-dir=/opt/global --background=1 --output=syslog  
164 -  
165 -Готово, можно попробовать:  
166 -  
167 - date >> /opt/global/test.log  
168 -