HAProxy系列文章二《Patroni+ETCD+PG14+HAProxy的安装部署》

瀚高数据库
目录
文档用途
详细信息

文档用途
本文主要介绍Patroni架构下单点HAProxy的安装部署,通过单点HAProxy实现数据库的负载均衡。本文为HAProxy系列文章之一,其他相关文章请点击文档下方的相关文档链接进行详细查看,文章内不在赘述。

详细信息

一、环境信息

1、服务器信息

IP主机名安装组件操作系统CPU
192.168.164.111patroni1etcd+patroni+pgredhat7.6X86_64
192.168.164.112patroni2etcd+patroni+pgredhat7.6X86_64
192.168.164.113patroni3etcd+patroni+pgredhat7.6X86_64
192.168.164.114patroni4HAProxyredhat7.6X86_64

2、软件版本信息

Python: 3.4.17

etcd:3.5.7

patroni:2.4.1

pg版本:14.6

HAProxy: 2.6.9

3、防火墙端口信息

组件端口号用途
Etcd2379/2380客户端访问/服务监听端口
Patroni8008Restapi监听端口
PG5432数据库服务端口
HAProxy10001/6432/6433WEB服务端口/数据库对外服务端口

4、目录规划

组件路径用途
Etcd/opt/etcd/opt/etcd为etcd工作的主目录,路径内存放etcd配置文件
Etcd/opt/etcd/dataEtcd工作data目录
Patroni/opt/patroni存放patroni配置文件
Patroni/opt/patroni/patroni_log存放patroni运行日志
PG/opt/pg14.6数据库安装主目录
PG/opt/pg14.6/data数据库data目录
HAProxy/opt/haproxyHaproxy程序主目录,路径内存放haproxy配置文件
Python/usr/local/python3Python3主目录

5、整体安装步骤

①环境准备工作

②安装并启动etcd服务

③编译安装pg数据库

④安装Python3

⑤编译安装patroni,启动服务

⑥编译安装配置HAProxy,启动服务

注:所有安装包均上传至各节点的/opt目录下,后边不在赘述。

二、环境准备工作

以下内容如无特殊说明,需在数据库高可用三节点执行。

1、配置防火墙

本文通过停止防火墙服务的方式进行演示。

[root@patroni1 ~]# systemctl stop firewalld.service[root@patroni1 ~]# systemctl disable firewalld.service

2、停止Networkmanager.service

[root@patroni1 ~]# systemctl stop Networkmanager.service[root@patroni1 ~]# systemctl disable Networkmanager.service

3、时间同步

笔者使用的是虚拟机,故通过同时向四台虚拟机发送修改时间命令的方式实现时间同步

[root@patroni1 ~]# date -s'时间'

4、创建系统用户及组

只在数据库高可用相关节点执行以下命令

[root@patroni1 ~]# groupadd -g 10000 postgres[root@patroni1 ~]# useradd -g 10000 -u 10000 -m postgres

5、创建各类工作目录

只在数据库高可用相关节点执行以下命令

[root@patroni1 ~]# mkdir /opt/etcd[root@patroni1 ~]# mkdir /opt/patroni/patroni_log -p[root@patroni1 ~]# chown -R postgres:postgres /opt/patroni/

三、安装ETCD
以下内容如无特殊说明,需在数据库高可用三节点执行。

1、解压缩etcd,将解压后的etcd、etcdctl命令移动至/usr/bin目录下

[root@patroni1 ~]# cd /opt[root@patroni1 opt]# tar -zxvf etcd-v3.5.7-linux-amd64.tar.gz[root@patroni1 opt]# cd etcd-v3.5.7-linux-amd64/[root@patroni1 etcd-v3.5.7-linux-amd64]# cp etcd* /usr/bin/

2、编辑etcd配置文件

[root@patroni1 etcd-v3.5.7-linux-amd64]# vi /opt/etcd/etcd.yaml##写入以下内容,各节点需要根据实际信息填写debug: falsename: etcd01data-dir: /opt/etcd/datainitial-advertise-peer-urls: http://192.168.164.111:2380listen-peer-urls: http://192.168.164.111:2380advertise-client-urls: http://192.168.164.111:2379listen-client-urls: http://192.168.164.111:2379,http://127.0.0.1:2379initial-cluster-token: etcd-clusterinitial-cluster: etcd01=http://192.168.164.111:2380,etcd02=http://192.168.164.112:2380,etcd03=http://192.168.164.113:2380initial-cluster-state: newenable-v2: true

