PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cách giám sát PostgreSQL đang chạy bên trong vùng chứa Docker:Phần thứ nhất

Giám sát là hành động theo dõi và kiểm tra trong một khoảng thời gian để xem những gì bạn đang giám sát phát triển và hoạt động như thế nào. Bạn làm điều đó để có thể thực hiện bất kỳ thay đổi cần thiết nào để đảm bảo mọi thứ hoạt động chính xác. Điều cần thiết là các quá trình phải được giám sát để tạo ra những hiểu biết sâu sắc về các hoạt động đang được thực hiện nhằm lập kế hoạch, tổ chức và điều hành một giải pháp hiệu quả.

Docker là một chương trình được tạo ra để hoạt động như một người xây dựng sẵn sàng trả lời câu hỏi "Liệu phần mềm có chạy trên máy của tôi không?" Về cơ bản, nó lắp ráp các bộ phận khác nhau lại với nhau để tạo ra một mô hình dễ bảo quản và vận chuyển. Mô hình, còn được gọi là thùng chứa, có thể được vận chuyển đến bất kỳ máy tính nào đã cài đặt Docker.

Trong bài này chúng ta sẽ được giới thiệu về Docker, mô tả một số cách cấu hình và so sánh chúng. Hơn nữa, PostgreSQL còn phát huy tác dụng và chúng tôi sẽ triển khai nó bên trong vùng chứa Docker một cách thông minh và cuối cùng, chúng ta sẽ thấy những lợi ích mà ClusterControl có thể cung cấp, để theo dõi các số liệu chính về PostgreSQL và hệ điều hành bên ngoài nó.

Tổng quan về Docker

Khi Docker khởi động, nó sẽ tạo một kết nối mạng mới để cho phép truyền dữ liệu giữa hai điểm cuối, được gọi là cầu nối và đây là nơi chứa các vùng chứa mới theo mặc định.

Trong phần sau, chúng ta sẽ xem chi tiết về cây cầu này và thảo luận lý do tại sao nó không phải là ý kiến ​​hay khi sử dụng trong sản xuất.

$ docker network inspect bridge
Kiểm tra docker cầu mặc định của Docker0.

Vui lòng lưu ý các tùy chọn nhúng, bởi vì nếu bạn chạy một vùng chứa mà không chỉ định mạng mong muốn, bạn sẽ đồng ý với nó.

Trên kết nối mạng mặc định này, chúng tôi mất một số lợi thế tốt của mạng, chẳng hạn như DNS. Hãy tưởng tượng rằng bạn muốn truy cập Google, bạn thích địa chỉ nào hơn, www.google.com hay 172.217.165.4?

Tôi không biết về bạn nhưng tôi thích lựa chọn sớm hơn và thành thật mà nói, tôi không nhập 'www.'.

Mạng cầu nối do người dùng xác định

Vì vậy, chúng tôi muốn có DNS trong kết nối mạng của mình và lợi ích của việc cách ly, vì hãy tưởng tượng tình huống bạn triển khai các vùng chứa khác nhau bên trong cùng một mạng.

Khi chúng tôi tạo vùng chứa Docker, chúng tôi có thể đặt tên cho nó hoặc Docker đặt tên cho chúng tôi ngẫu nhiên hai từ được kết nối bằng gạch dưới hoặc ‘_’.

Nếu chúng tôi không sử dụng Mạng cầu nối do người dùng xác định, trong tương lai có thể là một vấn đề ở giữa các địa chỉ IP, bởi vì chúng tôi rõ ràng không phải là máy và việc nhớ các giá trị này có thể khó và dễ xảy ra lỗi.

Việc tạo cầu nối tùy chỉnh hoặc Mạng cầu nối do người dùng xác định rất dễ dàng.

Trước khi tạo cái đầu tiên của chúng tôi, để hiểu rõ hơn về quy trình, hãy mở một thiết bị đầu cuối mới, nhập lệnh Linux của gói iproute2 và bây giờ hãy quên nó đi.

