通用机KESV8R2-3节点集群缩容为2节点

缩容需求

现场集群架构为1主2备,因不可抗力因素需要把3节点集群缩容为2节点。

集群节点为node1、node2、node3,待缩容节点为node3,各节点IP分别为192.168.40.107、192.168.40.160、192.168.40.161。

缩容前需要确认的点

缩容前需要确认以下几个方面:

  • 缩容哪个节点
  • 授权回收
  • 是否有监控,若有是否需要提前下线
  • 是否有备份任务,若有是否要提前停止

集群缩容操作步骤

回收授权文件

核实以下2点:

  • 现场是否使用KEMCC?
  • 授权是否用的是LAC?如果是LAC下发授权,要在LAC上做回收

该操作由金仓人员在LAC上对授权进行回收。

检查现有集群状态

在集群任意节点执行命令"repmgr service status",建议使用repmgr cluster show 查看集群状态,可以看到ip地址、端口等信息。

复制代码
[kingbase@node1 ~]$ repmgr service status
 ID | Name  | Role    | Status    | Upstream | repmgrd | PID  | Paused? | Upstream last seen
----+-------+---------+-----------+----------+---------+------+---------+--------------------
 1  | node1 | primary | * running |          | running | 6139 | no      | n/a
 2  | node2 | standby |   running | node1    | running | 4118 | no      | 1 second(s) ago
 3  | node3 | standby |   running | node1    | running | 4076 | no      | 1 second(s) ago

准备缩容所需文件

集群缩容需要准备cluster_install.sh和install.conf文件,通常情况下这两个文件在安装集群的/bin目录下

配置install.conf文件

编辑install.conf配置文件中shrink标签下的参数(参数设置规则可见文后扩展部分)。如需修改ssh连接端口,先修改install.conf文件中ssh_port项的值,然后修改系统/etc/ssh/sshd_config文件中的Port项的值,最后需要重启sshd服务。

该操作和接下来的操作均在需要缩容的节点上进行。

注意:

  • install_dir为安装目录/kingbase/bin中的安装目录值,不要写成$安装目录/kingbase

  • system密码如果不是默认的12345678ab需要配置db_password参数,默认密码12345678ab不需要配置[install]参数

    [install]
    db_user="system"
    db_password="kingbase"
    db_port="54321"

    [shrink]
    shrink_type="0"
    primary_ip="192.168.40.107"
    shrink_ip="192.168.40.161"
    node_id="3"
    install_dir="/home/kingbase/cluster/install"
    ssh_port="22"
    scmd_port="8890"

集群缩容

集群部署用户执行"cluster_install.sh shrink"命令进行集群缩容,脚本将按照配置自动完成集群缩容工作。

执行命令"cluster_install.sh shrink",进行自动化缩容。

复制代码
cd /home/kingbase/cluster/install/kingbase/bin
./cluster_install.sh shrink

详细输出如下:

复制代码
[kingbase@node3 bin]$ ./cluster_install.sh shrink
[CONFIG_CHECK] will deploy the cluster of
[RUNNING] success connect to the target "192.168.40.161" ..... OK
[RUNNING] success connect to "192.168.40.161" from current node by 'ssh' ..... OK
[RUNNING] success connect to the target "192.168.40.107" ..... OK
[RUNNING] success connect to "192.168.40.107" from current node by 'ssh' ..... OK
[RUNNING] Primary node ip is 192.168.40.107 ...
[RUNNING] Primary node ip is 192.168.40.107 ... OK
[CONFIG_CHECK] set install_with_root=1
[RUNNING] success connect to "" from current node by 'ssh' ..... OK
[RUNNING] success connect to the target "192.168.40.107" ..... OK
[RUNNING] success connect to "192.168.40.107" from current node by 'ssh' ..... OK
[INSTALL] load config from cluster.....
 [INFO] db_user=system
 [INFO] db_port=54321
 [INFO] use_scmd=1
 [INFO] auto_cluster_recovery_level=1
 [INFO] synchronous=quorum
