如何使用ClusterControl将PostgreSQL部署到Docker容器

发布于:2020-12-19 18:29:49

0

383

0

ClusterControl PostgreSQL Docker容器

Docker已成为使用容器创建,部署和运行应用程序的最常用工具。它使我们能够将应用程序与它所需的所有部分打包在一起,例如库和其他依赖项,然后将其作为一个程序包全部交付。可以将Docker视为虚拟机,但是Docker无需创建整个虚拟操作系统,而是允许应用程序使用与其所运行的系统相同的Linux内核,并且仅要求应用程序附带尚未运行的东西。主机。这样可以显着提高性能,并减小应用程序的大小。

在此博客中,我们将看到如何通过Docker轻松部署PostgreSQL设置,以及如何使用ClusterControl将设置转换为主/备用复制设置。

如何使用Docker部署PostgreSQL

首先,让我们看看如何通过使用PostgreSQL Docker映像在Docker上手动部署PostgreSQL。

该映像在Docker Hub上可用,您可以从命令行找到它:

1个

2

3

$ docker search postgres<font></font>

NAME                                         DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED<font></font>

postgres                                     The PostgreSQL object-relational database sy…   6519                [OK]

我们将取得第一个结果。官方的。因此,我们需要提取图像:

1个

$ docker pull postgres

并运行将本地端口映射到容器中数据库端口的节点容器:

1个

2

3

$ docker run -d --name node1 -p 6551:5432 postgres<font></font>

$ docker run -d --name node2 -p 6552:5432 postgres<font></font>

$ docker run -d --name node3 -p 6553:5432 postgres

运行这些命令后,您应该创建以下Docker环境:

1个

2

3

4

5

$ docker ps<font></font>

CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS                 PORTS                                                                                     NAMES<font></font>

51038dbe21f8        postgres                      "docker-entrypoint.s…"   About an hour ago   Up About an hour       0.0.0.0:6553->5432/tcp                                                                    node3<font></font>

b7a4211744e3        postgres                      "docker-entrypoint.s…"   About an hour ago   Up About an hour       0.0.0.0:6552->5432/tcp                                                                    node2<font></font>

229c6bd23ff4        postgres                      "docker-entrypoint.s…"   About an hour ago   Up About an hour       0.0.0.0:6551->5432/tcp                                                                    node1

现在,您可以使用以下命令访问每个节点

1个

2

3

4

5

6

$ docker exec -ti [db-container] bash<font></font>

$ su postgres<font></font>

$ psql<font></font>

psql (11.2 (Debian 11.2-1.pgdg90+1))<font></font>

Type "help" for help.<font></font>

postgres=#

然后,您可以创建数据库用户,根据需要更改配置或手动配置节点之间的复制。

如何将PostgreSQL容器导入ClusterControl

现在,您已经设置了PostgreSQL集群,您仍然需要对其进行监视,在出现性能问题时发出警报,管理备份,检测故障并自动将故障转移到运行状况良好的服务器。

如果您已经有一个在Docker上运行的PostgreSQL集群,并且希望ClusterControl对其进行管理,则只需在与数据库容器相同的Docker网络中运行ClusterControl容器即可。唯一的要求是确保目标容器已安装与SSH相关的软件包(openssh服务器,openssh客户端)。然后,允许从ClusterControl到数据库容器的无密码SSH 。完成后,使用“导入现有服务器/群集”功能,并且应该将群集导入ClusterControl。

首先,让我们在数据库容器上安装与OpenSSH相关的软件包,允许root登录,启动它并设置root密码:

1个

2

3

4

5

6

$ docker exec -ti [db-container] apt-get update<font></font>

$ docker exec -ti [db-container] apt-get install -y openssh-server openssh-client<font></font>

$ docker exec -it [db-container] sed -i 's|^PermitRootLogin.*|PermitRootLogin yes|g' /etc/ssh/sshd_config<font></font>

$ docker exec -it [db-container] sed -i 's|^#PermitRootLogin.*|PermitRootLogin yes|g' /etc/ssh/sshd_config<font></font>

$ docker exec -ti [db-container] service ssh start<font></font>

$ docker exec -it [db-container] passwd

启动ClusterControl容器(如果尚未启动),然后将容器上的端口80转发到主机上的端口5000:

1个

$ docker run -d --name clustercontrol -p 5000:80 severalnines/clustercontrol

验证ClusterControl容器是否已启动:

1个

2

$ docker ps | grep clustercontrol<font></font>

7eadb6bb72fb        severalnines/clustercontrol   "/entrypoint.sh"         4 hours ago         Up 4 hours (healthy)   22/tcp, 443/tcp, 3306/tcp, 9500-9501/tcp, 9510-9511/tcp, 9999/tcp, 0.0.0.0:5000->80/tcp   clustercontrol


打开Web浏览器,转到http:// [Docker_Host]:5000 / clustercontrol并创建默认的admin用户和密码。现在,您应该看到ClusterControl主页。

最后一步是为所有数据库容器设置无密码的SSH。为此,我们需要知道每个数据库节点的IP地址。要知道这一点,我们可以为每个节点运行以下命令:

1个

2

$ docker inspect [db-container] |grep IPAddress<font></font>

            "IPAddress": "172.17.0.6",

然后,附加到ClusterControl容器交互式控制台:

1个

$ docker exec -it clustercontrol bash

将SSH密钥复制到所有数据库容器:

1个

2

3

$ ssh-copy-id 172.17.0.6<font></font>

$ ssh-copy-id 172.17.0.7<font></font>

$ ssh-copy-id 172.17.0.8