3、编辑etcd系统服务文件

[root@patroni1 opt]# vi /usr/lib/systemd/system/etcd.service##增加以下内容[Unit]Description=Etcd ServerAfter=network.targetAfter=network-online.targetWants=network-online.target[Service]Type=notifyUser=rootWorkingDirectory=/opt/etcd/# set GOMAXPROCS to number of processorsExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /usr/bin/etcd --config-file=/opt/etcd/etcd.yaml"Restart=on-failureLimitNOFILE=65536[Install]WantedBy=multi-user.target

4、三节点同时启动etcd服务

[root@patroni1 opt]# systemctl start etcd.service[root@patroni1 opt]# systemctl status etcd.service[root@patroni1 opt]# systemctl enable etcd.service

5、检查etcd集群工作状态

[root@patroni1 opt]# etcdctl endpoint health127.0.0.1:2379 is healthy: successfully committed proposal: took = 3.75515ms[root@patroni1 opt]#  ETCDCTL_API=2 etcdctl cluster-healthmember 5e1b8b610178ffb4 is healthy: got healthy result from http://192.168.164.111:2379member a9810de95208a71d is healthy: got healthy result from http://192.168.164.112:2379member ed63d339d4c7b8e4 is healthy: got healthy result from http://192.168.164.113:2379cluster is healthy[root@patroni1 opt]# etcdctl --endpoints=http://192.168.164.111:2379,http://192.168.164.112:2379,http://192.168.164.113:2379 endpoint status --write-out=table +-----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+|          ENDPOINT           |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |+-----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+| http://192.168.164.111:2379 | 5e1b8b610178ffb4 |   3.5.7 |   20 kB |     false |      false |         6 |     180077 |             180077 |        || http://192.168.164.112:2379 | a9810de95208a71d |   3.5.7 |   20 kB |     false |      false |         6 |     180077 |             180077 |        || http://192.168.164.113:2379 | ed63d339d4c7b8e4 |   3.5.7 |   20 kB |      true |      false |         6 |     180077 |             180077 |        |+-----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+

四、安装数据库

1、安装环境依赖

[root@patroni1 opt]# yum install gcc gcc-c++ flex bison zlib-devel libreadline* ncurses-devel readline-devel  gettext-devel openssl openssl-devel pam pam-devel libxml2 libxml2-devel libxslt libxslt-devel perl tcl-devel uuid-devel make python-devel libffi-devel sysemd-devel

2、解压缩并编译安装数据库,数据库安装完成后无需初始化

[root@patroni1 opt]# tar -zxvf postgresql-14.6.tar.gz[root@patroni1 opt]# cd /opt/postgresql-14.6/[root@patroni1 postgresql-14.6]#./configure --prefix=/opt/pg14.6  --with-tcl --with-tclconfig=/usr/lib64 --with-python --with-openssl --with-pam --without-ldap --with-libxml --with-libxslt --enable-thread-safety[root@patroni1 postgresql-14.6]# make && make install[root@patroni1 postgresql-14.6]# chown -R postgres:postgres /opt/pg14.6/

五、编译安装patroni

1、编译安装python3.7.13

[root@patroni1 opt]# tar -zxvf Python-3.7.13.tgz[root@patroni1 opt]# cd Python-3.7.13/[root@patroni1 Python-3.7.13]# ./configure --prefix=/usr/local/python3 --enable-shared[root@patroni1 Python-3.7.13]# make && make install

2、修改系统默认的python、python3、pip、pip3等路径

[root@patroni1 Python-3.7.13]# ln -sf /usr/local/python3/bin/python3.7 /usr/bin/python[root@patroni1 Python-3.7.13]# ln -sf /usr/local/python3/bin/pip3.7 /usr/bin/pip[root@patroni1 Python-3.7.13]# ln -sf /usr/local/python3/bin/python3 /usr/bin/python3[root@patroni1 Python-3.7.13]# ln -sf /usr/local/python3/bin/pip3 /usr/bin/pip3

3、修改YUM文件

由于redhat7版本yum命令为python2编写,修改系统默认python版本后需要修改对应的yum信息

[root@patroni1 Python-3.7.13]# sed -i "s:\<python\>:python2:g" /usr/bin/yum[root@patroni1 Python-3.7.13]# sed -i "s:\<python\>:python2:g" /usr/libexec/urlgrabber-ext-down