[INSTALL] load config from cluster.....OK
[CONFIG_CHECK] check database connection ...
[CONFIG_CHECK] check database connection ... OK
[CONFIG_CHECK] shrink_ip[192.168.40.161] is a standby node IP in the cluster ...
[CONFIG_CHECK] shrink_ip[192.168.40.161] is a standby node IP in the cluster ...ok
[CONFIG_CHECK] The localhost is shrink_ip:[192.168.40.161] or primary_ip:[192.168.40.107]...
[CONFIG_CHECK] The localhost is shrink_ip:[192.168.40.161] or primary_ip:[192.168.40.107]...ok
[RUNNING] Primary node ip is 192.168.40.107 ...
[RUNNING] Primary node ip is 192.168.40.107 ... OK
[CONFIG_CHECK] check node_id is in cluster ...
[CONFIG_CHECK] check node_id is in cluster ...OK
[RUNNING] The /home/kingbase/cluster/install/kingbase/bin dir exist on "192.168.40.161" ...
[RUNNING] The /home/kingbase/cluster/install/kingbase/bin dir exist on "192.168.40.161" ... OK
 ID | Name  | Role    | Status    | Upstream | Location | Priority | Timeline | LSN_Lag | Connection string
----+-------+---------+-----------+----------+----------+----------+----------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 1  | node1 | primary | * running |          | default  | 100      | 1        |         | host=192.168.40.107 user=esrep dbname=esrep port=54321 connect_timeout=10 keepalives=1 keepalives_idle=2 keepalives_interval=2 keepalives_count=3 tcp_user_timeout=9000
 2  | node2 | standby |   running | node1    | default  | 100      | 1        | 0 bytes | host=192.168.40.160 user=esrep dbname=esrep port=54321 connect_timeout=10 keepalives=1 keepalives_idle=2 keepalives_interval=2 keepalives_count=3 tcp_user_timeout=9000
 3  | node3 | standby |   running | node1    | default  | 100      | 1        | 0 bytes | host=192.168.40.161 user=esrep dbname=esrep port=54321 connect_timeout=10 keepalives=1 keepalives_idle=2 keepalives_interval=2 keepalives_count=3 tcp_user_timeout=9000
[RUNNING] Del node is standby ...
[INFO] node:192.168.40.161 can be deleted ... OK
[RUNNING] query archive command at 192.168.40.107 ...
[RUNNING] current cluster not config sys_rman,return.
[Mon Jan 19 10:15:10 CST 2026] [INFO] /home/kingbase/cluster/install/kingbase/bin/repmgr standby unregister --node-id=3 ...
[INFO] connecting to local standby
[INFO] connecting to primary database
[NOTICE] unregistering node 3
[INFO] SET synchronous TO "quorum" on primary host
[INFO] change synchronous_standby_names from "ANY 1( node2,node3)" to "ANY 1( node2)"
[INFO] try to drop slot "repmgr_slot_3" of node 3 on primary node
[WARNING] replication slot "repmgr_slot_3" is still active on node 3
[INFO] standby unregistration complete
[Mon Jan 19 10:15:11 CST 2026] [INFO] /home/kingbase/cluster/install/kingbase/bin/repmgr standby unregister --node-id=3 ...OK
[Mon Jan 19 10:15:11 CST 2026] [INFO] check db connection ...
[Mon Jan 19 10:15:11 CST 2026] [INFO] check db connection ...ok
2026-01-19 10:15:12 Ready to stop local kbha daemon and repmgrd daemon ...
2026-01-19 10:15:15 begin to stop repmgrd on "[localhost]".
2026-01-19 10:15:16 repmgrd on "[localhost]" stop success.
2026-01-19 10:15:16 Done.
2026-01-19 10:15:16 begin to stop DB on "[localhost]".
waiting for server to shut down.... done
server stopped
2026-01-19 10:15:16 DB on "[localhost]" stop success.
 ID | Name  | Role    | Status    | Upstream | Location | Priority | Timeline | LSN_Lag | Connection string
----+-------+---------+-----------+----------+----------+----------+----------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 1  | node1 | primary | * running |          | default  | 100      | 1        |         | host=192.168.40.107 user=esrep dbname=esrep port=54321 connect_timeout=10 keepalives=1 keepalives_idle=2 keepalives_interval=2 keepalives_count=3 tcp_user_timeout=9000
 2  | node2 | standby |   running | node1    | default  | 100      | 1        | 0 bytes | host=192.168.40.160 user=esrep dbname=esrep port=54321 connect_timeout=10 keepalives=1 keepalives_idle=2 keepalives_interval=2 keepalives_count=3 tcp_user_timeout=9000
[Mon Jan 19 10:15:16 CST 2026] [INFO] drop replication slot:repmgr_slot_3...
 pg_drop_replication_slot
