猪圈Pigsty-PG私有RDS集群搭建教程

news2024/11/29 8:50:38

博客

https://songxwn.com/Pigsty-PG-RDS/

简介

Pigsty 是一个更好的本地自建且开源 RDS for PostgreSQL 替代,具有以下特点:

  • 开箱即用的 PostgreSQL 发行版,深度整合地理、时序、分布式、图、向量、分词、AI等 150 余个扩展插件!

  • 运行于裸操作系统之上,无需容器支持,支持主流操作系统: EL7/8/9 及其衍生发行版, Ubuntu 20.04/22.04 以及 Debian 11/12。(推荐使用Rocky Linux)

  • 基于现代的 Prometheus 与 Grafana 技术栈,提供令人惊艳,无可比拟的数据库观测能力:画廊 & 演示站点

  • 基于 patroni, haproxy, 与etcd,打造故障自愈的高可用架构:硬件故障自动切换,流量无缝衔接。

  • 基于 pgBackRest 与可选的 MinIO 集群提供开箱即用的 PITR 时间点恢复,为软件缺陷与人为删库兜底。

  • 基于 Ansible 提供声明式的 API 对复杂度进行抽象,以 Database-as-Code 的方式极大简化了日常运维管理操作。

  • Pigsty用途广泛,可用作完整应用运行时,开发演示数据/可视化应用,大量使用 PG 的软件可用 Docker 模板一键拉起。

  • 提供基于 Vagrant 的本地开发测试沙箱环境,与基于 Terraform 的云端自动部署方案,开发测试生产保持环境一致。

  • 部署并监控专用的 Redis(主从,哨兵,集群),MinIO,Etcd,Haproxy,MongoDB(FerretDB) 集群

官方文档:https://pigsty.cc/doc/#/zh/README

项目地址:https://github.com/Vonng/pigsty

本教程说明

一个非常简单的入门教程,用于构建一个三节点的PG集群(开启VIP),且支持扩展时序数据库timescaledb,主要用于Zabbix的后端数据库。

基于Pigsty 2.5.1 、Rocky Linux 9.3 编写。

安装

初始化元节点(管理监控节点)

准备一个全新的符合要求 的 Linux x86_64 ,使用带有root权限或有sudo权限的用户执行安装脚本。

(官方推荐使用Rocky Linux 8.8,配置建议2C4G 100G硬盘)

curl https://get.pigsty.cc/latest | bash

PS:安装后会移除系统自带yum源,建议提前安装所需软件。

该命令会下载并解压 Pigsty 源码至用户Home,按提示完成 准备,配置,安装三个步骤即可完成安装。

cd ~/pigsty     
 # 进入 Pigsty 源码目录,完成后续 准备、配置、安装 三个步骤
./bootstrap      
# 确保 Ansible 正常安装,如果存在 /tmp/pkg.tgz 离线软件包,便使用它。
./configure      
# 执行环境检测,并生成相应的推荐配置文件,如果你知道如何配置 Pigsty 可以跳过。
./install.yml    
# 根据生成的配置文件开始在当前节点上执行安装,使用离线安装包大概需要10分钟完成。
# 可以在里面修改默认信息pigsty.yml,如域名和默认密码等。

安装完成后,您可以通过域名或80/443端口通过 Nginx 访问 WEB 界面,通过 5432 端口访问元节点默认的 PostgreSQL 数据库服务。

IP地址规划

IP地址主机名角色
172.18.77.33pg-meta-1元节点
172.18.77.101pg-cu1-1PG集群主机节点
172.18.77.102pg-cu1-2PG集群主机节点
172.18.77.103pg-cu1-3PG集群主机节点
172.18.77.99vipKeepalived 虚拟IP

PS:Keepalived 集群需要在同一广播域。(其实就是基于VRRP协议)

DNS 解析配置

组件端口域名说明官方Demo地址
Nginx80h.pigstyWeb 服务总入口,本地YUM源home.pigsty.cc
AlertManager9093a.pigsty告警聚合/屏蔽页面a.pigsty.cc
Grafana3000g.pigstyGrafana 监控面板demo.pigsty.cc
Prometheus9090p.pigstyPrometheus 管理界面p.pigsty.cc

你需要修改hosts文件,增加以上解析。或者在内网dns配置上述解析。解析的IP为元节点IP即可

