Có rất nhiều trường hợp bạn phải di chuyển dữ liệu và yêu cầu vận hành từ một máy chủ sang máy chủ khác. Có thể bạn cần triển khai giải pháp của mình tại một trung tâm dữ liệu mới, nâng cấp lên một máy chủ mạnh hơn, hoặc chuyển sang phần cứng mới hoặc nhà cung cấp VPS mới. Dù lý do của bạn là gì, có rất nhiều yếu tố cần lưu ý khi thực hiện di cư từ hệ thống này sang hệ thống khác. Việc tái tạo cấu hình tương đương về chức năng có thể gặp khó khăn nếu bạn không sử dụng giải pháp quản lý cấu hình như Chef, Puppet hay Ansible. Bạn không chỉ cần chuyển dữ liệu mà còn phải cấu hình các dịch vụ để hoạt động tương tự trên máy chủ mới.
Nếu bạn đang tìm cách di chuyển dữ liệu máy chủ Linux, việc sử dụng VPS giá rẻ có thể giúp tiết kiệm chi phí mà vẫn đảm bảo hiệu suất. Khám phá ngay các gói VPS giá rẻ tại DataOnline để hỗ trợ quản trị máy chủ dễ dàng và tối ưu ngân sách của bạn.
Trong bài viết trước, bạn đã chuẩn bị máy chủ của mình cho quá trình di chuyển dữ liệu. Tại thời điểm này, hệ thống đích (target) và hệ thống nguồn (source) đã có thể giao tiếp với nhau — hệ thống đích nên có quyền truy cập SSH đến hệ thống nguồn. Bạn cũng cần có danh sách các phần mềm và dịch vụ cần chuyển (bao gồm cả số phiên bản). Trong hướng dẫn này, bạn sẽ tiếp tục từ điểm dừng lại và bắt đầu quá trình di cư thực tế sang máy chủ mới.
Lưu ý: Ý tưởng chung ở đây là chuyển tất cả các phần thông tin quan trọng trong khi để hệ thống đích càng “sạch” càng tốt. Một số chiến lược di cư có thể nhân bản toàn bộ phân vùng gốc, hoặc bắt đầu sao chép từ gốc của máy chủ nguồn và chỉ loại trừ thủ công một vài tệp tin mà bạn biết sẽ gây ra xung đột. Tuy nhiên, việc di chuyển các phần dữ liệu hệ thống lớn lên một hệ điều hành đang hoạt động có thể gây ra kết quả không lường trước được, hoặc vô tình làm đầy máy chủ mới với các tệp không còn cần thiết cho yêu cầu vận hành của bạn. Hướng dẫn này sẽ thực hiện di chuyển một cách chọn lọc — bằng cách bao gồm các phần cần thiết thay vì loại trừ — để tạo ra kết quả cuối cùng tốt hơn.
Bước 1 – Tạo một Script Di Cư
Bài viết này và bài viết tiếp theo sẽ tập trung vào việc tạo và bổ sung nội dung cho một script bash di cư theo từng bước. Bạn sẽ sử dụng một số công cụ cấp thấp của Linux, và thay vì chạy chúng một cách tương tác, mục tiêu của bạn là tạo ra một quy trình có thể tái sử dụng nhằm bắt giữ các phần cấu hình quan trọng của máy chủ.
Khi viết script này, bạn có thể chạy lại nó theo từng bước. Hầu hết các công cụ được sử dụng trong hướng dẫn này, chẳng hạn như rsync, chỉ chuyển dữ liệu nếu dữ liệu đó đã thay đổi kể từ lần chạy trước, cho phép bạn lặp lại các lệnh mà không lo bị lặp lại không cần thiết. Vì bạn đã cấu hình SSH để cho phép kết nối từ máy chủ đích (target) đến máy chủ nguồn (source), bạn nên làm việc từ máy chủ đích trong suốt hướng dẫn này.
Bạn có thể tạo script này trong thư mục home của mình, sử dụng nano hoặc trình soạn thảo ưa thích:
nano ~/sync.sh
Sau đó, thêm dòng khai báo script (shebang) ở dòng đầu tiên của file. Dòng #!/bin/bash
cho biết script sẽ sử dụng shell bash, đây là shell mạnh mẽ và được hỗ trợ rộng rãi trên hầu hết các hệ thống.
~/sync.sh #!/bin/bash
Lưu và đóng file lại. Nếu bạn sử dụng nano, nhấn Ctrl+X
, sau đó nhấn Y
và Enter
khi được yêu cầu.
Trên dòng lệnh, hãy làm cho script có thể thực thi bằng cách sử dụng lệnh chmod
:
chmod 700 ~/sync.sh
Để tìm hiểu chi tiết hơn về cách thức hoạt động của chmod và quyền trên Linux.
Sau khi đã làm cho script có thể thực thi và thêm dòng shebang, bạn có thể chạy nó bằng cách gọi trực tiếp:
~/sync.sh
Lúc này script sẽ không in ra bất kỳ thông báo nào vì nó chưa có nội dung. Bạn nên kiểm tra script thường xuyên trong quá trình làm theo hướng dẫn này. Giống như trong bài viết trước của loạt bài, có thể bạn sẽ cần chạy script với quyền sudo tùy theo các bước bạn bổ sung vào script.
Bước 2 – Cài đặt Các Chương Trình và Dịch Vụ Cần Thiết
Bước đầu tiên bạn sẽ thêm vào script di cư là khôi phục các gói phần mềm mà bạn đã đánh dấu để di chuyển trong bài viết trước.
Thêm Các Repository Bổ Sung
Trước tiên, bạn nên kết nối lại với máy chủ nguồn trong một terminal riêng để kiểm tra xem bạn có cài đặt phần mềm từ bất kỳ repository bên thứ ba nào không. Nếu có, bạn sẽ không thể cài đặt lại các gói đó trên môi trường mới mà không cấu hình thêm các nguồn gói đó.
Trong môi trường Ubuntu và Debian, bạn có thể kiểm tra các repository thay thế trên máy chủ nguồn bằng cách xem một số vị trí sau:
cat /etc/apt/sources.list
Kết quả có thể như sau:
Output … ## Uncomment the following two lines to add software from Canonical's ## 'partner' repository. ## This software is not part of Ubuntu, but is offered by Canonical and the ## respective vendors as a service to Ubuntu users. # deb http://archive.canonical.com/ubuntu impish partner # deb-src http://archive.canonical.com/ubuntu impish partner deb http://security.ubuntu.com/ubuntu impish-security main restricted # deb-src http://security.ubuntu.com/ubuntu impish-security main restricted deb http://security.ubuntu.com/ubuntu impish-security universe # deb-src http://security.ubuntu.com/ubuntu impish-security universe deb http://security.ubuntu.com/ubuntu impish-security multiverse # deb-src http://security.ubuntu.com/ubuntu impish-security multiverse
Đây là danh sách nguồn chính của gói phần mềm — vì nó chỉ có một file, bạn có thể dùng lệnh cat
để in nội dung. Nếu dòng cuối cùng của file chứa địa chỉ ubuntu.com, có khả năng bạn chưa thêm repository bên thứ ba vào file này. Các repository bổ sung cũng có thể được liệt kê trong thư mục sources.list.d
:
ls /etc/apt/sources.list.d
Ví dụ kết quả có thể như sau:
Output droplet-agent.list elastic-7.x.list nodesource.list
Nếu thư mục này không trống, bạn có thể dùng lệnh cat
để xem nội dung các file riêng lẻ và kiểm tra từng repository:
cat /etc/apt/sources.list.d/elastic-7.x.list
Output deb https://artifacts.elastic.co/packages/7.x/apt stable main
Điều này cho bạn biết URL của repository mà bạn sẽ cần thêm vào máy chủ đích. Trong hầu hết các trường hợp, bạn có thể thực hiện việc này với lệnh add-apt-repository
:
sudo add-apt-repository repo_url
Trên các hệ thống RHEL, Rocky hoặc Fedora, bạn có thể dùng dnf
để liệt kê các repository đã được cấu hình trên máy chủ:
dnf repolist enabled
Sau đó, bạn có thể thêm repository bổ sung vào hệ thống đích bằng cách sử dụng dnf config-manager
:
sudo dnf config-manager --add-repo repo_url
Nếu bạn thay đổi danh sách nguồn trên máy chủ nguồn, hãy ghi chú lại trong phần đầu của script di cư trên máy chủ đích. Bằng cách này, nếu bạn cần cài đặt lại từ đầu, bạn sẽ biết những thao tác nào cần thực hiện trước khi bắt đầu di cư.
Mở lại file script:
nano ~/sync.sh
Nội dung có thể cập nhật như sau:
~/sync.sh #!/bin/bash ############# # Prep Steps ############# # Add additional repositories to /etc/apt/source.list # deb http://example.repo.com/linux/deb stable main non-free
Lưu và đóng file lại.
Xác Định Ràng Buộc Phiên Bản và Cài Đặt
Bây giờ, bạn đã cập nhật các nguồn gói trên máy chủ đích sao cho phù hợp với máy chủ nguồn.
Trên các máy Ubuntu hoặc Debian, bạn có thể cài đặt các phiên bản phần mềm cần thiết trên máy chủ đích bằng cách gõ:
sudo apt update sudo apt install package_name=version_number
Nếu phiên bản của gói bạn cần khớp đã quá cũ (vượt quá vài tháng), có thể phiên bản đó đã bị xóa khỏi kho chính thức. Trong trường hợp này, bạn có thể tìm các phiên bản .deb cũ (ví dụ như duyệt các repository upstream cũ, hoặc PPAs bên thứ ba) và cài đặt thủ công bằng lệnh:
sudo dpkg -i package.deb
Tuy nhiên, hãy sử dụng cách này một cách hạn chế để tránh tạo ra tình huống có quá nhiều gói với phiên bản không khớp. Nếu phiên bản cũ không có sẵn, hãy thử cài phiên bản mới nhất xem nó có đáp ứng được yêu cầu hay không, nhằm tránh áp đặt các yêu cầu lỗi thời.
Đối với các hệ thống RHEL, Rocky hoặc Fedora, bạn có thể cài đặt phiên bản cụ thể của phần mềm bằng lệnh:
Sudo dnf install package_name-version_number
Nếu bạn cần tìm kiếm các file rpm đã bị xóa khỏi repository vì đã có phiên bản mới hơn, bạn có thể cài đặt chúng bằng lệnh:
dnf install package_name.rpm
Hãy theo dõi các thao tác bạn đang thực hiện và ghi chú chúng lại dưới dạng comment trong script:
nano ~/sync.sh
Nội dung file có thể như sau:
~/sync.sh #!/bin/bash ############# # Prep Steps ############# # Add additional repositories to /etc/apt/source.list # deb http://example.repo.com/linux/deb stable main non-free # Install necessary software and versions # apt-get update # apt-get install apache2=2.2.22-1ubuntu1.4 mysql-server=5.5.35-0ubuntu0.12.04.2 libapache2
Lưu và đóng file lại.
Bước 3 – Bắt Đầu Chuyển Dữ Liệu
Quá trình chuyển dữ liệu thực sự không phải là phần tốn công sức nhất của quá trình di cư, nhưng có thể là phần tốn thời gian nhất. Nếu bạn di cư một máy chủ có lượng dữ liệu lớn, tốt nhất là nên bắt đầu chuyển dữ liệu càng sớm càng tốt.
rsync
là một công cụ mạnh mẽ với rất nhiều tùy chọn để sao chép tệp và thư mục giữa các môi trường khác nhau, tích hợp kiểm tra checksum và nhiều tính năng khác.
Xác định các thư mục chứa dữ liệu bạn muốn chuyển và thêm các lệnh rsync vào script di cư của bạn.
Một ví dụ về lệnh rsync có thể như sau:
rsync -azvP --progress source_server:/path/to/directory/to/transfer /path/to/local/directory
Giải thích các tùy chọn:
-
-a
kích hoạt “Archive Mode” cho quá trình sao chép, bảo toàn thời gian chỉnh sửa, chủ sở hữu, v.v. Nó tương đương với việc cung cấp từng tùy chọn-rlptgoD
riêng lẻ (thật vậy đấy). Đặc biệt, tùy chọn-r
cho phép rsync sao chép đệ quy vào các thư mục con. -
-z
nén dữ liệu trong quá trình chuyển, hữu ích khi kết nối chậm, đặc biệt với các tệp như logs và văn bản dễ nén. -
-v
bật chế độ verbose để bạn có thể xem chi tiết quá trình chuyển. -
-P
cho phép giữ lại các bản sao một phần của các tệp chưa chuyển hết, giúp có thể tiếp tục quá trình chuyển sau này.
Bạn có thể tìm hiểu thêm về cách tạo các lệnh rsync
phù hợp bằng cách tham khảo bài viết liên quan.
Trong một số trường hợp, bạn có thể cần tạo các thư mục cha dẫn đến đích trước khi chạy rsync.
Với các lệnh rsync được thêm vào, script sync của bạn có thể trông như sau:
~/sync.sh #!/bin/bash ############# # Prep Steps ############# # Add additional repositories to /etc/apt/source.list # deb http://example.repo.com/linux/deb stable main non-free # Install necessary software and versions # apt-get update # apt-get install apache2=2.2.22-1ubuntu1.4 mysql-server=5.5.35-0ubuntu0.12.04.2 libapache2-mod-auth-mysql=4.3.9-13ubuntu3 php5-mysql=5.3.10-1ubuntu3.9 php5=5.3.10-1ubuntu3.9 libapache2-mod-php5=5.3.10-1ubuntu3.9 php5-mcrypt=5.3.5-0ubuntu1 ############# # File Transfer ############# # Rsync web root rsync -azvP --progress source_server:/var/www/site1 /var/www/ # Rsync home directories . . .
Lưu ý rằng các lệnh này có thể được chạy lại mà không chuyển dữ liệu mới nếu các tệp nguồn không thay đổi, vì vậy bạn có thể bổ sung vào script từng bước khi tiến hành kiểm thử. Hãy cẩn trọng và tiến hành từng bước với các thư mục cần chuyển.
Di Cư Cơ Sở Dữ Liệu và Dữ Liệu Không Dạng Tệp Khác
Lưu ý rằng không phải tất cả dữ liệu đều có thể sao chép bằng rsync mà không cần chuẩn bị thêm. Nhiều ứng dụng như cơ sở dữ liệu lưu trữ dữ liệu của chúng qua nhiều “tệp” khác nhau trên hệ thống, nhằm tối ưu truy xuất bằng các kỹ thuật như Database Sharding. Các tệp này thường không được thiết kế để truy cập hoặc sao chép trực tiếp; cơ sở dữ liệu sẽ cung cấp dữ liệu qua giao diện truy vấn.
May mắn thay, hầu hết các ứng dụng có phương thức lưu trữ riêng sẽ bao gồm cơ chế xuất và nhập dữ liệu dưới dạng các tệp bình thường, cho phép chúng được sao chép khi di cư. Ví dụ, nếu bạn sử dụng MySQL, hãy tham khảo bài viết “Cách Nhập và Xuất Cơ Sở Dữ Liệu trong MySQL hoặc MariaDB“. Sau đó, bạn có thể chuyển các file xuất dữ liệu này qua các máy chủ bằng rsync
hoặc scp
.
Bước 4 – Chỉnh Sửa Các Tệp Cấu Hình
Mặc dù một số phần mềm có thể tự động hoạt động tốt sau khi chuyển các cấu hình và dữ liệu từ máy chủ gốc, nhưng nhiều cấu hình sẽ cần phải được chỉnh sửa lại.
Điều này đặt ra một vấn đề nhỏ cho script đồng bộ (sync). Nếu bạn chạy script để đồng bộ dữ liệu, sau đó chỉnh sửa các giá trị để phù hợp với thông tin của máy chủ đích, những thay đổi đó có thể bị ghi đè khi script chạy lại. Để giải quyết vấn đề này, bạn có thể thêm các bước bổ sung vào script để chỉnh sửa dữ liệu ngay sau khi chuyển.
Linux bao gồm nhiều tiện ích lõi hữu ích cho việc xử lý văn bản trong script. Hai trong số đó là sed
và awk
. Nói chung, sed
đơn giản hơn khi bạn muốn chỉnh sửa văn bản không có cấu trúc sử dụng biểu thức chính quy, còn awk
hữu ích hơn cho việc phân tích văn bản có định dạng hoặc dữ liệu dạng bảng.
Bằng cách đó, script đồng bộ của bạn có thể thực hiện các lệnh sed
hoặc awk
ngay sau khi chạy lệnh rsync, để các tệp được tự động chỉnh sửa sau khi chuyển.
Cú pháp của sed
như sau:
sed -i 's/string_to_match/string_to_replace_it_with/g' file_to_edit
-
Tùy chọn
-i
nghĩa là chỉnh sửa trực tiếp trong tệp mà không tạo file output riêng. -
Các ký hiệu
s
vàg
không thay đổi và là quy ước thông thường của sed. -
Bạn cũng có thể sử dụng biểu thức chính quy trong phần
string_to_match
. Hãy đảm bảo rằng các lệnh sed được đặt sau các lệnh rsync.
Bạn có thể thêm lệnh sed
vào script sync.sh
như sau:
~/sync.sh rsync -avz --progress source_server:/etc/mysql/* /etc/mysql/ # Change socket to '/mysqld/mysqld.sock' sed -i 's/\/var\/run\/mysqld\/mysqld.sock/\/mysqld\/mysqld.sock/g' /etc/mysql/my.cnf
Lệnh trên sẽ thay thế mọi trường hợp /var/run/mysqld/mysqld.sock
trong tệp /etc/mysql/my.cnf
bằng /mysqld/mysqld.sock
. Ký tự \
được sử dụng để escape các ký tự /
vì nếu không sẽ bị hiểu nhầm là kết thúc biểu thức của sed.
Bạn cũng có thể dùng awk
để xử lý văn bản có định dạng. Ví dụ, tệp /etc/shadow
có dạng dữ liệu được phân tách bởi dấu hai chấm :
, như sau:
/etc/shadow vault:!:18941:::::: stunnel4:!:18968:0:99999:7::: sammy:$6$bscTWIVxvy.KhkO8$NJNhpABhJoybG/vDiRzQ2y9OFEd6XtqgCUG4qkuWfld97VEXH8/jUtc7oMtOC34V47VE7Hjd
Bạn có thể sử dụng awk
để loại bỏ dữ liệu của cột thứ hai (tức dữ liệu giữa ký tự :
đầu tiên và thứ hai) như sau:
awk 'BEGIN { OFS=FS=":"; } $1=="root" { $2=""; } { print; }' /etc/shadow > shadow.tmp && mv shadow.tmp /etc/shadow
Lệnh này chỉ định rằng cả đầu vào và đầu ra đều được phân tách bằng dấu :
. Sau đó, nếu cột đầu tiên bằng “root”, thì cột thứ hai sẽ được gán thành chuỗi rỗng. Vì awk
không hỗ trợ chỉnh sửa tệp trực tiếp, nên script thực hiện các bước ghi ra tệp tạm rồi dùng mv
để ghi đè tệp gốc.
Lưu ý: Trong khi
sed
được ưa chuộng nhờ khả năng làm việc với biểu thức chính quy, cú pháp củaawk
có thể phức tạp hơn. Nếu bạn làm việc với các tệp phân cách bởi dấu phẩy, hãy xem xét sử dụng các công cụ hiện đại như csvkit.
Bạn luôn có thể thêm các chú thích vào script di cư (dòng bắt đầu bằng ký hiệu #
) để ghi lại các thay đổi hoặc chỉnh sửa tạm thời.
Kết luận
Bây giờ, bạn đã có đầy đủ thông tin cần thiết để di cư môi trường ứng dụng và dữ liệu sang máy chủ mới. Đồng thời, bạn cũng đã có tài liệu tái tạo quy trình này để có thể triển khai lại stack của mình trên hệ thống mới khi cần thiết.
Để xử lý lỗi khi di chuyển dữ liệu, một máy chủ ổn định là yếu tố then chốt. Thuê VPS tại DataOnline cung cấp hạ tầng mạnh mẽ, hỗ trợ kỹ thuật 24/7, giúp bạn vận hành trơn tru. Tìm hiểu ngay dịch vụ thuê VPS để nâng cao trải nghiệm quản trị máy chủ Linux.
Trong bài viết cuối cùng của loạt bài, bạn sẽ xem xét cách chuyển giao và kiểm tra các dịch vụ hệ thống còn lại trên máy chủ mới.