--------------------------

(1 row)

[Mon Jan 19 10:15:17 CST 2026] [INFO] drop replication slot:repmgr_slot_3...OK
[Mon Jan 19 10:15:17 CST 2026] [INFO] modify synchronous parameter configuration...
[Mon Jan 19 10:15:17 CST 2026] [INFO] modify synchronous parameter configuration...ok
 ID | Name  | Role    | Status    | Upstream | Location | Priority | Timeline | LSN_Lag | Connection string
----+-------+---------+-----------+----------+----------+----------+----------+---------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 1  | node1 | primary | * running |          | default  | 100      | 1        |         | host=192.168.40.107 user=esrep dbname=esrep port=54321 connect_timeout=10 keepalives=1 keepalives_idle=2 keepalives_interval=2 keepalives_count=3 tcp_user_timeout=9000
 2  | node2 | standby |   running | node1    | default  | 100      | 1        | 0 bytes | host=192.168.40.160 user=esrep dbname=esrep port=54321 connect_timeout=10 keepalives=1 keepalives_idle=2 keepalives_interval=2 keepalives_count=3 tcp_user_timeout=9000
[kingbase@node3 bin]$

问题处理

repmgr: No such file or directory

问题描述:备节点集群收缩提示如下报错 repmgr: No such file or directory

复制代码
[kingbase@node3 bin]$ ./cluster_install.sh shrink
[CONFIG_CHECK] will deploy the cluster of
[RUNNING] success connect to the target "192.168.40.161" ..... OK
[RUNNING] success connect to "192.168.40.161" from current node by 'ssh' ..... OK
[RUNNING] success connect to the target "192.168.40.107" ..... OK
[RUNNING] success connect to "192.168.40.107" from current node by 'ssh' ..... OK
[RUNNING] Primary node ip is 192.168.40.107 ...
bash: /home/kingbase/cluster/install/kingbase/kingbase/bin/repmgr: No such file or directory
[RUNNING] Primary node ip is not 192.168.40.107, check fail!
[kingbase@node3 bin]$ ls -l /home/kingbase/cluster/install/kingbase/kingbase/bin/repmgr
ls: cannot access /home/kingbase/cluster/install/kingbase/kingbase/bin/repmgr: No such file or directory

问题原因:install.conf中[shrink]标签中install_dir配置错误

install_dir="/home/kingbase/cluster/install/kingbase"

注意:install_dir为安装目录/kingbase/bin中的安装目录值,不要写成$安装目录/kingbase

解决办法:更改install_dir="/home/kingbase/cluster/install" 再次集群缩容成功

FATAL: password authentication failed for user "system"

问题描述:集群缩容提示如下报错: FATAL: password authentication failed for user "system"

复制代码
[kingbase@node3 bin]$ ./cluster_install.sh shrink
[CONFIG_CHECK] will deploy the cluster of
[RUNNING] success connect to the target "192.168.40.161" ..... OK
[RUNNING] success connect to "192.168.40.161" from current node by 'ssh' ..... OK
[RUNNING] success connect to the target "192.168.40.107" ..... OK
[RUNNING] success connect to "192.168.40.107" from current node by 'ssh' ..... OK
[RUNNING] Primary node ip is 192.168.40.107 ...
[RUNNING] Primary node ip is 192.168.40.107 ... OK
[CONFIG_CHECK] set install_with_root=1
[RUNNING] success connect to "" from current node by 'ssh' ..... OK
[RUNNING] success connect to the target "192.168.40.107" ..... OK
[RUNNING] success connect to "192.168.40.107" from current node by 'ssh' ..... OK
[INSTALL] load config from cluster.....
 [INFO] db_user=system
 [INFO] db_port=54321
 [INFO] use_scmd=1
 [INFO] auto_cluster_recovery_level=1
 [INFO] synchronous=quorum
[INSTALL] load config from cluster.....OK
[CONFIG_CHECK] check database connection ...
ksql: error: could not connect to server: FATAL:  password authentication failed for user "system"
[ERROR] param [primary_ip:192.168.40.107 db_name:esrep db_user:system db_password:****** db_port:54321] is error, please check these params

分析过程:sh -x /cluster_install.sh shrink输出error中显示密码为初始密码12345678ab,而正确密码是kingbase

解决办法:更改install.conf中[install]标签中数据库信息,如下:

