Cài đặt và cấu hình DRDB để sao chép hệ thống tập tin mạng trên Debian 8

theanh

Administrator
Nhân viên
Chúng ta hãy nói về Network Filesystem Replication.

Network filesystem replication thường được sử dụng ngày nay trong nhiều tình huống:
  • Sao chép một hệ thống tệp vì lý do bảo mật: nếu một nút bị lỗi, nút kia có thể truy cập được.
  • Để sao chép một hệ thống tệp sang trụ sở công ty khác, do đó mỗi nhân viên có thể truy cập dữ liệu của mình cục bộ chứ không phải thông qua mạng công cộng. Nhưng nếu anh ta đến trụ sở khác, anh ta có tất cả dữ liệu của mình và một lần nữa anh ta có thể truy cập cục bộ.
Như bạn có thể tưởng tượng, loại hệ thống này thường được sử dụng để xây dựng các hệ thống tệp cho môi trường cụm.

Chúng tôi đã chọn triển khai giải pháp với DRDB. Mục đích chính của nó là (giống như các hệ thống khác như thế này) Tính khả dụng cao và Phục hồi sau thảm họa cho các hệ thống tệp.

Chúng tôi triển khai giải pháp với Debian 8, nhưng nó cũng có thể hoạt động trên Ubuntu.


Điều kiện tiên quyết​

Trước khi bắt đầu, đây là các điều kiện tiên quyết:
  • Ít nhất 2 máy chủ Debian.
  • Debian được cài đặt dưới dạng cài đặt tối thiểu (hoàn toàn không cần thiết nếu bạn biết mình đang làm gì trên các hệ thống sản xuất) hướng dẫn được đề xuấthttps://www.howtoforge.com/tutorial/debian-8-jessie-minimal-server/
  • Ít nhất 2 đĩa Linux trong mỗi máy chủ: /dev/sda để cài đặt Linux, /dev/sdb để cài đặt DRDB.
LƯU Ý!!!: Trong quá trình cài đặt, tất cả dữ liệu trên đĩa /dev/sdb sẽ bị hủy, vì vậy không làm việc trên đĩa có dữ liệu bên trong.


Cài đặt DRBD​

Trong ví dụ của chúng tôi, tôi sẽ sử dụng hai nút, đó là:
  • 192.168.152.100 mysql1.local.vm
  • 192.168.152.110 mysql2.local.vm
Trên tất cả các nút, hãy sửa đổi tệp /etc/hosts như sau:
Mã:
127.0.0.1 localhost
192.168.152.100 mysql1.local.vm mysql1
192.168.152.110 mysql2.local.vm mysql2

# Các dòng sau đây là mong muốn cho các máy chủ có khả năng IPv6
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Sau đó thực hiện các lệnh sau để cài đặt DRDB:
Mã:
apt-get update
apt-get -y upgrade
apt-get installdrbd-utils

Cấu hình chính/phụ - Phục hồi sau thảm họa​

Tệp cấu hình chính là/etc/drbd.conf trông giống như sau:
Mã:
include "drbd.d/global_common.conf";
include "drbd.d/*.res";
Theo quy ước, /etc/drbd.d/global_common.conf chứa các phần globalvà commoncủa cấu hình DRBD, trong khi các tệp .res chứa một tài nguyêntrong mỗi phần.

Trong ví dụ của chúng tôi, chúng tôi thực hiện một thiết lập tối thiểu để sao chép dữ liệu trên hai nút. Trên mỗi nút, hãy thực hiện sửa đổi sau:

