什么是 PostgreSQL HA?

此 PostgreSQL 集群解决方案包括 PostgreSQL 复制管理器(replication manager),这是一种用于管理 PostgreSQL 集群上的复制(replication)和故障转移(failover)的开源工具。

获取此镜像

获取 Bitnami PostgreSQL HA Docker 镜像的推荐方法是从 Docker Hub Registry 中提取预构建的镜像。

$ docker pull bitnami/postgresql-repmgr:latest

要使用特定版本,您可以拉取版本化标签。 您可以在 Docker Hub Registry 中查看可用版本的列表

$ docker pull bitnami/postgresql-repmgr:[TAG]

如果您愿意,您也可以自己构建镜像。

$ docker build -t bitnami/postgresql-repmgr:latest 'https://github.com/bitnami/bitnami-docker-postgresql-repmgr.git#master:14/debian-10'

持久化您的应用程序

如果删除容器,所有数据都将丢失,下次运行镜像时,数据库将重新初始化。 为避免这种数据丢失,您应该挂载一个即使在容器被删除后仍将持续存在的卷。

对于持久性,您应该在 /bitnami/postgresql 路径上挂载一个目录。 如果挂载的目录是空的,它将在第一次运行时被初始化。

$ docker run \
-v /path/to/postgresql-repmgr-persistence:/bitnami/postgresql \
bitnami/postgresql-repmgr:latest

此存储库中的 docker-compose.yml 文件已经配置了持久性。

注意:由于这是一个非 root 容器,因此挂载的文件和目录必须具有 UID 1001 的适当权限。

连接到其他容器

使用 Docker 容器网络,您的应用程序容器可以轻松访问在容器内运行的 PostgreSQL 服务器,反之亦然。

连接到同一网络的容器可以使用容器名称作为主机名相互通信。

使用命令行

在此示例中,我们将创建一个 PostgreSQL 客户端实例,该实例将连接到与客户端在同一 docker 网络上运行的服务器实例。

Step 1: 创建 network

$ docker network create my-network --driver bridge

Step 2: 在您的 network 中启动 postgresql-repmgr 容器

使用 docker run 命令的 --network <NETWORK> 参数将容器附加到 my-network 网络。

$ docker run --detach --rm --name pg-0 \
--network my-network \
--env REPMGR_PARTNER_NODES=pg-0 \
--env REPMGR_NODE_NAME=pg-0 \
--env REPMGR_NODE_NETWORK_NAME=pg-0 \
--env REPMGR_PRIMARY_HOST=pg-0 \
--env REPMGR_PASSWORD=repmgrpass \
--env POSTGRESQL_PASSWORD=secretpass \
bitnami/postgresql-repmgr:latest

Step 3: 运行你的 PostgreSQL client 实例

最后,我们创建一个新的容器实例来启动 PostgreSQL client 并连接到上一步中创建的服务器:

$ docker run -it --rm \
--network my-network \
bitnami/postgresql:10 \
psql -h pg-0 -U postgres

使用 Docker Compose

如果未指定,Docker Compose 会自动设置一个新网络并将所有已部署的服务附加到该网络。 但是,我们将明确定义一个名为 my-network 的新 bridge 网络。 在此示例中,我们假设您希望从您自己的自定义应用程序镜像连接到 PostgreSQL 服务器,该镜像在以下代码段中由服务名称 myapp 标识。

version: '2'

networks:
my-network:
driver: bridge services:
pg-0:
image: 'bitnami/postgresql-repmgr:latest'
networks:
- my-network
environment:
- POSTGRESQL_PASSWORD=custompassword
- REPMGR_PASSWORD=repmgrpassword
- REPMGR_PRIMARY_HOST=pg-0
- REPMGR_NODE_NETWORK_NAME=pg-0
- REPMGR_NODE_NAME=pg-0
- REPMGR_PARTNER_NODES=pg-0
myapp:
image: 'YOUR_APPLICATION_IMAGE'
networks:
- my-network