4、增加python3 lib库路径并生效

[root@patroni1 Python-3.7.13]# vi /etc/ld.so.conf##增加以下信息/usr/local/python3/lib[root@patroni1 Python-3.7.13]# ldconfig

5、安装patroni前输出pg及python相关的环境变量

[root@patroni1 opt]# export PGPORT=5432[root@patroni1 opt]# export PGHOME=/opt/pg14.6[root@patroni1 opt]# export PGDATA=/opt/pg14.6/data[root@patroni1 opt]# export PGUSER=postgres[root@patroni1 opt]# export PGDATABASE=postgres[root@patroni1 opt]# export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/local/python3/lib:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:${LD_LIBRARY_PATH}[root@patroni1 opt]# export PATH=$PGHOME/bin:$PATH[root@patroni1 opt]# export PKG_CONFIG_PATH=/usr/local/python3/lib/pkgconfig:$PKG_CONFIG_PATH[root@patroni1 opt]# export C_INCLUDE_PATH=/usr/local/python3/include/python3.7m:$C_INCLUDE_PATH[root@patroni1 opt]# export MANPATH=$PGHOME/share/man:$MANPATH

6、创建pip源配置文件

[root@patroni1 ~]# mkdir ~/.pip[root@patroni1 ~]# cat ~/.pip/pip.conf##配置信息如下[global]index-url = http://mirrors.aliyun.com/pypi/simple/[install]trusted-host = mirrors.aliyun.comYou have new mail in /var/spool/mail/root

7、在线安装patroni

##使用pip或者pip3均可以[root@patroni1 opt]# pip/pip3 install psycopg2[root@patroni1 opt]# pip/pip3 install psycopg2-binary[root@patroni1 opt]# pip/pip3 install patroni[etcd]==2.1.4

8、将patroni相关命令移动到数据库bin目录下并修改属主

[root@patroni1 opt]# cd /usr/local/python3/bin/[root@patroni1 bin# cp patroni* /opt/pg14.6/bin[root@patroni1 bin]# chown -R postgres:postgres /opt/pg14.6/bin

9、编辑patroni.yaml文件

[root@patroni1 opt]# su – postgres[postgres@patroni1 ~]$ vi /opt/patroni/patroni.yaml##配置信息如下:#节点名称,集群中每个节点间的名称不同name: test4#配置在存储(例如etcd)中的路径,默认值:service。同一集群各节点使用同样的配置namespace: postgres#集群名称scope: test#配置patroni的rest api信息restapi:connect_address: 192.168.164.114:8008#  connect_address: 192.168.164.112:8008#配置reset api的监听端口listen: 0.0.0.0:8008#配置etcd信息etcd:#配置etcd所有节点的访问IP及端口hosts: 192.168.164.111:2379,192.168.164.112:2379,192.168.164.113:2379#填写使用patroni初始化数据库配置信息bootstrap:#数据库初始信息initdb:- encoding: UTF8- locale: en_US.UTF-8- data-checksums- auth: md5dcs:ttl: 60loop_wait: 10retry_timeout: 10maximum_lag_on_failover: 1048576master_start_timeout: 300master_stop_timeout: 60synchronous_mode: truemax_timelines_history: 0check_timeline: truepostgresql:#设置是否使用复制槽,默认trueuse_slots: true#设置是否使用pg_rewind,默认falseuse_pg_rewind: true# PG初始化时使用的参数parameters:listen_addresses: '0.0.0.0'port: 5432max_connections: 200max_locks_per_transaction: 64wal_level: logicalwal_log_hints: 'on'track_commit_timestamp: onmax_wal_senders: 20max_replication_slots: 20wal_keep_size: 10240hot_standby: 'on'unix_socket_directories: '/tmp'archive_timeout: 1800s#下面是postgresql配置信息postgresql:database: postgresbin_dir: /opt/pg14.6/bindata_dir: /opt/pg14.6/dataconnect_address: 192.168.164.114:5432listen: 0.0.0.0:5432authentication:superuser:username: postgrespassword: postgresreplication:username: replicatorpassword: replicatorrewind:username: replicatorpassword: replicator#当前运行的数据库配置parameters:synchronous_standby_names: '*'shared_buffers: '512MB'work_mem: '8MB'checkpoint_timeout: '10min'checkpoint_completion_target: 0.9logging_collector: 'on'log_destination: csvloglog_filename: postgresql-%d-%H.loglog_rotation_age: 1hlog_rotation_size: 100MBlog_truncate_on_rotation: 'on'log_file_mode: '0640'log_autovacuum_min_duration: 0log_checkpoints: 'on'log_lock_waits: 'on'log_min_duration_statement: 1000log_replication_commands: onlog_statement: ddllog_temp_files: 0track_functions: allshared_preload_libraries: ' 'superuser_reserved_connections: 10huge_pages: 'try'pg_hba:- local   all             all                                  trust- host   all             all             127.0.0.1/32            trust- host   all             all             192.168.164.111/32            trust- host   all             all             192.168.164.112/32            trust- host   all             all             192.168.164.113/32            trust- host    all             all             0.0.0.0/0            md5- host    all             all             ::1/128                 md5- local   replication     all                                     md5- host        replication     replicator      192.168.164.0/24       trust- host    replication     all             0.0.0.0/0            md5- host    replication     all             ::1/128                 md5use_unix_socket: false#patroni日志配置信息log:#设置日志级别,默认INFO。日志级别有:NOTSET、DEBUG、INFO、WARNING、ERROR、CRITICAL,从左往右,日志量依次减少level: INFO#日志存放位置dir: /opt/patroni/patroni_log#日志存放数量file_num: 4#每个日志文件的大小,单位bytesfile_size: 2500000