Chúng ta sẽ bắt đầu chỉnh sửa tệp /etc/drbd.d/global_common.conf, sửa đổi dòng mặc định từ
Mã:
global {
usage-count yes;
# minor-count dialog-refresh disable-ip-verification
}
...
net {
protocol C;
# protocol timeout max-epoch-size max-buffers unplug-watermark
# connect-int ping-int sndbuf-size rcvbuf-size ko-count
# allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri
# after-sb-1pri after-sb-2pri always-asbp rr-conflict
# ping-timeout data-integrity-alg tcp-cork on-congestion
# suspension-fill suspension-extents csums-alg verify-alg
# use-rle
}
...
Bây giờ chúng ta sẽ tạo tệp cấu hình /etc/drbd.d/r0.res cho tài nguyên của chúng ta. Tạo tệp trên tất cả các nút và thêm tệp này vào bên trong:
Mã:
resource r0 { on mysql1.local.vm { device /dev/drbd1; disk /dev/sdb; address 192.168.152.100:7789; meta-disk internal; } on mysql2.local.vm { device /dev/drbd1; disk /dev/sdb; address 192.168.152.110:7789; meta-disk internal; }}
Những gì chúng tôi đã làm cho đến bây giờ là như sau:
  • Bạn "chọn tham gia" để được đưa vào số liệu thống kê sử dụng của DRBD với tham số usage-count.
  • Các tài nguyên được định cấu hình để sử dụng sao chép đồng bộ hoàn toàn với Giao thức Cun trừ khi được chỉ định rõ ràng khác.
  • Cụm của chúng tôi bao gồm hai nút: mysql1 và mysql2.
  • Chúng tôi có một tài nguyên được đặt tên tùy ý là r0 sử dụng /dev/sdblàm thiết bị cấp thấp hơn và được định cấu hình với siêu dữ liệu nội bộ.
  • Tài nguyên sử dụng cổng TCP 7789 cho các kết nối mạng của nó và liên kết với các địa chỉ IP 192.168.152.100 và 192.168.152.110tương ứng.
Trên tất cả các nút, hãy khởi tạo siêu dữ liệu bằng lệnh sau:
Mã:
drbdadm create-md r0
Bạn sẽ thấy nội dung tương tự như sau:
Mã:
--== Cảm ơn bạn đã tham gia khảo sát sử dụng toàn cầu ==--
Phản hồi của máy chủ là:

bạn là người dùng thứ 2963 cài đặt phiên bản này
đang khởi tạo nhật ký hoạt động
KHÔNG khởi tạo bitmap
Đang ghi siêu dữ liệu...
Khối siêu dữ liệu drbd mới đã được tạo thành công.
thành công
Tiếp theo, chúng tôi bật tài nguyên và khởi tạo lần chạy sao chép đầu tiên, chỉ trên nút đầu tiên, nó sẽ bắt đầu sao chép:
Mã:
drbdadm up r0
drbdadm primary --force r0
Để kiểm tra xem mọi thứ có hoạt động tốt không, bạn có thể kiểm tra tệp /proc/drbd trên cả hai nút và bạn sẽ thấy nội dung tương tự như sau cái này:

Mysql1
Mã:
root@mysql1:# cat /proc/drbd
phiên bản: 8.4.3 (api:1/proto:86-101)
srcversion: 1A9F77B1CA5FF92235C2213
1: cs:SyncSource ro:Chính/Phụ ds:Cập nhật/Không nhất quán C r-----
ns:54624 nr:0 dw:0 dr:55536 al:0 bm:3 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:5188060
[>.......................] đã đồng bộ: 1,1% (5064/5116)Kết thúc: 0:17:21 tốc độ: 4.964 (4.964) K/giây
Mysql2
Mã:
root@mysql2:# cat /proc/drbd
phiên bản: 8.4.3 (api:1/proto:86-101)
srcversion: 1A9F77B1CA5FF92235C2213
1: cs:SyncTarget ro:Phụ/Chính ds:Không nhất quán/Cập nhật C r-----
ns:0 nr:17496 dw:17496 dr:0 al:0 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:5225188
[>....................] đã đồng bộ: 0,4% (5100/5116)Mfinish: 0:29:41 tốc độ: 2.916 (2.916) mong muốn: 5.160 K/giây
Trong giai đoạn xây dựng, bạn có thể nhận thấyUpToDate/Inconsistent, điều này đúng vì đây là lần đồng bộ dữ liệu đầu tiên.

