返回顶部
首页 > 资讯 > 精选 >分析Docker容器中的Patroni
  • 103
分享到

分析Docker容器中的Patroni

2023-06-25 13:06:36 103人浏览 八月长安
摘要

本篇内容介绍了“分析Docker容器中的Patroni”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!etcd作为分布式注册中心、进行集群选主

本篇内容介绍了“分析Docker容器中的Patroni”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

etcd作为分布式注册中心、进行集群选主工作;vip-manager为主节点设置漂移IP;patroni负责引导集群的创建、运行和管理工作,并可以使用patronictl来进行终端访问。

具体流程:
1、首先启动etcd集群,本例中etcd数量为3个。
2、检测etcd集群状态健康后,启动patroni并竞争选主,其他跟随节点进行数据同步过程。
3、启动vip-manager,通过访问etcd集群中/ S E R V I C E N A M E / {SERVICE_NAME}/ SERVICENAME/{CLUSTER_NAME}/leader键中的具体值,判断当前节点是否为主节点ip,如果是则为该节点设置vip,提供对外读写服务。
注:建议真实环境下将etcd部署到独立容器上,对外提供服务。

创建镜像

文件结构

其中Dockerfile为镜像主文件,docker服务通过该文件在本地仓库创建镜像;entrypoint.sh为容器入口文件,负责业务逻辑的处理;function为执行业务方法的入口文件,负责启动etcd,监控etcd集群状态、启动patroni和vip-manager;generatefile为整个容器生成对应的配置文件,包括etcd、patroni及vip-mananger。

目录结构大致如图所示:

分析Docker容器中的Patroni

注:数据库安装包和patroni安装包请自行构建。

DockerFile

FROM Centos:7MaiNTAINER wangzhibin <wangzhibin>ENV USER="postgresql" \    PASSWord=123456 \    GROUP=postgresql RUN useradd ${USER} \       && chown -R ${USER}:${GROUP} /home/${USER} \       && yum -y update && yum install -y iptables sudo net-tools iproute  openssh-server openssh-clients which vim sudo crontabs#安装etcdCOPY etcd/etcd /usr/sbinCOPY etcd/etcdctl /usr/sbin#安装databaseCOPY lib/ /home/${USER}/libCOPY include/ /home/${USER}/includeCOPY share/ /home/${USER}/shareCOPY bin/ /home/${USER}/bin/COPY patroni/ /home/${USER}/patroni#安装vip-managerCOPY vip-manager/vip-manager /usr/sbin#安装执行脚本COPY runtime/ /home/${USER}/runtimeCOPY entrypoint.sh /sbin/entrypoint.sh#设置环境变量ENV LD_LIBRARY_PATH /home/${USER}/libENV PATH /home/${USER}/bin:$PATHENV ETCDCTL_api=3#安装PatroniRUN yum -y install epel-release python-devel  && yum -y install Python-pip \    && pip install /home/${USER}/patroni/1/pip-20.3.3.tar.gz \    && pip install /home/${USER}/patroni/1/psycopg2-2.8.6-cp27-cp27mu-linux_x86_64.whl \    && pip install --no-index --find-links=/home/${USER}/patroni/2/ -r /home/${USER}/patroni/2/requirements.txt \    && pip install /home/${USER}/patroni/3/patroni-2.0.1-py2-none-any.whl#修改执行权限RUN chmod 755 /sbin/entrypoint.sh \ && mkdir /home/${USER}/etcddata \&& chown -R ${USER}:${GROUP} /home/${USER} \&& echo 'root:root123456' | chpasswd \&& chmod 755 /sbin/etcd \&& chmod 755 /sbin/etcdctl \&& chmod 755 /sbin/vip-manager#设置SudoRUN chmod 777 /etc/sudoers \       && sed -i '/## Allow root to run any commands anywhere/a '${USER}' ALL=(ALL) NOPASSWD:ALL' /etc/sudoers \       && chmod 440 /etc/sudoers#切换用户USER ${USER}#切换工作目录WORKDIR /home/${USER}#启动入口程序CMD ["/bin/bash", "/sbin/entrypoint.sh"]

entrypoint.sh

#!/bin/bashset -e# shellcheck source=runtime/functionssource "/home/${USER}/runtime/function"configure_patroni

function

