当前位置: 首页 > news >正文

PostgreSQL 14 pacemaker 高可用集群

核心架构原理

集群组成(典型三节点结构):

[Node1] PostgreSQL + Pacemaker + Corosync + pcsd

[Node2] PostgreSQL + Pacemaker + Corosync + pcsd

[Node3] PostgreSQL + Pacemaker + Corosync + pcsd

           ↕           ↕           ↕

        ← Corosync 多播/单播心跳通信 →

           ↕           ↕           ↕

        Pacemaker 资源调度器决定主从角色、服务状态、VIP绑定位置

组件介绍

组件

作用

PostgreSQL 14

数据库核心,负责数据存储与复制。

Pacemaker

集群资源管理器,负责数据库服务、VIP 等资源的启停与主备切换。

Corosync

集群通信组件,提供节点间心跳和消息广播机制。

pcsd

Web UI + CLI 集群管理组件,简化 pcs 工具使用,提供节点认证与配置同步。

系统资源及组件规划

节点名称

CPU/内存

网卡

硬盘

IP地址

OS

节点角色

pgtest1

2c/2g

ens33

60G

192.168.24.11

Centos7.9

PostgreSQLPacemakerCorosync

pgtest2

2c/2g

ens33

60G

192.168.24.12

Centos7.9

pgtest3

2c/2g

ens33

60G

192.168.24.13

Centos7.9

vip-master

192.168.24.14

vip-slave

192.168.24.15

数据库版本:

Postgresql14.6

PCS集群版本:

#rpm -qa|grep pacemaker

pacemaker-libs-1.1.23-1.el7_9.1.x86_64

pacemaker-cluster-libs-1.1.23-1.el7_9.1.x86_64

pacemaker-1.1.23-1.el7_9.1.x86_64

pacemaker-cli-1.1.23-1.el7_9.1.x86_64

#rpm -qa|grep pcs

pcsc-lite-libs-1.8.8-8.el7.x86_64

pcs-0.9.169-3.el7.centos.3.x86_64

# rpm -qa|grep corosync

corosync-2.4.5-7.el7_9.2.x86_64

corosynclib-2.4.5-7.el7_9.2.x86_64

一、安装基础软件

1.1 配置hosts文件[all servers]

[root@pgtest1 ~]# cat >> /etc/hosts <<EOF

192.168.24.11 pgtest1

192.168.24.12 pgtest2

192.168.24.13 pgtest3

192.168.24.14 vip-master

192.168.24.15 vip-slave

EOF

1.2 关闭防火墙及selinux [all servers]

# systemctl disable firewalld

# systemctl stop firewalld

#vi /etc/selinux/config

selinux=disabled

# sestatus

SELinux status:                 disabled

1.3 安装PCS [all servers]

yum -y install libsmb*

yum install -y pacemaker pcs

yum install -y autoconf automake libtool

yum install -y docbook-style-xsl

yum install -y gcc-c++ glib2-devel

1.4 pacemaker resource-agents 更新 [all servers]

:centos7.9 yum安装集群软件只支持pg9、pg10以下,需要安装新版本resource-agents,如下:

resource-agents-4.12.0下载地址:  Release v4.12.0 · ClusterLabs/resource-agents · GitHub

# tar zxvf resource-agents-4.12.0.tar.gz

# cd resource-agents-4.12.0

# ./autogen.sh

# ./configure

# make && make install

确认支持PG12以上版本

[root@pgtest1 ~]# cat /usr/lib/ocf/resource.d/heartbeat/pgsql | grep ocf_version_cmp

        ocf_version_cmp "$version" "9.3"

        ocf_version_cmp "$version" "12"

        ocf_version_cmp "$version" "10"

        ocf_version_cmp "$version" "9.4"

        ocf_version_cmp "$OCF_RESKEY_crm_feature_set" "3.1.0"

            ocf_version_cmp "$OCF_RESKEY_crm_feature_set" "3.2.0"

1.5 pcsd[all servers]

# echo "hacluster"| passwd --stdin hacluster     #设置hacluster用户密码

1.6 安装postgresql数据库软件 [all servers]

#使用脚本一键安装,可忽略以下步骤。

--安装依赖包:

yum install -y perl-ExtUtils-Embed readline zlib-devel pam-devel libxml2-devel libxslt-devel openldap-devel python-devel gcc-c++ openssl-devel cmake gcc* readline-devel zlib bison flex bison-devel flex-devel openssl openssl-devel

--创建用户、组

groupadd -g 666 postgres

useradd -g postgres -u 666 postgres

echo "postgres"| passwd --stdin postgres

--创建目录

mkdir -p /postgresql/{pg14,pgdata,arch,soft}

chown -R postgres. /postgresql

chmod -R 700 /postgresql

--上传解压安装包

tar zxvf postgresql-14.6.tar.gz

--编译安装

[root@pgtest1 soft]# su - postgres

Last login: Fri May  5 16:39:55 CST 2023 on pts/2

[postgres@pgtest1 ~]$ cd /postgresql/soft/

[postgres@pgtest1 soft]$ cd postgresql-14.6/

[postgres@pgtest1 postgresql-14.6]$ ls

aclocal.m4  config  config.log  config.status  configure  configure.ac  contrib  COPYRIGHT  doc  GNUmakefile  GNUmakefile.in  HISTORY  INSTALL  Makefile  README  src

[postgres@pgtest1 postgresql-14.6]$ ./configure --prefix=/postgresql/pg14 --with-pgport=5432

[postgres@pgtest1 postgresql-14.6]$ make world &&make install-world

1.7 service setup [all servers]

systemctl disable corosync

systemctl disable pacemaker

systemctl enable pcsd.service

systemctl start pcsd.service

--查看服务启动状态

systemctl status corosync pacemaker pcsd.service

1.8 cluster auth[any one host]

#pcs cluster auth pgtest1 pgtest2 pgtest3 -u hacluster -p "hacluster"

pgtest2: Authorized

pgtest3: Authorized

pgtest1: Authorized

 #在任意节点上启用集群认证

1.9 设置数据库集群[any one host] 

#### 配置集群节点 ####

(选择master执行)

#pcs cluster setup --name pgcluster pgtest1 pgtest2 pgtest3

Destroying cluster on nodes: pgtest1, pgtest2, pgtest3...

pgtest1: Stopping Cluster (pacemaker)...

pgtest2: Stopping Cluster (pacemaker)...

pgtest3: Stopping Cluster (pacemaker)...

pgtest3: Successfully destroyed cluster

pgtest1: Successfully destroyed cluster

pgtest2: Successfully destroyed cluster

Sending 'pacemaker_remote authkey' to 'pgtest1', 'pgtest2', 'pgtest3'

pgtest1: successful distribution of the file 'pacemaker_remote authkey'

pgtest2: successful distribution of the file 'pacemaker_remote authkey'

pgtest3: successful distribution of the file 'pacemaker_remote authkey'

Sending cluster config files to the nodes...

pgtest1: Succeeded

pgtest2: Succeeded

pgtest3: Succeeded

Synchronizing pcsd certificates on nodes pgtest1, pgtest2, pgtest3...

pgtest2: Success