$ ip monitor all
Khởi tạo thiết bị đầu cuối để giám sát lưu lượng mạng trong Máy chủ Docker.

Thiết bị đầu cuối này bây giờ sẽ lắng nghe hoạt động mạng và hiển thị ở đó.

Bạn có thể đã thấy các lệnh như “ifconfig” hoặc “netstat” trước đây và tôi cho bạn biết rằng chúng không được dùng nữa kể từ năm 2001. Gói net-tools vẫn được sử dụng rộng rãi, nhưng không được cập nhật nữa.

Bây giờ đã đến lúc tạo mạng tùy chỉnh đầu tiên của chúng tôi, vì vậy hãy mở một thiết bị đầu cuối khác và nhập:

$ docker network create --driver bridge br-db
Tạo mạng cầu nối do người dùng xác định "br-db".

Sự kết hợp rất dài giữa các chữ cái và số này được gọi là UUID, hoặc Bộ nhận dạng duy nhất phổ biến. Về cơ bản, điều này nói lên rằng mạng đã được tạo thành công.

Tên đã cho cho mạng đầu tiên của chúng tôi được tạo theo cách thủ công là “br-db” và nó cần phải nằm trong phần cuối cùng của lệnh, nhưng trước đó, chúng tôi có đối số '“-driver”, sau đó là giá trị “bridge” , tại sao?

Trong phiên bản Cộng đồng, Docker cung cấp ba trình điều khiển khác nhau có sẵn:cầu nối, máy chủ lưu trữ và không có trình điều khiển nào. Tại thời điểm tạo, như thế này, mặc định là cầu nối và không cần chỉ định, nhưng chúng tôi đang tìm hiểu về nó.

Nếu bạn đã làm mọi thứ với tôi, hãy nhìn vào thiết bị đầu cuối khác vì tôi sẽ giải thích điều gì đang xảy ra với bạn.

Docker đã tạo ra mạng, được gọi là "br-db", nhưng mạng này chỉ được gọi như vậy bởi anh ấy.

Ở phía bên kia của cây cầu tùy chỉnh này được tạo ra, có một lớp khác, Hệ điều hành. Tên cụ thể cho cùng một mạng cầu nối đã thay đổi và trở thành đại diện của danh pháp cho cầu nối, “br”, theo sau là 12 ký tự đầu tiên của giá trị UUID ở trên, có màu đỏ.

Giám sát các thay đổi địa chỉ IP của Docker.

Với kết nối mạng mới của chúng tôi, chúng tôi có một mạng con, cổng vào và chương trình phát sóng.

Gateway, như tên cho thấy, là nơi tất cả lưu lượng của các gói xảy ra giữa các điểm cuối cầu nối và nó được gọi là “inet” cho hệ điều hành như bạn có thể thấy.

Broadcast đứng ở địa chỉ IP cuối cùng và chịu trách nhiệm gửi cùng một lưu lượng dữ liệu cho tất cả các địa chỉ IP trong mạng con khi cần thiết.

Chúng luôn hiện diện trong các kết nối mạng và đây là lý do tại sao chúng ta có ở đầu đầu ra, giá trị “[ADDR]”. Giá trị này đại diện cho các thay đổi địa chỉ IP và nó giống như một sự kiện được kích hoạt để giám sát hoạt động mạng, vì chúng tôi đã tạo một kết nối mạng mới!

Vùng chứa Docker

Vui lòng truy cập Trung tâm Docker và thấy rằng những gì ở đó được gọi là Hình ảnh Docker và về cơ bản nó là khung của vùng chứa (mô hình).

Docker Images được tạo bởi Dockerfiles và chúng chứa tất cả thông tin cần thiết để tạo vùng chứa, nhằm giúp dễ dàng duy trì và tùy chỉnh.