#!/bin/bashset -esource /home/${USER}/runtime/env-defaultssource /home/${USER}/runtime/generatefilePG_DATADIR=/home/${USER}/pgdataPG_BINDIR=/home/${USER}/binconfigure_patroni(){    #生成配置文件    generate_etcd_conf    generate_patroni_conf    generate_vip_conf    #启动etcd    etcdcount=${ETCD_COUNT}    count=0    ip_temp=""    array=(${HOSTLIST//,/ })    for host in ${array[@]}    do        ip_temp+="Http://${host}:2380,"    done    etcd --config-file=/home/${USER}/etcd.yml >/home/${USER}/etcddata/etcd.log 2>&1 &    while [ $count -lt $etcdcount ]    do      line=(`etcdctl --endpoints=${ip_temp%?} endpoint health -w JSON`)      count=`echo $line | awk -F"\"health\":true" '{print NF-1}'`      echo "waiting etcd cluster"      sleep 5    done    #启动patroni    patroni /home/${USER}/postgresql.yml >  /home/${USER}/patroni/patroni.log 2>&1 &    #启动vip-manager    sudo vip-manager --config /home/${USER}/vip.yml}

generatefile

#!/bin/bashset -eHOSTNAME="`hostname`"hostip=`ping ${HOSTNAME} -c 1 -w 1 | sed '1{s/[^(]*(//;s/).*//;q}'`#generate etcdgenerate_etcd_conf(){    echo "name : ${HOSTNAME}" >> /home/${USER}/etcd.yml    echo "data-dir: /home/${USER}/etcddata" >> /home/${USER}/etcd.yml    echo "listen-client-urls: http://0.0.0.0:2379" >> /home/${USER}/etcd.yml    echo "advertise-client-urls: http://${hostip}:2379" >> /home/${USER}/etcd.yml    echo "listen-peer-urls: http://0.0.0.0:2380" >> /home/${USER}/etcd.yml    echo "initial-advertise-peer-urls: http://${hostip}:2380" >> /home/${USER}/etcd.yml    ip_temp="initial-cluster: "    array=(${HOSTLIST//,/ })      for host in ${array[@]}    do    ip_temp+="${host}=http://${host}:2380,"     done    echo  ${ip_temp%?} >> /home/${USER}/etcd.yml    echo "initial-cluster-token: etcd-cluster-token" >> /home/${USER}/etcd.yml    echo "initial-cluster-state: new" >> /home/${USER}/etcd.yml}#generate patronigenerate_patroni_conf(){  echo "scope: ${CLUSTER_NAME}" >> /home/${USER}/postgresql.yml  echo "namespace: /${SERVICE_NAME}/ " >> /home/${USER}/postgresql.yml  echo "name: ${HOSTNAME} " >> /home/${USER}/postgresql.yml  echo "restapi: " >> /home/${USER}/postgresql.yml   echo "  listen: ${hostip}:8008 " >> /home/${USER}/postgresql.yml   echo "  connect_address: ${hostip}:8008 " >> /home/${USER}/postgresql.yml  echo "etcd: " >> /home/${USER}/postgresql.yml  echo "  host: ${hostip}:2379 " >> /home/${USER}/postgresql.yml  echo "  username: ${ETCD_USER} " >>  /home/${USER}/postgresql.yml  echo "  password: ${ETCD_PASSWD} " >> /home/${USER}/postgresql.yml  echo "bootstrap: " >> /home/${USER}/postgresql.yml  echo "  dcs: " >> /home/${USER}/postgresql.yml  echo "    ttl: 30 " >> /home/${USER}/postgresql.yml  echo "    loop_wait: 10  " >> /home/${USER}/postgresql.yml  echo "    retry_timeout: 10   " >> /home/${USER}/postgresql.yml  echo "    maximum_lag_on_failover: 1048576 " >> /home/${USER}/postgresql.yml  echo "    postgresql: " >>  /home/${USER}/postgresql.yml  echo "      use_pg_rewind: true  " >>  /home/${USER}/postgresql.yml  echo "      use_slots: true  " >>  /home/${USER}/postgresql.yml  echo "      parameters:  " >>  /home/${USER}/postgresql.yml  echo "  initdb:  " >>  /home/${USER}/postgresql.yml  echo "  - encoding: UTF8  " >>  /home/${USER}/postgresql.yml  echo "  - data-checksums  " >>  /home/${USER}/postgresql.yml  echo "  pg_hba:   " >>  /home/${USER}/postgresql.yml  echo "  - host replication ${USER} 0.0.0.0/0 md5  " >>  /home/${USER}/postgresql.yml  echo "  - host all all 0.0.0.0/0 md5  " >>  /home/${USER}/postgresql.yml  echo "postgresql:  " >>  /home/${USER}/postgresql.yml  echo "  listen: 0.0.0.0:5432  " >>  /home/${USER}/postgresql.yml  echo "  connect_address: ${hostip}:5432  " >>  /home/${USER}/postgresql.yml  echo "  data_dir: ${PG_DATADIR}  " >>  /home/${USER}/postgresql.yml  echo "  bin_dir: ${PG_BINDIR}  " >>  /home/${USER}/postgresql.yml  echo "  pgpass: /tmp/pgpass  " >>  /home/${USER}/postgresql.yml  echo "  authentication:  " >>  /home/${USER}/postgresql.yml  echo "    replication:  " >>  /home/${USER}/postgresql.yml  echo "      username: ${USER}  " >>  /home/${USER}/postgresql.yml  echo "      password: ${PASSWD}  " >>  /home/${USER}/postgresql.yml  echo "    superuser:  " >>  /home/${USER}/postgresql.yml  echo "      username: ${USER}  " >>  /home/${USER}/postgresql.yml  echo "      password: ${PASSWD}  " >>  /home/${USER}/postgresql.yml  echo "    rewind:  " >>  /home/${USER}/postgresql.yml  echo "      username: ${USER}  " >>  /home/${USER}/postgresql.yml  echo "      password: ${PASSWD}  " >>  /home/${USER}/postgresql.yml  echo "  parameters:  " >>  /home/${USER}/postgresql.yml  echo "    unix_Socket_directories: '.'  " >>  /home/${USER}/postgresql.yml  echo "    wal_level: hot_standby  " >>  /home/${USER}/postgresql.yml  echo "    max_wal_senders: 10  " >>  /home/${USER}/postgresql.yml  echo "    max_replication_slots: 10  " >>  /home/${USER}/postgresql.yml  echo "tags:  " >>  /home/${USER}/postgresql.yml  echo "    nofailover: false  " >>  /home/${USER}/postgresql.yml  echo "    noloadbalance: false  " >>  /home/${USER}/postgresql.yml  echo "    clonefrom: false  " >>  /home/${USER}/postgresql.yml  echo "    nosync: false  " >>  /home/${USER}/postgresql.yml}#........ 省略部分内容