Sau khi hệ thống tệp được đồng bộ, dòng này sẽ thay đổi thành UpToDate/UpToDate như trong nhật ký sau:
Mã:
root@mysql1:/home/sysop# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
srcversion: 1A9F77B1CA5FF92235C2213
1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:5242684 nr:0 dw:0 dr:5243596 al:0 bm:320 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
Bây giờ chúng ta có một thiết bị khối mới, được gọi là/dev/drbd1 mà chúng ta có thể định dạng bằng loại hệ thống tệp ưa thích của mình. Ví dụ, nếu chúng ta muốn định dạng nó trong ext4 và gắn nó vào /var/www, chúng ta có thể chỉ cần làm:
Mã:
root@mysql1:/home/sysop# mkfs.ext4 /dev/drbd1
mke2fs 1.42.12 (29-08-2014)
Tạo hệ thống tệp với 1310671 4k khối và 327680 inode
Nhãn hệ thống tệp=ab3e18c9-e8cb-42c8-977a-ab79bdb18aea
Sao lưu superlocco đã lưu vào khối:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Phân bổ bảng nhóm: fatto
Viết các lệnh của inode: fatto
Tạo nhật ký (32768 khối): fatto
Viết thông tin về siêu khối và kế toán của hệ thống tệp: fatto
Sau đó, chúng ta có thể gắn hệ thống tệp của mình:
Mã:
mkdir /var/www
mount /dev/drbd1 /var/www
Thư mục /var/www hiện đã được gắn thông qua hệ thống drbd.

Trong trường hợp này, với cấu hình Chính/Phụ, chúng ta đã triển khai một hệ thống phục hồi sau thảm họa.

Trong trường hợp này, nếu bạn thử gắn hệ thống tệp trên nút thứ hai, bạn sẽ gặp lỗi:
Mã:
root@mysql2:~# mount /dev/drbd1 /var/www/
mount: /dev/drbd1 được bảo vệ khi ghi, gắn kết chỉ đọc
mount: mount /dev/drbd1 trên /var/www không thành công: Loại hỗ trợ bị lỗi
Điều này là bình thường và nằm trong dự đoán vì cấu hình của chúng tôi.

Bây giờ chúng ta có thể mô phỏng lỗi trên mysql1, vì vậy hãy tắt nguồn bằng lệnh poweroff.