10、编写patroni系统服务文件

[root@patroni1 ~]# vi /usr/lib/systemd/system/patroni.service##配置新如下[Unit]Description=patroniAfter=syslog.target network.target[Service]Type=simpleUser=postgresGroup=postgresEnvironment="PGHOME=/opt/pg14.6"Environment="PGDATA=/opt/pg14.6/data"Environment="PGPORT=5432"Environment="LD_LIBRARY_PATH=/opt/pg14.6/lib"Environment="PATH=/opt/pg14.6/bin"# Start the patroni processExecStart=/bin/bash -c "patroni /opt/patroni/patroni.yaml"# Send HUP to reload from patroni.ymlExecReload=/usr/bin/kill -s HUP $MAINPID# only kill the patroni process, not it's children, so it will gracefully stop postgresKillMode=process# Give a reasonable amount of time for the server to start up/shut downTimeoutSec=30# Do not restart the service if it crashes, we want to manually inspect database on failureRestart=yes[Install]WantedBy=multi-user.target

11、启动patorni服务并设置开机自启

[root@patroni1 ~]# systemctl daemon-reload[root@patroni1 ~]# systemctl start patroni.service[root@patroni1 ~]# systemctl status patroni.service[root@patroni1 ~]# systemctl enable patorni.service

12、集群工作状态检查

[postgres@patroni2 ~]$ patronictl -c /opt/patroni/patroni.yaml list+ Cluster: test -----------+--------------+---------+----+-----------+| Member | Host            | Role         | State   | TL | Lag in MB |+--------+-----------------+--------------+---------+----+-----------+| test1  | 192.168.164.111 | Leader       | running |  1 |           || test2  | 192.168.164.112 | Sync Standby | running |  1 |         0 || test3  | 192.168.164.113 | Replica      | running |  1 |         0 |+--------+-----------------+--------------+---------+----+-----------+至此 patroni+etcd+pg14.6高可用集群搭建完成

六、安装配置HAProxy

此部分只在第四个节点进行

1、解压缩并编译安装haproxy

[root@patroni4 ~]# cd /opt[root@patroni4 opt]# tar -zxvf haproxy-2.6.9.tar.gz[root@patroni4 opt]# cd haproxy-2.6.9/[root@patroni4 haproxy-2.6.9]# make TARGET=linux-glibc ARCH=x86_64 PREFIX=/opt/haproxy USE_ZLIB=1 USE_CPU_AFFINITY=1 USE_PCRE=1 USE_OPENSSL=1 USE_SYSTEMD=1[root@patroni1 haproxy-2.6.9]# make install PREFIX=/opt/haproxy

2、环境变量增加haproxy的可执行路径

[root@patroni4 ~]# vi ~/.bashrc ##增加以下内容(:后边的内容)export PATH=$PATH:/opt/haproxy/sbin/[root@patroni4 ~]# source ~/.bashrc

3、编辑haproxy配置文件