重要的:

  1. 请使用您的应用程序镜像更新上述代码段中的 YOUR_APPLICATION_IMAGE 占位符
  2. 在您的应用程序容器中,使用主机名 pg-0 连接到 PostgreSQL 服务器

使用以下命令启动容器:

$ docker-compose up -d

配置

初始化一个新实例

第一次执行容器时,它将执行位于 /docker-entrypoint-initdb.d 的扩展名为 .sh.sql.sql.gz 的文件。

为了将您的自定义文件放入 docker 镜像中,您可以将它们挂载为卷。

在首次运行时设置 root 和 repmgr 密码

在上述命令中,您可能已经注意到 POSTGRESQL_PASSWORDREPMGR_PASSWORD 环境变量的使用。 第一次运行镜像时传递 POSTGRESQL_PASSWORD 环境变量会将 postgres 用户的密码设置为 POSTGRESQL_PASSWORD 的值(或 POSTGRESQL_PASSWORD_FILE 中指定的文件内容)。同样,传递 REPMGR_PASSWORD 环境变量将 repmgr 用户的密码设置为 REPMGR_PASSWORD 的值(或 REPMGR_PASSWORD_FILE 中指定的文件内容)。

$ docker run --name pg-0 --env REPMGR_PASSWORD=repmgrpass --env POSTGRESQL_PASSWORD=secretpass bitnami/postgresql-repmgr:latest

或通过修改此存储库中存在的 docker-compose.yml 文件:

...
services:
pg-0:
...
environment:
- - POSTGRESQL_PASSWORD=adminpassword
+ - POSTGRESQL_PASSWORD=password123
- - REPMGR_PASSWORD=repmgrpassword
+ - REPMGR_PASSWORD=password123
...
pg-1:
...
environment:
- - POSTGRESQL_PASSWORD=adminpassword
+ - POSTGRESQL_PASSWORD=password123
- - REPMGR_PASSWORD=repmgrpassword
+ - REPMGR_PASSWORD=password123
...

Note!postgresrepmgr 用户都是超级用户,并且对 PostgreSQL 数据库具有完全的管理访问权限。

如果要为 postgres 用户设置非特权用户和密码,请参阅在首次运行时创建数据库用户。

首次运行时创建数据库

通过在第一次运行镜像时传递 POSTGRESQL_DATABASE 环境变量,将创建一个数据库。 如果您的应用程序要求数据库已经存在,这将非常有用,您不必使用 PostgreSQL 客户端手动创建数据库。

$ docker run --name pg-0 --env POSTGRESQL_DATABASE=my_database bitnami/postgresql-repmgr:latest

首次运行时创建数据库用户

您还可以创建一个受限数据库用户,该用户仅对使用 POSTGRESQL_DATABASE 环境变量创建的数据库具有权限。 为此,请提供 POSTGRESQL_USERNAME 环境变量。

$ docker run --name pg-0 --env POSTGRESQL_USERNAME=my_user --env POSTGRESQL_PASSWORD=password123 --env POSTGRESQL_DATABASE=my_database bitnami/postgresql-repmgr:latest

此存储库中的 docker-compose.yml 文件已配置此设置。

Note!指定 POSTGRESQL_USERNAME 时,不会为 postgres 用户分配密码,因此您无法以 postgres 用户身份远程登录 PostgreSQL 服务器。如果您仍想使用用户 postgres 访问,请设置 POSTGRESQL_POSTGRES_PASSWORD 环境变量(或 POSTGRESQL_POSTGRES_PASSWORD_FILE 中指定的文件内容)。

使用流复制和 repmgr 设置 HA PostgreSQL 集群