Pigsty 会自动给纳入管理的节点填写hosts文件。

172.18.77.33 h.pigsty a.pigsty p.pigsty g.pigsty # pigsty dns
#示例

访问Web 界面

主页域名为 h.pigsty ,g.pigsty 为Grafana ,全局应用默认账号密码为 admin/pigsty。

(如果自己电脑要用浏览器访问,注意配置DNS解析或hosts文件)

部署三节点PG高可用集群

编辑Pigsty 配置文件,增加主机节点信息

cd ~/pigsty  
# 进入pigsty 主目录,所有操作都在此目录执行。
vim pigsty.yml 
# 编辑配置文件,增加三台主节点和集群配置。
增加PG集群和VIP配置信息

1、集群名字为pg-cu1

2、配置172.18.77.101为默认主节点,其他为从节点。

3、开启keepalived配置,配置VIP地址为 172.18.22.99。配置每台关联VIP的网卡为ens33。(网卡名字注意修改)

4、此段配置在children 下增加,与默认的pg-meta同级别。

5、VRRP的id 为35,注意不要冲突。

    pg-cu1:
      hosts:
        172.18.77.101: { pg_seq: 1, pg_role: primary }
        172.18.77.102: { pg_seq: 2, pg_role: replica }
        172.18.77.103: { pg_seq: 3, pg_role: replica }
      vars: 
        pg_cluster: pg-cu1
        vip_enabled: true            # enable vip on this node cluster?
        vip_address: 172.18.77.99       # node vip address in ipv4 format, required if vip is enabled
        vip_vrid: 35        # required, integer, 1-254, should be unique among same VLAN
        vip_role: backup                  # optional, `master/backup`, backup by default, use as init role
        vip_preempt: true               # optional, `true/false`, false by default, enable vip preemption
        vip_interface: ens33              # node vip network interface to listen, `eth0` by default
        vip_dns_suffix: ''                # node vip dns name suffix, empty string by default
        vip_exporter_port: 9650           # keepalived exporter listen port, 9650 by default
增加PG数据库、用户、HBA配置。

1、增加zabbix、grafana 数据库,Zabbix 开启timescaledb扩展,并配置所属用户。并与pgbouncer同步创建。

2、增加zabbix、grafana 用户并配置密码、角色。并与pgbouncer同步创建。

3、配置用户的HBA规则,允许任意IP访问,并配置pgbouncer和HBA

4、pg_libs 配置PG加载的插件列表,这里加载了timescaledb插件。

    pg-cu1:
      hosts:
        172.18.77.101: { pg_seq: 1, pg_role: primary } 
        172.18.77.102: { pg_seq: 2, pg_role: replica } 
        172.18.77.103: { pg_seq: 3, pg_role: replica } 
      vars: 
        pg_cluster: pg-cu1
        pg_databases:
          - name: zabbix                    # 必选,`name` 是数据库定义的唯一必选字段
            pgbouncer: true                 # 可选,是否将此数据库添加到 pgbouncer 数据库列表?默认为 true
            extensions:                     # 可选,要安装的附加扩展: 扩展对象的数组
              - { name: timescaledb }       # 例如有的扩展会创建并使用固定的模式,就不需要指定模式。
            owner: zabbix                   # 可选,数据库所有者,默认为 postgres
          - name: grafana                   # 必选,`name` 是数据库定义的唯一必选字段
            pgbouncer: true                 # 可选,是否将此数据库添加到 pgbouncer 数据库列表?默认为 true
            owner: grafana                  # 可选,数据库所有者,默认为 postgres
        pg_users:    
          - name: zabbix                    # 数据库用户名,必需,`name` 是用户定义的唯一必选字段
            password: Passwd.zabbix         # 可选,密码,可以是 scram-sha-256 哈希字符串或明文
            pgbouncer: true                 # 可选,默认为 false,将此用户添加到 pgbouncer 用户列表
            roles: [dbrole_admin]
            comment: Zabbix                 # 可选,此用户/角色的说明与备注字符串
          - name: grafana                   # 数据库用户名,必需,`name` 是用户定义的唯一必选字段
            password: 
            pgbouncer: true                 # 可选,默认为 false,将此用户添加到 pgbouncer 用户列表
            roles: [dbrole_admin]
            comment: grafana                # 可选,此用户/角色的说明与备注字符串
        pg_hba_rules:
          - { user: 'zabbix'  ,db: all ,addr: 0.0.0.0/0    ,auth: pwd ,title: 'zabbix用户不限制登录'}
          - { user: 'grafana' ,db: all ,addr: 0.0.0.0/0    ,auth: pwd ,title: 'grafana用户不限制登录'}
        pgb_hba_rules: 
          - { user: 'zabbix'  ,db: all  ,addr: 0.0.0.0/0   ,auth: pwd ,title: 'zabbix用户不限制登录'}
          - { user: 'grafana' ,db: all  ,addr: 0.0.0.0/0   ,auth: pwd ,title: 'grafana用户不限制登录'}
        pg_libs: 'timescaledb, pg_stat_statements, auto_explain' # 加载时序数据库插件
        vip_enabled: true            # enable vip on this node cluster?
        vip_address: 172.18.77.99       # node vip address in ipv4 format, required if vip is enabled
        vip_vrid: 35        # required, integer, 1-254, should be unique among same VLAN
        vip_role: backup                  # optional, `master/backup`, backup by default, use as init role
        vip_preempt: true               # optional, `true/false`, false by default, enable vip preemption
        vip_interface: ens33              # node vip network interface to listen, `eth0` by default
        vip_dns_suffix: ''                # node vip dns name suffix, empty string by default
        vip_exporter_port: 9650           # keepalived exporter listen port, 9650 by default