复制代码
[install]
db_user="system"          
db_password="kingbase"       
db_port="54321"
ERROR]param [primary-ip :192,168,40,107 db_name:esrep dbo_user:esrep db port;s4321] is error, Please check these params

说明:该报错属于另一个测试场景中的

问题描述:在自定义端口的集群结构中收缩节点提示报错:ERROR]param [primary-ip :192,168,40,107 db_name:esrep dbo_user:esrep db port;s4321] is error, Please check these params

分析过程:/home/kingbase/cluster/install/kingbase/etc/all_nodes_tools.conf 中 db_port=54321

解决办法:更改/home/kingbase/cluster/install/kingbase/etc/all_nodes_tools.conf 中 db_port=54524

缩容后检查集群状态

缩容成功后,登录主库所在节点,进入集群安装目录的子目录/bin,执行命令"repmgr service status",确认是否真正成功缩容集群,建议使用repmgr cluster show 查看集群状态,可以看到ip地址、端口等信息。

复制代码
[kingbase@node2 bin]$ repmgr service status
 ID | Name  | Role    | Status    | Upstream | repmgrd | PID  | Paused? | Upstream last seen
----+-------+---------+-----------+----------+---------+------+---------+--------------------
 1  | node1 | primary | * running |          | running | 6139 | no      | n/a
 2  | node2 | standby |   running | node1    | running | 4118 | no      | 1 second(s) ago

停止备份

find / -name sys_rman.conf

在对应的备份服务器上删除备份的定时任务,删除备份文件

停止监控

现场未使用KEMCC,采用客户自研的监控平台,通过在数据库服务节点上部署探针服务实现监控。

  1. 数据库服务节点上停止探针服务

  2. 监控平台删除监控任务

    ps -ef | grep 'kingbase_exporter'

    kill -9 pid

补充:简要步骤

复制代码
需求:集群节点为node1、node2、node3,待缩容节点为node3,各节点IP分别为192.168.40.107、192.168.40.160、192.168.40.161。

--1. 回收授权  注意:授权是否用的是LAC?如果是LAC下发授权,要在LAC上做回收
LAC授权由金仓人员在LAC上对授权进行回收。

--2. 要缩容节点操作:缩容前检查现有集群状态  
repmgr service status

--3. 要缩容节点操作:配置install.conf文件    install_dir为$安装目录/kingbase/bin中的$安装目录值,不要写成$安装目录/kingbase
     密码和端口如果不是默认的12345678ab和54321需要更改db_password和db_port参数不然报错

cd /home/kingbase/cluster/install/kingbase/bin

[install]
db_user="system"          
db_password="kingbase"       
db_port="54524"

[shrink]
shrink_type="0"
primary_ip="192.168.40.107"
shrink_ip="192.168.40.161"
node_id="3"
install_dir="/home/kingbase/cluster/install"
ssh_port="22"
scmd_port="8890"

--4. 要缩容节点操作:缩容

cd /home/kingbase/cluster/install/kingbase/bin
./cluster_install.sh shrink

--5. 其他节点操作:缩容后检查现有集群状态
repmgr service status


--6. 停止备份  若现场没可忽略
find / -name sys_rman.conf
在对应的备份服务器上删除备份的定时任务,删除备份文件

--7. 停止监控  若现场没可忽略

现场未使用KEMCC,采用客户自研的监控平台,通过在数据库服务节点上部署探针服务实现监控。
1. 数据库服务节点上停止探针服务
2. 监控平台删除监控任务

ps -ef | grep 'kingbase_exporter'

kill -9 pid

扩展

缩容简介

KingbaseES提供数据库扩缩容工具进行数据库集群的在线扩缩容。对于不支持GUI的服务器,KingbaseES提供基于命令行操作的集群扩缩容方式,本文档主要用于指导不支持GUI的服务器上的KingbaseES版本集群扩缩容工作。

通用机集群扩缩容约束

免密配置约束

1、 目前在通用机上支持两种扩缩容方式 :第一种是通过sshd服务自动分发文件并扩缩容 ;第二种是手动分发文件,启动sys_securecmdd工具并进行扩缩容。

2、第一种扩缩容方式,需要配置节点间ssh免密,第二种扩缩容方式需要节点间sys_securecmdd工具秘钥协商。两种方式都有如下免密登陆要求:如果依赖root进行部署,则所有即将扩缩容集群的设备之间,root用户和root用户、root用户和普通用户、普通用户和普通用户免密登陆,同一主机的root用户和root用户、root用户和普通用户免密登陆。如果不依赖root进行部署,则需要所有即将扩缩容集群的设备之间,普通用户和普通用户免密登陆。