使用以下环境变量,可以使用 Bitnami PostgreSQL HA Docker 镜像轻松设置具有[流复制](Streaming replication)和 repmgrHA PostgreSQL 集群:

  • POSTGRESQL_PASSWORD:postgres 用户的密码。没有默认值。
  • POSTGRESQL_PASSWORD_FILE:包含 postgres 用户密码的文件的路径。 这将覆盖 POSTGRESQL_PASSWORD 中指定的值。 没有默认值。
  • REPMGR_USERNAME:repmgr 用户的用户名。默认为 repmgr
  • REPMGR_PASSWORD_FILE:包含 repmgr 用户密码的文件的路径。这将覆盖 REPMGR_PASSWORD 中指定的值。 没有默认值。
  • REPMGR_PASSWORD:repmgr 用户的密码。没有默认值。
  • REPMGR_USE_PASSFILE:配置 repmgr 以在其配置中使用 passfilePGPASSFILE 而不是纯文本密码。
  • REPMGR_PASSFILE_PATH:密码文件的位置,如果它不存在,它将使用 REPMGR 凭据创建。
  • REPMGR_PRIMARY_HOST:初始主节点的主机名。没有默认值。
  • REPMGR_PARTNER_NODES:集群中的伙伴节点的逗号分隔列表。没有默认值。
  • REPMGR_NODE_NAME:节点名称。没有默认值。
  • REPMGR_NODE_NETWORK_NAME:节点主机名。没有默认值。
  • REPMGR_PGHBA_TRUST_ALL:这将在生成的 pg_hba.conf 中设置 auth-method。仅当您使用带有 LDAP 身份验证的 pgpool 时才将其设置为 yes。默认为 no

HA PostgreSQL 集群中,您可以拥有一个主节点和零个或多个备用节点。主节点处于读写模式,而备用节点处于只读模式。为获得最佳性能,建议将读取限制在备用节点。

注意:对于 9.6 版之前的 Postgresql,REPMGR_USE_PASSFILE 和 REPMGR_PASSFILE_PATH 将被忽略。

使用 REPMGR_PASSFILE_PATH 挂载外部密码文件时,还需要相应地配置 REPMGR_PASSWORD 和 REPMGR_USERNAME。

Step 1: 创建 network

$ docker network create my-network --driver bridge

Step 2: 创建初始主节点

第一步是启动初始主节点:

$ docker run --detach --name pg-0 \
--network my-network \
--env REPMGR_PARTNER_NODES=pg-0,pg-1 \
--env REPMGR_NODE_NAME=pg-0 \
--env REPMGR_NODE_NETWORK_NAME=pg-0 \
--env REPMGR_PRIMARY_HOST=pg-0 \
--env REPMGR_PASSWORD=repmgrpass \
--env POSTGRESQL_PASSWORD=secretpass \
bitnami/postgresql-repmgr:latest

Step 3: 创建备用节点

接下来我们启动一个备用节点:

$ docker run --detach --name pg-1 \
--network my-network \
--env REPMGR_PARTNER_NODES=pg-0,pg-1 \
--env REPMGR_NODE_NAME=pg-1 \
--env REPMGR_NODE_NETWORK_NAME=pg-1 \
--env REPMGR_PRIMARY_HOST=pg-0 \
--env REPMGR_PASSWORD=repmgrpass \
--env POSTGRESQL_PASSWORD=secretpass \
bitnami/postgresql-repmgr:latest

使用这三个命令,您现在可以启动并运行一个两节点 PostgreSQL 主备流复制集群。 您可以通过添加/删除备用节点来扩展集群,而不会导致任何停机时间。

注意:集群会完整地复制主节点,其中包括所有用户和数据库。

如果主节点宕机,repmgr 将确保任何备用节点担任主节点,从而保证高可用性。

注意:集群中其他节点的配置需要更新,以便它们知道它们。这将需要重新启动旧节点,以适应 REPMGR_PARTNER_NODES 环境变量。

使用 Docker Compose,可以使用此存储库中的 docker-compose.yml 文件设置 HA PostgreSQL 集群:

$ curl -sSL https://raw.githubusercontent.com/bitnami/bitnami-docker-postgresql-repmgr/master/docker-compose.yml > docker-compose.yml
$ docker-compose up -d

保护 PostgreSQL 流量