Nếu bạn chú ý vào Docker Hub, bạn sẽ dễ dàng nhận thấy rằng hình ảnh PostgreSQL, được gọi là postgres, có các thẻ và phiên bản khác nhau và nếu bạn không chỉ định một trong số chúng, thì mặc định sẽ được sử dụng, mới nhất, nhưng có thể trong trong tương lai nếu bạn cần các vùng chứa PostgreSQL khác nhau hoạt động cùng nhau, bạn có thể muốn chúng ở cùng một phiên bản.

Hãy tạo vùng chứa bên phải đầu tiên của chúng ta ngay bây giờ, hãy nhớ sự cần thiết của đối số ‘--network’, nếu không nó sẽ được triển khai trong cầu nối mặc định.

$ docker container run --name postgres-1 --network br-db -e POSTGRES_PASSWORD=5af45Q4ae3Xa3Ff4 -p 6551:5432 -d postgres
Chạy vùng chứa PostgreSQL vào mạng "br-db".

Một lần nữa là UUID, thành công và trong thiết bị đầu cuối khác, điều gì đang xảy ra?

Thay đổi giao diện mạng là sự kiện đang diễn ra ngay bây giờ, hay đơn giản là “[LINK]”. Bạn có thể quên bất cứ điều gì sau “veth”, hãy tin tôi, giá trị luôn thay đổi khi vùng chứa được khởi động lại hoặc điều gì đó tương tự xảy ra.

Giám sát các thay đổi giao diện mạng Docker.

Tùy chọn khác “-e POSTGRES_PASSWORD =?” là viết tắt của Environment, và nó chỉ khả dụng khi chạy vùng chứa PostgreSQL, nó đang định cấu hình mật khẩu cho tài khoản siêu người dùng trong cơ sở dữ liệu, được gọi là postgres.

Publish là tên dài của thông số “-p 6551:5432” và về cơ bản, nó làm cho cổng OS 6551 được liên kết hai chiều với cổng 5432 của vùng chứa.

Cuối cùng nhưng không kém phần quan trọng, là tùy chọn Detach, “-d” và những gì nó làm là làm cho vùng chứa hoạt động độc lập với thiết bị đầu cuối này.

Cuối cùng, tên Docker Image phải theo cùng một mẫu tạo mạng, có tất cả các đối số và tùy chọn ở bên trái, và ở cuối điều quan trọng nhất, trong trường hợp này là tên hình ảnh.

Hãy nhớ rằng các vùng chứa được lưu giữ trong mạng con của mạng, đứng trên các địa chỉ IP được phép cho mỗi một trong số chúng và chúng sẽ không bao giờ ở địa chỉ đầu tiên hoặc địa chỉ cuối cùng, bởi vì Gateway và Broadcast sẽ luôn ở đó.

Chúng tôi đã hiển thị các chi tiết của cây cầu đã tạo và bây giờ sẽ được hiển thị cho từng điểm cuối những chi tiết này do họ lưu giữ.

$ docker network inspect br-db
Kiểm tra giao diện mạng do người dùng xác định "br-db".
$ brctl show
Hiển thị thông tin về Mạng cầu nối do người dùng xác định bởi Máy chủ lưu trữ Docker.

Như bạn có thể thấy, tên mạng và vùng chứa khác nhau, có tên thứ hai được Hệ điều hành công nhận là giao diện, được gọi là “veth768ff71” và tên ban đầu do chúng tôi đặt cho “postgres-1” cho Docker.

Trong lệnh Docker, bạn có thể lưu ý địa chỉ IP cho vùng chứa đã tạo trước đó, mạng con khớp với những gì đã xuất hiện trong thiết bị đầu cuối khác đã mở ngay trước đó và cuối cùng là các tùy chọn trống cho mạng tùy chỉnh này.

Lệnh Linux “brctl show” là một phần của gói bridge-utils và như tên gọi, mục đích của nó là cung cấp một bộ công cụ để định cấu hình và quản lý các cầu nối Ethernet của Linux.