全部配置展示(仅参考) 用于Zabbix服务器的时序数据库

1、注意全局密码已经修改为PG-PWD-01

all:
  children:
    # infra cluster for proxy, monitor, alert, etc..
    infra: { hosts: { 172.18.77.33: { infra_seq: 1 } } }
    # etcd cluster for ha postgres
    etcd: { hosts: { 172.18.77.33: { etcd_seq: 1 } }, vars: { etcd_cluster: etcd } }
    # minio cluster, optional backup repo for pgbackrest
    #minio: { hosts: { 172.18.77.33: { minio_seq: 1 } }, vars: { minio_cluster: minio } }
    # postgres cluster 'pg-meta' with single primary instance
    pg-meta:
      hosts: { 172.18.77.33: { pg_seq: 1, pg_role: primary } }
      vars:
        pg_cluster: pg-meta
        pg_databases: [ { name: meta ,baseline: cmdb.sql ,comment: pigsty meta database ,schemas: [ pigsty ] ,extensions: [{name: postgis, schema: public}] }]
        pg_users:
          - { name: dbuser_meta ,password: DBUser.Meta   ,pgbouncer: true ,roles: [ dbrole_admin ]    ,comment: pigsty admin user }
          - { name: dbuser_view ,password: DBUser.Viewer ,pgbouncer: true ,roles: [ dbrole_readonly ] ,comment: read-only viewer for meta database }
        pg_libs: 'pg_stat_statements, auto_explain' # add extra extensions to shared_preload_libraries
        node_crontab: [ '00 03 * * * postgres /pg/bin/pg-backup full' ] # make a full backup every 1am
    bj-zjy-pg-cu1:
      hosts:
        172.18.77.101: { pg_seq: 1, pg_role: primary } 
        172.18.77.102: { pg_seq: 2, pg_role: replica } 
        172.18.77.103: { pg_seq: 3, pg_role: replica } 
      vars: 
        pg_cluster: pg-cu1
        pg_databases:
          - name: zabbix                    # 必选,`name` 是数据库定义的唯一必选字段
            pgbouncer: true                 # 可选,是否将此数据库添加到 pgbouncer 数据库列表?默认为 true
            extensions:                     # 可选,要安装的附加扩展: 扩展对象的数组
              - { name: timescaledb }       # 例如有的扩展会创建并使用固定的模式,就不需要指定模式。
            owner: zabbix                   # 可选,数据库所有者,默认为 postgres
          - name: grafana                   # 必选,`name` 是数据库定义的唯一必选字段
            pgbouncer: true                 # 可选,是否将此数据库添加到 pgbouncer 数据库列表?默认为 true
            owner: grafana                  # 可选,数据库所有者,默认为 postgres
        pg_users:    
          - name: zabbix                    # 数据库用户名,必需,`name` 是用户定义的唯一必选字段
            password: Passwd.Zabbix  # 可选,密码,可以是 scram-sha-256 哈希字符串或明文
            pgbouncer: true                 # 可选,默认为 false,将此用户添加到 pgbouncer 用户列表
            roles: [dbrole_admin]
            comment: Zabbix                 # 可选,此用户/角色的说明与备注字符串
          - name: grafana                    # 数据库用户名,必需,`name` 是用户定义的唯一必选字段
            password: Passwd.grafana  # 可选,密码,可以是 scram-sha-256 哈希字符串或明文
            pgbouncer: true                 # 可选,默认为 false,将此用户添加到 pgbouncer 用户列表
            roles: [dbrole_admin]
            comment: grafana                 # 可选,此用户/角色的说明与备注字符串
        pg_hba_rules:
          - { user: 'zabbix'  ,db: all ,addr: 0.0.0.0/0    ,auth: pwd ,title: 'zabbix用户不限制登录'}
          - { user: 'grafana' ,db: all ,addr: 0.0.0.0/0    ,auth: pwd ,title: 'grafana用户不限制登录'}
        pgb_hba_rules: 
          - { user: 'zabbix'  ,db: all  ,addr: 0.0.0.0/0   ,auth: pwd ,title: 'zabbix用户不限制登录'}
          - { user: 'grafana' ,db: all  ,addr: 0.0.0.0/0   ,auth: pwd ,title: 'grafana用户不限制登录'}
        pg_libs: 'timescaledb, pg_stat_statements, auto_explain' # 加载时序数据库插件        
        vip_enabled: true            # enable vip on this node cluster?
        vip_address: 172.18.77.99       # node vip address in ipv4 format, required if vip is enabled
        vip_vrid: 35                    # required, integer, 1-254, should be unique among same VLAN
        vip_role: backup                # optional, `master/backup`, backup by default, use as init role
        vip_preempt: true               # optional, `true/false`, false by default, enable vip preemption
        vip_interface: ens33              # node vip network interface to listen, `eth0` by default
        vip_dns_suffix: ''                # node vip dns name suffix, empty string by default
        vip_exporter_port: 9650           # keepalived exporter listen port, 9650 by default
  vars:                               # global parameters
    version: v2.5.1                   # pigsty version string
    admin_ip: 172.18.77.33            # admin node ip address
    region: china                     # upstream mirror region: default,china,europe
    infra_portal:                     # domain names and upstream servers
      home         : { domain: h.pigsty }
      grafana      : { domain: g.pigsty ,endpoint: "${admin_ip}:3000" , websocket: true }
      prometheus   : { domain: p.pigsty ,endpoint: "${admin_ip}:9090" }
      alertmanager : { domain: a.pigsty ,endpoint: "${admin_ip}:9093" }
      blackbox     : { endpoint: "${admin_ip}:9115" }
      loki         : { endpoint: "${admin_ip}:3100" }
      #minio        : { domain: sss.pigsty  ,endpoint: "${admin_ip}:9001" ,scheme: https ,websocket: true }
    # if you want to use minio as backup repo instead of local fs, uncomment minio related lines
    # don't forget to configure pgbackrest_repo and change credentials there!
    #pgbackrest_method: minio
    # if disabled, original /etc/yum.repos.d will be kept
    repo_remove: true       # remove existing repo on admin node during repo bootstrap
    node_repo_remove: true  # remove existing node repo for node managed by pigsty
    # WARNING: CHANGE THESE PASSWORDS
    #grafana_admin_username: admin
    grafana_admin_password: PG-PWD-01
    #pg_admin_username: dbuser_dba
    pg_admin_password: PG-PWD-01
    #pg_monitor_username: dbuser_monitor
    pg_monitor_password: PG-PWD-01
    #pg_replication_username: replicator
    pg_replication_password: PG-PWD-01
    #patroni_username: postgres
    patroni_password: PG-PWD-01
    #haproxy_admin_username: admin
    haproxy_admin_password: PG-PWD-01
    # this config template assume you are using pre-packed offline packages
    # If you wish to download upstream yum packages directly from internet,
    # consider using ad hoc `el7.yml`, `el8.yml`, `el9.yml` config instead.