PostgreSQL 支持使用 SSL/TLS 协议对连接进行加密。如果您希望启用此可选功能,您可以使用以下环境变量来配置应用程序:

  • POSTGRESQL_ENABLE_TLS:是否为流量启用 TLS。默认为 no
  • POSTGRESQL_TLS_CERT_FILE:包含 TLS 流量证书文件的文件。没有默认值。
  • POSTGRESQL_TLS_KEY_FILE:包含证书密钥的文件。没有默认值。
  • POSTGRESQL_TLS_CA_FILE:包含证书 CA 的文件。如果提供,PostgreSQL 将通过向 TLS/SSL 客户端请求证书来对其进行身份验证(请参阅ref)。没有默认值。
  • POSTGRESQL_TLS_CRL_FILE:包含证书吊销列表的文件。没有默认值。
  • POSTGRESQL_TLS_PREFER_SERVER_CIPHERS:是否使用服务器的 TLS 密码首选项而不是客户端的。默认为 yes

启用 TLS 时,PostgreSQL 默认支持标准流量和加密流量,但更喜欢后者。下面是一些关于如何快速设置 TLS 流量的示例:

  1. 使用 docker run
$ docker run \
-v /path/to/certs:/opt/bitnami/postgresql/certs \
-e POSTGRESQL_ENABLE_TLS=yes \
-e POSTGRESQL_TLS_CERT_FILE=/opt/bitnami/postgresql/certs/postgres.crt \
-e POSTGRESQL_TLS_KEY_FILE=/opt/bitnami/postgresql/certs/postgres.key \
bitnami/postgresql-repmgr:latest
  1. 修改此存储库中存在的 docker-compose.yml 文件:
services:
pg-0:
...
environment:
...
- POSTGRESQL_ENABLE_TLS=yes
- POSTGRESQL_TLS_CERT_FILE=/opt/bitnami/postgresql/certs/postgres.crt
- POSTGRESQL_TLS_KEY_FILE=/opt/bitnami/postgresql/certs/postgres.key
...
volumes:
...
- /path/to/certs:/opt/bitnami/postgresql/certs
...

或者,您也可以在自定义配置文件中提供此配置。

配置文件

该镜像在 /opt/bitnami/repmgr/conf//opt/bitnami/postgresql/conf/ 中查找 repmgr.confpostgresql.confpg_hba.conf 文件。您可以在 /bitnami/repmgr/conf/ 挂载一个卷,并复制/编辑 /path/to/custom-conf/ 中的配置文件。 如果 /bitnami/repmgr/conf/ 为空,默认配置将填充到 conf/ 目录。

/path/to/custom-conf/
└── postgresql.conf

由于带有 Replication manager 镜像的 PostgreSQL 是非 root 用户,因此您需要为主机中的挂载目录设置适当的权限:

$ sudo chgrp -R root /path/to/custom-conf/
$ sudo chmod -R g+rwX /path/to/custom-conf/

Step 1: 运行 PostgreSQL 镜像

运行 PostgreSQL 镜像,从您的主机挂载一个目录。

$ docker run --name pg-0 \
-v /path/to/custom-conf/:/bitnami/repmgr/conf/ \
bitnami/postgresql-repmgr:latest

或者使用 Docker Compose

version: '2'

services:
pg-0:
image: bitnami/postgresql-repmgr:latest
ports:
- '5432:5432'
volumes:
- /path/to/custom-conf/:/bitnami/repmgr/conf/
pg-1:
image: bitnami/postgresql-repmgr:latest
ports:
- '5432:5432'
volumes:
- /path/to/custom-conf/:/bitnami/repmgr/conf/

Step 2: 编辑配置

使用您喜欢的编辑器编辑主机上的配置。

vi /path/to/custom-conf/postgresql.conf

Step 3: 重启 PostgreSQL

更改配置后,重新启动 PostgreSQL 容器以使更改生效。

$ docker restart pg-0

或者使用 Docker Compose

