前回はRepmgrの構築手順と自動切り替えの実装を紹介しました。今回はコンテナ配下にPatroniクラスタ環境を構築する方法を紹介します。Patroniはすぐに使えるPG高可用性ツールとして、クラウド環境でさまざまなベンダーの導入が増えています。 パトロニの基本的なアーキテクチャを図に示します。 etcd は分散登録センターとして機能し、クラスター マスターの選出を実行します。vip-manager はマスター ノードのドリフト IP を設定します。patroni はクラスターの作成、操作、管理をガイドする役割を担い、ターミナル アクセスに patentictl を使用できます。 具体的なプロセス: 画像を作成するファイル構造このうち、Dockerfile はイメージのメイン ファイルであり、docker サービスはこのファイルを通じてローカル ウェアハウスにイメージを作成します。entrypoint.sh はコンテナー エントリ ファイルであり、ビジネス ロジックの処理を担当します。function はビジネス メソッドを実行するためのエントリ ファイルであり、etcd の起動、etcd クラスターの状態の監視、patoni および vip-manager の起動を担当します。generatefile は、etcd、patoni、vip-manager を含むコンテナー全体の対応する構成ファイルを生成します。 ディレクトリ構造は、おおよそ図のようになります。 注意: データベースインストールパッケージとpatroniインストールパッケージはご自身で構築してください。 DockerファイルCentos:7より メンテナー wangzhibin <wangzhibin> 環境変数 USER="postgresql" \ パスワード=123456 \ グループ=postgresql 実行 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 #etcdをインストールする etcd/etcd /usr/sbin にコピー etcd/etcdctl /usr/sbin にコピー #データベースをインストールする lib/ /home/${USER}/lib をコピーする コピー include/ /home/${USER}/include コピー share/ /home/${USER}/share コピー bin/ /home/${USER}/bin/ コピーpatroni/ /home/${USER}/patroni #vip-managerをインストールする vip-manager/vip-manager /usr/sbinにコピー #実行スクリプトをインストール COPYruntime/ /home/${USER}/runtime コピー entrypoint.sh /sbin/entrypoint.sh #環境変数ENV LD_LIBRARY_PATH /home/${USER}/libを設定します 環境変数PATH /home/${USER}/bin:$PATH 環境変数ETCDCTL_API=3 #Patroniをインストールする 実行 yum -y install epel-release python-devel && yum -y install python-pip \ && pip インストール /home/${USER}/patroni/1/pip-20.3.3.tar.gz \ && pip インストール /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 インストール /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 #Sudoを設定する chmod 777 /etc/sudoers \ を実行します && sed -i '/## root がどこでも任意のコマンドを実行できるようにする/a '${USER}' ALL=(ALL) NOPASSWD:ALL' /etc/sudoers \ && chmod 440 /etc/sudoers #ユーザー USER ${USER} を切り替える #作業ディレクトリを切り替える WORKDIR /home/${USER} #エントリプログラムを起動します CMD ["/bin/bash", "/sbin/entrypoint.sh"] エントリポイント#!/bin/bash セット-e # シェルチェックソース=runtime/functions ソース "/home/${USER}/runtime/function" 設定_patroni 関数#!/bin/bash セット-e ソース /home/${USER}/runtime/env-defaults ソース /home/${USER}/runtime/generatefile PG_DATADIR=/home/${USER}/pgdata PG_BINDIR=/home/${USER}/bin configure_patroni() { #設定ファイルgenerate_etcd_confを生成する 生成_patroni_conf 生成vip #etcdを起動する etcdcount=${ETCD_COUNT} カウント=0 ip_temp="" 配列=(${HOSTLIST//,/ }) ${array[@]}内のホスト する ip_temp+="http://${ホスト}:2380," 終わり etcd --config-file=/home/${USER}/etcd.yml >/home/${USER}/etcddata/etcd.log 2>&1 & [ $count -lt $etcdcount ] の間 する 行 = (`etcdctl --endpoints=${ip_temp%?} エンドポイントヘルス -w json`) count=`echo $line | awk -F"\"health\":true" '{print NF-1}'` echo "etcd クラスターを待機中" 睡眠5 終わり #パトロニを開始 パトロニ /home/${USER}/postgresql.yml > /home/${USER}/patroni/patroni.log 2>&1 & #vip-managerを起動 sudo vip-manager --config /home/${USER}/vip.yml } ファイルを生成する#!/bin/bash セット-e HOSTNAME="`ホスト名`" hostip=`ping ${HOSTNAME} -c 1 -w 1 | sed '1{s/[^(]*(//;s/).*//;q}'` #etcd を生成する 生成する { echo "name : ${HOSTNAME}" >> /home/${USER}/etcd.yml echo "データディレクトリ: /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 "初期アドバタイズピア URL: http://${hostip}:2380" >> /home/${USER}/etcd.yml ip_temp="初期クラスター: " 配列=(${HOSTLIST//,/ }) ${array[@]}内のホスト する ip_temp+="${ホスト}=http://${ホスト}:2380," 終わり ${ip_temp%?} をエコー >> /home/${USER}/etcd.yml echo "初期クラスタートークン: etcd クラスタートークン" >> /home/${USER}/etcd.yml echo "初期クラスター状態: new" >> /home/${USER}/etcd.yml } #パトロニを生成する 生成する { echo "スコープ: ${CLUSTER_NAME}" >> /home/${USER}/postgresql.yml echo "名前空間: /${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 " ホスト: ${hostip}:2379 " >> /home/${USER}/postgresql.yml echo " ユーザー名: ${ETCD_USER} " >> /home/${USER}/postgresql.yml echo " パスワード: ${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 " フェイルオーバー時の最大ラグ: 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 " パラメータ: " >> /home/${USER}/postgresql.yml echo " initdb: " >> /home/${USER}/postgresql.yml echo " - エンコーディング: UTF8 " >> /home/${USER}/postgresql.yml echo " - データチェックサム " >> /home/${USER}/postgresql.yml echo " pg_hba: " >> /home/${USER}/postgresql.yml echo " - ホストレプリケーション ${USER} 0.0.0.0/0 md5 " >> /home/${USER}/postgresql.yml echo " - ホストすべて すべて 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 " 認証: " >> /home/${USER}/postgresql.yml echo " レプリケーション: " >> /home/${USER}/postgresql.yml echo " ユーザー名: ${USER} " >> /home/${USER}/postgresql.yml echo " パスワード: ${PASSWD} " >> /home/${USER}/postgresql.yml echo " スーパーユーザー: " >> /home/${USER}/postgresql.yml echo " ユーザー名: ${USER} " >> /home/${USER}/postgresql.yml echo " パスワード: ${PASSWD} " >> /home/${USER}/postgresql.yml echo " 巻き戻し: " >> /home/${USER}/postgresql.yml echo " ユーザー名: ${USER} " >> /home/${USER}/postgresql.yml echo " パスワード: ${PASSWD} " >> /home/${USER}/postgresql.yml echo " パラメータ: " >> /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 "タグ: " >> /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 patentani を実行します。 画像を実行するコンテナノード1を実行します。 要約するこの操作プロセスは、etcd+patroni+vipmanager の全体的なコンテナ化を示すために、実験環境に限定されています。実際の環境では、etcd を異なるコンテナにデプロイして独立した分散クラスタを形成し、PG ストレージをローカル ディスクまたはネットワーク ディスクにマッピングする必要があります。また、コンテナ クラスタの構築には、docker-compose、docker-warm、Kubernetes などのオーケストレーション ツールを可能な限り使用する必要があります。 添付写真etcd クラスターのステータスは以下のとおりです。 パトロニ クラスターのステータスは次のとおりです。 VIP マネージャーのステータスは以下のとおりです。 Docker コンテナにおける Patroni の詳細な分析に関するこの記事はこれで終わりです。Docker コンテナの Patroni に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: フレックスインサイドボタンの垂直方向の中央揃えが中央揃えにならない問題の解決方法
オープンソース ソフトウェアである Apache は、最も広く使用されている Web アプリケーショ...
背景:サイトはフロントエンドとバックエンドから分離されています: vue+springbootフロン...
目次Linux 環境変数とプロセスアドレス空間コードを通じて環境変数を取得するプロセスアドレス空間な...
Alibaba Cloud Image Repositoryを使用して外部イメージをダウンロードする...
1: django-admin.py startproject プロジェクト名2: cd プロジェク...
多くの場合、画像をコンテナのサイズに合わせて調整する必要があります。 1. imgタグ方式幅と高さを...
Linux ヘルプ ドキュメントでの echo の説明は、Python や Java などのプログラ...
プロジェクトでは、何らかの不可逆的な理由により、テーブルに保存されたデータがページの表示要件を満たす...
一部の Web ページは大きく見えなくても開くのに非常に時間がかかる場合があります。一方、他の We...
目次Vuex環境を構築する要約するVuex環境を構築するsrcディレクトリにフォルダstoreを作成...
FTP と SFTP はファイル転送プロトコルとして広く使用されています。関連する機能を開発するには...
1. 環境整備CentOS Linux リリース 7.5.1804 (コア)インストールフォルダを作...
序文Nodejs はサーバーサイド言語です。開発中、登録やログインなどでは、判断のためにフォームを通...
ブラウザによって動作が異なるだけでなく、フォントやテキスト サイズによっても動作が異なります。フォー...
序文:日々の勉強や仕事の中で、データをエクスポートする必要に迫られることがよくあります。たとえば、デ...