现在,我们可以开始将群集导入ClusterControl。打开Web浏览器,并使用映射的端口转到Docker的物理主机IP地址,例如http://192.168.100.150:5000/clustercontrol,单击“导入现有服务器/群集”,然后添加以下信息。

我们必须指定用户,密钥或密码和端口以通过SSH连接到我们的服务器。我们还需要为新集群命名。

设置SSH访问信息后,我们必须为每个数据库节点定义数据库用户,版本,basedir和IP地址或主机名。

输入主机名或IP地址时,请确保显示绿色对勾,表示ClusterControl能够与该节点通信。然后,单击“导入”按钮,等待直到ClusterControl完成其工作。您可以在ClusterControl活动部分中监视该过程。

导入后,数据库集群将列在ClusterControl仪表盘下。

请注意,如果只有PostgreSQL主节点,则可以将其添加到ClusterControl中。然后,您可以从ClusterControl UI添加备用节点,以允许ClusterControl为您配置它们。

如何使用ClusterControl部署PostgreSQL容器

现在,让我们看看如何通过使用CentOS Docker映像(manynines / centos-ssh)和ClusterControl Docker映像(manynines / clustercontrol)将PostgreSQL与Docker一起部署。

首先,我们将使用最新版本部署一个ClusterControl Docker容器,因此我们需要提取几个nines / clustercontrol Docker映像。

1个

$ docker pull severalnines/clustercontrol

然后,我们将运行ClusterControl容器并发布端口5000以对其进行访问。

1个

$ docker run -d --name clustercontrol -p 5000:80 severalnines/clustercontrol

现在,您可以通过http:// [Docker_Host]:5000 / clustercontrol打开ClusterControl UI并创建默认的管理员用户和密码。

除了启用了SSH服务之外,还提供了manynines / centos-ssh的自动部署功能,但仅对Galera Cluster有效。尚不支持PostgreSQL。因此,我们将在docker run命令中将AUTO_DEPLOYMENT变量设置为0,以创建数据库节点。

1个

2

3

$ docker run -d --name postgres1 -p 5551:5432 --link clustercontrol:clustercontrol -e AUTO_DEPLOYMENT=0 severalnines/centos-ssh<font></font>

$ docker run -d --name postgres2 -p 5552:5432 --link clustercontrol:clustercontrol -e AUTO_DEPLOYMENT=0 severalnines/centos-ssh<font></font>

$ docker run -d --name postgres3 -p 5553:5432 --link clustercontrol:clustercontrol -e AUTO_DEPLOYMENT=0 severalnines/centos-ssh

运行这些命令后,我们应该具有以下Docker环境:

1个

2

3

4

5

6

$ docker ps<font></font>

CONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS                    PORTS                                                                                     NAMES<font></font>

0df916b918a9        severalnines/centos-ssh       "/entrypoint.sh"    4 seconds ago       Up 3 seconds              22/tcp, 3306/tcp, 9999/tcp, 27107/tcp, 0.0.0.0:5553->5432/tcp                             postgres3<font></font>

4c1829371b5e        severalnines/centos-ssh       "/entrypoint.sh"    11 seconds ago      Up 10 seconds             22/tcp, 3306/tcp, 9999/tcp, 27107/tcp, 0.0.0.0:5552->5432/tcp                             postgres2<font></font>

79d4263dd7a1        severalnines/centos-ssh       "/entrypoint.sh"    32 seconds ago      Up 31 seconds             22/tcp, 3306/tcp, 9999/tcp, 27107/tcp, 0.0.0.0:5551->5432/tcp                             postgres1<font></font>

7eadb6bb72fb        severalnines/clustercontrol   "/entrypoint.sh"    38 minutes ago      Up 38 minutes (healthy)   22/tcp, 443/tcp, 3306/tcp, 9500-9501/tcp, 9510-9511/tcp, 9999/tcp, 0.0.0.0:5000->80/tcp   clustercontrol

我们需要知道每个数据库节点的IP地址。要知道这一点,我们可以为每个节点运行以下命令:

1个

2

$ docker inspect [db-container] |grep IPAddress<font></font>

            "IPAddress": "172.17.0.3",

现在我们已经启动并运行了服务器节点,我们需要部署数据库集群。为了使它简单易行,我们将使用ClusterControl。

要从ClusterControl执行部署,请打开位于http:// [Docker_Host]:5000 / clustercontrol的ClusterControl UI ,然后选择“ Deploy”选项并按照显示的说明进行操作。

选择PostgreSQL时,我们必须指定用户,密钥或密码和端口,以通过SSH连接到我们的服务器。我们还需要一个新集群的名称,如果我们想让ClusterControl为我们安装相应的软件和配置。

设置SSH访问信息后,我们必须定义数据库用户,版本和数据目录(可选)。我们还可以指定要使用的存储库。

在下一步中,我们需要将服务器添加到要创建的集群中。

添加服务器时,我们可以输入IP或主机名。在这里,我们必须使用先前从每个容器获得的IP地址。

在最后一步中,我们可以选择复制是“同步”还是“异步”。

我们可以从ClusterControl活动监视器监视新集群的创建状态。

任务完成后,我们可以在ClusterControl主屏幕中看到我们的集群。


结论

如我们所见,使用Docker部署PostgreSQL在一开始可能很容易,但是配置复制需要更多的工作。最后,您应该监视集群以查看发生了什么。使用ClusterControl,您可以使用Docker导入或部署PostgreSQL集群,以及自动执行监视和管理任务,例如备份和自动故障转移/恢复。试试看。