$ docker-compose restart pg-0
$ docker-compose restart pg-1

有关配置选项的完整列表,请参阅服务器配置手册

允许从默认 postgresql.conf 以外的文件加载设置。

除了使用自定义的 repmgr.confpostgresql.confpg_hba.conf,您还可以在 /bitnami/postgresql/conf/ 的卷中包含 conf.d 目录中以 .conf 结尾的文件。为此,默认的 postgresql.conf 包含以下部分:

##------------------------------------------------------------------------------
## CONFIG FILE INCLUDES
##------------------------------------------------------------------------------ ## These options allow settings to be loaded from files other than the
## default postgresql.conf. include_dir = 'conf.d' # Include files ending in '.conf' from directory 'conf.d'

如果您使用自定义 postgresql.conf,您应该在配置文件中创建(或取消注释)上述部分,在这种情况下,结构应该类似于

/path/to/custom-conf/
└── postgresql.conf
/path/to/extra-custom-conf/
└── extended.conf

请记住为主机中的挂载目录设置适当的权限:

$ sudo chgrp -R root /path/to/extra-custom-conf/
$ sudo chmod -R g+rwX /path/to/extra-custom-conf/

Step 1: 运行 PostgreSQL 镜像

运行 PostgreSQL 镜像,从您的主机挂载一个目录。

$ docker run --name pg-0 \
-v /path/to/extra-custom-conf/:/bitnami/postgresql/conf/conf.d/ \
-v /path/to/custom-conf/:/bitnami/repmgr/conf/ \
bitnami/postgresql-repmgr:latest

或者使用 Docker Compose

version: '2'

services:
pg-0:
image: bitnami/postgresql-repmgr:latest
ports:
- '5432:5432'
volumes:
- /path/to/extra-custom-conf/:/bitnami/postgresql/conf/conf.d/
- /path/to/custom-conf/:/bitnami/repmgr/conf/
pg-1:
image: bitnami/postgresql-repmgr:latest
ports:
- '5432:5432'
volumes:
- /path/to/extra-custom-conf/:/bitnami/postgresql/conf/conf.d/
- /path/to/custom-conf/:/bitnami/repmgr/conf/

Step 2: 编辑配置

使用您喜欢的编辑器编辑主机上的配置。

vi /path/to/extra-custom-conf/extended.conf

Step 3: 重启 PostgreSQL

更改配置后,重新启动 PostgreSQL 容器以使更改生效。

$ docker restart pg-0

或者使用 Docker Compose:

$ docker-compose restart pg-0
$ docker-compose restart pg-1

环境变量

请在下表中查看 Bitnami PostgreSQL HA 容器中可用的环境变量列表:

Environment Variable Default value
REPMGR_NODE_ID nil
REPMGR_NODE_ID_START_SEED 1000
REPMGR_NODE_NAME nil
REPMGR_NODE_NETWORK_NAME nil
REPMGR_NODE_PRIORITY 100
REPMGR_PARTNER_NODES nil
REPMGR_PRIMARY_HOST nil
REPMGR_NODE_LOCATION default
REPMGR_PRIMARY_PORT 5432
REPMGR_PORT_NUMBER 5432
REPMGR_LOG_LEVEL NOTICE
REPMGR_START_OPTIONS nil
REPMGR_CONNECT_TIMEOUT 5
REPMGR_RECONNECT_ATTEMPTS 3
REPMGR_RECONNECT_INTERVAL 5
REPMGR_USE_REPLICATION_SLOTS 1
REPMGR_MASTER_RESPONSE_TIMEOUT 20
REPMGR_DEGRADED_MONITORING_TIMEOUT 5
REPMGR_USERNAME repmgr
REPMGR_DATABASE repmgr
REPMGR_PASSWORD nil
REPMGR_PASSWORD_FILE nil
REPMGR_FENCE_OLD_PRIMARY no
REPMGR_CHILD_NODES_CHECK_INTERVAL 5
REPMGR_CHILD_NODES_CONNECTED_MIN_COUNT 1
REPMGR_CHILD_NODES_DISCONNECT_TIMEOUT 30
REPMGR_USE_PASSFILE nil
POSTGRESQL_USERNAME postgres
POSTGRESQL_DATABASE nil
POSTGRESQL_PASSWORD nil
POSTGRESQL_PASSWORD_FILE nil
POSTGRESQL_POSTGRES_PASSWORD nil
POSTGRESQL_POSTGRES_PASSWORD_FILE nil
POSTGRESQL_PORT_NUMBER 5432
POSTGRESQL_INITDB_ARGS nil
POSTGRESQL_PGCTLTIMEOUT 60
POSTGRESQL_SHUTDOWN_MODE fast
POSTGRESQL_ENABLE_TLS no
POSTGRESQL_TLS_CERT_FILE nil
POSTGRESQL_TLS_KEY_FILE nil
POSTGRESQL_TLS_CA_FILE nil
POSTGRESQL_TLS_CRL_FILE nil
POSTGRESQL_TLS_PREFER_SERVER_CIPHERS yes