...

配置元节点密钥免密登录主机节点

Pigsty 会在元节点自动生成一对公私钥,将其拷贝到所有主机节点。

ssh-copy-id 172.18.77.101
# 执行后输入yes,然后再手动输入主机节点的登录密码即可。
ssh 172.18.77.101
# 确认可直接登录即可,所有主机节点都要操作。

将集群节点纳入Pigsty 管理并部署PG集群

节点纳入管理
bin/node-add   pg-cu1    
 # 将集群 pg-test1 的3个主机节点纳入 Pigsty 管理
PG集群初始化部署(注意:会根据CPU内存等配置自动优化PG参数,建议提前固定好虚拟机配置)
bin/pgsql-add  pg-cu1      # 初始化一个3节点的 pg-cu1 可用PG集群
# 执行后不到10分钟,就将拥有一个服务接入,监控,备份PITR,高可用配置齐全的 PostgreSQL 数据库集群。

PG集群架构图

PG-HA示例图

硬件故障由 patroni、etcd 和 Haproxy 提供的自愈高可用架构来兜底,在主库故障的情况下,默认会在 30 秒内执行自动故障转移(Failover)。 客户端无需修改配置重启应用:Haproxy 利用 patroni 健康检查进行流量分发,读写请求会自动分发到新的集群主库中,并避免脑裂的问题。 这一过程十分丝滑,例如在从库故障,或主动切换(switchover)的情况下,客户端只有一瞬间的有感知查询闪断。