[root@patroni4 ~]# vi /opt/haproxy/haproxy.yaml##配置新如下globalmaxconn 1000chroot /opt/haproxyuser    rootgroup   rootdaemon#       nbproc 4#       cpu-map 1 0#       cpu-map 2 1#       cpu-map 3 2#       cpu-map 4 3pidfile /var/run/haproxy.pidlog 127.0.0.1 local1 infodefaultsoption tcplogoption  dontlognullretries  3option    redispatchoption  abortonclosemaxconn 1000mode tcptimeout queue           1mtimeout connect         10stimeout client          1mtimeout server          1mtimeout check           10slisten statusbind 0.0.0.0:10001mode httplog globalstats enablestats refresh 30sstats uri /stats realm Private landsstats auth admin:admin@123listen  masterbind 0.0.0.0:6432mode tcpoption tcplogbalance roundrobinoption httpchk OPTIONS /masterhttp-check expect status 200default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessionsserver test1 192.168.164.111:5432 maxconn 200 check port 8008 inter 5000 rise 2 fall 2server test2 192.168.164.112:5432 maxconn 200 check port 8008 inter 5000 rise 2 fall 2server test3 192.168.164.113:5432 maxconn 200 check port 8008 inter 5000 rise 2 fall 2listen replicasbind 0.0.0.0:6433mode tcpoption tcplogbalance roundrobinoption httpchk OPTIONS /replicahttp-check expect status 200default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessionsserver test1 192.168.164.111:5432 maxconn 200 check port 8008 inter 5000 rise 2 fall 2server test2 192.168.164.112:5432 maxconn 200 check port 8008 inter 5000 rise 2 fall 2server test3 192.168.164.113:5432 maxconn 200 check port 8008 inter 5000 rise 2 fall 2

4、编辑HAProxy系统服务文件

[root@patroni4 ~]# vi /usr/lib/systemd/system/haproxy.service[Unit]Description=HAProxyAfter=syslog.target network.target[Service]ExecStartPre=/opt/haproxy/sbin/haproxy -f /opt/haproxy/haproxy.cfg -c -qExecStart=/opt/haproxy/sbin/haproxy -Ws -f /opt/haproxy/haproxy.cfg -p /var/run/haproxy.pidExecReload=/bin/kill -USR2 $MAINPID[Install]WantedBy=multi-user.target

5、启动服务,设置开机自启

[root@patroni4 ~]# systemctl daemon-reload[root@patroni4 ~]# systemctl start haproxy.service[root@patroni4 ~]# systemctl status haproxy.service[root@patroni4 ~]# systemctl enable haproxy.service

服务启动后可通过在网页输入haproxy地址的方式查看工作信息统计,本例中为192.168.164.114:10001

七、负载均衡场景验证

pgbench是PostgreSQL内置的一个基准测试工具。默认情况下(工具默认提供),pgbench 测试基于TPC-B场景,每个事务包括5个SELECT、UPDATE 和INSERT命令。本部分通过pgbench工具测试haproxy的负载情况,关于pgbench的参数说明,请参看support平台的另一篇文章018756704,本文不再详细介绍。

1、创建测试用户跟测试库

[postgres@patroni1 ~]$ psql -h 192.168.164.114 -p 6432Password for user postgres:psql (14.6)Type "help" for help.postgres=# create user a password'a';postgres=# create database a owner a;

2、a库内初始化测试表

[postgres@patroni1 ~]$  pgbench -h 192.168.164.114 -U a -p 6432 -i a -u apgbench: invalid option -- 'u'Try "pgbench --help" for more information.[postgres@patroni1 ~]$  pgbench -h 192.168.164.114 -U a -p 6432 -i a -U aPassword:dropping old tables...NOTICE:  table "pgbench_accounts" does not exist, skippingNOTICE:  table "pgbench_branches" does not exist, skippingNOTICE:  table "pgbench_history" does not exist, skippingNOTICE:  table "pgbench_tellers" does not exist, skippingcreating tables...generating data (client-side)...100000 of 100000 tuples (100%) done (elapsed 0.43 s, remaining 0.00 s)vacuuming...creating primary keys...done in 5.85 s (drop tables 0.00 s, create tables 0.11 s, client-side generate 2.51 s, vacuum 1.67 s, primary keys 1.56 s).

3、模拟20个客户端,4个线程运行120秒