pgtest3: Success

pgtest1: Success

Restarting pcsd on the nodes in order to reload the certificates...

pgtest2: Success

pgtest3: Success

pgtest1: Success

#### 启动所有集群节点 ####

(选择master执行)

# pcs cluster start --all

pgtest1: Starting Cluster (corosync)...

pgtest2: Starting Cluster (corosync)...

pgtest3: Starting Cluster (corosync)...

pgtest3: Starting Cluster (pacemaker)...

pgtest1: Starting Cluster (pacemaker)...

pgtest2: Starting Cluster (pacemaker)...

#### 检查集群状态 ####

# pcs status --full

Cluster name: pgcluster

WARNINGS:

No stonith devices and stonith-enabled is not false

Stack: corosync

Current DC: pgtest3 (3) (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum

Last updated: Mon Oct  9 09:58:45 2023

Last change: Mon Oct  9 09:55:47 2023 by hacluster via crmd on pgtest3

3 nodes configured

0 resource instances configured

Online: [ pgtest1 (1) pgtest2 (2) pgtest3 (3) ]

No resources

Node Attributes:

* Node pgtest1 (1):

* Node pgtest2 (2):

* Node pgtest3 (3):

Migration Summary:

* Node pgtest3 (3):

* Node pgtest1 (1):

* Node pgtest2 (2):

Fencing History:

PCSD Status:

  pgtest1: Online

  pgtest2: Online

  pgtest3: Online

Daemon Status:

  corosync: active/disabled

  pacemaker: active/disabled

  pcsd: active/enabled

1.10 数据库环境变量设置[all servers]

[root@pgtest1 soft]# su - postgres

Last login: Fri May  5 17:18:28 CST 2023 on pts/3

[postgres@pgtest1 ~]$ cat .bash_profile

# .bash_profile

# Get the aliases and functions

if [ -f ~/.bashrc ]; then

        . ~/.bashrc

fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

export PGHOME=/postgresql/pg14

export PGDATA=/postgresql/pgdata

export PATH=$PGHOME/bin:$PATH

export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH

1.11 primary数据库配置 [pgtest1]

#### pgtest1 ####

1).初始化数据库

# su - postgres

$ initdb -D $PGDATA

2).配置主机访问

修改 pg_hba.conf

sed -i '/^host[[:space:]]\+all[[:space:]]\+all[[:space:]]\+127\.0\.0\.1\/32[[:space:]]\+trust/i host    all             all             0.0.0.0/0               scram-sha-256'  /postgresql/pgdata/pg_hba.conf

sed -i '/^host[[:space:]]\+replication[[:space:]]\+all[[:space:]]\+127\.0\.0\.1\/32[[:space:]]\+trust/i host    replication     all             0.0.0.0/0               scram-sha-256'  /postgresql/pgdata/pg_hba.conf

3).配置数据库参数

cat <<EOF >> /postgresql/pgdata/postgresql.conf

# Custom settings appended by script

listen_addresses = '*'

wal_keep_size = 10240  # 单位MB

log_destination = 'csvlog'

logging_collector = on

archive_mode = on

archive_command = 'cp %p /postgresql/arch/%f'

EOF

4).修改用户默认密码

[postgres@pgtest1 pgdata]$ pg_ctl start

[postgres@pgtest1 pgdata]$ psql -c "alter user postgres password 'postgres'";

1.12 创建secondary数据库 [pgtest2]

[postgres@pgtest2 pgdata]$ pg_basebackup -h pgtest1 -U repl -D /postgresql/pgdata/ -Fp -Pv -Xs

#无需启动

1.13 创建third数据库 [pgtest3]

[postgres@pgtest3 pgdata]$ pg_basebackup -h pgtest1 -U repl -D /postgresql/pgdata/ -Fp -Pv -Xs

#无需启动

1.14 停止primary数据库 [pgtest1]

$ pg_ctl stop

waiting for server to shut down.... done

server stopped

二、配置pacemaker数据库集群 [any one host] (一个节点配置即可,会自动同步到另外一个节点,master节点执行)

2.1 检查集群状态

[root@pgtest1 resource-agents-4.12.0]# pcs status

Cluster name: cluster_pg01

WARNINGS:

No stonith devices and stonith-enabled is not false

Stack: corosync

