Проект

Общее

Профиль

FAILOVER-процедуры » История » Версия 22

Dmitry Chernyak, 07.04.2014 06:32

1 1 Dmitry Chernyak
.
2 1 Dmitry Chernyak
3 1 Dmitry Chernyak
{{>toc}}
4 1 Dmitry Chernyak
5 1 Dmitry Chernyak
h1. FAILOVER-процедуры
6 1 Dmitry Chernyak
7 1 Dmitry Chernyak
Обозначения:
8 1 Dmitry Chernyak
<pre>
9 1 Dmitry Chernyak
gnt# - запуск команды на мастер-узле
10 1 Dmitry Chernyak
gntX# - запуск команды на обычном узле
11 1 Dmitry Chernyak
gntY# - запуск команды на другом узле
12 1 Dmitry Chernyak
# - запуск команды на любом узле
13 1 Dmitry Chernyak
</pre>
14 1 Dmitry Chernyak
15 12 Dmitry Chernyak
h2. Запуск на одном действующем мастер-узле
16 1 Dmitry Chernyak
17 1 Dmitry Chernyak
При запуске на одном узле, управление кластером ganeti-masterd не стартует автоматически, даже на master-узле.
18 1 Dmitry Chernyak
Это связано с тем, что невозможно отличить крах второго узла от потери связи, когда на втором узле продолжают работать запущенные виртуалки.
19 1 Dmitry Chernyak
20 12 Dmitry Chernyak
h3. Запуск управляющего демона:
21 12 Dmitry Chernyak
22 1 Dmitry Chernyak
<pre>
23 1 Dmitry Chernyak
gnt# ganeti-masterd --no-voting
24 11 Dmitry Chernyak
</pre>
25 11 Dmitry Chernyak
26 11 Dmitry Chernyak
h3. Перенос виртуальных машин с аварийного узла
27 11 Dmitry Chernyak
28 13 Dmitry Chernyak
Эта операция выполняется один раз. Она поменяет узел запуска для виртуальной машины.
29 13 Dmitry Chernyak
Перенесенные машины автоматически запустятся, если таково их состояние по-умолчанию.
30 13 Dmitry Chernyak
31 13 Dmitry Chernyak
Лучше мигрировать или перезапустить виртуальные машины в штатном режиме, до того, как их узел будет отключен.
32 13 Dmitry Chernyak
Однако, если это случилось внезапно, тогда необходимо дать команду:
33 13 Dmitry Chernyak
34 11 Dmitry Chernyak
<pre>
35 11 Dmitry Chernyak
gnt# gnt-node failover --ignore-consistency gntX
36 11 Dmitry Chernyak
</pre>
37 11 Dmitry Chernyak
38 11 Dmitry Chernyak
39 11 Dmitry Chernyak
h3. Запуск всех виртуальных машин
40 11 Dmitry Chernyak
41 11 Dmitry Chernyak
<pre>
42 11 Dmitry Chernyak
gnt# gnt-instance startup --force --all
43 11 Dmitry Chernyak
</pre>
44 11 Dmitry Chernyak
45 1 Dmitry Chernyak
h2. Штатное переключение master-узла
46 1 Dmitry Chernyak
47 1 Dmitry Chernyak
Оба узла запущены, смена master-узла производится в штатном режиме.
48 1 Dmitry Chernyak
На master-candidate (gntX):
49 1 Dmitry Chernyak
<pre>
50 1 Dmitry Chernyak
gntX# gnt-cluster master-failover
51 1 Dmitry Chernyak
</pre>
52 1 Dmitry Chernyak
53 1 Dmitry Chernyak
h2. Выход из строя master-узла
54 1 Dmitry Chernyak
55 1 Dmitry Chernyak
Основной узел (в примере - gnt1) оказывается выключен в результате аппаратной аварии.
56 1 Dmitry Chernyak
57 1 Dmitry Chernyak
Запустить управляющий демон на узле master-candidate (gntX):
58 1 Dmitry Chernyak
<pre>
59 1 Dmitry Chernyak
gntX# ganeti-masterd --no-voting
60 1 Dmitry Chernyak
</pre>
61 1 Dmitry Chernyak
62 1 Dmitry Chernyak
Активировать новый master-узел:
63 1 Dmitry Chernyak
<pre>
64 1 Dmitry Chernyak
gntX# gnt-cluster master-failover --no-voting
65 1 Dmitry Chernyak
</pre>
66 9 Dmitry Chernyak
67 9 Dmitry Chernyak
Пометить отключенный узел offline, чтобы master в него не долбился
68 9 Dmitry Chernyak
-С = master-candidate
69 9 Dmitry Chernyak
-O = offline
70 9 Dmitry Chernyak
<pre>
71 9 Dmitry Chernyak
gnt# gnt-node modify -C no -O yes gntY
72 9 Dmitry Chernyak
</pre>
73 10 Dmitry Chernyak
74 9 Dmitry Chernyak
Запустить все виртуалки отключенного узла на резервном:
75 9 Dmitry Chernyak
<pre>
76 9 Dmitry Chernyak
gnt# gnt-node failover --ignore-consistency gnt1
77 9 Dmitry Chernyak
</pre>
78 9 Dmitry Chernyak
79 1 Dmitry Chernyak
h2. Возврат основного узла в строй
80 1 Dmitry Chernyak
81 1 Dmitry Chernyak
Старый основной узел не будет автоматически запускать управляющего демона.
82 1 Dmitry Chernyak
* если не найдет парного узла,
83 1 Dmitry Chernyak
* если найдет парный узел и узнает, что он стал новым master-ом.
84 1 Dmitry Chernyak
85 15 Dmitry Chernyak
Если при отключении узла он помечался как offline (см. выше), то надо вернуть его в строй:
86 15 Dmitry Chernyak
<pre>
87 15 Dmitry Chernyak
gnt# gnt-node modify -C yes -O no gntX
88 15 Dmitry Chernyak
</pre>
89 15 Dmitry Chernyak
90 1 Dmitry Chernyak
Если на узле сохранились данные, то для включения его обратно в кластер:
91 1 Dmitry Chernyak
92 1 Dmitry Chernyak
Скопировать на него свежую конфигурацию с нового master-а
93 1 Dmitry Chernyak
<pre>
94 1 Dmitry Chernyak
gnt# gnt-cluster redist-conf
95 1 Dmitry Chernyak
</pre>
96 1 Dmitry Chernyak
97 1 Dmitry Chernyak
Запустить на нем ganeti-демоны
98 1 Dmitry Chernyak
<pre>
99 1 Dmitry Chernyak
gntX# /etc/init.d/ganeti restart
100 1 Dmitry Chernyak
</pre>
101 1 Dmitry Chernyak
102 2 Владимир Ипатов
h2. Плановый вывод узла из эксплуатации
103 3 Владимир Ипатов
104 2 Владимир Ипатов
Мигрируем виртуальные машины:
105 2 Владимир Ипатов
<pre>
106 8 Dmitry Chernyak
gnt# gnt-instance migrate имя_машины
107 2 Владимир Ипатов
</pre>
108 2 Владимир Ипатов
109 8 Dmitry Chernyak
Если выводимый узел - мастер, то нужно назначить нового мастера(см. выше *Штатное переключение master узла*).
110 1 Dmitry Chernyak
111 8 Dmitry Chernyak
Вывести узел из списка кандидатов на мастера и перевести его в режим offline (это предотвратит появление сообщений об "аварии"):
112 2 Владимир Ипатов
<pre>
113 8 Dmitry Chernyak
gnt# gnt-node modify -C no -O yes УЗЕЛ
114 2 Владимир Ипатов
</pre>
115 2 Владимир Ипатов
116 2 Владимир Ипатов
Далее узел можно просто выключить.
117 1 Dmitry Chernyak
118 1 Dmitry Chernyak
h3. Возврат узла в кластер
119 1 Dmitry Chernyak
120 8 Dmitry Chernyak
После включения узла нужно сообщить кластеру, что узел вернулся в строй:
121 1 Dmitry Chernyak
<pre>
122 8 Dmitry Chernyak
gnt# gnt-node modify -C yes -O no УЗЕЛ
123 8 Dmitry Chernyak
</pre>
124 8 Dmitry Chernyak
125 8 Dmitry Chernyak
Однако, если у вас имеются сомнения в том, что узел остался в рабочем состоянии, то лучше выполнить:
126 8 Dmitry Chernyak
<pre>
127 8 Dmitry Chernyak
gnt# gnt-node add --readd УЗЕЛ
128 2 Владимир Ипатов
</pre> 
129 8 Dmitry Chernyak
130 8 Dmitry Chernyak
В любом случае, после этого нужно подождать около 5 минут, чтобы демон watcher поднял drbd, либо инициировать процесс вручную:
131 7 Dmitry Chernyak
<pre>
132 8 Dmitry Chernyak
gnt# gnt-cluster verify-disks
133 5 Владимир Ипатов
</pre>
134 8 Dmitry Chernyak
135 2 Владимир Ипатов
136 1 Dmitry Chernyak
h2. Замена узла на новый
137 1 Dmitry Chernyak
138 17 Dmitry Chernyak
Удалить старый узел из /root/.ssh/known_hosts
139 17 Dmitry Chernyak
140 1 Dmitry Chernyak
Добавить узел в кластер
141 1 Dmitry Chernyak
<pre>
142 1 Dmitry Chernyak
gnt# gnt-node add --readd gntX
143 1 Dmitry Chernyak
</pre>
144 1 Dmitry Chernyak
145 5 Владимир Ипатов
Для всех виртуалок, которые имеют secondary на подключенном узле:
146 1 Dmitry Chernyak
<pre>
147 19 Dmitry Chernyak
gnt# gnt-instance replace-disks --auto [--submit] INSTANCE
148 18 Dmitry Chernyak
</pre>
149 18 Dmitry Chernyak
150 1 Dmitry Chernyak
Перерегистрировать узел в puppet
151 1 Dmitry Chernyak
<pre>
152 1 Dmitry Chernyak
gnt# gnt-instance console sci
153 17 Dmitry Chernyak
sci# puppetca --clean gntX.fqdn
154 1 Dmitry Chernyak
</pre>
155 1 Dmitry Chernyak
156 1 Dmitry Chernyak
<pre>
157 17 Dmitry Chernyak
gntX# rm -r /var/lib/puppet/ssl/*
158 1 Dmitry Chernyak
gntX# /etc/init.d/puppet restart
159 1 Dmitry Chernyak
</pre>
160 1 Dmitry Chernyak
161 1 Dmitry Chernyak
h2. Замена жесткого диска
162 1 Dmitry Chernyak
163 1 Dmitry Chernyak
Скопировать разметку с существующего (только для дисков одной модели!)
164 1 Dmitry Chernyak
<pre>
165 1 Dmitry Chernyak
# sfdisk -d /dev/sda|sfdisk /dev/sdX
166 1 Dmitry Chernyak
</pre>
167 1 Dmitry Chernyak
Проверить
168 1 Dmitry Chernyak
<pre>
169 1 Dmitry Chernyak
# fdisk -l
170 1 Dmitry Chernyak
</pre>
171 1 Dmitry Chernyak
Добавить в RAID
172 1 Dmitry Chernyak
<pre>
173 1 Dmitry Chernyak
# mdadm --manage /dev/md0 --add /dev/sdX1
174 1 Dmitry Chernyak
# mdadm --manage /dev/md1 --add /dev/sdX2
175 1 Dmitry Chernyak
# mdadm --manage /dev/md2 --add /dev/sdX3
176 1 Dmitry Chernyak
</pre>
177 1 Dmitry Chernyak
Проверить
178 1 Dmitry Chernyak
<pre>
179 1 Dmitry Chernyak
cat /proc/mdstat
180 1 Dmitry Chernyak
</pre>
181 21 Владимир Ипатов
182 21 Владимир Ипатов
h2. Восстановление при split-brain:
183 21 Владимир Ипатов
184 21 Владимир Ипатов
Если при activate-disks или при команде запуска/фейловера drbd ругается следующим образом в dmesg:
185 21 Владимир Ипатов
<pre>
186 21 Владимир Ипатов
[10893282.055705] block drbd21: Handshake successful: Agreed network protocol version 96
187 21 Владимир Ипатов
[10893282.056003] block drbd21: Peer authenticated using 16 bytes of 'md5' HMAC
188 21 Владимир Ипатов
[10893282.056008] block drbd21: conn( WFConnection -> WFReportParams ) 
189 21 Владимир Ипатов
[10893282.056031] block drbd21: Starting asender thread (from drbd21_receiver [20355])
190 21 Владимир Ипатов
[10893282.056303] block drbd21: data-integrity-alg: <not-used>
191 21 Владимир Ипатов
[10893282.056319] block drbd21: drbd_sync_handshake:
192 21 Владимир Ипатов
[10893282.056322] block drbd21: self 5323ED521900E1F9:FCBCCB0FBF14BA04:480CD30FE2A601EA:480BD30FE2A601EB bits:46 flags:0
193 21 Владимир Ипатов
[10893282.056324] block drbd21: peer F3B949426796C7F8:FCBCCB0FBF14BA05:480CD30FE2A601EB:480BD30FE2A601EB bits:12288 flags:2
194 21 Владимир Ипатов
[10893282.056326] block drbd21: uuid_compare()=100 by rule 90
195 21 Владимир Ипатов
[10893282.056329] block drbd21: helper command: /bin/true initial-split-brain minor-21
196 21 Владимир Ипатов
[10893282.073918] block drbd21: meta connection shut down by peer.
197 21 Владимир Ипатов
[10893282.073976] block drbd21: conn( WFReportParams -> NetworkFailure ) 
198 21 Владимир Ипатов
[10893282.073981] block drbd21: asender terminated
199 21 Владимир Ипатов
[10893282.073983] block drbd21: Terminating drbd21_asender
200 21 Владимир Ипатов
[10893282.080752] block drbd21: helper command: /bin/true initial-split-brain minor-21 exit code 0 (0x0)
201 21 Владимир Ипатов
[10893282.080754] block drbd21: Split-Brain detected but unresolved, dropping connection!
202 21 Владимир Ипатов
[10893282.080844] block drbd21: helper command: /bin/true split-brain minor-21
203 21 Владимир Ипатов
[10893282.081481] block drbd21: helper command: /bin/true split-brain minor-21 exit code 0 (0x0)
204 21 Владимир Ипатов
[10893282.081484] block drbd21: conn( NetworkFailure -> Disconnecting ) 
205 21 Владимир Ипатов
[10893282.081487] block drbd21: error receiving ReportState, l: 4!
206 21 Владимир Ипатов
[10893282.081577] block drbd21: Connection closed
207 21 Владимир Ипатов
[10893282.081582] block drbd21: conn( Disconnecting -> StandAlone ) 
208 21 Владимир Ипатов
[10893282.081603] block drbd21: receiver terminated
209 21 Владимир Ипатов
[10893282.081604] block drbd21: Terminating drbd21_receiver
210 21 Владимир Ипатов
[10893282.711704] block drbd22: Handshake successful: Agreed network protocol version 96
211 21 Владимир Ипатов
[10893282.712019] block drbd22: Peer authenticated using 16 bytes of 'md5' HMAC
212 21 Владимир Ипатов
[10893282.712024] block drbd22: conn( WFConnection -> WFReportParams ) 
213 21 Владимир Ипатов
[10893282.712047] block drbd22: Starting asender thread (from drbd22_receiver [23709])
214 21 Владимир Ипатов
[10893282.712301] block drbd22: data-integrity-alg: <not-used>
215 21 Владимир Ипатов
[10893282.712332] block drbd22: drbd_sync_handshake:
216 21 Владимир Ипатов
[10893282.712334] block drbd22: self CD794FB0989E2B95:DD71B308E6D3FE88:AD335B3ED83CE576:AD325B3ED83CE577 bits:7 flags:0
217 21 Владимир Ипатов
[10893282.712336] block drbd22: peer 17B47E98FD204408:DD71B308E6D3FE89:AD335B3ED83CE577:AD325B3ED83CE577 bits:3072 flags:2
218 21 Владимир Ипатов
[10893282.712338] block drbd22: uuid_compare()=100 by rule 90
219 21 Владимир Ипатов
[10893282.712341] block drbd22: helper command: /bin/true initial-split-brain minor-22
220 21 Владимир Ипатов
[10893282.713155] block drbd22: helper command: /bin/true initial-split-brain minor-22 exit code 0 (0x0)
221 21 Владимир Ипатов
[10893282.713157] block drbd22: Split-Brain detected but unresolved, dropping connection!
222 21 Владимир Ипатов
[10893282.713251] block drbd22: helper command: /bin/true split-brain minor-22
223 21 Владимир Ипатов
[10893282.713820] block drbd22: meta connection shut down by peer.
224 21 Владимир Ипатов
[10893282.713889] block drbd22: conn( WFReportParams -> NetworkFailure ) 
225 21 Владимир Ипатов
[10893282.713895] block drbd22: asender terminated
226 21 Владимир Ипатов
[10893282.713897] block drbd22: Terminating drbd22_asender
227 21 Владимир Ипатов
[10893282.713945] block drbd22: helper command: /bin/true split-brain minor-22 exit code 0 (0x0)
228 21 Владимир Ипатов
[10893282.713948] block drbd22: conn( NetworkFailure -> Disconnecting ) 
229 21 Владимир Ипатов
[10893282.713952] block drbd22: error receiving ReportState, l: 4!
230 21 Владимир Ипатов
[10893282.714046] block drbd22: Connection closed
231 21 Владимир Ипатов
[10893282.714050] block drbd22: conn( Disconnecting -> StandAlone ) 
232 21 Владимир Ипатов
[10893282.714070] block drbd22: receiver terminated
233 21 Владимир Ипатов
[10893282.714072] block drbd22: Terminating drbd22_receiver
234 21 Владимир Ипатов
[10893283.140310] block drbd21: conn( StandAlone -> Unconnected ) 
235 21 Владимир Ипатов
[10893283.140323] block drbd21: Starting receiver thread (from drbd21_worker [23682])
236 21 Владимир Ипатов
[10893283.140363] block drbd21: receiver (re)started
237 21 Владимир Ипатов
[10893283.140366] block drbd21: conn( Unconnected -> WFConnection ) 
238 21 Владимир Ипатов
[10893283.498632] block drbd22: conn( StandAlone -> Unconnected ) 
239 21 Владимир Ипатов
[10893283.498646] block drbd22: Starting receiver thread (from drbd22_worker [23702])
240 21 Владимир Ипатов
[10893283.498705] block drbd22: receiver (re)started
241 21 Владимир Ипатов
[10893283.498710] block drbd22: conn( Unconnected -> WFConnection ) 
242 21 Владимир Ипатов
</pre>
243 21 Владимир Ипатов
Здесь мы видим:
244 21 Владимир Ипатов
<pre>
245 21 Владимир Ипатов
[10893282.713155] block drbd22: helper command: /bin/true initial-split-brain minor-22 exit code 0 (0x0)
246 21 Владимир Ипатов
[10893282.713157] block drbd22: Split-Brain detected but unresolved, dropping connection!
247 21 Владимир Ипатов
</pre>
248 21 Владимир Ипатов
249 21 Владимир Ипатов
то, во-первых, нужно установить, где находятся актуальные данные.
250 21 Владимир Ипатов
Когда когда точно установлено, где актуальные данные, мы идем на ноду, где данные *битые*, и там даем команду:
251 21 Владимир Ипатов
<pre>
252 21 Владимир Ипатов
drbdsetup /dev/drbd23 invalidate
253 21 Владимир Ипатов
</pre>
254 21 Владимир Ипатов
Затем на мастере дать activate-disks для этого инстанса, и проследить, что все drbd ресурсы отсинкались.
255 22 Dmitry Chernyak
256 22 Dmitry Chernyak
h2. Восстановление outdated диска
257 22 Dmitry Chernyak
258 22 Dmitry Chernyak
Ситуация: primary узел умер, диск на secondary узле считает себя outdated.
259 22 Dmitry Chernyak
Watcher пишет письма, содержащие в логе такую строку:
260 22 Dmitry Chernyak
<pre>
261 22 Dmitry Chernyak
Error while assembling disk: drbd7: can't make drbd device primary: /dev/drbd7: State change failed: (-2) Need access to UpToDate data\n
262 22 Dmitry Chernyak
</pre>
263 22 Dmitry Chernyak
264 22 Dmitry Chernyak
Виртуалка не поднимается, диски не собираются (точнее собираются и отключаются обратно).
265 22 Dmitry Chernyak
Требуется собрать диск вручную и сказать ему что он primary
266 22 Dmitry Chernyak
267 22 Dmitry Chernyak
<pre>
268 22 Dmitry Chernyak
root@gnt1:~# gnt-instance info ИНСТАНС
269 22 Dmitry Chernyak
[skip]
270 22 Dmitry Chernyak
    - disk/0: drbd8, size 117.2G