3、sys_securecmdd工具秘钥协商在初始化、启动过程中自动完成;配置ssh免密时,请用root用户(依赖root部署的场景)或集群部署用户(不依赖root部署的场景)执行脚本trust_cluster.sh。脚本会读取install.conf配置文件【install】标签下的内容,所以请先按要求配置install.conf文件。

注意:在使用脚本配置ssh免密时,由于脚本是交互式的,在执行过程中需要用户输入必要信息。

操作系统配置约束

1、建议关闭防火墙,如果用户确认无法关闭防火墙,那么在防火墙添加数据库白名单,不同系统命令不同,数据库端口默认54321,HA-LOG分析工具默认端口65432,sys_securecmdd工具默认端口8890,请根据实际配置调整。

2、 其他操作系统配置约束请参考 系统参数章节进行配置。

文件及文件名约束

1、集群扩缩容所需要的所有文件需要已存在设备上,且install.conf文件、cluster_install.sh、trust_cluster.sh都需要在同一设备的同一目录下,需安装数据库后获取对应文件。

以下是集群扩缩容所需要的所有文件:

(仅扩容需要)用户可选准备正式版license.dat授权文件

(仅扩容需要)从 安装目录/ClientTools/guitools/DeployTools/zip/下获取:

    • 服务器压缩包db.zip
    • 一键部署脚本 cluster_install.sh
    • 配置文件install.conf
    • 配置SSH免密脚本 trust_cluster.sh

(仅扩容需要)在不依赖root扩容的场景中,需要额外从安装目录获取root_env_init.sh、root_env_check.sh、arping三个文件,并放在目标设备同一目录下。

注意 : 这里的db.zip也可以换成用户自行压缩的其他形式的压缩包,在"安装目录/Server/"下将bin、lib、share三个目录做成压缩包,支持zip、tar、tar.gz三种格式的压缩包;压缩包解压后的目录应该和db.zip保持一致

2、扩容时,若不配置license,默认使用试用版license进行部署。如果配置正式版license,此处支持配置1个license,若集群设备上的license不能复用于多个设备且需要多次扩容,每次扩容则请在license_file参数填入不同正式版license的文件名,如果license文件可以复用,则可以使用同样license。需要注意的是,如果集群license不可复用,所有节点扩容使用相同license,那么在扩容过程中可能因为license问题无法启动数据库而扩容失败,同理,net_device的配置也仅支持配置一个。

3、集群设置virtual_ip时,必须保证其子网掩码长度与网卡net_device的子网掩码长度一致;网卡net_device上必须已有IP,此IP需要配置在net_device_ip中。

4、扩容节点不支持用户配置数据库data目录的路径,data目录自动从已有集群获取。

扩缩容执行约束

1、执行脚本的操作扩容时只能在需要扩容的机器上执行,缩容时只能在集群主机上或者集群需要缩容的机器上执行,通用机需用普通用户执行脚本。

2、配置文件中所有要求写路径的参数都必须是绝对路径,不支持相对路径。

3、扩容时license_file参数只需写license文件名即可,无需写路径

4、脚本支持使用非22端口进行ssh连接,如果想要修改ssh连接端口,除了更改配置文件install.conf之 外,还需修改系统**/etc/ssh/sshd_config文件中的Port项** ,然后重启sshd服务才能正常扩缩容集群。修改系统文件以及重启sshd服务均需要使用root用户执行。

5、脚本支持使用非8890端口进行scmd连接,如果想要修改scmd连接端口,除了更改配置文件install.conf之外还需修改系统install_dir/share目录sys_HAscmdd.conf文件中的scmd_port项,然后使用install_dir/bin/sys_HAscmdd.sh stop命令停止已有securecmdd服务,再使用命令install_dir/bin/sys_HAscmdd.sh init/start初始化和启动securecmdd 服务。执行用户需要与scmd此前的执行用户保持一致。

6、如果扩容前使用了single或single-pro模式的物理备份,请在扩容后对新增节点也进行备份,或者取消原有备份并对扩容后的整个集群进行备份。

扩缩容配置文件install.conf配置

提供install.conf配置文件用于配置集群扩缩容所需参数

