Cách cấu hình dịch vụ Linux để khởi động tự động sau khi gặp sự cố hoặc khởi động lại - Phần 1: Ví dụ thực tế
Hướng dẫn này chỉ cho bạn cách cấu hình dịch vụ hệ thống để tự động khởi động lại sau sự cố hoặc server khởi động lại.Ví dụ sử dụng MySQL, nhưng bạn có thể áp dụng các nguyên tắc này cho các dịch vụ khác đang chạy trên server của bạn , như Nginx, Apache hoặc ứng dụng của bạn .
Ta đề cập đến ba hệ thống init phổ biến nhất trong hướng dẫn này, vì vậy hãy đảm bảo làm theo một hệ thống cho bản phân phối của bạn. (Nhiều bản phân phối cung cấp nhiều tùy chọn hoặc cho phép cài đặt hệ thống init thay thế.)
- Hệ thống V là hệ thống init cũ hơn:
- Debian 6 trở về trước
- Ubuntu 9.04 trở về trước
- CentOS 5 trở về trước
- Khởi động :
- Ubuntu 9.10 đến Ubuntu 14.10, bao gồm Ubuntu 14.04
- CentOS 6
- systemd là hệ thống init cho các bản phân phối mới nhất được nêu ở đây:
- Debian 7 và Debian 8
- Ubuntu 15.04 và mới hơn
- CentOS 7
Bạn cũng có thể xem Phần 2, bài viết tham khảo .
Lý lịch
Hệ thống Linux hoặc Unix đang chạy của bạn sẽ có một số quy trình thực thi bất kỳ lúc nào. Các quy trình này - còn gọi là dịch vụ hoặc daemon - có thể có nguồn root từ hệ điều hành hoặc chạy như một phần của ứng dụng.
Ví dụ về các dịch vụ hệ điều hành:
- sshd daemon cho phép kết nối từ xa
- daemon cupd điều khiển in ấn
Ví dụ về daemon ứng dụng:
- httpd / apache2 là một dịch vụ web server
- mongod là một daemon database
Các dịch vụ này phải chạy liên tục đảm bảo các trang web, thư, database và các ứng dụng khác của ta luôn hoạt động.
Là administrator , ta muốn các dịch vụ Linux của bạn :
- Chạy liên tục mà không hỏng
- Tự động khởi động sau khi hệ thống khởi động lại hoặc gặp sự cố
Tuy nhiên, đôi khi, các dịch vụ này ngừng hoạt động, khiến các trang web hoặc ứng dụng của ta không khả dụng.
Khởi động lại có thể xảy ra vì nhiều lý do: đó có thể là khởi động lại theo kế hoạch, bước cuối cùng của bản cập nhật vá lỗi hoặc kết quả của hành vi hệ thống không mong muốn. Sự cố là những gì xảy ra khi quá trình dừng đột ngột hoặc không phản hồi các yêu cầu của user hoặc ứng dụng.
Mục tiêu của bài viết này là làm cho các dịch vụ của bạn hoạt động trở lại, ngay cả sau khi gặp sự cố hoặc khởi động lại.
Mặc dù không thể thay thế cho việc giám sát và cảnh báo liên tục, các dịch vụ Linux có thể được thực hiện phần lớn tự phục hồi bằng cách thay đổi cách chúng được xử lý bởi các trình quản lý dịch vụ, còn gọi là hệ thống init .
Không có cách duy nhất để làm điều này: tất cả phụ thuộc vào bản phân phối Linux cụ thể và trình quản lý dịch vụ đi kèm với nó. Các hệ thống init mặc định cho nhiều hệ điều hành phổ biến được hiển thị trong phần giới thiệu ở trên.
Ta sẽ đi vào chi tiết hơn về runlevel trong Phần 2 , nhưng đối với bài viết này, sẽ giúp bạn hiểu rằng mọi hệ thống Linux đều có chung bốn runlevel cơ bản:
- 0 - Runlevel 0 nghĩa là tắt hệ thống
- 1 - Runlevel 1 nghĩa là một user , chế độ cứu hộ
- 5 - Runlevel 5 nghĩa là đa user , kích hoạt mạng, chế độ đồ họa
- 6 - Runlevel 6 dùng để khởi động lại hệ thống
Nói chung, cấp độ 2, 3 và 4 nghĩa là các trạng thái mà Linux đã khởi động ở chế độ đa user , kích hoạt mạng, chế độ văn bản.
Khi ta cho phép một dịch vụ tự động khởi động, ta thực sự đang thêm nó vào một cấp chạy.
Bàn thắng
Trong hướng dẫn hai phần này, ta sẽ xem cách cấu hình dịch vụ Linux để tự động khởi động khi hệ thống khởi động lại hoặc gặp sự cố.
Phần này của loạt bài, Phần 1, sẽ là một phần chạy nhanh mặc dù cách thực hiện nó trong ba chế độ init (khởi tạo) khác nhau:
- Hệ thống V init ( còn gọi là init cổ điển)
- Khởi động
- systemd
Trong Phần 2 , ta sẽ giải thích lý do tại sao ta chạy các lệnh và cách chúng hoạt động đằng sau mức thấp . Ta sẽ nói về các tập lệnh khởi động, các file quan trọng và các tham số cấu hình cho mỗi phương thức init. Nhiều thảo luận trong Phần 2 có vẻ lý thuyết, nhưng sẽ là tài liệu tham khảo hữu ích để hiểu những điều cơ bản.
Phần 1 sẽ chỉ đề cập đến các khía cạnh thực tế của việc cài đặt tự động khởi động lại.
Yêu cầu
Để làm theo hướng dẫn này, bạn cần tạo một số server DigitalOcean (hoặc tạo server Linux của bạn ), mỗi server có ít nhất 1 GB RAM. Ta sẽ không đi vào chi tiết về cách tạo Server, nhưng bạn có thể tìm thêm thông tin tại đây .
Ta sẽ sử dụng các bản phân phối khác nhau cho các ví dụ của ta .
- Debian 6 x64 (cần có hệ điều hành cũ hơn này để chứng minh hệ thống System V init)
- Ubuntu 14.04 x64 (dành cho Upstart)
- CentOS 7 x64 (dành cho systemd)
- Bạn nên cài đặt một user sudo trên mỗi server . Để hiểu cách hoạt động của các quyền sudo, hãy xem hướng dẫn DigitalOcean này về cách bật quyền truy cập sudo
Ta khuyên bạn nên giữ các Server sau khi làm theo Phần 1 của hướng dẫn này, vì ta sẽ sử dụng cài đặt tương tự cho Phần 2 .
Bạn không nên chạy bất kỳ lệnh, truy vấn hoặc cấu hình nào từ hướng dẫn này trên server Linux production . Ta sẽ làm gián đoạn các dịch vụ như một phần của quá trình thử nghiệm và bạn sẽ không muốn server trực tiếp của bạn gặp trục trặc.
Dịch vụ tự động khởi động với Hệ thống V
Hãy bắt đầu cuộc thảo luận của ta với System V init, hệ thống init lâu đời nhất được thảo luận ở đây.
- Debian 6 trở về trước
- Ubuntu 9.04 trở về trước
- CentOS 5 trở về trước
Với System V, hầu hết các ứng dụng tiêu chuẩn mà bạn có thể cài đặt, chẳng hạn như Nginx hoặc MySQL, sẽ khởi động sau khi khởi động lại theo mặc định, nhưng KHÔNG khởi động sau sự cố theo mặc định. Chúng sẽ đi kèm với các tập lệnh init của riêng chúng trong /etc/init.d
rồi.
Đối với các ứng dụng tùy chỉnh, bạn sẽ phải tạo các tập lệnh init của riêng mình và cho phép các dịch vụ tự khởi động theo cách của bạn .
Việc tạo tập lệnh init của bạn nằm ngoài phạm vi của bài viết này, nhưng bạn có thể tham khảo các tập lệnh mẫu hiện có để giúp bạn xây dựng tập lệnh của riêng mình, nếu bạn cần. Hệ thống V sử dụng Bash cho các tập lệnh init.
Danh sách kiểm tra tự động khởi động cho Hệ thống V
Phần này là một tra cứu nhanh đảm bảo dịch vụ của bạn được cài đặt để tự động khởi động.
Danh sách kiểm tra cấu hình
- Đảm bảo rằng dịch vụ có tập lệnh Bash init chức năng được đặt tại
/etc/init.d/service
- Sử dụng lệnh
update-rc.d
để bật dịch vụ (hoặc cho hệ thống CentOS,chkconfig
):
- sudo update-rc.d service enable
- Điều này sẽ tạo một softlink trong
/etc/rc2.d
trông giống như sau ( KHÔNG tạo liên kết này theo cách thủ công):
lrwxrwxrwx 1 root root 15 Jul 31 07:09 S02mysql -> ../init.d/service
Lưu ý bạn cũng sẽ thấy các liên kết từ các folder /etc/rc3.d
đến /etc/rc5.d
; tìm hiểu thêm về những con số này khi ta thảo luận về runlevel .
- Thêm một dòng
respawn
cho dịch vụ này ở cuối file/etc/inittab
. Đây là một ví dụ chung:
id:2345:respawn:/bin/sh /path/to/application/startup
- Dừng lại, sau đó bắt đầu, dịch vụ:
- sudo service service stop
- sudo service service start
- Khởi động lại server .
- sudo reboot
Kiểm tra
Để kiểm tra xem những thứ này đang hoạt động, bạn có thể:
- Khởi động lại server , sau đó xác minh dịch vụ đã hoạt động
- Tìm kiếm số quy trình:
- ps -ef | grep service
- Kết thúc quá trình:
- sudo kill -9 process_number
- Chờ năm phút, sau đó xác minh dịch vụ đã được backup
Bước 1 - Kết nối với Debian 6 Server
Bây giờ ta sẽ chạy qua một ví dụ thực tế, sử dụng MySQL.
Từ console DigitalOcean, hãy tạo Debian 6.0 x64 Server với 1 GB RAM.
Khi Server đã được khởi tạo, hãy sử dụng SSH để kết nối với server ( user Windows có thể kết nối bằng một công cụ như PuTTY).
- ssh sammy@your_server_ip
Trong hướng dẫn sau, ta giả định account của bạn có quyền sudo.
Bước 2 - Cài đặt MySQL
Ta sẽ sử dụng MySQL làm dịch vụ thử nghiệm của bạn . Thực thi lệnh tiếp theo để cài đặt MySQL Server:
- sudo apt-get install mysql-server -y
Màn hình đồ họa như hình dưới đây sẽ xuất hiện yêu cầu nhập password root mới. Cung cấp:
Lặp lại password trong dấu nhắc tiếp theo:
Nhấn ENTER
để xác nhận.
Các dòng sẽ cuộn theo khi MySQL được cài đặt. Sau khi cài đặt hoàn tất, hãy chạy lệnh sau để hoàn tất quá trình cài đặt của bạn:
- mysql_secure_installation
Thao tác này sẽ yêu cầu password root hiện tại. Nhấn N
để giữ nguyên password . Sau đó, nhấn Y
để xóa user ẩn danh, tắt đăng nhập root từ xa và xóa database thử nghiệm. Cuối cùng, nhấn Y
để reload các bảng quyền .
Cài đặt MySQL của ta bây giờ sẽ hoàn tất.
Để kiểm tra xem dịch vụ có đang chạy hay không, hãy thực hiện lệnh này:
- service mysql status
Đầu ra sẽ hiển thị một vài dòng thông tin, một trong số đó sẽ cho biết dịch vụ MySQL đã chạy trong bao lâu (thời gian hoạt động).
Output/usr/bin/mysqladmin Ver 8.42 Distrib 5.1.73, for debian-linux-gnu on x86_64 . . . Uptime: 4 days 18 hours 58 min 27 sec Threads: 1 Questions: 18 Slow queries: 0 Opens: 15 Flush tables: 1 Open tables: 8 Queries per second avg: 0.0.
Bước 3 - Cấu hình MySQL để tự động khởi động sau khi khởi động lại
Theo mặc định, MySQL đã được đặt để bắt đầu sau khi khởi động lại.
Bạn sẽ thấy softlink này tới tập lệnh init của MySQL trong folder /etc/rc2.d
. Lưu ý bạn KHÔNG nên cố gắng tạo các softlink này theo cách thủ công; sử dụng lệnh update-rc.d
để bật và tắt dịch vụ.
- ls -l /etc/rc2.d
Outputlrwxrwxrwx 1 root root 15 Jul 31 07:09 S02mysql -> ../init.d/mysql
Miễn là có một tập lệnh S
trong folder runlevel mặc định cho dịch vụ, init sẽ bắt đầu dịch vụ khi server khởi động.
Vì vậy, MySQL sẽ được chạy. Bây giờ đã đến lúc xác minh nó sẽ tự động khởi động vào thời điểm khởi động. Khởi động lại máy bằng lệnh này:
- sudo reboot
Sau khi server trực tuyến trở lại, hãy kết nối với nó bằng SSH.
Chạy lại lệnh service mysql status
. , dịch vụ sẽ được hiển thị là đang chạy. Điều này nghĩa là dịch vụ tự động khởi động khi hệ điều hành khởi động.
Tuy nhiên, không phải tất cả các dịch vụ sẽ như thế này. Trong những trường hợp đó, ta sẽ phải cấu hình thủ công các dịch vụ để tự động khởi động lại. Đối với Debian, lệnh update-rc.d
cho phép bạn thêm (hoặc gỡ bỏ) các dịch vụ được khởi động tự động khi khởi động.
Hãy vô hiệu hóa dịch vụ MySQL và sau đó xem cách bật lại nó để tự động khởi động. Hãy chạy lệnh này để tắt MySQL:
- sudo update-rc.d mysql disable
Để kiểm tra, hãy khởi động lại server .
- sudo reboot
Kết nối với server của bạn bằng SSH.
Cố gắng kết nối với MySQL bằng công cụ client MySQL:
- mysql -u root -p
Bạn sẽ nhận được thông báo này:
OutputERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
Chạy lại dịch vụ:
- sudo update-rc.d mysql enable
Đầu ra sẽ là:
Outputupdate-rc.d: using dependency based boot sequencing
Nếu bạn đang chạy hệ thống CentOS với System V, các lệnh sẽ sử dụng chkconfig
thay vì update-rc.d
.
Lưu ý việc kích hoạt một dịch vụ để tự động khởi động tại thời điểm khởi động không tự động khởi động nó nếu nó bị dừng. Để khởi động MySQL, hãy chạy lệnh sau:
- sudo service mysql start
Bước 4 - Cấu hình MySQL để tự động khởi động sau sự cố
Bây giờ dịch vụ của ta đang chạy lại, hãy xem liệu nó có tự động khởi động sau sự cố hay không. Với System V, nó sẽ KHÔNG tự động xuất hiện theo mặc định.
Ta sẽ mô phỏng một sự cố bằng cách giết quá trình đột ngột. Tìm ID quy trình của nó bằng cách chạy lệnh sau:
- ps -ef | grep mysql
Đầu ra sẽ tương tự như sau:
Outputroot 1167 1 0 07:21 pts/0 00:00:00 /bin/sh /usr/bin/mysqld_safe mysql 1292 1167 0 07:21 pts/0 00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306 root 1293 1167 0 07:21 pts/0 00:00:00 logger -t mysqld -p daemon.error root 1384 1123 0 07:21 pts/0 00:00:00 grep mysql
Các quy trình chính chạy MySQL là mysqld_safe
và mysqld
. mysqld_safe
là tiến trình mẹ của mysqld
.
Trong ví dụ của ta ở đây, ta có thể thấy chúng có ID quy trình 1167 và 1292 tương ứng. Số quy trình của họ được đánh dấu màu đỏ ở trên.
Hãy giả lập một vụ tai nạn bằng lệnh kill -9
. Đảm bảo sử dụng ID quy trình của bạn :
- sudo kill -9 1167
- sudo kill -9 1292
Kiểm tra trạng thái dịch vụ:
- sudo service mysql status
Kết quả kết quả sẽ cho thấy dịch vụ đã dừng:
OutputMySQL is stopped..
Bây giờ dịch vụ của ta đã bị lỗi, ta làm cách nào để khôi phục nó? Tất nhiên ta có thể khởi động lại nó, nhưng đó sẽ là một quá trình thủ công; ta muốn khởi động lại tự động. Để làm cho MySQL tự động khởi động lại sau sự cố, ta phải chỉnh sửa file /etc/inittab
.
Ta sẽ nói chi tiết hơn về file /etc/inittab
trong Phần 2, nhưng hiện tại, hãy hiểu rằng đó là file đầu tiên mà System V init đọc khi khởi động.
Trong số những thứ khác, /etc/inittab
quyết định cách một quy trình sẽ hoạt động nếu nó gặp sự cố. Đối với một số quy trình, nó nghĩa là phục hồi lại dịch vụ. Ta cần đảm bảo MySQL nằm trong số các dịch vụ đó. Vì vậy, hãy tạo một bản sao của nó trước:
- sudo cp /etc/inittab /etc/inittab.orig
Một lưu ý thận trọng: hãy cực kỳ cẩn thận khi chỉnh sửa file /etc/inittab
. Nếu bạn mắc lỗi trong các lệnh của bạn hoặc xóa bất kỳ cấu hình hiện có nào, hệ thống có thể không hiển thị khi bạn khởi động lại.
Mở /etc/inittab
bằng editor :
- sudo nano /etc/inittab
Ở cuối file , thêm dòng này:
ms:2345:respawn:/bin/sh /usr/bin/mysqld_safe
Vậy ta đang làm gì ở đây?
Vâng, ta đang đặt một lệnh trong /etc/inittab
file để respawn các mysqld_safe process
khi nó bị treo. Nó có bốn trường, mỗi trường được ngăn cách với nhau bằng dấu hai chấm (:).
-
ms:
Hai ký tự đầu tiên chỉ định một id cho quá trình. -
2345:
Trường thứ hai chỉ định các runlevel mà nó phải áp dụng. Trong trường hợp này, nó dành cho các cấp độ 2, 3, 4 và 5 -
respawn:
Trường thứ ba chỉ định hành động ( ta đang khởi động lại dịch vụ) -
/bin/sh /usr/bin/mysqld_safe
: Cuối cùng, trường thứ tư là tiến trình (lệnh để thực thi)
Ta sẽ quay lại file /etc/inittab
chi tiết hơn trong Phần 2 và xem nó giúp ích như thế nào với việc tự động khởi động MySQL sau sự cố. Bây giờ, hãy lưu file và thoát khỏi editor .
Bắt đầu lại dịch vụ:
- sudo service mysql start
Khởi động lại server để thay đổi có hiệu lực:
- sudo reboot
Bây giờ, lặp lại các lệnh để xác định vị trí số tiến trình, hủy tiến trình và kiểm tra lại trạng thái, bắt đầu bằng ps -ef | grep mysql
.
Chờ khoảng năm phút và sau đó thực hiện lệnh:
- sudo service mysql status
Bạn sẽ thấy rằng lần này, MySQL đã tự động khởi động sau sự cố.
Đó là nó! MySQL bây giờ sẽ tự động khởi động sau sự cố dịch vụ hoặc khởi động lại hệ thống.
Dịch vụ tự động khởi động với Upstart
Upstart là một phương thức init khác, được giới thiệu lần đầu tiên trong Ubuntu 6. Nó trở thành phương thức mặc định trong Ubuntu 9.10, và sau đó được áp dụng vào RHEL 6 và các dẫn xuất của nó. Hệ điều hành Chrome của Google cũng sử dụng Upstart.
- Ubuntu 9.10 đến Ubuntu 14.10, bao gồm Ubuntu 14.04
- CentOS 6
Mặc dù nó đang hoạt động mạnh mẽ trên version LTS hiện tại của Ubuntu (14.04 tại thời điểm viết bài), nhưng nó đang bị loại bỏ dần ở mọi nơi để ủng hộ systemd, mà ta đề cập trong phần trước.
Upstart tốt hơn System V trong việc xử lý các dịch vụ hệ thống và nó cũng dễ hiểu. Tuy nhiên, ta sẽ không đi sâu vào Upstart trong phần này của hướng dẫn; có một hướng dẫn rất tốt về Upstart trong cộng đồng DigitalOcean.
Hôm nay ta sẽ chủ yếu tập trung vào các file cấu hình Upstart và xem cách sử dụng chúng để khởi động dịch vụ tự động.
Upstart sử dụng các file cấu hình để kiểm soát các dịch vụ. Các file nằm trong folder /etc/init
. Các file có nội dung văn bản thuần túy với các phần dễ đọc được gọi là khổ thơ . Mỗi khổ thơ mô tả một khía cạnh khác nhau của dịch vụ và cách hoạt động của nó.
Theo mặc định, hầu hết các ứng dụng tiêu chuẩn mà bạn có thể cài đặt, chẳng hạn như Nginx hoặc MySQL, sẽ khởi động sau khi khởi động lại và cũng khởi động sau sự cố theo mặc định, vì vậy bạn không phải làm bất cứ điều gì để làm cho việc này hoạt động. Chúng sẽ đi kèm với các tập lệnh init của riêng chúng trong /etc/init
rồi.
Đối với các ứng dụng tùy chỉnh, bạn sẽ phải tự cài đặt điều này. Để tìm hiểu cách tạo tập lệnh Khởi động tùy chỉnh của bạn , hãy đọc hướng dẫn Khởi động giới thiệu đã tham khảo trước đó.
Danh sách kiểm tra tự động khởi động để khởi động lại
Phần này là một tra cứu nhanh đảm bảo dịch vụ của bạn được cài đặt để tự động khởi động.
Danh sách kiểm tra cấu hình
- Đảm bảo rằng dịch vụ có tập lệnh Upstart init chức năng nằm tại
/etc/init/ service .conf
- Tệp
/etc/init/ service .conf
phải chứa một dòng nhưstart on runlevel [2345]
để cho phép tự động khởi động sau khi khởi động lại - Tệp
/etc/init/ service .conf
cũng phải chứa một dòng như làrespawn
để cho phép dịch vụ khôi phục lại sau sự cố
- Tệp
- Đảm bảo không có file overrides cho dịch vụ:
/etc/init/ service .override
(Sẽ có một cái duy nhất nếu bạn hoặc một administrator khác tạo một cái sớm hơn)
- Dừng lại, sau đó bắt đầu, dịch vụ:
- sudo initctl stop service
- sudo initctl start service
- Khởi động lại server .
- sudo reboot
Kiểm tra
Để kiểm tra xem những thứ này đang hoạt động, bạn có thể:
- Khởi động lại server , sau đó xác minh dịch vụ đã hoạt động
- Tìm kiếm số quy trình:
- ps -ef | grep service
- Kết thúc quá trình:
- sudo kill -9 process_number
- Trong vòng vài giây, hãy xác minh dịch vụ đã được backup
Bước 1 - Kết nối với Ubuntu 14.04 Server
Ta sẽ sử dụng server Ubuntu 14.04, chạy MySQL, để trình diễn Upstart.
Tạo Server với 1 GB RAM và chọn Ubuntu 14.04 x64 làm hình ảnh cơ sở.
Kết nối với server bằng SSH ( user Windows có thể kết nối bằng công cụ như PuTTy).
- ssh sammy@your_server_ip
Trong hướng dẫn sau, ta giả định account của bạn có quyền sudo.
Bước 2 - Cài đặt MySQL
Bây giờ ta sẽ cài đặt MySQL.
Thực hiện lệnh tiếp theo để cập nhật danh sách gói:
- sudo apt-get update
Cài đặt Server MySQL:
- sudo apt-get install mysql-server -y
Tạo password root mới cho MySQL và xác nhận password đó khi được yêu cầu .
Sau khi cài đặt hoàn tất, hãy chạy lệnh mysql_secure_installation
:
- mysql_secure_installation
Cung cấp câu trả lời tương tự cho các dấu nhắc như bạn đã làm trước đây khi cài đặt trong Debian (xem phần trước đó).
Bước 3 - Cấu hình MySQL để tự động khởi động sau khi khởi động lại
Theo mặc định, MySQL sẽ tự động khởi động sau khi khởi động lại. Sẽ rất hữu ích khi xem cấu hình của nó để bạn có thể cài đặt các dịch vụ của riêng mình theo cách này.
Trước hết, hãy kiểm tra xem quá trình server MySQL có đang chạy hay không:
- sudo initctl status mysql
Bạn sẽ thấy kết quả như thế này:
Outputmysql start/running, process 2553
Khởi động lại server :
- sudo reboot
Khi server trực tuyến trở lại, hãy sử dụng SSH để kết nối lại.
Kiểm tra trạng thái của MySQL:
- sudo initctl status mysql
Kết quả kết quả sẽ hiển thị rằng MySQL đã tự động khởi động. Vì vậy, ta không phải làm bất cứ điều gì cụ thể ở đây để kích hoạt dịch vụ.
Lưu ý điều đó có thể không xảy ra đối với các trình ứng dụng khác, nơi bạn phải kích hoạt dịch vụ theo cách thủ công bằng cách tạo file Upstart của bạn trong folder /etc/init/
.
Ngoài ra, làm thế nào Upstart biết MySQL nên tự động khởi động khi server khởi động lại?
Ta hãy xem file init Upstart của MySQL. Mở file /etc/init/mysql.conf
trong editor :
- sudo nano /etc/init/mysql.conf
Tệp Upstart không phải là một tập lệnh shell như ta đã thấy trên máy Debian của bạn .
Tệp cấu hình init cho MySQL sẽ có các khối tập lệnh cho các sự kiện trước và sau khi bắt đầu. Các khối mã này cho hệ thống Upstart biết những gì sẽ thực thi khi quá trình mysqld sắp xuất hiện hoặc đã xuất hiện.
Hãy xem xét kỹ hơn mười dòng đầu tiên của file :
... description "MySQL Server" author "Mario Limonciello <superm1@ubuntu.com>" start on runlevel [2345] stop on starting rc RUNLEVEL=[016] respawn respawn limit 2 5
Ta có thể thấy MySQL được cho là bắt đầu trên runlevel 2, 3, 4 và 5, và nó không được cho là chạy trên runlevels 0, 1 và 6.
Đây là nơi ta xác định hành vi khởi động dịch vụ cho một daemon Upstart. Không giống như System V nơi ta sử dụng các lệnh update-rc.d
hoặc chkconfig
, ta sử dụng các file cấu hình dịch vụ trong Upstart. Tất cả những gì ta phải làm là thêm / thay đổi khổ thơ start
. Trong Phần 2, ta sẽ chơi với file này và xem việc bật và tắt dịch vụ MySQL ảnh hưởng đến file này như thế nào và ngược lại.
Các chỉ thị respawn
khởi động lại dịch vụ sau sự cố, vì vậy ta sẽ thảo luận về chúng trong bước tiếp theo.
Bước 4 - Cấu hình MySQL để tự động khởi động sau sự cố
Bạn vẫn phải mở /etc/init/mysql.conf
.
Chỉ thị respawn
là tự giải thích: MySQL sẽ bắt đầu nếu nó gặp sự cố. Điều này đã được bật theo mặc định.
Chỉ thị sau đó thú vị hơn: chỉ thị respawn limit
quy định số lần Linux sẽ cố gắng khởi động lại dịch vụ bị lỗi trong một khoảng thời gian được chỉ định tính bằng giây. Trong trường hợp này, đối số đầu tiên ( 2
) là số lần thử và đối số thứ hai ( 5
) là khoảng thời gian. Nếu dịch vụ không khởi động (hồi sinh) thành công trong ngưỡng này, nó sẽ được giữ ở trạng thái dừng. Đây là hành vi mặc định lành mạnh bởi vì nếu một dịch vụ liên tục gặp sự cố, tốt hơn là bạn nên vô hiệu hóa nó hơn là ảnh hưởng đến sự ổn định của toàn bộ hệ thống của bạn.
Hiện tại, hãy thoát khỏi editor mà không thực hiện bất kỳ thay đổi nào.
Như ta vừa thấy, theo mặc định, MySQL cũng được cấu hình để tự động quay lại sau sự cố.
Để kiểm tra điều này, hãy kiểm tra PID dịch vụ:
- sudo initctl status mysql
PID mới (sau khi khởi động lại) cho hệ thống của ta sẽ trông như thế này:
Outputmysql start/running, process 961
Lưu ý ID quy trình cho trường hợp thử nghiệm của bạn. Tiếp theo, mô phỏng một sự cố bằng cách giết quá trình bằng lệnh kill -9
, sử dụng số tiến trình của bạn :
- sudo kill -9 961
Kiểm tra trạng thái MySQL ngay bây giờ. Nó sẽ chạy (ngay lập tức hoặc trong vài giây) với một PID mới:
- sudo initctl status mysql
Trong trường hợp của ta , PID mới là 1552:
Outputmysql start/running, process 1552
Nếu bạn muốn, bạn có thể giết nó . Nó sẽ xuất hiện lại mỗi lần:
Điều này xảy ra do chỉ thị respawn
trong file mysql.conf
.
respawn
MySQL đi kèm với khả năng khởi động lại sau sự cố theo mặc định, nhưng đối với các dịch vụ khác, bạn có thể phải thêm chỉ thị này theo cách thủ công trong file Upstart. , trong Phần 2, ta sẽ xem cách ta có thể thay đổi hành vi crash từ file cấu hình.
Dịch vụ tự động khởi động với systemd
systemd là trình quản lý hệ thống và dịch vụ cho Linux, đã trở thành nền tảng khởi tạo trên thực tế cho hầu hết các bản phân phối Linux mới.
Lần đầu tiên được triển khai trong Fedora, systemd hiện đi kèm với RHEL 7 và các dẫn xuất của nó như CentOS 7. Ubuntu 15.04 cũng đi kèm với systemd root . Các bản phân phối khác đã kết hợp systemd hoặc thông báo sẽ sớm ra mắt.
- Debian 7 và Debian 8
- Ubuntu 15.04
- CentOS 7
systemd tương thích ngược với các lệnh System V và các tập lệnh khởi tạo.
Điều đó nghĩa là bất kỳ dịch vụ System V nào cũng sẽ chạy trong systemd. Hầu hết các lệnh quản trị Upstart và System V đã được sửa đổi để hoạt động theo systemd. Đó là lý do tại sao nó thường được gọi là phần mềm thay thế cho System V init.
Với systemd, hầu hết các ứng dụng tiêu chuẩn mà bạn có thể cài đặt, chẳng hạn như Nginx hoặc MySQL, sẽ khởi động sau khi khởi động lại và cũng khởi động sau sự cố theo mặc định, vì vậy bạn không cần phải làm bất cứ điều gì để làm cho việc này hoạt động. Chúng sẽ đi kèm với các tập lệnh init của riêng chúng trong /etc/systemd/system
.
Đối với các ứng dụng tùy chỉnh, bạn sẽ phải tạo các tập lệnh init của riêng mình và cho phép các dịch vụ tự khởi động theo cách của bạn . Ta sẽ không đi vào chi tiết cụ thể về những gì đi vào một tập lệnh init tùy chỉnh một cách chi tiết tại đây, nhưng bạn có thể đọc thêm về systemd trong bài viết giới thiệu systemd này .
Danh sách kiểm tra tự động khởi động cho systemd
Phần này là một tra cứu nhanh đảm bảo dịch vụ của bạn được cài đặt để tự động khởi động.
Danh sách kiểm tra cấu hình
- Đảm bảo dịch vụ có tập lệnh systemd init chức năng tại
/etc/systemd/system/multi-user.target.wants/ service .service
- Sử dụng lệnh
systemctl
để kích hoạt dịch vụ:
- sudo systemctl enable service.service
- Thao tác này sẽ tạo softlink trong
/etc/systemd/system/multi-user.target.wants/
trông giống như sau ( KHÔNG tạo liên kết này theo cách thủ công):
lrwxrwxrwx 1 root root 38 Aug 1 04:43 /etc/systemd/system/multi-user.target.wants/service.service -> /usr/lib/systemd/system/service.service
Điều này sẽ cho phép tự động khởi động sau khi khởi động lại.
- Tệp
/etc/systemd/system/multi-user.target.wants/ service .service
cũng phải chứa một dòng nhưRestart=always
bên dưới phần[Service]
của file để cho phép dịch vụ hồi sinh sau sự cố - Reload daemon systemd, sau đó khởi động lại dịch vụ:
- sudo systemctl daemon-reload
- sudo systemctl restart service.service
Kiểm tra
Để kiểm tra xem những thứ này đang hoạt động, bạn có thể:
- Khởi động lại server , sau đó xác minh dịch vụ đã hoạt động
- sudo reboot
- Tìm kiếm số quy trình:
- ps -ef | grep service
- Kết thúc quá trình:
- sudo kill -9 process_number
- Trong vòng vài giây, hãy xác minh dịch vụ đã được backup
Bước 1 - Kết nối với CentOS 7 Server
Ta sẽ sử dụng CentOS 7 và MySQL để chỉ cho bạn cách cấu hình các dịch vụ systemd.
Tạo một Server với 1 GB RAM và chọn CentOS 7 x64 làm hình ảnh cơ sở của nó.
Sử dụng SSH để kết nối với server ( user Windows có thể kết nối bằng công cụ như PuTTy).
- ssh sammy@your_server_ip
Ta cho rằng bạn đang sử dụng account có quyền sudo.
Bước 2 - Cài đặt MySQL
Chạy các lệnh sau để download và cài đặt kho server MySQL Community:
- sudo wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
- sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm
Cài đặt server MySQL:
- sudo yum install mysql-server -y
Sau khi cài đặt hoàn tất, hãy bắt đầu dịch vụ mysqld.
( Lưu ý điều này không giống như khi ta cài đặt MySQL trong Debian và Ubuntu. Trong các bản phân phối khác, MySQL tự động khởi động.)
Ngoài ra, ta đang sử dụng một lệnh systemd mới có tên là systemctl
để kiểm soát dịch vụ:
- sudo systemctl start mysqld
Tiếp theo, chạy lệnh mysql_secure_installation
.
- mysql_secure_installation
Trong trường hợp này, password root của MySQL sẽ trống, vì vậy bạn nên chọn tạo một password mới. Cung cấp câu trả lời tương tự cho các dấu nhắc khác như bạn đã làm khi cài đặt trong Debian hoặc Ubuntu (xem phần Debian trước đó để biết chi tiết).
Bước 3 - Cấu hình MySQL để tự động khởi động sau khi khởi động lại
Theo mặc định, MySQL được cấu hình để tự động khởi động sau khi khởi động lại. Hãy xem cách này hoạt động như thế nào.
Để kiểm tra xem daemon mysqld
đã được cấu hình để khởi động tự động lúc khởi động hay chưa, hãy thực thi lệnh systemctl
với tùy chọn is-enabled
:
- sudo systemctl is-enabled mysqld.service
Kết quả sẽ là:
Outputenabled
Hãy khởi động lại máy:
- sudo reboot
Khi server hoạt động trở lại, hãy kết nối với nó bằng SSH.
Thực hiện lệnh sau để kiểm tra trạng thái dịch vụ:
- sudo systemctl status mysqld.service
Đầu ra sẽ hiển thị dịch vụ đang chạy:
Outputmysqld.service - MySQL Community Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled) Active: active (running) since Fri 2015-07-31 21:58:03 EDT; 1min 52s ago Process: 662 ExecStartPost=/usr/bin/mysql-systemd-start post (code=exited, status=0/SUCCESS) Process: 625 ExecStartPre=/usr/bin/mysql-systemd-start pre (code=exited, status=0/SUCCESS) Main PID: 661 (mysqld_safe) ...
Để tắt dịch vụ, hãy chạy lệnh sau:
- sudo systemctl disable mysqld.service
Điều này sẽ không dừng dịch vụ, nhưng vô hiệu hóa nó. Trên thực tế, kết quả cho thấy các softlink đã bị xóa:
Outputrm '/etc/systemd/system/multi-user.target.wants/mysqld.service' rm '/etc/systemd/system/mysql.service'
Nếu muốn, bạn có thể khởi động lại server và kiểm tra lại để xem server MySQL có đang chạy hay không (sẽ không như vậy).
Hoặc, thực thi systemctl is-enabled
lại; ta sẽ nhận được phản hồi của disabled
:
- sudo systemctl is-enabled mysqld.service
Outputdisabled
Bật lại dịch vụ:
- sudo systemctl enable mysqld.service
Đầu ra sẽ hiển thị các softlink đang được tạo lại:
Outputln -s '/usr/lib/systemd/system/mysqld.service' '/etc/systemd/system/mysql.service' ln -s '/usr/lib/systemd/system/mysqld.service' '/etc/systemd/system/multi-user.target.wants/mysqld.service'
Dịch vụ của bạn sẽ tự động bắt đầu sau khi khởi động lại.
Bước 4 - Cấu hình MySQL để tự động khởi động sau sự cố
Bây giờ ta sẽ xem cách MySQL được cấu hình để tự động khởi động sau sự cố.
Trước tiên, hãy mở file đơn vị mysqld.service
trong editor (hãy nhớ rằng, các dịch vụ systemd sử dụng file đơn vị để cấu hình):
- sudo nano /etc/systemd/system/multi-user.target.wants/mysqld.service
Ở cuối file , có một chỉ thị để khởi động lại:
[Unit] ... [Install] ... [Service] ... ... Restart=always ...
Giá trị của tham số Restart
được đặt thành always
. Điều này nghĩa là dịch vụ MySQL sẽ khởi động lại đối với các mã thoát hoặc hết thời gian chờ sạch hoặc không sạch.
Đó là nơi khởi động lại tự động được xác định trong systemd.
Cũng giống như chỉ thị respawn
trong Upstart, tham số Restart
trong systemd xác định cách dịch vụ sẽ hoạt động nếu nó gặp sự cố.
Không phải tất cả các dịch vụ systemd đều có khả năng này được bật theo mặc định; để làm cho một dịch vụ xuất hiện sau sự cố, tất cả những gì ta phải làm là thêm chỉ thị bổ sung này trong phần [Service]
của file đơn vị dịch vụ. Nếu tiêu đề phần không tồn tại, ta cũng phải thêm tiêu đề [Service]
.
Để mô phỏng sự cố, trước tiên hãy thoát khỏi editor và sau đó kiểm tra ID quy trình MySQL:
- sudo systemctl status mysqld.service
Outputmysqld.service - MySQL Community Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled) Active: active (running) since Fri 2015-07-31 21:58:03 EDT; 1h 7min ago Main PID: 661 (mysqld_safe) ...
Kết thúc quá trình này bằng tín hiệu kill -9
. Trong trường hợp của ta , PID chính là 661; thay thế PID bằng của bạn :
- sudo kill -9 661
Kiểm tra trạng thái:
- sudo systemctl status mysqld.service
Kết quả kết quả sẽ cho thấy MySQL đã khởi động lại với PID mới (trong trường hợp của ta là ID quy trình mới là 11217):
Outputmysqld.service - MySQL Community Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled) Active: active (running) since Fri 2015-07-31 23:06:38 EDT; 1min 8s ago Process: 11218 ExecStartPost=/usr/bin/mysql-systemd-start post (code=exited, status=0/SUCCESS) Process: 11207 ExecStartPre=/usr/bin/mysql-systemd-start pre (code=exited, status=0/SUCCESS) Main PID: 11217 (mysqld_safe) ... ...
Vì vậy, bạn thấy rằng dịch vụ vẫn hoạt động ngay cả sau sự cố.
Kết luận
Trong phần đầu tiên của hướng dẫn này, ta đã biết cách các dịch vụ System V, Upstart và systemd có thể được cấu hình để tự động khởi động sau khi khởi động lại hoặc gặp sự cố.
Ta cũng đã thấy các file , tham số cấu hình và lệnh kiểm soát hành vi này.
Đây là phần giới thiệu thực hành nhiều hơn. Ta sẽ trình bày chi tiết hơn các khái niệm và khái niệm cơ bản trong phần tiếp theo của loạt bài này.
Đừng xóa Server - hãy tiếp tục chạy vì ta sẽ quay lại với chúng trong phần tiếp theo .
Các tin liên quan
Cách sử dụng Hệ thống kiểm toán Linux trên CentOS 72015-07-16
Cách sử dụng Hệ thống kiểm toán Linux trên CentOS 7
2015-07-16
Thiết lập ban đầu của server Fedora 22
2015-07-08
Cách thiết lập Shiny Server trên Ubuntu 14.04
2015-06-28
Cách backup server LAMP bằng Bacula trên Ubuntu 14.04
2015-06-11
Cách cấu hình sao chép DNS trên server Slave PowerDNS trên Ubuntu 14.04
2015-06-04
Cách thay đổi mật khẩu tài khoản trên server OpenLDAP
2015-05-29
Cách thay đổi mật khẩu tài khoản trên server OpenLDAP
2015-05-29
Cách chạy mail server và lưu trữ tệp của riêng bạn với PEPS trên Ubuntu 14.04
2015-05-22
Cách chạy mail server của riêng bạn với Mail-in-a-Box trên Ubuntu 14.04
2015-05-15