Một mạng cầu nối tùy chỉnh khác

Chúng ta sẽ sớm thảo luận về DNS, nhưng nó rất tốt để làm cho mọi thứ trở nên đơn giản đối với chúng ta trong tương lai. Cấu hình tuyệt vời có xu hướng làm cho việc sử dụng DBA dễ dàng hơn trong tương lai.

Với các mạng cũng vậy, vì vậy chúng ta có thể thay đổi cách hệ điều hành nhận ra địa chỉ mạng con và tên mạng bằng cách thêm nhiều đối số vào lúc tạo.

$ docker network create --driver bridge --subnet 172.23.0.0/16 -o “com.docker.network.bridge.name”=”bridge-host” bridge-docker
Tạo giao diện mạng cầu do người dùng xác định với các tùy chọn tùy chỉnh.
$ ip route show
Hiển thị bảng định tuyến Docker.

Với lệnh Linux này, chúng ta có thể thấy gần giống như lệnh khác trước đó, nhưng bây giờ thay vì liệt kê các giao diện “veth” cho mỗi mạng, chúng ta chỉ cần có “linkdown” này hiển thị những người trống.

Địa chỉ mạng con mong muốn đã được chỉ định làm đối số và tương tự như tùy chọn Môi trường để tạo vùng chứa, đối với mạng, chúng ta có “-o” theo sau là cặp khóa và giá trị. Trong trường hợp này, chúng tôi đang nói với Docker, nói với OS, rằng anh ta nên gọi mạng là "máy chủ cầu nối".

Sự tồn tại của ba mạng đó cũng có thể được xác minh trong Docker, chỉ cần nhập:

$ docker network ls
Hiển thị giao diện mạng trên Docker Engine.

Bây giờ chúng ta đã thảo luận trước đó rằng giá trị của những “veth” này đối với vùng chứa không quan trọng và tôi sẽ chỉ cho bạn trong thực tế.

Bài tập bao gồm xác minh giá trị hiện tại, sau đó khởi động lại vùng chứa, sau đó xác minh lại. Để làm như vậy, chúng ta sẽ cần sự kết hợp của các lệnh Linux đã sử dụng trước đây và các lệnh Docker, các lệnh này mới ở đây nhưng rất đơn giản:

$ brctl show
$ docker container stop postgres-1
$ docker container start postgres-1
$ brctl show
Kiểm tra cách "iptables" làm cho tên vùng chứa dễ thay đổi đối với Máy chủ Docker.

Khi vùng chứa bị dừng, địa chỉ IP phải được đặt miễn phí để nhận địa chỉ mới nếu cần và đó là lời nhắc nhở về cách DNS có thể quan trọng.

Hệ điều hành cung cấp các tên này cho các giao diện mỗi khi vùng chứa đứng trong địa chỉ IP và chúng được tạo bằng gói iptables, gói này sẽ sớm được thay thế bằng khung mới có tên nftables.

Bạn không nên thay đổi các quy tắc này, nhưng vẫn tồn tại các công cụ có sẵn để giúp trực quan hóa chúng, nếu cần, như dockerveth.

Chính sách khởi động lại vùng chứa

Khi chúng tôi khởi động lại chương trình Docker hoặc thậm chí cả máy tính, các mạng do anh ấy tạo sẽ được giữ trong Hệ điều hành, nhưng trống.

Các vùng chứa có cái được gọi là Chính sách Khởi động lại Vùng chứa và đây là một đối số rất quan trọng khác được chỉ định tại thời điểm tạo. PostgreSQL, với tư cách là một cơ sở dữ liệu sản xuất, tính khả dụng của nó là rất quan trọng và đây là cách Docker có thể trợ giúp với nó.

$ docker container run --name postgres-2 --network bridge-docker --restart always -e POSTGRES_PASSWORD=5af45Q4ae3Xa3Ff4 -p 6552:5432 -d postgres
Chỉ định Chính sách khởi động lại vùng chứa tại thời điểm tạo.