[postgres@patroni1 ~]$  pgbench -h 192.168.164.114 -U a -p 6432 -d a -r -M prepared -v -T 120 -c 20 -j 4 --aggregate-interval=5 -l

监控haproxy页面,可以看到所有的客户端连接均连接到主机

image.png

4、模拟20个客户端 4个线程只读SQL运行120秒

[postgres@patroni2 ~]$ pgbench -h 192.168.164.114 -U a -p 6433 -d a -r -M prepared -v -T 120 -c 20 -j 4 -S --aggregate-interval=5 -l

监控haproxy页面,可以看到所有的客户端平均分配到了两个备节点,如下图所示

image.png

结论:针对已做好读写分离的业务系统,此配置方法可以很好的实现负载均衡。

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

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

相关文章

Spring MVC(四) 数据校验

在开发过程中有一环必不可少的部分就是数据校验&#xff0c;用户在页面中填写的数据通过表单提交时&#xff0c;前端的JS可以做一些是否合法性的验证&#xff0c;比如是否为空、两次密码是否一致、格式是否正确等等验证。当数据到了后台控制器&#xff0c;为了确保程序的健壮性…

内网环境ubuntu设置静态ip、DNS、路由,不影响网络访问

内网环境通常是有线的&#xff0c;通过服务器的ip、mac、dns地址访问网络才生效的&#xff0c;如果ip地址变了&#xff0c;就不能访问网络了。 如果你的ip地址变了&#xff0c;或者要防止ip变更影响网络访问&#xff0c;就要设置 1、依次点击右上角的电源-设置&#xff0c;在打…

公司里的“卷王”,是主动卷还是迫于无奈?

先来唠唠 “卷” 这个词是近几年流行起来的网络用语&#xff0c;它是内卷的简化形式&#xff0c;“内卷”本来是一个名不见经传的普通词语&#xff0c;经网络流传&#xff0c;很多人就用其来指代非理性的内部竞争或“被自愿”竞争。 在现代职场&#xff0c;有一群人被戏称为&…

三分钟快速上手SpringSecurity框架

导入依赖框架 web 框架(spring-boot-starter-web) <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> springSecurity 框架(spring-boot-starter-security) <de…

基于单片机的空气质量检测系统设计(51+4G版)-设计说明书

设计摘要&#xff1a; 本设计是基于单片机的空气质量检测系统设计涉及以下主要功能&#xff0c;旨在监测甲烷和一氧化碳的浓度&#xff0c;并在浓度过高时采取相应措施&#xff0c;以确保室内空气质量的安全。该系统使用传感器对甲烷和一氧化碳的浓度进行检测。传感器将收集到…

人物介绍模板 PSD 源文件免费获取

免费获取 下载链接在最后&#xff01; 下载链接在最后&#xff01; 下载链接在最后&#xff01; 下载链接在最后&#xff01; 下载链接在最后&#xff01; 链接&#xff1a;https://pan.baidu.com/s/1sq3e6djMdZt76Sh_uqVxWg 提取码&#xff1a;naun

AniPortrait详细讲解以及完整搭建流程(有问题留言)

AniPortrait是一款真实感人像动画的音频驱动合成的AI程序。 下面是它的github源码: GitHub - Zejun-Yang/AniPortrait: AniPortrait: Audio-Driven Synthesis of Photorealistic Portrait AnimationAniPortrait: Audio-Driven Synthesis of Photorealistic Portrait Animati…

TiDB学习1:TiDB体系架构概览

目录 1. TiDB体系结构 2. TiDBsever 3. TiKV 4. PD(Placement Driver) 5. TiFlash 1. TiDB体系结构 水平扩容或者缩容金融级高可用实时 HTAP云原生的分布式数据库兼容MySQ 5.7 协议 2. TiDBsever 处理客户端的连接SQL语句的解析和编译关系型数据与 kv 的转化(insert语句)S…

线上3D博物馆搭建简单吗?有何优势?有哪些应用场景?

随着科技的飞速发展&#xff0c;传统的博物馆参观方式正在经历一场前所未有的变革&#xff0c;在科技的“加持”下&#xff0c;不少博物馆凭借强大的技术、创意和美学实践&#xff0c;频频“出圈”&#xff0c;线上3D博物馆逐渐崛起&#xff0c;这不仅丰富了人们的文化体验&…

C++|多态性与虚函数(1)功能绑定|向上转换类型|虚函数