软件故障、人为错误和 数据中心级灾难由 pgbackrest 和可选的 MinIO 集群来兜底。这为您提供了本地/云端的 PITR 能力,并在数据中心爆炸的情况下提供了跨地理区域复制,与异地容灾功能。

管理和使用

默认用户

Pigsty 也有四个默认用户(系统用户):

  • 超级用户 (postgres),集群的所有者和创建者,与操作系统 dbsu 名称相同。

  • 复制用户 (replicator),用于主-从复制的系统用户。

  • 监控用户 (dbuser_monitor),用于监控数据库和连接池指标的用户。

  • 管理用户 (dbuser_dba),执行日常操作和数据库更改的管理员用户。

这4个默认用户的用户名/密码通过4对专用参数进行定义,并在很多地方引用:

  • pg_dbsu:操作系统 dbsu 名称,默认为 postgres,最好不要更改它

  • pg_dbsu_password:dbsu 密码,默认为空字符串意味着不设置 dbsu 密码,最好不要设置。

  • pg_replication_username:postgres 复制用户名,默认为 replicator

  • pg_replication_password:postgres 复制密码,默认为 DBUser.Replicator

  • pg_admin_username:postgres 管理员用户名,默认为 dbuser_dba

  • pg_admin_password:postgres 管理员密码的明文,默认为 DBUser.DBA

  • pg_monitor_username:postgres 监控用户名,默认为 dbuser_monitor

  • pg_monitor_password:postgres 监控密码,默认为 DBUser.Monitor

在生产部署中记得更改这些密码,不要使用默认值!
在部署前,可以在pigsty.yml 里面修改。

配置用户

bin/pgsql-user <cls> <username>    # pgsql-user.yml -l <cls> -e username=<username>

配置HBA

bin/pgsql-hba <cls>                 # 重新加载指定集群 `<cls>` 的 hba 规则
bin/pgsql-hba <cls> ip1 ip2...      # 重新加载特定实例的 hba 规则

创建数据库

bin/pgsql-db <cls> <dbname>    # pgsql-db.yml -l <cls> -e dbname=<dbname>

数据库集群访问端口说明

组件端口描述状态备注
Postgres5432Pigsty CMDB默认启用
Pgbouncer6432Pgbouncer 连接池服务默认启用
Patroni8008Patroni 高可用组件默认启用
Haproxy Primary5433主连接池:读/写服务默认启用
Haproxy Replica5434副本连接池:只读服务默认启用
Haproxy Default5436主直连服务*默认启用
Haproxy Offline5438离线直连:离线读服务默认启用
Haproxy service543xPostgreSQL 定制服务按需定制
Haproxy Admin9101监控指标和流量管理默认启用
PG Exporter9630PG 监控指标导出器默认启用
PGBouncer Exporter9631PGBouncer 监控指标导出器默认启用
Node Exporter9100节点监控指标导出器默认启用
Promtail9080收集数据库组件与主机日志默认启用
vip-manager-将 VIP 绑定到主节点按需启用
Docker Daemon9323Docker 守护进程按需启用
keepalived-为整个集群绑定 L2 VIP按需启用
Keepalived Exporter9650Keepalived 指标导出器按需启用