Trừ khi bạn dừng nó theo cách thủ công, vùng chứa “postgres-2” này sẽ luôn khả dụng.

Để hiểu rõ hơn, các vùng chứa đang chạy sẽ được hiển thị và chương trình Docker được khởi động lại, sau đó thực hiện lại bước đầu tiên:

$ docker container ls
$ systemctl restart docker
$ docker container ls
Kiểm tra Chính sách khởi động lại vùng chứa trong "postgres-2".

Chỉ vùng chứa “postgres-2” đang chạy, vùng chứa “postgres-1” khác không bắt đầu một mình. Thông tin thêm về nó có thể được xem trong Tài liệu Docker.

Hệ thống tên miền (DNS)

Một lợi ích của Mạng cầu nối do người dùng xác định là tổ chức, chắc chắn, vì chúng tôi có thể tạo bao nhiêu tùy thích để chạy các vùng chứa mới và thậm chí kết nối các vùng chứa cũ, nhưng một lợi ích khác mà chúng ta không có khi sử dụng cầu nối mặc định Docker, là DNS.

Khi các vùng chứa cần giao tiếp với nhau có thể khiến DBA phải ghi nhớ các địa chỉ IP và chúng ta đã thảo luận về điều này trước đó khi hiển thị ví dụ về www.google.com và 172.217.165.4. DNS giải quyết vấn đề này một cách liền mạch, giúp có thể tương tác với các vùng chứa bằng cách sử dụng tên của chúng tại thời điểm tạo do chúng tôi đặt, chẳng hạn như “postgres-2”, thay vì địa chỉ IP “172.23.0.2”.

Hãy xem nó hoạt động như thế nào. Chúng tôi sẽ tạo một vùng chứa khác chỉ cho mục đích trình diễn trong cùng một mạng có tên “postgres-3”, sau đó, chúng tôi sẽ cài đặt gói iputils-ping để truyền các gói dữ liệu đến vùng chứa “postgres-2”, tất nhiên là sử dụng tên của nó .

$ docker container run --name postgres-3 --network bridge-docker --restart always -e POSTGRES_PASSWORD=5af45Q4ae3Xa3Ff4 -p 6553:5432 -d postgres
$ docker container exec -it postgres-3 bash

Để hiểu rõ hơn, hãy tách nó thành các phần, trong các kết quả đầu ra sau đây, mũi tên màu xanh lam sẽ cho biết khi nào lệnh được thực hiện bên trong vùng chứa và màu đỏ, trong OS.

Chạy vùng chứa tạm thời để kiểm tra DNS được cung cấp bởi Giao diện mạng cầu nối do người dùng xác định.
$ apt-get update && apt-get install -y iputils-ping
Cài đặt gói "iputils-ping" để kiểm tra DNS.
$ ping postgres-2
Hiển thị DNS hoạt động thành công.

Tóm tắt

PostgreSQL đang chạy bên trong Docker và tính khả dụng của nó hiện đã được đảm bảo. Khi được sử dụng bên trong Mạng cầu nối do người dùng xác định, vùng chứa có thể được quản lý dễ dàng hơn với nhiều lợi ích như DNS, địa chỉ mạng con tùy chỉnh và tên hệ điều hành cho mạng.

Chúng tôi đã xem chi tiết về Docker và tầm quan trọng của việc nhận thức được các gói và khuôn khổ được cập nhật trên Hệ điều hành.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Báo cáo đường ray không thể tìm thấy một cột ở đó

  2. PostgreSQL không chấp nhận bí danh cột trong mệnh đề WHERE

  3. Kết nối với cơ sở dữ liệu PostgreSQL thông qua đường hầm SSH bằng Python

  4. THAM GIA (CHỌN ...) ue ON 1 =1?

  5. làm cách nào để tạo tệp XML mới từ cơ sở dữ liệu hiện có trong cơ sở dữ liệu PostgreSQL bằng java