271 22 Dmitry Chernyak
      access mode: rw
272 22 Dmitry Chernyak
      nodeA:       gnt2.XXXX.ru, minor=2
273 22 Dmitry Chernyak
      nodeB:       gnt3.XXXX.ru, minor=0
274 22 Dmitry Chernyak
      port:        11012
275 22 Dmitry Chernyak
      auth key:    06ca8046f1323d0b154c500f41c0d625cbd796c3
276 22 Dmitry Chernyak
      on primary:  /dev/drbd2 (147:2) in sync, status *DEGRADED*
277 22 Dmitry Chernyak
      child devices:
278 22 Dmitry Chernyak
        - child 0: lvm, size 117.2G
279 22 Dmitry Chernyak
          logical_id: xenvg/813feab3-f7a5-41bb-8a34-5b053ad1c8a6.disk0_data
280 22 Dmitry Chernyak
          on primary: /dev/xenvg/813feab3-f7a5-41bb-8a34-5b053ad1c8a6.disk0_data (253:11)
281 22 Dmitry Chernyak
        - child 1: lvm, size 128M
282 22 Dmitry Chernyak
          logical_id: xenvg/813feab3-f7a5-41bb-8a34-5b053ad1c8a6.disk0_meta
283 22 Dmitry Chernyak
          on primary: /dev/xenvg/813feab3-f7a5-41bb-8a34-5b053ad1c8a6.disk0_meta (253:12)