PS:个人推荐使用 5436端口,并通过VIP地址访问数据库集群。(绕过pgbouncer)

使用pgbouncer 则可以使用5433端口,并通过VIP地址访问集群

默认管理员账号为dbuser_dba。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1455776.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenAI Sora —— 文生视频为何如此逼真?AI算法架构解析

OpenAI于2024年2月16日发布了名为Sora的文生视频模型。Sora是一个革命性的视频生成模型&#xff0c;可以根据用户输入的简单文本脚本自动生成与好莱坞级别画面相媲美的视频内容&#xff0c;其生成的视频不仅仅是对已有素材的拼接或剪辑合成&#xff0c;而是从像素级别全新“绘制…

【Jvm】性能调优(上)线上问题排查工具汇总

文章目录 一.互联网概念1.产品闭环和业务闭环2.软件设计中的上游和下游3.JDK运行时常量池 二.CPU相关概念1.查询CPU信息2.CPU利用率&#xff08;CPU utilization&#xff09;和 CPU负载&#xff08;CPU load&#xff09;2.1.如何理解CPU负载2.2.top命令查看CPU负载均值2.3.CPU负…

动态头部:统一目标检测头部与注意力

论文地址:https://arxiv.org/pdf/2106.08322.pdf ai阅读论文_论文速读_论文阅读软件-网易有道速读 创新点是什么? 这篇文档的创新点是提出了一种统一的方法&#xff0c;将对象检测头和注意力机制结合起来。作者在文中提出了一种称为Dynamic Head的方法&#xff0c;通过引入…

Android 15 第一个开发者预览版

点击查看&#xff1a;first-developer-preview-android15 点击查看&#xff1a;Get Android 15 2024年2月16日,谷歌发布 Android 15 第一个开发者预览版 翻译 由工程副总裁戴夫伯克发布 今天&#xff0c;我们发布了Android 15的首个开发者预览版&#xff0c;这样我们的开发者就…

[技术杂谈]Chat With RTX 介绍

英伟达&#xff08;Nvidia&#xff09;已于近日发布了名为“Chat with RTX”的Demo版个性化AI聊天机器人&#xff0c;并在其海外官网渠道中提供了下载链接。 据了解&#xff0c;这是一款适用于Windows平台的聊天机器人&#xff0c;由TensorRT-LLM提供支持&#xff0c;完全在本地…

机器人革命:从斯坦福的通用操作接口到OpenAI的Sora,塑造未来的合成学习

引言 在机器人成为平凡工匠和前沿先驱的时代&#xff0c;我们正站在新黎明的边缘。本文将探讨斯坦福大学的通用操作接口&#xff08;UMI&#xff09;及其与OpenAI的Sora如何共同推进机器人技术&#xff0c;开创未来学习的新纪元。 正文 斯坦福的通用操作接口&#xff08;UMI…

电脑文件大爆炸,快用知识管理 | 咨询案例

在刚刚过去的春节假期&#xff0c;意料之外地完成了一次关于个人知识管理实践的咨询。为此&#xff0c;要特别感谢李博和双红老师的引介&#xff0c;使我有机会在帮助他人实践落地个人知识管理系统的同时&#xff0c;丰富了自己的经验积累和案例库。话不多说&#xff0c;来做个…

MySQL-锁(LOCK)

文章目录 1. 锁是什么&#xff1f;2. 全局锁2.1 相关语法2.2 特点 3. 表级锁3.1 表锁3.1.1 共享读锁&#xff08;S&#xff09;3.1.2 排它写锁&#xff08;X&#xff09; 3.2 元数据锁&#xff08;MDL&#xff09;3.2 意向锁&#xff08;IS、IX&#xff09; 4. 行级锁4.1 行锁 …

『随处指挥』:用这款APP,世界听你的!

