Showing
1 changed file
with
99 additions
and
168 deletions
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 | - |
-
Please register or login to post a comment