Trên mysql2, chúng ta có thể thấy heappens là gì:
Mã:
5 tháng 10 lúc 13:52:14 hạt nhân mysql2: [13458.629215] drbd r0: PingAck không đến kịp.
5 tháng 10 lúc 13:52:14 hạt nhân mysql2: [13458.629587] drbd r0: peer( Primary -> Unknown ) conn( Đã kết nối -> NetworkFailure ) pdsk( Đã cập nhật -> DUnknown )
5 tháng 10 lúc 13:52:14 hạt nhân mysql2: [13458.629919] drbd r0: asender đã kết thúc
5 tháng 10 lúc 13:52:14 hạt nhân mysql2: [13458.629921] drbd r0: Đang kết thúc drbd_a_r0
5 tháng 10 lúc 13:52:14 hạt nhân mysql2: [13458.630028] drbd r0: Kết nối đã đóng
5 tháng 10 lúc 13:52:14 hạt nhân mysql2: [13458.630035] drbd r0: conn( NetworkFailure -> Unconnected )
5 tháng 10 13:52:14 mysql2 kernel: [13458.630035] drbd r0: bộ thu đã kết thúc
5 tháng 10 13:52:14 mysql2 kernel: [13458.630036] drbd r0: Đang khởi động lại luồng bộ thu
5 tháng 10 13:52:14 mysql2 kernel: [13458.630037] drbd r0: bộ thu đã (khởi động lại)
5 tháng 10 13:52:14 mysql2 kernel: [13458.630041] drbd r0: conn( Unconnected -> WFConnection )
Nút mysql2 phát hiện mysql1 đã chết và nếu chúng ta kiểm tra /proc/drbd:
Mã:
root@mysql2:~# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
srcversion: 1A9F77B1CA5FF92235C2213
1: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r-----
ns:0 nr:5457236 dw:5457236 dr:0 al:0 bm:320 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
chúng ta có thể thấy trạng thái đã thay đổi từ Secondary/primary thành Secondary/unknown. Bây giờ chúng ta thực hiện thủ thuật này, quảng bá mysql2 thành primary. Trên mysql2 chỉ cần chạy:
Mã:
drbdadm primary r0
hãy kiểm tra lại /proc/drbd và xem điều kỳ diệu...
Mã:
root@mysql2:~# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
srcversion: 1A9F77B1CA5FF92235C2213
1: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r-----
ns:0 nr:5457236 dw:5457236 dr:912 al:0 bm:320 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
Như bạn thấy, nút của chúng ta hiện là primary và có thể được gắn kết thường xuyên.
Mã:
root@mysql2:~# mount /dev/drbd1 /var/www/
root@mysql2:~# df -h
Hệ thống tập tin Dim. Usati Dispon. Uso% Montato su
/dev/sda1 9,3G 1,4G 7,5G 16% /
udev 10M 0 10M 0% /dev
tmpfs 97M 4,6M 92M 5% /run
tmpfs 241M 0 241M 0% /dev/shm
tmpfs 5,0M 4,0K 5,0M 1% /run/lock
tmpfs 241M 0 241M 0% /sys/fs/cgroup
/dev/drbd1 4,8G 10M 4,6G 1% /var/www
Bây giờ chúng ta giả sử chúng ta muốn sử dụng lại mysql1, nếu chúng ta bắt đầu ngay bây giờ, chúng ta sẽ phải chia nhỏ não, thực tế bạn có thể kiểm tra nhật ký và thấy những lỗi này:
Mã:
5 tháng 10 14:26:04 mysql1 kernel: [ 7.760588] drbd r0: conn( StandAlone -> Unconnected )
5 tháng 10 14:26:04 mysql1 kernel: [ 7.760599] drbd r0: Đang bắt đầu luồng thu (từ drbd_w_r0 [458])
5 tháng 10 14:26:04 mysql1 drbdadm[435]: điều chỉnh mạng: r0
5 tháng 10 14:26:04 mysql1 drbdadm[435]: ]
5 tháng 10 14:26:04 mysql1 kernel: [ 7.769318] drbd r0: thu (đã) khởi động lại
5 tháng 10 14:26:04 mysql1 kernel: [ 7.769327] drbd r0: conn( Unconnected -> WFConnection )
5 tháng 10 14:26:04 mysql1 /etc/init.d/mysql[485]: Không tìm thấy PID MySQL, đã phát hiện/đoán được pid_file: /var/run/mysqld/mysqld.pid
5 tháng 10 14:26:04 mysql1 acpid: đang khởi động với netlink và lớp đầu vào
5 tháng 10 14:26:04 mysql1 acpid: 1 quy tắc đã được tải
5 tháng 10 14:26:04 mysql1 acpid: đang chờ sự kiện: ghi nhật ký sự kiện đã tắt
5 tháng 10 14:26:05 hạt nhân mysql1: [ 8.270578] drbd r0: Bắt tay thành công: Đã đồng ý phiên bản giao thức mạng 101
5 tháng 10 14:26:05 mysql1 kernel: [ 8.270581] drbd r0: Đồng ý hỗ trợ TRIM ở cấp độ giao thức
5 tháng 10 14:26:05 mysql1 kernel: [ 8.270770] drbd r0: conn( WFConnection -> WFReportParams )
5 tháng 10 14:26:05 mysql1 kernel: [ 8.270771] drbd r0: Bắt đầu luồng asender (từ drbd_r_r0 [461])
5 tháng 10 14:26:05 mysql1 kernel: [ 8.272594] chặn drbd1: drbd_sync_handshake:
5 tháng 10 14:26:05 mysql1 kernel: [ 8.272597] chặn drbd1: self 242B364F4A5B9C68:525CC995A3CFBA2B:44A1DE193A6C6701:00000000000000004 bits:64463 flags:0
5 tháng 10 14:26:05 mysql1 kernel: [ 8.272598] chặn drbd1: ngang hàng 6903F6042F95F5FF:525CC995A3CFBA2A:44A1DE193A6C6700:00000000000000004 bit:4 cờ:0
5 tháng 10 14:26:05 mysql1 kernel: [ 8.272599] chặn drbd1: uuid_compare()=100 theo quy tắc 90
5 tháng 10 14:26:05 mysql1 kernel: [ 8.272601] chặn drbd1: lệnh trợ giúp: /sbin/drbdadm initial-split-brain minor-1
5 tháng 10 14:26:05 mysql1 kernel: [ 8.272692] drbd r0: kết nối meta bị tắt bởi peer.
5 tháng 10 lúc 14:26:05 hạt nhân mysql1: [ 8.272720] drbd r0: conn( WFReportParams -> NetworkFailure )
5 tháng 10 lúc 14:26:05 hạt nhân mysql1: [ 8.272722] drbd r0: asender đã kết thúc
5 tháng 10 lúc 14:26:05 hạt nhân mysql1: [ 8.272722] drbd r0: Đang kết thúc drbd_a_r0
5 tháng 10 lúc 14:26:05 hạt nhân mysql1: [ 8.279158] chặn drbd1: lệnh trợ giúp: /sbin/drbdadm initial-split-brain minor-1 mã thoát 0 (0x0)
5 tháng 10 lúc 14:26:05 hạt nhân mysql1: [ 8.279173] block drbd1: Đã phát hiện Split-Brain nhưng chưa được giải quyết, đang ngắt kết nối!
5 tháng 10 lúc 14:26:05 hạt nhân mysql1: [ 8.279197] block drbd1: lệnh trợ giúp: /sbin/drbdadm split-brain minor-1
5 tháng 10 lúc 14:26:05 hạt nhân mysql1: [ 8.286125] block drbd1: lệnh trợ giúp: /sbin/drbdadm split-brain minor-1 mã thoát 0 (0x0)
5 tháng 10 lúc 14:26:05 hạt nhân mysql1: [ 8.286144] drbd r0: conn( NetworkFailure -> Đang ngắt kết nối)
5 tháng 10 lúc 14:26:05 hạt nhân mysql1: [ 8.286146] drbd r0: lỗi khi nhận ReportState, e: -5 l: 0!
5 tháng 10 lúc 14:26:05 hạt nhân mysql1: [ 8.287009] drbd r0: Kết nối đã đóng
5 tháng 10 lúc 14:26:05 hạt nhân mysql1: [ 8.287017] drbd r0: conn( Đang ngắt kết nối -> Độc lập)
5 tháng 10 lúc 14:26:05 hạt nhân mysql1: [ 8.287018] drbd r0: máy thu đã kết thúc
5 tháng 10 lúc 14:26:05 hạt nhân mysql1: [ 8.287019] drbd r0: Đang kết thúc drbd_r_r0
Điều này là do, bây giờ chúng ta có hai nút chính, điều này không khả thi trong cấu hình Chính/Phụ. Vì vậy, giả sử id dữ liệu mới trên mysql2, chúng ta phải hạ cấp mysql1 xuống Phụ.

Vì vậy, trên mysql1 chạy:
Mã:
root@mysql1:~# drbdadm secondary r0
root@mysql1:~#drbdadm connect --discard-my-data r0
Thay vào đó, trên mysql2, là split brain survivor, chúng ta phải thực hiện:
Mã:
root@mysql2:~# drbdadm connect r0
bây giờ bạn có thể kiểm tra và thấy rằng mọi thứ đang được xây dựng lại đúng cách, nhưng bây giờ mysql1 là thứ cấp và mysql2 là chính.
Mã:
root@mysql1:~# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
srcversion: 1A9F77B1CA5FF92235C2213
1: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----
ns:0 nr:28224 dw:28224 dr:0 al:0 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:229628
[=>....................] đồng bộ: 11,2% (229628/257852)K
hoàn thành: 0:01:04 tốc độ: 3.528 (3.528) mong muốn: 6.600 K/giây
 
Back
Bên trên