目录 什么是多态性&#xff1f; 概念 分类 向上类型转换 功能的早绑定和晚绑定 绑定 绑定与多态的联系 编译时多态&#xff08;功能的早绑定&#xff09; 运行时多态&#xff08;功能的晚绑定&#xff09; 一般而言 实现功能晚绑定——虚函数 虚函数定义的说明 什么…

springboot jar包下config logback外配置文件不生效

描述 与jar 包同级的config目录下放置配置文件 检查1 确定配置配置文件名称为logback-spring.xml 检查2 确定logback-spring.xml 内容正确 检查3 开发环境为 生产环境&#xff08;外配置环境下&#xff09;

寻求发展+兼顾陪读|企业高管赴美国乔治梅森大学做访问学者

E经理拟去美国访学&#xff0c;想达到3个目的&#xff1a;结合本专业方向&#xff0c;扩展至跨学科研究领域&#xff1b;考察市场&#xff0c;寻求新的发展契机&#xff1b;携孩子出国读书&#xff0c;兼顾陪读&#xff0c;并希望尽早出国。最终我们为其落实的乔治梅森大学访问…

会员网站如何创建具有不同仪表盘结构的用户帐户页面

用户帐户页面是中央用户仪表盘&#xff0c;用户可以在其中添加和编辑信息、发布和编辑帖子以及保存收藏夹项目。本教程介绍如何使用“内容”和“重写”模板模式设置帐户页面、为帐户页面创建子页面以及设置个人资料菜单等。 在本教程中&#xff0c;我们将介绍如何使用招聘网站…

PSAI超强插件来袭:一键提升设计效率!

无需魔法&#xff0c;直接在PS中完成图生图、局部重绘、线稿上色、无损放大、扩图等操作。无论你是Windows还是Mac用户&#xff0c;都能轻松驾驭这款强大的AI绘图工具&#xff0c;这款PSAI插件让你的设计工作直接起飞&#xff01; 在之前的分享中&#xff0c;我为大家推荐过两…

Wiley数据库文献哪里比较全?去哪里下载比较高效

Wiley出版社1807年创建于美国&#xff0c;是一家具有超过200年历史的全球知名的出版机构&#xff0c;面向专业人士、科研人员、教育工作者、学生、终身学习者提供必需的知识和服务。 Wiley及旗下的子品牌出版了超过500位诺贝尔奖得主的作品。Wiley Online Library为全学科期刊全…

价格战开卷!字节发布豆包大模型,比行业便宜99.3%

豆包大模型正式亮相 5月15日&#xff0c;在2024春季火山引擎Force原动力大会上&#xff0c;字节跳动自研豆包大模型正式亮相。 &#xff08;图源&#xff1a;证券时报&#xff09; 火山引擎是字节跳动旗下云服务平台&#xff0c;据火山引擎总裁谭待介绍&#xff0c;豆包大模型…

海外媒体发稿:如何在日本媒体投放新闻通稿-大舍传媒

导言 在全球化的时代背景下&#xff0c;海外媒体宣发对于企业来说非常重要。通过在海外媒体投放新闻通稿&#xff0c;企业能够拓展海外市场&#xff0c;增强知名度和影响力。本文将探讨如何在海外媒体投放新闻通稿&#xff0c;以帮助企业进行有效的海外宣传。 挖掘海外媒体资…

Dubbo2.x迁移3.x过程及原理

Dubbo2.x迁移3.x过程及原理 1.Dubbo2.x迁移3.x1.1 快速升级步骤1.2 Provider 端升级过程详解1.2.1 双注册带来的资源消耗 1.3 Consumer 端升级过程1.3.1 APPLICATION_FIRST策略1.3.2 双订阅带来的资源消耗1.3.3 消费端更细粒度的控制 1.4 迁移状态的收敛1.4.1 不同的升级策略影…

Java—如何判断两个浮点数相等

结论 一旦有浮点型数据参与运算的结果&#xff0c;一定不要使用 “ ” 与其比较。 提出问题 我们知道在Java中浮点数float 和 double 的值不能很精准的表示一个小数&#xff0c;因为会有精度损失。 下面来看一个例子&#xff1a; public class FloatTest {public static …

戒烟网站|基于SSM+vue的戒烟网站系统的设计与实现(源码+数据库+文档)

戒烟网站 目录 基于SSM&#xff0b;vue的戒烟网站系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1网站功能模块 2管理员功能模块 3用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主…