284 22 Dmitry Chernyak
285 22 Dmitry Chernyak
</pre>
286 22 Dmitry Chernyak
287 22 Dmitry Chernyak
<pre>
288 22 Dmitry Chernyak
root@gnt2:~# drbdsetup /dev/drbd8 disk /dev/xenvg/813feab3-f7a5-41bb-8a34-5b053ad1c8a6.disk0_data /dev/xenvg/813feab3-f7a5-41bb-8a34-5b053ad1c8a6.disk0_meta 0
289 22 Dmitry Chernyak
</pre>
290 22 Dmitry Chernyak
291 22 Dmitry Chernyak
<pre>
292 22 Dmitry Chernyak
root@gnt2:~# drbd-overview 
293 22 Dmitry Chernyak
  0:??not-found??  Connected  Secondary/Primary UpToDate/UpToDate C      r----- 
294 22 Dmitry Chernyak
  8:??not-found??  StandAlone Secondary/Unknown Outdated/DUnknown r-----
295 22 Dmitry Chernyak
</pre> 
296 22 Dmitry Chernyak
297 22 Dmitry Chernyak
root@gnt2:~# drbdsetup /dev/drbd8 primary -f
298 22 Dmitry Chernyak
299 22 Dmitry Chernyak
<pre>
300 22 Dmitry Chernyak
root@gnt2:~# drbd-overview 
301 22 Dmitry Chernyak
  0:??not-found??  Connected  Secondary/Primary UpToDate/UpToDate C      r----- 
302 22 Dmitry Chernyak
  8:??not-found??  StandAlone Primary/Unknown   UpToDate/DUnknown r-----
303 22 Dmitry Chernyak
</pre> 
304 22 Dmitry Chernyak
305 22 Dmitry Chernyak
<pre>
306 22 Dmitry Chernyak
root@gnt2:~# drbdsetup /dev/drbd8 down
307 22 Dmitry Chernyak
</pre>