Current DC: pgtest1 (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum

Last updated: Fri May  9 12:21:03 2025

Last change: Fri May  9 12:14:30 2025 by hacluster via crmd on pgtest1

3 nodes configured

0 resource instances configured

Online: [ pgtest1 pgtest2 pgtest3 ]

No resources

Daemon Status:

  corosync: active/disabled

  pacemaker: active/disabled

  pcsd: active/enabled

2.2 创建集群文件

[root@pgtest1 resource-agents-4.12.0]# pcs cluster cib cib.xml

2.3 配置数据库资源

-- property: cluster-name --

# pcs -f cib.xml property set cluster-name="pgcluster"

-- property: disable stonith, quorum --

# pcs -f cib.xml property set no-quorum-policy="ignore"

# pcs -f cib.xml property set stonith-enabled="false"

-- resource: vip-master --

# pcs -f cib.xml resource create vip-master ocf:heartbeat:IPaddr2 ip=192.168.24.14 cidr_netmask=24 nic=ens33 iflabel=master op monitor interval=5s

-- resource: vip-slave --

# pcs -f cib.xml resource create vip-slave ocf:heartbeat:IPaddr2 ip=192.168.24.15 cidr_netmask=24 nic=ens33 iflabel=slave op monitor interval=5s

-- resource: pgsql --

# pcs -f cib.xml resource create pgsql ocf:heartbeat:pgsql\

    pgctl="/postgresql/pg14/bin/pg_ctl"\

    psql="/postgresql/pg14/bin/psql"\

    pgdata="/postgresql/pgdata"\

    node_list="pgtest1 pgtest2 pgtest3"\

    restore_command=""\

    master_ip="192.168.24.14"\

    repuser="postgres"\

    rep_mode="sync"\

    primary_conninfo_opt="password=postgres keepalives_idle=60 keepalives_interval=5 keepalives_count=5"\

    op monitor interval="11s"\

    op monitor interval="10s" role="Master"\

    master master-max=1 master-node-max=1 clone-max=3 clone-node-max=1 notify=true target-role='Started'

-- constraint: vip-master, pgsql on master node --

# pcs -f cib.xml constraint colocation add vip-master with master pgsql-master INFINITY

-- constraint: pgsql promote  node  MasterGroup --

# pcs -f cib.xml constraint order promote pgsql-master then start vip-master symmetrical=false score=INFINITY

-- constraint: pgsql demote  node  MasterGroup --

# pcs -f cib.xml constraint order demote pgsql-master then stop vip-master symmetrical=false score=0

-- constraint: vip-slave  sync standby sync standby on master --

# pcs -f cib.xml constraint location vip-slave rule score=200 pgsql-status eq HS:sync

# pcs -f cib.xml constraint location vip-slave rule score=100 pgsql-status eq PRI

# pcs -f cib.xml constraint location vip-slave rule score=-INFINITY not_defined pgsql-status

# pcs -f cib.xml constraint location vip-slave rule score=-INFINITY pgsql-status ne HS:sync and pgsql-status ne PRI

-- cluster: push cib file into cib --

# pcs cluster cib-push cib.xml

2.4 刷新集群状态

# pcs resource refresh --full

Waiting for 1 reply from the CRMd. OK

2.5 查询集群状态

[root@pgtest1 ~]# pcs status --full     #需要等待几秒或者多刷新几次

Cluster name: pgcluster

Stack: corosync

Current DC: pgtest3 (3) (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum

Last updated: Fri May  9 12:35:17 2025

Last change: Fri May  9 12:35:11 2025 by root via crm_attribute on pgtest1

3 nodes configured

5 resource instances configured

Online: [ pgtest1 (1) pgtest2 (2) pgtest3 (3) ]

Full list of resources:

 vip-master     (ocf::heartbeat:IPaddr2):       Started pgtest1

 vip-slave      (ocf::heartbeat:IPaddr2):       Started pgtest2

 Master/Slave Set: pgsql-master [pgsql]

     pgsql      (ocf::heartbeat:pgsql): Slave pgtest2

     pgsql      (ocf::heartbeat:pgsql): Slave pgtest3

     pgsql      (ocf::heartbeat:pgsql): Master pgtest1

     Masters: [ pgtest1 ]

     Slaves: [ pgtest2 pgtest3 ]

Node Attributes:

* Node pgtest1 (1):

    + master-pgsql                      : 1000

    + pgsql-data-status                 : LATEST

    + pgsql-master-baseline             : 00000000050000A0

    + pgsql-status                      : PRI

* Node pgtest2 (2):

    + master-pgsql                      : 100

    + pgsql-data-status                 : STREAMING|SYNC

    + pgsql-status                      : HS:sync

* Node pgtest3 (3):

    + master-pgsql                      : -INFINITY

    + pgsql-data-status                 : STREAMING|ASYNC

    + pgsql-status                      : HS:async

Migration Summary:

* Node pgtest2 (2):

* Node pgtest3 (3):

* Node pgtest1 (1):

Fencing History:

PCSD Status:

  pgtest1: Online

  pgtest3: Online

  pgtest2: Online

Daemon Status:

  corosync: active/disabled

  pacemaker: active/disabled

  pcsd: active/enabled

--查看流复制状态

[root@pgtest1 ~]# ps -ajxf|grep postgres

---查看VIP

#master vip (write and read vip)

[root@pgtest1 ~]# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

    link/ether 00:0c:29:b0:62:cd brd ff:ff:ff:ff:ff:ff

    inet 192.168.24.11/24 brd 192.168.24.255 scope global noprefixroute ens33

       valid_lft forever preferred_lft forever

    inet 192.168.24.14/24 brd 192.168.24.255 scope global secondary ens33:master

       valid_lft forever preferred_lft forever

    inet6 fe80::20c:29ff:feb0:62cd/64 scope link

#slave vip (read vip)

[postgres@pgtest2 ~]$ ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

    link/ether 00:0c:29:c8:ee:12 brd ff:ff:ff:ff:ff:ff

    inet 192.168.24.12/24 brd 192.168.24.255 scope global noprefixroute ens33

       valid_lft forever preferred_lft forever

    inet 192.168.24.15/24 brd 192.168.24.255 scope global secondary ens33:slave

       valid_lft forever preferred_lft forever

    inet6 fe80::15bb:4008:354c:4f0f/64 scope link noprefixroute

       valid_lft forever preferred_lft forever

[postgres@pgtest3 ~]$ ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

    link/ether 00:0c:29:c8:ee:12 brd ff:ff:ff:ff:ff:ff

    inet 192.168.24.12/24 brd 192.168.24.255 scope global noprefixroute ens33

       valid_lft forever preferred_lft forever

    inet 192.168.24.15/24 brd 192.168.24.255 scope global secondary ens33:slave

       valid_lft forever preferred_lft forever

    inet6 fe80::20c:29ff:fec8:ee12/64 scope link

       valid_lft forever preferred_lft forever

三、PostgreSQL故障演示

3.1 数据同步验证

--master vip连接测试

[postgres@pgtest3 ~]$ psql -h 192.168.24.14 -p5432

Password for user postgres:

psql (14.6)

Type "help" for help.

postgres=# create table t1 (id int);

CREATE TABLE

postgres=# insert into t1 values(1);

INSERT 0 1

--slave vip连接测试

[postgres@pgtest3 ~]$ psql -h 192.168.24.15 -p5432

Password for user postgres:

psql (14.6)

Type "help" for help.

postgres=# select * from t1;

 id

----

  1

(1 row)

postgres=# insert into t1 values(2);

ERROR:  cannot execute INSERT in a read-only transaction

3.2 模拟主节点故障

[postgres@pgtest1 ~]$ pg_ctl stop

waiting for server to shut down.... done

server stopped

---查看当前节点资源状态

[root@pgtest1 ~]# crm_mon -Afr -1

Stack: corosync

Current DC: pgtest3 (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum

Last updated: Fri May  9 13:53:14 2025

Last change: Fri May  9 13:52:49 2025 by root via crm_attribute on pgtest2

3 nodes configured

5 resource instances configured

Online: [ pgtest1 pgtest2 pgtest3 ]

Full list of resources:

 vip-master     (ocf::heartbeat:IPaddr2):       Started pgtest2

 vip-slave      (ocf::heartbeat:IPaddr2):       Started pgtest3

 Master/Slave Set: pgsql-master [pgsql]

     Masters: [ pgtest2 ]

     Slaves: [ pgtest3 ]

     Stopped: [ pgtest1 ]

Node Attributes:

* Node pgtest1:

    + master-pgsql                      : -INFINITY

    + pgsql-data-status                 : DISCONNECT

    + pgsql-status                      : STOP

* Node pgtest2:

    + master-pgsql                      : 1000

    + pgsql-data-status                 : LATEST

    + pgsql-master-baseline             : 00000000060000A0

    + pgsql-status                      : PRI

* Node pgtest3:

    + master-pgsql                      : 100

    + pgsql-data-status                 : STREAMING|SYNC

    + pgsql-status                      : HS:sync

Migration Summary:

* Node pgtest2:

* Node pgtest3:

* Node pgtest1:

   pgsql: migration-threshold=1000000 fail-count=1000000 last-failure='Fri May  9 13:52:32 2025'

Failed Resource Actions:

* pgsql_start_0 on pgtest1 'unknown error' (1): call=55, status=complete, exitreason='My data may be inconsistent. You have to remove /var/lib/pgsql/tmp/PGSQL.lock file to force start.',

    last-rc-change='Fri May  9 13:52:32 2025', queued=0ms, exec=234ms

---查看集群状态

[root@pgtest1 ~]# pcs status --all

Cluster name: pgcluster

Stack: corosync

Current DC: pgtest3 (3) (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum

Last updated: Fri May  9 13:55:31 2025

Last change: Fri May  9 13:52:49 2025 by root via crm_attribute on pgtest2

3 nodes configured

5 resource instances configured

Online: [ pgtest1 (1) pgtest2 (2) pgtest3 (3) ]

Full list of resources:

 vip-master     (ocf::heartbeat:IPaddr2):       Started pgtest2

 vip-slave      (ocf::heartbeat:IPaddr2):       Started pgtest3

 Master/Slave Set: pgsql-master [pgsql]

     pgsql      (ocf::heartbeat:pgsql): Master pgtest2

     pgsql      (ocf::heartbeat:pgsql): Slave pgtest3

     pgsql      (ocf::heartbeat:pgsql): Stopped

     Masters: [ pgtest2 ]

     Slaves: [ pgtest3 ]

     Stopped: [ pgtest1 ]

Node Attributes:

* Node pgtest1 (1):

    + master-pgsql                      : -INFINITY

    + pgsql-data-status                 : DISCONNECT

    + pgsql-status                      : STOP

* Node pgtest2 (2):

    + master-pgsql                      : 1000

    + pgsql-data-status                 : LATEST

    + pgsql-master-baseline             : 00000000060000A0

    + pgsql-status                      : PRI

* Node pgtest3 (3):

    + master-pgsql                      : 100

    + pgsql-data-status                 : STREAMING|SYNC

    + pgsql-status                      : HS:sync

Migration Summary:

* Node pgtest2 (2):

* Node pgtest3 (3):

* Node pgtest1 (1):

   pgsql: migration-threshold=1000000 fail-count=1000000 last-failure='Fri May  9 13:52:32 2025'

Failed Resource Actions:

* pgsql_start_0 on pgtest1 'unknown error' (1): call=55, status=complete, exitreason='My data may be inconsistent. You have to remove /var/lib/pgsql/tmp/PGSQL.lock file to force start.',

    last-rc-change='Fri May  9 13:52:32 2025', queued=0ms, exec=234ms

Fencing History:

PCSD Status:

  pgtest1: Online

  pgtest2: Online

  pgtest3: Online

Daemon Status:

  corosync: active/disabled

  pacemaker: active/disabled

  pcsd: active/enabled

#此时集群master已自动切换至pgtest2

--vip发生了漂移

#Master-vip漂移到pgtest2slave-vip漂移到pgtest3

[root@pgtest2 ~]# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

    link/ether 00:0c:29:c8:ee:12 brd ff:ff:ff:ff:ff:ff

    inet 192.168.24.12/24 brd 192.168.24.255 scope global noprefixroute ens33

       valid_lft forever preferred_lft forever

    inet 192.168.24.14/24 brd 192.168.24.255 scope global secondary ens33:master

       valid_lft forever preferred_lft forever

    inet6 fe80::20c:29ff:fec8:ee12/64 scope link

       valid_lft forever preferred_lft forever

[postgres@pgtest3 ~]$ ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

    link/ether 00:0c:29:50:60:1a brd ff:ff:ff:ff:ff:ff

    inet 192.168.24.13/24 brd 192.168.24.255 scope global noprefixroute ens33

       valid_lft forever preferred_lft forever

    inet 192.168.24.15/24 brd 192.168.24.255 scope global secondary ens33:slave

       valid_lft forever preferred_lft forever

    inet6 fe80::20c:29ff:fe50:601a/64 scope link

       valid_lft forever preferred_lft forever

---恢复原master节点

注意原master节点挂掉之后,使用 crm_mon -Arf -1命令看到末尾有"You have to remove /var/lib/pgsql/tmp/PGSQL.lock file to force start."字样,master宕机启动时,需要删除临时锁文件方可进行集群角色转换。即执行rm -rf /var/lib/pgsql/tmp/PGSQL.lock

[root@pgtest1 ~]# ls /var/lib/pgsql/tmp/PGSQL.lock

/var/lib/pgsql/tmp/PGSQL.lock

[postgres@pgtest1 ~]$ rm -rf /var/lib/pgsql/tmp/PGSQL.lock

拉起数据库不需要执行pg_ctl start,只需重启服务,软件会自动把数据库拉起。

[root@pgtest1 tmp]# systemctl restart corosync pacemaker pcsd

---查看集群状态

[root@pgtest1 tmp]# pcs status --full

Cluster name: pgcluster

Stack: corosync

Current DC: pgtest3 (3) (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum

Last updated: Fri May  9 14:00:05 2025

Last change: Fri May  9 13:59:09 2025 by root via crm_attribute on pgtest2

3 nodes configured

5 resource instances configured

Online: [ pgtest1 (1) pgtest2 (2) pgtest3 (3) ]

Full list of resources:

 vip-master     (ocf::heartbeat:IPaddr2):       Started pgtest2

 vip-slave      (ocf::heartbeat:IPaddr2):       Started pgtest3

 Master/Slave Set: pgsql-master [pgsql]

     pgsql      (ocf::heartbeat:pgsql): Master pgtest2

     pgsql      (ocf::heartbeat:pgsql): Slave pgtest3

     pgsql      (ocf::heartbeat:pgsql): Slave pgtest1

     Masters: [ pgtest2 ]

     Slaves: [ pgtest1 pgtest3 ]

Node Attributes:

* Node pgtest1 (1):

    + master-pgsql                      : -INFINITY

    + pgsql-data-status                 : STREAMING|ASYNC

    + pgsql-status                      : HS:async

* Node pgtest2 (2):

    + master-pgsql                      : 1000

    + pgsql-data-status                 : LATEST

    + pgsql-master-baseline             : 00000000060000A0

    + pgsql-status                      : PRI

* Node pgtest3 (3):

    + master-pgsql                      : 100

    + pgsql-data-status                 : STREAMING|SYNC

    + pgsql-status                      : HS:sync

Migration Summary:

* Node pgtest2 (2):

* Node pgtest3 (3):

* Node pgtest1 (1):

Fencing History:

PCSD Status:

  pgtest1: Online

  pgtest2: Online

  pgtest3: Online

Daemon Status:

  corosync: active/disabled

  pacemaker: active/disabled

  pcsd: active/enabled

#pgtest1重新加入集群后变成了slave节点。

3.3 二次模拟主节点故障

[postgres@pgtest2 ~]$ pg_ctl stop

waiting for server to shut down.... done

server stopped

--查看资源状态

Stack: corosync

Current DC: pgtest3 (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum

Last updated: Fri May  9 14:02:47 2025

Last change: Fri May  9 14:02:43 2025 by root via crm_attribute on pgtest3

3 nodes configured

5 resource instances configured

Online: [ pgtest1 pgtest2 pgtest3 ]

Full list of resources:

 vip-master     (ocf::heartbeat:IPaddr2):       Started pgtest3

 vip-slave      (ocf::heartbeat:IPaddr2):       Started pgtest1

 Master/Slave Set: pgsql-master [pgsql]

     Masters: [ pgtest3 ]

     Slaves: [ pgtest1 ]

     Stopped: [ pgtest2 ]

Node Attributes:

* Node pgtest1:

    + master-pgsql                      : 100

    + pgsql-data-status                 : STREAMING|SYNC

    + pgsql-status                      : HS:sync

* Node pgtest2:

    + master-pgsql                      : -INFINITY

    + pgsql-data-status                 : DISCONNECT

    + pgsql-status                      : STOP

* Node pgtest3:

    + master-pgsql                      : 1000

    + pgsql-data-status                 : LATEST

    + pgsql-master-baseline             : 00000000070000A0

    + pgsql-status                      : PRI

Migration Summary:

* Node pgtest2:

   pgsql: migration-threshold=1000000 fail-count=1000000 last-failure='Fri May  9 14:02:26 2025'

* Node pgtest3:

* Node pgtest1:

Failed Resource Actions:

* pgsql_start_0 on pgtest2 'unknown error' (1): call=73, status=complete, exitreason='My data may be inconsistent. You have to remove /var/lib/pgsql/tmp/PGSQL.lock file to force start.',

    last-rc-change='Fri May  9 14:02:25 2025', queued=0ms, exec=262ms

--查看集群状态

[root@pgtest2 ~]# pcs status --full

Cluster name: pgcluster

Stack: corosync

Current DC: pgtest3 (3) (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum

Last updated: Fri May  9 14:02:32 2025

Last change: Fri May  9 14:02:29 2025 by root via crm_attribute on pgtest3

3 nodes configured

5 resource instances configured

Online: [ pgtest1 (1) pgtest2 (2) pgtest3 (3) ]

Full list of resources:

 vip-master     (ocf::heartbeat:IPaddr2):       Started pgtest3

 vip-slave      (ocf::heartbeat:IPaddr2):       Started pgtest3

 Master/Slave Set: pgsql-master [pgsql]

     pgsql      (ocf::heartbeat:pgsql): Master pgtest3

     pgsql      (ocf::heartbeat:pgsql): Slave pgtest1

     pgsql      (ocf::heartbeat:pgsql): Stopped

     Masters: [ pgtest3 ]

     Slaves: [ pgtest1 ]

     Stopped: [ pgtest2 ]

Node Attributes:

* Node pgtest1 (1):

    + master-pgsql                      : -INFINITY

    + pgsql-data-status                 : DISCONNECT

    + pgsql-status                      : HS:alone

* Node pgtest2 (2):

    + master-pgsql                      : -INFINITY

    + pgsql-data-status                 : DISCONNECT

    + pgsql-status                      : STOP

* Node pgtest3 (3):

    + master-pgsql                      : 1000

    + pgsql-data-status                 : LATEST

    + pgsql-master-baseline             : 00000000070000A0

    + pgsql-status                      : PRI

Migration Summary:

* Node pgtest2 (2):

   pgsql: migration-threshold=1000000 fail-count=1000000 last-failure='Fri May  9 14:02:26 2025'

* Node pgtest3 (3):

* Node pgtest1 (1):

Failed Resource Actions:

* pgsql_start_0 on pgtest2 'unknown error' (1): call=73, status=complete, exitreason='My data may be inconsistent. You have to remove /var/lib/pgsql/tmp/PGSQL.lock file to force start.',

    last-rc-change='Fri May  9 14:02:25 2025', queued=0ms, exec=262ms

Fencing History:

PCSD Status:

  pgtest2: Online

  pgtest1: Online

  pgtest3: Online

Daemon Status:

  corosync: active/disabled

  pacemaker: active/disabled

  pcsd: active/enabled

集群master已经切换到pgtest3上。

--vip发生漂移

#Master-vip漂移到pgtest3slave-vip漂移到pgtest1

[root@pgtest1 tmp]# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

    link/ether 00:0c:29:b0:62:cd brd ff:ff:ff:ff:ff:ff

    inet 192.168.24.11/24 brd 192.168.24.255 scope global noprefixroute ens33

       valid_lft forever preferred_lft forever

    inet 192.168.24.15/24 brd 192.168.24.255 scope global secondary ens33:slave

       valid_lft forever preferred_lft forever

    inet6 fe80::a2cc:510c:af40:af87/64 scope link noprefixroute

       valid_lft forever preferred_lft forever

[postgres@pgtest3 ~]$ ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000

    link/ether 00:0c:29:50:60:1a brd ff:ff:ff:ff:ff:ff

    inet 192.168.24.13/24 brd 192.168.24.255 scope global noprefixroute ens33

       valid_lft forever preferred_lft forever

    inet 192.168.24.14/24 brd 192.168.24.255 scope global secondary ens33:master

       valid_lft forever preferred_lft forever

    inet6 fe80::6d33:e581:1ad:cc2e/64 scope link noprefixroute

       valid_lft forever preferred_lft forever

---恢复原master节点

注意原master节点挂掉之后,使用 crm_mon -Arf -1命令看到末尾有"You have to remove /var/lib/pgsql/tmp/PGSQL.lock file to force start."字样,master宕机启动时,需要删除临时锁文件方可进行集群角色转换。即执行rm -rf /var/lib/pgsql/tmp/PGSQL.lock

[root@pgtest2 ~]# ls /var/lib/pgsql/tmp/PGSQL.lock

/var/lib/pgsql/tmp/PGSQL.lock

[root@pgtest2 ~]# rm -rf /var/lib/pgsql/tmp/PGSQL.lock

拉起数据库不需要执行pg_ctl start,只需重启服务,软件会自动把数据库拉起。

[root@pgtest2 tmp]# systemctl restart corosync pacemaker pcsd

---查看集群状态

[root@pgtest2 tmp]# pcs status --full

Cluster name: pgcluster

Stack: corosync

Current DC: pgtest3 (3) (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum

Last updated: Fri May  9 14:06:50 2025

Last change: Fri May  9 14:05:22 2025 by root via crm_attribute on pgtest3

3 nodes configured

5 resource instances configured

Online: [ pgtest1 (1) pgtest2 (2) pgtest3 (3) ]

Full list of resources:

 vip-master     (ocf::heartbeat:IPaddr2):       Started pgtest3

 vip-slave      (ocf::heartbeat:IPaddr2):       Started pgtest1

 Master/Slave Set: pgsql-master [pgsql]

     pgsql      (ocf::heartbeat:pgsql): Slave pgtest2

     pgsql      (ocf::heartbeat:pgsql): Master pgtest3

     pgsql      (ocf::heartbeat:pgsql): Slave pgtest1

     Masters: [ pgtest3 ]

     Slaves: [ pgtest1 pgtest2 ]

Node Attributes:

* Node pgtest1 (1):

    + master-pgsql                      : 100

    + pgsql-data-status                 : STREAMING|SYNC

    + pgsql-status                      : HS:sync

* Node pgtest2 (2):

    + master-pgsql                      : -INFINITY

    + pgsql-data-status                 : STREAMING|ASYNC

    + pgsql-status                      : HS:async

* Node pgtest3 (3):

    + master-pgsql                      : 1000

    + pgsql-data-status                 : LATEST

    + pgsql-master-baseline             : 00000000070000A0

    + pgsql-status                      : PRI

Migration Summary:

* Node pgtest2 (2):

* Node pgtest3 (3):

* Node pgtest1 (1):

Fencing History:

PCSD Status:

  pgtest1: Online

  pgtest3: Online

  pgtest2: Online

Daemon Status:

  corosync: active/disabled

  pacemaker: active/disabled

  pcsd: active/enabled

pgtest2重新加入集群后,变成了slave节点。

依此操作,执行多次mster切换,master节点会在pgtest1pgtest2pgtest3循环切换。

相关文章:

PostgreSQL 14 pacemaker 高可用集群

核心架构原理 集群组成&#xff08;典型三节点结构&#xff09;&#xff1a; [Node1] PostgreSQL Pacemaker Corosync pcsd [Node2] PostgreSQL Pacemaker Corosync pcsd [Node3] PostgreSQL Pacemaker Corosync pcsd ↕ ↕ ↕ ← Corosync 多…...

英语学习5.21

Far from sensible 表示“很不明智的”、“离明智相去甚远”。这是一个固定表达&#xff0c;结构是 far from adj.&#xff0c;意思是“根本不……”&#xff0c;常见例子&#xff1a; far from perfect&#xff08;远非完美&#xff09; far from acceptable&#xff08;远…...

实现了TCP的单向通信

1. 客户端代码:Client.java package com.xie.javase.net1;import java.io.*; import java.net.*;public class Client {public static void main(String[] args) {Socket socket = null;BufferedWriter bw = null;try {// 1. 获取本机IP地址对象InetAddress localHost = Inet…...

华为云Flexus+DeepSeek征文 | 基于ModelArts Studio和Cherry Studio快速构建午餐管家助手

目录 一、前言 二、ModelArts Studio&#xff08;MaaS&#xff09;介绍与应用场景 2.1ModelArts Studio&#xff08;MaaS&#xff09;介绍 2.2 ModelArts Studio&#xff08;MaaS&#xff09;使用场景 2.3 开通MaaS服务 2.4 开通DeepSeek-V3商用服务 三、Cherry Studio简介和安…...

Spring AI 1.0 GA 正式发布

Spring AI 1.0 GA 正式发布 快速入门核心特性1. **增强型 LLM&#xff08;大语言模型&#xff09;**2. **MCP 协议支持**3. **RAG&#xff08;检索增强生成&#xff09;**4. **评估与监控**5. **智能代理&#xff08;Agents&#xff09;** 下一步计划 VMware Spring 团队 Mark …...

【计算机网络 第8版】谢希仁编著 第五章运输层 题型总结1 UDP和TCP报文格式

UDP报文 5.13 这一题可以先问AI&#xff1a; 但是问了AI&#xff0c;肯定想知道&#xff1a;这些知识点在书上哪里&#xff1f;怎么这么难找&#xff1f; 没错这题主要是靠IP地址&#xff0c;所以应该在第四章。 P136 P137 省流&#xff1a; 1.UDP的首部格式是8个字节&…...

华为云Flexus+DeepSeek征文 | 基于ModelArts Studio 的 DeepSeek API 实现行业深度搜索和分析

目录 一、前言 二、ModelArts Studio&#xff08;MaaS&#xff09;介绍与应用场景 2.1ModelArts Studio&#xff08;MaaS&#xff09;介绍 2.2 ModelArts Studio&#xff08;MaaS&#xff09;使用场景 2.3 开通MaaS服务 2.4 开通DeepSeek-V3商用服务 三、Deep Research简介和安…...

计算机网络——Session、Cookie 和 Token

在 Web 开发中&#xff0c;Session、Cookie 和 Token 是实现用户会话管理和身份验证的核心技术。它们既有联系&#xff0c;也有明显区别。以下从定义、原理、联系、区别和应用场景等方面详细解析。 一、基本定义与原理 1. Cookie 定义&#xff1a; 是浏览器存储在客户端的小…...

AAOS系列之----简介

一文讲透AAOS架构&#xff0c;点到为止不藏私 &#x1f4cc; AAOS是以一个系统APP的方式集成进安卓系统中,通过在SystemServer中启动其中的Service &#x1f4da; 1. CarServcie 是如何被启动的&#xff1f; AAOS中的核心服务是CarService,其描述如下: 代码路径如下: android1…...

CTF签到题

1.题目&#xff1a;VmxkMFUxVXhTbkpOU0dSVVZrWktWRlpyVm5kU2JGSnlWbXhhYkdKRlduaFpWVlpoVkcxRmQwMUlhRlpXTTFKUVZXdFZlR05zWkZsaVJrcG9ZbGRvUmxaR1dsZFVhekZIVW14V1lWSlZOVkJVVlZaV1RVWldjbFZzVGxOTlJGWlhWa1pvZDFWdFJuTlRhMVpXVm14YVIxUlVSa2RPYkVweVYyeENWMVpVUlhwV1ZtUjNVMj…...

甲骨文云服务器适合做网站吗

甲骨文云服务器&#xff1a;建网站&#xff0c;它到底是不是“神队友”&#xff1f; 各位想在网上“立门户”的老板、个人创作者们&#xff0c;大家好&#xff01;现在这年头&#xff0c;没个自己的网站&#xff0c;那感觉就像做生意没个店面、搞创作没个画廊一样&#xff0c;…...

性能测试场景题

题目 针对618&#xff0c;双十一活动的&#xff0c;一个电商系统&#xff0c;如何设计压力测试方案&#xff1f; 参考答案 针对618、双十一等高并发电商大促活动&#xff0c;压力测试方案需覆盖全链路性能瓶颈识别、容量评估和极端场景验证。以下为详细设计框架&#xff0c;…...

数智读书笔记系列033《软件设计的哲学(第2版)》:复杂性管理的艺术

《软件设计的哲学》(A Philosophy of Software Design)书籍简介 作者:约翰奥斯特豪特(John Ousterhout) 出版信息:第2版于2024年11月由人民邮电出版社出版,中文版由茹炳晟、王海鹏翻译。 作者背景 奥斯特豪特是斯坦福大学计算机科学教授、美国国家工程院院士,拥有丰…...

MySQL与Redis数据同步实践与优化

一、数据不一致的典型场景 写入顺序不一致 当业务逻辑需要同时更新数据库和缓存时&#xff0c;若出现"先删缓存后更新DB"或"先更新DB后删缓存"操作失败&#xff0c;会导致缓存与数据库数据版本不一致。 并发读写冲突 高并发场景下可能出现&#xff1a; …...

HarmonyOS 鸿蒙应用开发基础:EventHub,优雅解决跨组件通信难题

EventHub是鸿蒙开发中用于线程内通信的事件中心模块&#xff0c;基于发布订阅模式实现组件间的高效通信。它完美解决了传统回调方式在多层嵌套场景下的痛点&#xff0c;使得组件间的通信更加灵活和易于管理。 核心特性 事件中心机制&#xff1a;通过事件名进行通信&#xff0c…...

如何解决鸿蒙应用闪退问题

如何解决鸿蒙应用闪退问题 本文是一份面向 ArkTS&#xff0f;JavaScript&#xff0f;C 多语言开发者的综合性排查与优化手册&#xff0c;覆盖 HarmonyOS/OpenHarmony 5.x 时代 常见闪退根因、诊断流程、调试技巧、CI 监控及线上防护方案&#xff0c;力争帮你把 Crash 数量降到 …...

人民日报社主管媒体深度聚焦珈和科技“遥感+AI”农险精准化突破:首创“四维数据贯通”模式 树行业转型新标杆

近日&#xff0c;由人民日报社主管的《中国城市报》对珈和科技与国寿财险湖南省分公司联合打造的农业保险数字化标杆项目进行了深度报道。 作为"遥感AI"技术在农业风险管理领域的创新实践者&#xff0c;珈和科技依托自主构建的覆盖“天-空-地-人”的全维度智慧农业技…...

(1)深度学习基础知识(八股)——常用名词解释

1. FC FC全称是Fully Connect全连接层&#xff0c;也被称为Linear Layer线性层。 它的核心是&#xff1a;每个输入神经元 与 每个输出神经元 都要通过权重连接&#xff0c;适用于将输入特征映射到高维或者低维空间。 数学表示 对于一个输入向量,FC的计算方式是&#xff1a; 是…...

深度学习零基础入门(2)-实战1:激活函数、前向传播和反向传播

一、激活函数 激活函数的作用 激活函数在神经网络中起着至关重要的作用&#xff0c;主要用于引入非线性因素&#xff0c;使得神经网络能够学习和模拟复杂的非线性关系。如果没有激活函数&#xff0c;无论神经网络有多少层&#xff0c;最终都只能表示线性变换&#xff0c;无法…...

LeRobot的机器人控制系统(下)

目的和范围 机器人控制系统是 LeRobot 框架的核心组件&#xff0c;提供用于操作、标定和记录物理机器人数据的接口。该系统支持远程操作、记录演示数据集、重放动作以及在真实机器人上运行已训练的策略。它充当用户、物理机器人硬件和训练流程之间的桥梁。本文介绍机器人控制系…...

Linux Docker安装【再探完美版教程】

Dokcer安装 文章目录 Dokcer安装安装前准备安装前设置yum网络镜像源【重要】查看服务器系统版本以及内核版本查看服务器内核版本安装依赖包&#xff1a;设置阿里云docker-ce镜像源 安装Dockerdocker-ce安装启动docker并设置开机自启配置阿里云镜像测试&#xff1a; Docker概念&…...

Java-根据路径获取JSON字符串的value值

实现内容 入参: 一串json的字符串,根据传入的字符串路径和想要获取此路径下的key值 出参: 此路径下的key的value值 实现原理 采用一层一层获取的方式,判断第一层并且获取第一层的数据,放入到数组中,将该数组放到下一次循环,再获取下一层的数据 实现方法 /*** 根据路径获取…...

【小呆的随机振动力学笔记】随机过程基础【一】

文章目录 1. 随机过程基础1.1 随机过程的概率分布1.2 随机过程的统计特征1.3 平稳随机过程1.4 遍历过程平稳随机过程 1. 随机过程基础 \quad\quad 上一节&#xff0c;我们主要回顾了概率论知识&#xff0c;接下来我们来回顾随机过程基础理论&#xff08;或者叫随机场&#xff0…...

Java 内存模型中的读、写屏障

目录 1. 基本概念 1.1、读屏障 (Load Barrier) 1.2、写屏障 (Store Barrier) 1.3、咖啡店例子 2. 常见内存屏障 2.1、volatile 1、缓存可见性 2、指令重排序 3、内存屏障 2.2、final 2.3、synchronized关键字 2.4、手动内存屏障 3、不同屏障类型对比 4、实…...

AI 多 Agent 图形化开发深度解析:iVX IDE 与主流产品技术架构对比研究

随着人工智能技术的发展&#xff0c;软件开发正从手工编码向智能辅助开发演进。在 AI 多 Agent 图形化开发领域&#xff0c;iVX IDE 与 GitHub Copilot、Tabnine、CodeGeeX 等主流产品代表了不同的技术路线。本文从技术架构、功能实现、性能表现、生态建设等维度&#xff0c;对…...

微服务中的 AKF 拆分原则:构建可扩展系统的核心方法论

在数字化浪潮的推动下&#xff0c;互联网应用规模呈指数级增长&#xff0c;传统单体架构逐渐暴露出难以扩展、维护成本高等问题&#xff0c;微服务架构应运而生并成为企业应对复杂业务场景的主流选择。然而&#xff0c;随着业务的不断扩张和用户量的持续增加&#xff0c;如何确…...

MySQL迁移SSL报错

文章记录了之前tdsql迁移IDC过程中遇到的小问题 环境 xboss业务&#xff1a; tdsql未启用SSL&#xff0c; IDC-mysql启用了SSL: 原因分析 1&#xff0c; 迁移前&#xff1a; 因为tdsql未启用ssl&#xff0c; 且应用未显式配置ssl JDBC默认使用非SSL连接&#xff0c;因此可以正…...

Mysql的主从同步

一主一从 IP地址主机名master节点192.168.10.200mysql200slave节点192.168.10.201mysql201 master节点操作 配置文件增加两行参数 [rootmysql200 ~]# tail -n 2 /etc/my.cnf.d/mysql-server.cnf log-bin/mylog/mysql200 server-id200 [rootmysql200 ~]# systemctl restart …...

云原生微服务的前世今生

目录 Part1 时代背景 Part2 何为微服务&#xff1f; Part3 微服务出现的意义​ Part4 企业应用 京东&#xff1a;国内电商领域的微服务实践​ 阿里&#xff1a;微服务在复杂业务场景中的应用​ Part5 Istio&#xff1a;服务网格时代的微服务治理中枢​ Istio 的技术定位…...

Python之虚拟环境

文章目录 Python之虚拟环境虚拟环境核心概念为什么需要虚拟环境&#xff1f;虚拟环境注意事项 创建虚拟环境使用 venv (Python 3.3 内置)使用 virtualenv (第三方工具&#xff0c;支持Python 2/3)与 venv创建方式的区别Python 版本支持功能与兼容性依赖关系和性能命令行工具创建…...

【Java高阶面经:数据库篇】15. 零停机数据迁移:从双写到一致性校验

一、迁移架构设计:双写+增量同步的三层防护模型 1.1 核心架构流程图 #mermaid-svg-MfnakvBNrtFScrMe {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-MfnakvBNrtFScrMe .error-icon{fill:#552222;}#mermaid-svg-Mf…...

车载以太网网络测试-27【SOME/IP-SD简述】

文章目录 1 摘要2 SOME/IP-SD协议介绍2.1 定义与作用2.2 SOMEIP/SD协议通俗易懂的理解2.2.1 SOMEIP/SD协议是什么&#xff1f;2.2.2 通信流程&#xff08;简化&#xff09;2.2.3 车载功能示例2.2.4 类比理解 2.3 SOME/IP-SD报文结构2.3.1 Flags2.3.1.1 REBOOT (Bit 7)2.3.1.2 U…...

Ubuntu 22.04上升级Node.js版本

在Ubuntu 22.04上升级Node.js版本有几种方法&#xff0c;推荐使用NVM&#xff08;Node Version Manager&#xff09;&#xff0c;因为它可以让你轻松管理多个Node.js版本。 方法1: 使用NVM&#xff08;推荐&#xff09; 1. 安装NVM # 下载并安装NVM curl -o- https://raw.gi…...

软件设计师“面向对象设计”真题考点分析——求三连

一、考点分值占比与趋势分析 综合知识历年考察统计 年份考题数分值占比考察重点2018334%继承类型、设计原则2019445.3%多态实现、类关系2020556.7%设计模式应用、接口隔离2021334%消息通信、封装特性2022668%开闭原则、组合模式2023556.7%模板方法、适配器模式2024445.3%单一…...

flutter dart 函数语法

以下是 Dart 语言中函数语法的 详细实例说明&#xff0c;涵盖了所有常用写法 基本语法参数类型&#xff08;必选、可选、命名、默认值&#xff09;匿名函数、箭头函数高阶函数&#xff08;函数作为参数/返回值&#xff09;异步函数&#xff08;async / await&#xff09; 1. …...

鸿蒙Flutter实战:24-混合开发详解-4-初始化Flutter

概述 将 Flutter 模块添加至宿主鸿蒙项目中后&#xff0c;接下需要实现页面跳转、消息通信等功能&#xff0c;本文重点介绍如何初始化 Flutter。 项目配置 添加依赖 编辑 ohos_app/oh-package.json 文件 如果通过 Har 包方式引入 Flutter 模块&#xff0c;则需要添加如下内…...

微信小程序之Promise-Promise初始用

我们来尝试使用Promise。 1、需求&#xff0c;做个抽奖的按钮&#xff0c; 抽奖规则&#xff1a; 30%的几率中奖&#xff0c;中奖会提示恭喜恭喜&#xff0c;奖品为10万 RMB 劳斯莱斯优惠券&#xff0c;没中奖会提示再接再厉。 2、先搭界面&#xff1a; <view class&qu…...

工业 / 农业 / AR 场景怎么选?Stereolabs ZED 双目3D相机型号对比与选型建议

Stereolabs ZED 相机系列为视觉感知领域提供了多种创新解决方案&#xff0c;适用于不同应用场景。选择合适的 ZED 相机型号&#xff0c;需综合考虑分辨率、深度感知范围、接口类型等因素。 Stereolabs ZED 相机产品系列概览 ZED&#xff1a;首款立体视觉相机&#xff0c;专为高…...

(Git) 稀疏检出(Sparse Checkout) 拉取指定文件

文章目录 &#x1f3ed;作用&#x1f3ed;指令总览&#x1f477;core.sparseCheckout&#x1f477;sparse-checkout 文件 &#x1f3ed;实例演示⭐END&#x1f31f;交流方式 &#x1f3ed;作用 类似于 .gitignore 进行文件的规则匹配。 一般在需要拉取大型项目指定的某些文件…...

Nginx 部署前端项目dist文件到局域网然后ngrok部署到公网

①项目里面 npm run build 生成的dist文件 ②下载nginx: download 将dist文件夹放入html文件夹中 ③conf修改配置 里面有nginx.conf 文本修改④在此目录下 打开cmd 输入 start nginx.exe 启动代理 ⑤http://localhost:90/index.html即可或者域名换成你的ip地址也可以 …...

【sylar-webserver】9 网络模块

目录 Address 类图 知识点 常用结构体 常用函数 Socket 类图 主要功能 初始化 socket 流程&#xff1a; ByteArray 知识点 zigzag 算法 TLV 编码结构 Stream 类图 Stream 流结构&#xff0c;提供字节流读写接口 SocketStream TcpServer 类图 主要功能 Address…...

野火鲁班猫(arrch64架构debian)从零实现用MobileFaceNet算法进行实时人脸识别(四)安装RKNN Toolkit2

RKNN Toolkit2是用来将onnx模型转成rknn专用模型&#xff0c;并可通过RKNN Toolkit Lite2或者RKNPU调用NPU进行加速计算的工具。 一开始我安装很多次都无法成功安装。后来跟售后技术对接&#xff0c;必须是PC平台的Linux环境才可以。我的电脑是windows&#xff0c;所以我需要用…...

第六部分:阶段项目 5:构建 NestJS RESTful API 服务器

现在&#xff0c;是时候将你学到的 NestJS 知识付诸实践&#xff0c;构建一个简单的 RESTful API 服务器了。我们将基于第四阶段的项目&#xff08;博客文章 API 或任务管理 API&#xff09;&#xff0c;使用 NestJS 的方式重新实现它。 选择以下一个项目&#xff1a; 项目选…...

【工作流】Fastgpt配置豆包模型-火山引擎

V4.9.7 Fastgpt现在不通过oneapi 来配置模型和渠道了&#xff0c; 可以直接在页面进行设置 首先在账号- 模型提供商里面 填入豆包的信息&#xff1a; 渠道名随便填&#xff0c;厂商选豆包&#xff0c; 然后选3个模型&#xff0c;如图所示 如果没有填入模型映射的话是没办法 …...

vite搭建vue3项目及相关配置

1.npm create vite 设置你的项目名&#xff0c;选择框架&#xff0c;选择语言 我此处选的为Vue typescripe 2.按照命令去执行 cd vite-vue3-app 进入项目文件&#xff0c;npm install 安装依赖&#xff0c;npm run dev 运行项目 此处由于node、npm版本导致报错问题如图 在…...

web实验(2)

实验1 搭建nginxssl的加密认证web服务器 第一步&#xff1a;准备工作 # 恢复快照 [rootserver ~]# setenforce 0 [rootserver ~]# systemctl stop firewalld [rootserver ~]# systemctl disable firewalld [rootserver ~]# yum install nginx mod_ssl -y [r…...

数字孪生技术如何重塑能源产业?

近年来&#xff0c;全球能源行业正步入一个前所未有的转型期。一方面&#xff0c;“双碳”目标驱动能源结构向低碳化、清洁化发展&#xff1b;另一方面&#xff0c;新能源比例快速上升&#xff0c;给传统电力系统带来巨大的不确定性。与此同时&#xff0c;数字化浪潮也席卷能源…...

你通俗易懂的理解——线程、多线程与线程池

一&#xff1a;异常处理 1.1 异常概述 &#xff08;1&#xff09;场景 &#xff08;2&#xff09;定义 &#xff08;3&#xff09;异常抛出机制 Java把不同的异常用不同的类表示 &#xff08;4&#xff09;如何对待异常 1.2 常见异常类 &#xff08;1&#xff09;Throwable &am…...

spring+tomcat 用户每次发请求,tomcat 站在线程的角度是如何处理用户请求的,spinrg的bean 是共享的吗

对于 springtomcat 用户每次发请求&#xff0c;tomcat 站在线程的角度是如何处理的 比如 bio nio apr 等情况 tomcat 配置文件中 maxThreads 的数量是相对于谁来说的&#xff1f; 以及 spring Controller 中的全局变量:各种bean 对于线程来说是共享的吗&#xff1f; 一、Tomca…...

机器人坐标系标定

机器人坐标系标定 机器人坐标系标定 1. 知识目标 理解机器人坐标系的定义掌握机器人坐标系的分类 2. 技能目标 能够正确标定机器人坐标系 3. 机器人坐标系的作用 代表不同的物体或边界示例&#xff1a; 相对于桌子、弓箭、坯料、其他机器或边界移动 用途&#xff1a; 使用…...