在这个科技日新月异的时代&#xff0c;我们的生活被各种手机软件所包围。几乎每个人都有一个甚至多个手机&#xff0c;你是否也有遇到过需要远程操作自己某一台手机的场景呢&#xff1f;今天&#xff0c;我要向大家推荐一款神奇的手机远程操作神器&#xff0c;让你可以随时随地…

VTK使用指南:介绍

1、什么是可视化&#xff1f; 术语 不同的术语用于描述可视化。科学可视化是计算机科学领域的正式名称&#xff0c;包括用户界面、数据表示和处理算法、视觉表示和其他感官表示&#xff0c;如声音或触摸。术语数据可视化是用于描述可视化的另一个短语。数据可视化通常被解释为…

Apache Apisix网关系统历史漏洞复现分析

文章目录 前言CVE-2020-13945默认api令牌CVE-2021-45232未授权接口2.1 默认账户密码导致RCE2.2 未授权访问api接口RCE CVE-2022-24112 地址限制绕过CVE-2022-29266 JWT令牌伪造4.1 漏洞源码简析与修复4.2 漏洞环境搭建与复现 总结 前言 Apache APISIX 是一个动态、实时、高性能…

探索Linux系统中HTTP隧道技术的原理与实践

在Linux的世界里&#xff0c;HTTP隧道技术就像是一个神秘的魔法师&#xff0c;它能让你的网络请求穿越重重障碍&#xff0c;安全地到达目的地。今天&#xff0c;我们就来一起探索这个魔法师的奥秘&#xff0c;看看它是如何在Linux系统中施展魔法的。 首先&#xff0c;我们要明…

PFH特征描述符、对应关系可视化以及ICP配准

一、PFH特征描述符可视化 C #include <pcl/point_types.h> #include <pcl/point_cloud.h> #include <pcl/search/kdtree.h> #include <pcl/io/pcd_io.h> #include <pcl/features/normal_3d_omp.h>//使用OMP需要添加的头文件 #include <boos…

PyCharm - Project Interpreter (项目解释器)

PyCharm - Project Interpreter [项目解释器] References File -> Settings… -> Project: -> Project Interpreter References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

深入探讨Lambda表达式转换为委托类型的编译过程

了解了&#xff0c;如果要深入探讨Lambda表达式转换为委托类型的编译过程&#xff0c;我们需要关注C#编译器如何处理这个转换。这个过程涉及到编译时的类型推断、匿名方法的创建&#xff0c;以及生成对应的委托实例。我们来更详细地分析这个过程&#xff1a; 编译阶段 1. 解…

21. Merge Two Sorted Lists(合并两个有序链表)

问题描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 问题分析 我们只需要使用两个指针分别从两个链表的头部向后遍历整个链表&#xff0c;每一个次都让量个元素比较大小&#xff0c;小的元素并入的新的链表&#xf…

MySQL(1/3)

基本命令行操作 命令行连接 mysql -uroot -p 回车&#xff0c;然后在下一行输入密码&#xff0c;或者直接在p后写密码 修改密码 updata mysql.user set authentication_stringpassword(原密码) where userroot and Host localhost; 刷新权限 flush privileges; 查看所有数据库…

数据库索引面试的相关问题

查看索引的执行计划 索引失效的情况 1、索引列上做了计算&#xff0c;函数&#xff0c;类型转换等操作。索引失效是因为查询过程需要扫描整个索引并回表。代价高于直接全表扫描。 Like匹配使用了前缀匹配符“%abc” 字符串不加引号导致类型转换。 原因&#xff1a; 常见索…

03 SS之返回JSON+UserDetail接口+基于数据库实现RBAC

1. 返回JSON 为什么要返回JSON 前后端分离成为企业应用开发中的主流&#xff0c;前后端分离通过json进行交互&#xff0c;登录成功和失败后不用页面跳转&#xff0c;而是给前端返回一段JSON提示, 前端根据JSON提示构建页面. 需求: 对于登录的各种状态 , 给前端返回JSON数据 …

面向对象编程(三)

目录 1. 关键字&#xff1a;static 1.1 类属性、类方法的设计思想 1.2 static关键字 1.3 静态变量 1.3.1 语法格式 1.3.2 静态变量的特点 1.3.3 举例 1.3.4 内存解析 1.4 静态方法 1.4.1 语法格式 1.4.2 静态方法的特点 1.4.3 举例 2. 单例(Singleton)设计模式 2…