构建镜像

docker build -t patroni .

运行镜像

运行容器节点1:
docker run --privileged --name patroni1 -itd --hostname patroni1 --net my_net3 --restart always --env ‘CLUSTER_NAME=patronicluster' --env ‘SERVICE_NAME=service' --env ‘ETCD_USER=etcduser' --env ‘ETCD_PASSWD=etcdpasswd' --env ‘PASSWD=zalando' --env ‘HOSTLIST=patroni1,patroni2,patroni3' --env ‘VIP=172.22.1.88' --env ‘NET_DEVICE=eth0' --env ‘ETCD_COUNT=3' patroni
运行容器节点2:
docker run --privileged --name patroni2 -itd --hostname patroni2 --net my_net3 --restart always --env ‘CLUSTER_NAME=patronicluster' --env ‘SERVICE_NAME=service' --env ‘ETCD_USER=etcduser' --env ‘ETCD_PASSWD=etcdpasswd' --env ‘PASSWD=zalando' --env ‘HOSTLIST=patroni1,patroni2,patroni3' --env ‘VIP=172.22.1.88' --env ‘NET_DEVICE=eth0' --env ‘ETCD_COUNT=3' patroni
运行容器节点3:
docker run --privileged --name patroni3 -itd --hostname patroni3 --net my_net3 --restart always --env ‘CLUSTER_NAME=patronicluster' --env ‘SERVICE_NAME=service' --env ‘ETCD_USER=etcduser' --env ‘ETCD_PASSWD=etcdpasswd' --env ‘PASSWD=zalando' --env ‘HOSTLIST=patroni1,patroni2,patroni3' --env ‘VIP=172.22.1.88' --env ‘NET_DEVICE=eth0' --env ‘ETCD_COUNT=3' patroni

“分析Docker容器中的Patroni”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 分析Docker容器中的Patroni