日志

Bitnami PostgreSQL HA Docker 镜像将容器日志发送到 stdout。查看日志:

$ docker logs pg-0

如果您希望以不同的方式使用容器日志,则可以使用 --log-driver 选项配置容器 logging driver。在默认配置中,docker 使用 json-file driver。

维护

升级这个镜像

Bitnami 提供了 PostgreSQL HA 的最新版本,包括安全补丁,这些补丁在上游发布后很快就会发布。我们建议您按照以下步骤升级容器。

Step 1: 获取更新的镜像

$ docker pull bitnami/postgresql-repmgr:latest

或者,如果您使用的是 Docker Compose,请将 image 属性的值更新为 bitnami/postgresql-repmgr:latest

Step 2: 停止正在运行的容器

使用命令停止当前运行的容器

$ docker stop pg-0

或者使用 Docker Compose:

$ docker-compose stop pg-0
$ docker-compose stop pg-1

接下来,使用以下命令对持久卷 /path/to/postgresql-persistence 进行快照:

$ rsync -a /path/to/postgresql-persistence /path/to/postgresql-persistence.bkp.$(date +%Y%m%d-%H.%M.%S)

Step 3: 移除当前运行的容器

$ docker rm -v pg-0

或者使用 Docker Compose:

$ docker-compose rm -v pg-0
$ docker-compose rm -v pg-1

Step 4: 运行新镜像

从新镜像重新创建容器。

$ docker run --name pg-0 bitnami/postgresql-repmgr:latest

或者使用 Docker Compose:

$ docker-compose up pg-0
$ docker-compose up pg-1

更多

使用 bitnami/postgresql-repmgr 镜像快速设置 PostgreSQL HA的更多相关文章

  1. 使用 Bitnami PostgreSQL Docker 镜像快速设置流复制集群

    bitnami-docker-postgresql 仓库 源码:bitnami-docker-postgresql https://github.com/bitnami/bitnami-docker- ...

  2. postgresql数据库linux下设置开机自启动

    设置PostgreSQL开机自启动PostgreSQL的开机自启动脚本位于PostgreSQL源码目录的contrib/start-scripts路径下cd /opt/soft_bak/postgre ...

  3. CentOS7下安装并简单设置PostgreSQL笔记

    为什么是PostgreSQL? 在.NET Core诞生之前,微软平台上最常见的开发组件便是.NET Framework + SQL Server了,但是现在.NET Core终于让跨平台部署成为了现 ...

  4. Linux怎么设置PostgreSQL远程访问

    原文链接: Linux怎么设置PostgreSQL远程访问 安装PostgreSQL数据库之后,默认是只接受本地访问连接.如果想在其他主机上访问PostgreSQL数据库服务器,就需要进行相应的配置. ...

  5. win10镜像重装,快速设置之后无限重启怎么办?

    我得操作过程: 1.下载老毛桃最win8pe装机版 2.安装老毛桃到U盘, 3.格式化U盘,用extFat格式,拷贝win10镜像文件(你也可以拷贝到硬盘上) 4.插入电脑,通过U盘启动,进入PE 5 ...

  6. Linux下设置postgresql数据库开机启动

    PostgreSQL的开机自启动脚本位于PostgreSQL源码目录的contrib/start-scripts路径下,linux文件即为linux系统上的启动脚本: 1.将Linux文件复制到 /e ...

  7. [转帖]Postgresql的csv日志设置

    Postgresql的csv日志设置 2012年06月16日 09:27:00 weixin_34406796 阅读数 24   原文链接:https://my.oschina.net/Kenyon/ ...

  8. 使用VMDepot镜像快速部署CKAN开放数据门户

    最新发布的CKAN VMDepot镜像针对中国用户强化了中文支持,提升了与MS Office办公软件的互操作性,并集成了常用插件和最佳实践配置参数. 使得CKAN原本十分复杂繁琐的部署流程变得非常简单 ...

  9. PostgreSQL自学笔记:1 初识 PostgreSQL

    博主教材:李小威.清华大学出版社.<PostgreSQL 9.6 从零开始学> 博主操作系统系统:Windows10 博主PostgreSQL版本:PostgreSQL 9.6 和 Pos ...