扩容参数

|----------------|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 参数名称 | 默认值/建议值 | 备注 |
| expand_type | | 必须配置 ,说明需要扩容的数据库节点类型,0表示为 standby节点,1表示为witness节点。 |
| primary_ip | | 必须配置,说明需要扩容的集群的主节点IP,可以配置IPv4或IPv6地址。 |
| expand_ip | | 必须配置,说明需要扩容的节点的IP,可以配置IPv4或IPv6地址。 |
| node_id | | 必须配置 ,说明扩容加入集群后的节点的序号。 |
| sync_type | | 可选配置,若集群的synchronous 参数为custom,且expand_type配置为0时,本参数生效,且本参数必须配置。指定扩容节点的同步类型,0:同步节点, 1:同步候选节点,2:异步节点。 |
| install_dir | | 必须配置,说明扩容节点对应的安装目录路径,该路径在待扩容节点需是一个不存在的目录,且该安装目录需与原集群保持一致, 专用机不需要配置,字符串不能以 / 字符结尾 |
| zip_package | | 必须配置,说明压缩包的路径,专用机和手动分发压缩包不需要配置 |
| net_device | | 可选配置,若配置了[virtual_ip],则此参数必须配置值为VIP所在网卡的网卡名称,仅需配置单个。 |
| net_device_ip | | 可选配置,若配置了[virtual_ip],则此参数必须配置值为VIP所在网卡的物理IP地址,仅需配置单个。 因为[virtual_ip]只能配置为IPv4,此参数也必须配置为IPv4。 net_device_ip可以是VIP所在网卡的物理ip地址列表中的任何一个,默认为第一个,且不区分虚拟IP与物理IP。 |
| license_file | | 可选配置,说明 license文件的名字,仅需配置一个。不配置时,默认使用试用版license。 |
| deploy_by_sshd | 1 | 可选配置,扩容方式。通用机是否通过 sshd服务对集群扩容。值为1表示使用sshd 服务,值为0表示不使用sshd服务。在专用机上不能通过sshd服务扩容(值为0)。 |
| ssh_port | 22 | 可选配置,指定sshd/ssh连接端口,默认22。 |
| scmd_port | 8890 | 可选配置,指定sys_securecmdd/sy s_securecmd连接端口,默认为8890。 |

缩容参数

|-------------|---------|---------------------------------------------------------------|
| 参数名称 | 默认值/建议值 | 备注 |
| shrink_type | | 必须配置,说明需要缩容的数据库节点类型,0表示为standby节点,1表示为witness节点。 |
| primary_ip | | **必须配置,说明需要缩容的集群的主节点IP,**可以配置IPv4或IPv6地址。 |
| shrink_ip | | 必须配置,说明需要缩容的节点的IP,可以配置IPv4或IPv6地址。 |
| node_id | | 必须配置,说明需要缩容的节点在集群中的节点的序号。 |
| install_dir | | 必须配置,说明缩容节点对应的安装目录路径,该路径需是一个存在的目录,专用机不需要配置,字符串不能以 / 字符结尾。 |
| ssh_port | 22 | 可选配置,指定sshd/ssh连接端口,默认22。 |
| scmd_port | 8890 | 可选配置,指定sys_securecmdd /sys_securecmd连接端口,默认为8890。 |

参考链接:https://help.kingbase.com.cn/v8/highly/availability/cluster-use/cluster-use-6.html#id18

相关推荐
云泽8082 小时前
C++ 继承进阶:默认成员函数、多继承问题与继承组合选型
开发语言·c++
LXMXHJ2 小时前
项目之html+javaScript
java·vue
源代码•宸2 小时前
Golang原理剖析(defer、defer面试与分析)
开发语言·经验分享·后端·面试·golang·defer·开放编码
越甲八千2 小时前
FastAPI传参类型
开发语言·python·fastapi
毕设源码-赖学姐2 小时前
【开题答辩全过程】以 高校竞赛试题库管理平台为例,包含答辩的问题和答案
java
南山乐只2 小时前
Java并发原生工具:原子类 (Atomic Classes)
java·开发语言·后端
一颗青果2 小时前
C++下的atomic | atmoic_flag | 内存顺序
java·开发语言·c++
木叶子---2 小时前
pdf生成排查记录与解决方案
java·pdf
Sylvia-girl2 小时前
Java之异常
java·开发语言