本文链接: https://lsjlt.com/news/304797.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 分析Docker容器中的Patroni
    本篇内容介绍了“分析Docker容器中的Patroni”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!etcd作为分布式注册中心、进行集群选主...
    99+
    2023-06-25
  • 深入浅析Docker容器中的Patroni
    目录创建镜像文件结构DockerFileentrypoint.shfunctiongeneratefile构建镜像运行镜像总结附图上一篇文章向大家介绍了Repmgr的搭建过程,实现了...
    99+
    2024-04-02
  • docker容器的原理分析
    目录01 容器的本质是什么?02 Cgroup技术和Namespace技术介绍03 容器、镜像和仓库之间的关系01 容器的本质是什么?    ...
    99+
    2024-04-02
  • docker中容器数据卷volumes的示例分析
    这篇文章主要介绍了docker中容器数据卷volumes的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 数据卷的概念   &...
    99+
    2023-06-04
  • 容器Docker入门实例分析
    这篇文章主要讲解了“容器Docker入门实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“容器Docker入门实例分析”吧!一、概述1.1 基本概念:d...
    99+
    2024-04-02
  • Docker容器使用实例分析
    今天小编给大家分享一下Docker容器使用实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2024-04-02
  • Docker容器卷管理的示例分析
    小编给大家分享一下Docker容器卷管理的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!容器卷管理容器卷 主机...
    99+
    2024-04-02
  • docker容器之间通信的示例分析
    这篇文章将为大家详细讲解有关docker容器之间通信的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。容器之间的通信  # 执行一个容器,并分配一个名字给它 ...
    99+
    2023-06-17
  • 如何进行Docker容器测试分析
    这篇文章主要为大家分析了如何进行Docker容器测试分析的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“如何进行Docker容器测试分析”的知识吧。为了解决上...
    99+
    2023-06-28
  • SpringBoot项目docker容器部署的示例分析
    这篇文章主要介绍了SpringBoot项目docker容器部署的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、修改docker.service,使其暴露2375端...
    99+
    2023-06-29
  • docker容器的四种端口映射演示分析
    端口映射 把容器的端口映射为宿主机的一个随机或者特定端口,使用外部用户可以访问容器服务端口映射本是在容器底层做了 iptables 地址转发,出去的流量做 SNAT 源地址转发,进来...
    99+
    2024-04-02
  • Node.js服务Docker容器化应用实例分析
    这篇“Node.js服务Docker容器化应用实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Node.js服务Doc...
    99+
    2023-06-17
  • docker中容器资源需求、资源限制及HeapSter的示例分析
    这篇文章主要介绍了docker中容器资源需求、资源限制及HeapSter的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。容器的资源需求、资源限制  ...
    99+
    2023-06-04
  • springboot中docker的原理分析
    这篇文章主要介绍“springboot中docker的原理分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“springboot中docker的原理分析”文章能帮助大家解决问题。一、添加maven配...
    99+
    2023-06-08
  • Docker容器实现MySQL多源复制场景分析
    目录前言⛳️ 1.多源复制简介⛳️ 2.多源复制使用场景⛳️ 3.多源复制部署✨ 3.1 下载镜像✨ 3.3 创建容器,安装mysql✨ 3.4 参数文件配置✨ 3.5 登陆MySQL⛳️ 4.主从配置✨ 4.1 主库配...
    99+
    2022-06-13
    Docker MySQL多源复制 MySQL多源复制
  • Spring中IOC容器的示例分析
    这篇文章将为大家详细讲解有关Spring中IOC容器的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一.Spring的IOC容器概述Spring的IOC的过程也被称为依赖注入(DI),那么对象可以...
    99+
    2023-06-03
  • docker中dangling images的示例分析
    这篇文章主要介绍docker中dangling images的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!dangling imagesbuild 自己的 docker 镜...
    99+
    2024-04-02
  • docker中19-k8s的示例分析
    这篇文章主要介绍docker中19-k8s的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!    Docker的第一类编排工具:   &n...
    99+
    2023-06-04
  • Java中并发容器的示例分析
    这篇文章给大家分享的是有关Java中并发容器的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、并发容器1.1 JDK 提供的并发容器总结JDK 提供的这些容器大部分在java.util.concurre...
    99+
    2023-06-15
  • 如何分析Kubernetes中的容器网络
    这篇文章将为大家详细讲解有关如何分析Kubernetes中的容器网络,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。| 前言随着云计算的兴起,各大平台之争也落下了帷幕,Kuberne...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作