随机推荐

  1. Redis数据结构详解(1)-redis中的字符串(SDS)

    前提知识 我们先从百科上摘下Redis的解释: Redis是一个使用ANSI C编写的开源.支持网络.基于内存.分布式.可选持久性的键值对存储数据库. (不用过多在意ANSI,它只是一个标准,你可以理 ...

  2. 网络编程 --安装wkhtmltopdf出现中文乱码的情况

    1 首先下载安装包 2安装依赖文件apt-get install libxfont1 xfonts-encodings xfonts-utils xfonts-base xfonts-75dpi su ...

  3. mybatis是如何分页的,分页插件的原理是什么

    mybatis是如何分页的,分页插件的原理是什么 代码之尖关注 12018.12.28 17:11:12字数 529阅读 19,877 1. SQL 分页 <select id="qu ...

  4. 微服务部署 docker-compose

    1.docker-maven-plugin 介绍 在我们持续集成过程中,项目工程一般使用 Maven 编译打包,然后生成镜像,通过镜像上线,能够大大提供上线效率,同时能够快速动态扩容,快速回滚,着实很 ...

  5. 哪一个List实现了最快插入?

    LinkedList和ArrayList是另个不同变量列表的实现.ArrayList的优势在于动态的增长数组,非常适合初始时总长度未知的情况下使用.LinkedList的优势在于在中间位置插入和删除操 ...

  6. 什么是 Future?

    在并发编程中,我们经常用到非阻塞的模型,在之前的多线程的三种实现中,不 管是继承 thread 类还是实现 runnable 接口,都无法保证获取到之前的执行结果. 通过实现 Callback 接口, ...

  7. HTML 5的页面结构和HTML 4或早先的HTML有什么不同?

    一个典型的Web页面有页眉(header),页脚(footer),导航(navigation),正文(central area)和侧栏(side bar).现在如果是在HTML 4中,HTML部分中的 ...

  8. 12 Web Development Trends That Will Dominate 2022

    12 Web Development Trends That Will Dominate 2022 (mindinventory.com) Progressive Web Apps (PWAs) An ...

  9. 基于React的仿QQ音乐(移动端)

    前言 由于这段时间工作上也是挺忙的,就没有时间去写这个项目,中间一直都是写写停停,进度也是非常慢的.正好前几天都还比较空,就赶紧抓着空闲时间去写这个项目,最后紧赶慢赶地完成了.本项目采用了React的 ...

  10. WPF控件大全(表格)-学习总结

    Label标签 label控件:一般用户描述性文字显示. 在Label控件使用时,一般给予用户提示.用法上没有什么很特殊的,label控件的值记住:不是Text 而是 Content属性. TextB ...