【DBA专属】MHA高可用数据库集群-----------一主一备两从一管理,一个VIP客户端

news2024/12/28 22:07:32

MHA高可用数据库集群

目录

环境配置: 所有操作系统均为centos 7.x 64bit

 1、关闭防火墙:(所有服务器)

2.配置所有主机名映射(所有服务器)

3、同步时区

4.安装MHA node及相关perl依赖包(所有服务器)

5.安装MHA Node(所有服务器)

6.管理节点huyang5安装MHA Manger(1)(管理服务器)

7.配置SSH密钥对验证(所有服务器) 

8.安装mysql(所有服务器)

​编辑

搭建主从复制环境

主库设置:(huyang1)

步骤一:修改配置文件/etc/my.cnf

步骤二:重启服务后进入数据库

步骤三:授权复制权限

步骤四:查看主状态

步骤五:创建监控用户

从库一设置:(huyang4)备用主库

步骤一:修改配置文件/etc/my.cnf

步骤二:重启服务后进入数据库

步骤三:授权复制权限

步骤四:连接主库

步骤五:创建监控用户

从库二设置:(huyang2)

步骤一:修改配置文件/etc/my.cnf

步骤二:重启服务后进入数据库

步骤三:授权复制权限

步骤四:连接主库

步骤五:创建监控用户

从库三设置:(huyang3)

步骤一:修改配置文件/etc/my.cnf

​编辑

步骤二:重启服务后进入数据库

步骤三:授权复制权限

步骤四:连接主库

步骤五:创建监控用户

配置MHA环境:(huyang5)

步骤一:建立工作目录及并设置配置文件

步骤二:配置故障转移脚本并赋权

部署完成,检查结果:(huyang5操作)

检查MHA ssh通信状态

检查整个集群的状态  

检查manager状态

验证MHA高可用当主库服务器因为某种原因宕机之后的变化:

步骤一:检查当前的端口(主库huyang1)

​编辑

步骤二:停止主库服务,查看变化

验证当主库服务器宕机恢复之后的变化:

步骤一:检查当前的端口(主库huyang1)

步骤二:开启主库服务,查看变化

步骤三:将huyang1连接至huyang4

步骤四:添加进huyang5的监听文件并开启监控

步骤五:关闭现有主库huyang4,查看变化

总  结:


环境配置: 所有操作系统均为centos 7.x 64bit

至少五台主机,一主三从一Manger

三从主指定为主的备胎,当主坏掉,他顶上,但默认情况还是从的角色

例:

IP地址

主机名

任  务

192.168.59.137

huyang1

主 库

192.168.59.138

huyang2

从库1

192.168.59.140

huyang3

从库2

192.168.59.142

huyang4

从库3(备用主库)

192.168.59.144

huyang5

管理节点

192.168.59.146

huyang6

VIP

 1、关闭防火墙:(所有服务器)

systemctl stop firewalld

iptables -F   setenforce 0

2.配置所有主机名映射(所有服务器)

cat << END >> /etc/hosts

192.168.59.137 huyang1

192.168.59.138 huyang2

192.168.59.140 huyang3

192.168.59.142 huyang4

192.168.59.144 huyang5

END

映射完之后需要用ip地址的可以用主机名

3、同步时区

[huyang1]yum -y install ntp

         systemctl start ntpd

[huyang2/3/4/5/6]ntpdate huyang1

4.安装MHA node及相关perl依赖包(所有服务器)

wget -O /etc/yum.repos.d/CentOS-Base.repo

http://mirrors.aliyun.com/repo/Centos-7.repo

下载阿里源

yum -y install epel-release  下载epel源

yum install -y perl-DBD-MySQL.x86_64

perl-DBI.x86_64 perl-CPAN perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker

5.安装MHA Node(所有服务器)

rz  上传文件包(mha4mysql-node-0.56.tar.gz)

 tar xf mha4mysql-node-0.56.tar.gz  解压

cd mha4mysql-node-0.56/    切换目录

perl Makefile.PL 用perl

语言编译文件,生成Makefile文件

make && make install  编译安装

 查看结果:MHA Node安装完后会在 /usr/local/bin生成以下脚本  ls -l /usr/local/bin/   有4个

6.管理节点huyang5安装MHA Manger(1)(管理服务器)

安装MHA Manger之前也需要安装MHA Node

安装MHA Manger依赖的perl模块

yum install -y perl perl-Log-Dispatch

perl-Parallel-ForkManager perl-DBD-MySQL perl-DBI perl-Time-HiRes   依赖

rz  上传依赖包

perl-Config-Tiny-2.14-7.el7.noarch.rpm

用perl软件配置Manger

rpm  -ivh

perl-Config-Tiny-2.14-7.el7.noarch.rpm

安装MHA Manger软件包

rz  上传管理节点安装包

tar xf mha4mysql-manager-0.56.tar.gz

cd mha4mysql-manager-0.56/

perl Makefile.PL

make && make install

安装完成后会有以下脚本文件

查看结果:MHA Manger e安装完后会在/usr/local/bin/

生成以下脚本  ls -l /usr/local/bin/   有13个

7.配置SSH密钥对验证(所有服务器) 

manger生成传给其他服务器,并验证,其他服务器直接互相传密钥,无需验证

服务器之间需要实现密钥对验证

【huyang1/2/3/4/5】ssh-keygen -t rsa

【huyang1/2/3/4/5】

ssh-copy-id -i .ssh/id_rsa.pub root@huyang1

cat /root/.ssh/authorized_keys

scp .ssh/authorized_keys root@huyang2:.ssh/

scp .ssh/authorized_keys root@huyang3:.ssh/

scp .ssh/authorized_keys root@huyang4:.ssh/

scp .ssh/authorized_keys root@huyang5:.ssh/

Manger生成密钥对传给其他数据库连接每个主机测试

ssh 加主机名

[huyang5]ssh huyang1

[huyang5]ssh huyang2

[huyang5]ssh huyang3

[huyang5]ssh huyang4

[huyang5]ssh huyang5

 因为第一次连接的时候需要输入yes影响后期故障切换时,对于每个主机的SSH控制;

数据库之间生成密钥对,保证一个数据库有其他三个数据库的密钥,无需连接测试.

8.安装mysql(所有服务器)

数据库服务器上的操作

yum -y install mariadb mariadb-server mariadb-devel

systemctl start mariadb

mysqladmin -u root password 123456

设置数据库初始密码

搭建主从复制环境

主库设置:(huyang1)

步骤一:修改配置文件/etc/my.cnf

[mysqld]

server-id = 1

log-bin=master-bin

log-slave-updates=true

relay_log_purge=0

步骤二:重启服务后进入数据库

systemctl restart mariadb

mysql -uroot -p123456

步骤三:授权复制权限

grant replication slave on *.* to

'repl'@'192.168.59.%' identified by '123456';

flush privileges;  刷新权限

步骤四:查看主状态

 show master status;

步骤五:创建监控用户

为监控节点服务较高的权限

grant all privileges on *.* to

'root'@'192.168.59.%' identified  by '123456';

  flush privileges;

为自己的主机名授权

grant all privileges on *.* to 'root'@'huyang1'

identified  by '123456';

从库一设置:(huyang4)备用主库

步骤一:修改配置文件/etc/my.cnf

[mysqld]

server-id = 2

log-bin=master-bin

log-slave-updates=true

relay_log_purge=0

步骤二:重启服务后进入数据库

systemctl restart mariadb

mysql -uroot -p123456

步骤三:授权复制权限

grant replication slave on *.* to

'repl'@'192.168.59.%' identified by '123456';

flush privileges;  刷新权限

步骤四:连接主库

stop slave;

change master to

master_host='192.168.59.137',master_user='repl',master_password='123456',master_log_file='master-bin.000003',master_log_pos=245;

start slave;

show slave status\G;

步骤五:创建监控用户

为监控节点服务较高的权限

grant all privileges on *.* to

'root'@'192.168.59.%' identified  by '123456';

  flush privileges;

为自己的主机名授权

grant all privileges on *.* to 'root'@'huyang4'

identified  by '123456';

从库二设置:(huyang2)

步骤一:修改配置文件/etc/my.cnf

[mysqld]

server-id = 3

log-bin=master-bin

log-slave-updates=true

relay_log_purge=0

步骤二:重启服务后进入数据库

systemctl restart mariadb

mysql -uroot -p123456

步骤三:授权复制权限

grant replication slave on *.* to

'repl'@'192.168.59.%' identified by '123456';

flush privileges;  刷新权限

步骤四:连接主库

stop slave;

change master to

master_host='192.168.59.137',master_user='repl',master_password='123456',master_log_file='master-bin.000003',master_log_pos=245;

start slave;

show slave status\G;

步骤五:创建监控用户

为监控节点服务较高的权限

grant all privileges on *.* to

'root'@'192.168.59.%' identified  by '123456';

  flush privileges;

为自己的主机名授权

grant all privileges on *.* to 'root'@'huyang2'

identified  by '123456';

从库三设置:(huyang3)

步骤一:修改配置文件/etc/my.cnf

[mysqld]

server-id = 4

log-bin=master-bin

log-slave-updates=true

relay_log_purge=0

步骤二:重启服务后进入数据库

systemctl restart mariadb

mysql -uroot -p123456

步骤三:授权复制权限

grant replication slave on *.* to

'repl'@'192.168.59.%' identified by '123456';

flush privileges;  刷新权限

步骤四:连接主库

stop slave;

change master to

master_host='192.168.59.137',master_user='repl',master_password='123456',master_log_file='master-bin.000003',master_log_pos=245;

start slave;

show slave status\G;

步骤五:创建监控用户

为监控节点服务较高的权限

grant all privileges on *.* to

'root'@'192.168.59.%' identified  by '123456';

  flush privileges;

为自己的主机名授权

grant all privileges on *.* to 'root'@'huyang3'

identified  by '123456';

配置MHA环境:(huyang5)

步骤一:建立工作目录及并设置配置文件

mkdir /etc/masterha创建配置目录复制模板文件

cp mha4mysql-manager-0.56/samples/conf/app1.cnf  /etc/masterha  软件包解压后的目录里面有样例配置文件

vim /etc/masterha/app1.cnf   修改配置文件

[server default]

#设置manager的工作日志

manager_workdir=/var/log/masterha/app1

#设置manager的日志,这两条都是默认存在的

manager_log=/var/log/masterha/app1/manager.log

#设置master默认保存binlog的位置,以便MHA可以找到master日志

master_binlog_dir=/var/lib/mysql

#设置自动failover时候的切换脚本

master_ip_failover_script= /usr/local/bin/master_ip_failover

#设置mysql中root用户的密码

password=123456

user=root

#ping包的时间间隔

ping_interval=1

#设置远端mysql在发生切换时保存binlog的具体位置

remote_workdir=/tmp

#设置复制用户的密码和用户名

repl_password=123456

repl_user=repl

[server1]

hostname=huyang1

port=3306

[server2]

hostname=huyang4

candidate_master=1

port=3306

check_repl_delay=0

[server3]

hostname=huyang2

port=3306

[server4]

hostname=huyang3

port=3306

步骤二:配置故障转移脚本并赋权

vim /usr/local/bin/master_ip_failover修改配置文件

chmod +x /usr/local/bin/master_ip_failover

赋予执行权限

#!/usr/bin/env perl

use strict;

use warnings FATAL => 'all';

use Getopt::Long;

my (

$command, $ssh_user, $orig_master_host, $orig_master_ip,

$orig_master_port, $new_master_host, $new_master_ip, $new_master_port,

);

my $vip = '192.168.59.146';          

my $key = "1";

my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";

my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";

$ssh_user = "root";

GetOptions(

'command=s' => \$command,

'ssh_user=s' => \$ssh_user,

'orig_master_host=s' => \$orig_master_host,

'orig_master_ip=s' => \$orig_master_ip,

'orig_master_port=i' => \$orig_master_port,

'new_master_host=s' => \$new_master_host,

'new_master_ip=s' => \$new_master_ip,

'new_master_port=i' => \$new_master_port,

);

exit &main();

sub main {

print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";

if ( $command eq "stop" || $command eq "stopssh" ) {

# $orig_master_host, $orig_master_ip, $orig_master_port are passed.

# If you manage master ip address at global catalog database,

# invalidate orig_master_ip here.

my $exit_code = 1;

#eval {

# print "Disabling the VIP on old master: $orig_master_host \n";

# &stop_vip();

# $exit_code = 0;

#};

eval {

print "Disabling the VIP on old master: $orig_master_host \n";

#my $ping=`ping -c 1 10.0.0.13 | grep "packet loss" | awk -F',' '{print $3}' | awk '{print $1}'`;

#if ( $ping le "90.0%"&& $ping gt "0.0%" ){

#$exit_code = 0;

#}

#else {

&stop_vip();

# updating global catalog, etc

$exit_code = 0;

#}

};

if ($@) {

warn "Got Error: $@\n";

exit $exit_code;

}

exit $exit_code;

}

elsif ( $command eq "start" ) {

# all arguments are passed.

# If you manage master ip address at global catalog database,

# activate new_master_ip here.

# You can also grant write access (create user, set read_only=0, etc) here.

my $exit_code = 10;

eval {

print "Enabling the VIP - $vip on the new master - $new_master_host \n";

&start_vip();

$exit_code = 0;

};

if ($@) {

warn $@;

exit $exit_code;

}

exit $exit_code;

}

elsif ( $command eq "status" ) {

print "Checking the Status of the script.. OK \n";

`ssh $ssh_user\@$orig_master_ip \" $ssh_start_vip \"`;

exit 0;

}

else {

&usage();

exit 1;

}

}

# A simple system call that enable the VIP on the new master

sub start_vip() {

`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;

}

# A simple system call that disable the VIP on the old_master

sub stop_vip() {

`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;

}

sub usage {

print

"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --

new_master_host=host --new_master_ip=ip --new_master_port=port\n"; }

部署完成,检查结果:(huyang5操作)

检查MHA ssh通信状态

masterha_check_ssh --conf=/etc/masterha/app1.cnf

返回 successfully表示没有问题

检查整个集群的状态  

masterha_check_repl --conf=/etc/masterha/app1.cnf

返回ok表示没有问题

检查manager状态

masterha_check_status--conf=/etc/masterha/app1.cnf

如果正常会显示"PING_OK"

NOT_RUNNING",代表MHA监控没有开启

开启监控再查看为开启状态

开启manager监控

nohup masterha_manager

--conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover<

/dev/null >/var/log/masterha/app1/manager.log 2>&1 &

--remove_dead_master_conf

当发生主从切换后,老的主库的ip将会从配置文件中移除

--manger_log  日志存放位置

--ignore_last_failover  在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不会进行Failover,之所以这样限制是为了避免ping-pong效应。该参数代表忽略上次MHA触发切换产生的文件,默认情况下,MHA发生切换后会在日志目录,也就是上面设置的/data产生app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failover

关闭监控

masterha_stop --conf=/etc/masterha/app1.cnf

验证MHA高可用当主库服务器因为某种原因宕机之后的变化:

步骤一:检查当前的端口(主库huyang1)

【huyang1】ip a|grep ens33

可以发现有两个,一个是主库的ip,另一个是vip的端口

步骤二:停止主库服务,查看变化

【huyang1】systemctl stop mariadb

【huyang2】show slave status\G; 

【huyang3】show slave status\G; 

 【huyang4】show slave status\G;

 【huyang4】ip a|grep ens33;

【huyang4】show master status;(成为主服务器) 

【huyang5】 

masterha_check_repl --conf=/etc/masterha/app1.cnf

【huyang5】 vim /etc/master/app1.cong

可以发现监听的文件内已经不再监听huyang1

验证当主库服务器宕机恢复之后的变化:

步骤一:检查当前的端口(主库huyang1)

【huyang1】ip a|grep ens33

可以发现只有一个端口了

步骤二:开启主库服务,查看变化

【huyang1】systemctl start mariadb

【huyang2/3】show slave status\G;

没有发生变化

 【huyang4】show master status;(依旧是主服务器)

【huyang5】 vim /etc/master/app1.cong

可以发现监听的文件内依旧没有huyang1

步骤三:将huyang1连接至huyang4

change master to

master_host='192.168.59.142',master_user='repl',master_password='123456',master_log_file='master-bin.000005',master_log_pos=245;

步骤四:添加进huyang5的监听文件并开启监控

【huyang5】vim /etc/master/app1.conf

步骤五:关闭现有主库huyang4,查看变化

【huyang4】systemctl stop mariadb

【huyang4】ip a |grep ens33

 【huyang1】ip a |grep ens33

【huyang1】show slave status;

【huyang1】show master status;变成主库

【huyang2/3】show slave status\G;

此时huyang2/3又变成了huyang1的从库

【huyang5】 vim /etc/master/app1.cong

可以发现监听的文件内已经不再监听huyang4

 

总  结:

  1、MHA高可用集群,在主机宕机之后,复制组里会有一台变成主库,若指定了备用库,则备用库成为新的主库,原主库的从库成为新主库的从库;

  2、指定备用库之后,主库宕机恢复之后,将成为独立的服务器,不会成为主库,宕机之后复制组的状态不会改变,若有需要,则需手动指定成为新主库的从库;在指定宕机恢复主库为备用库主库的从库之后,备用库主库宕机,宕机恢复主库成为新的主库,来回切换;

  3、管理库的监听需要手动的进行切换,监听的主库宕机之后,将会删除其信息,恢复之后,需手动添加进监听文件。

 

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

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

相关文章

AutoSAR系列讲解(入门篇)4.1-BSW概述

BSW概述 一、什么是BSW 二、BSW的结构 1、微控制器硬件抽象层&#xff08;MCAL&#xff09; 2、ECU抽象层 3、服务层 4、复杂驱动 三、再将结构细分 一、什么是BSW 中文翻译就是基础软件层&#xff08;Basic Software&#xff09;。这个基础软件层实质上就是将整个ECU分…

【斯坦福】FrugalGPT: 如何使用大型语言模型,同时降低成本并提高性能

FrugalGPT: 如何使用大型语言模型&#xff0c;同时降低成本并提高性能 作者&#xff1a;Lingjiao Chen, Matei Zaharia, James Zou 引言 本文介绍了一种新颖的方法&#xff0c;旨在解决使用大型语言模型&#xff08;LLM&#xff09;时面临的成本和性能挑战。随着GPT-4和Chat…

链路聚合综合实战

拓扑 需求 -PC1和PC3属于vlan 10、PC2和PC4属于vlan 20 -设备之间配置lacp模式的链路聚合&#xff0c;并确保同vlan之间的主机可以互通 配置步骤 1&#xff09;PC配置IP地址 2&#xff09;所有交换机创建vlan10 和vlan20 3&#xff09;交换机和PC互联的接口设置为access &am…

python数据分析之连接MySQL数据库并进行数据可视化

大家好&#xff0c;我是带我去滑雪&#xff01; 本期将熟悉MySQL数据库以及管理和操作MySQL数据库的数据库管理工具Navicat Premium&#xff0c;然后在python中调用MySQL数据库进行数据分析和数据可视化。 目录 1、MySQL数据库与数据库管理工具Navicat Premium 2、调用MySQL…

EasyCVR如何实现国标级联无人机推送的RTMP推流通道?

EasyCVR视频融合平台基于云边端一体化架构&#xff0c;可支持多协议、多类型设备接入&#xff0c;包括&#xff1a;NVR、IPC、视频编码器、无人机、车载设备、智能手持终端、移动执法仪等。平台具有强大的数据接入、处理及分发能力&#xff0c;可在复杂的网络环境中&#xff0c…

el-date-picker禁用指定日期之前或之后的日期

一、elementUI中el-date-picker禁用指定日期之前或之后的日期 通过配置picker-options配置指定禁用日期&#xff08;pickerOptions写到data里面&#xff09; <el-date-pickerv-model"date"type"date"size"small"value-format"yyyy-MM-d…

Linux-passwd或shadow删了怎么办?

passwd或者shadow被删除了怎么办 passwd和shadow被删了&#xff0c;可以启用营救模式进行补救&#xff0c;原因是这两个文件都有备份。 先将光驱的自动启动勾选。 将Boot的引导顺序改变下&#xff0c;将光驱引导顺序放到最前面。 选择Troubleshootin可以从名字来知道&#…

广州华锐互动:机电专业VR模拟实操教学平台提供沉浸式的实践操作和训练机会

虚拟现实(VR)技术是一种先进的技术&#xff0c;可以应用于机电专业的培训中。以下是VR技术应用到机电专业培训的一些好处&#xff1a; 模拟实际操作环境&#xff1a;VR技术可以创建一个虚拟的环境&#xff0c;模拟真实的机械和电气设备的操作环境。这使得学生可以在安全的环境…

Python最基础语法

文章目录 一、简介1、Python安全路径2、Python开发工具(PyCharm) 二、PyCharm使用1、新建项目位置2、Hello World3、查看python版本4、PEP8规范 三、标识符和关键字四、基本数据类型1、数据类型2、多数据赋值&#xff1a;3、标准数据类型4、格式化输出5、输入(input)6、格式转换…

电商系统架构设计系列(四):流量大、数据多的「商品详情页系统」该如何设计?

一个电商的商品系统&#xff0c;主要功能就是增删改查商品信息。 上篇文章中&#xff0c;我给你留了一个思考题&#xff1a;流量大、数据多的商品详情页系统该如何设计&#xff1f; 今天这篇文章&#xff0c;主要聊一下&#xff0c;如何设计一个快速、可靠的存储架构支撑商品系…

七、一百零二类花分类项目实战

一、准备数据集 一百零二类花数据集下载 flower_data包括train和valid文件&#xff0c;分别存放102个文件&#xff0c;对应102种类别的花 cat_to_name.json为类别和花品种键值对 将压缩包进行解压&#xff0c;跟项目放到同级路径下 二、导包 若遇到报错&#xff0c;不存…

网络链路聚合

这里写目录标题 链路聚合什么是链路聚合&#xff1f;为什么要进行链路聚合&#xff1f;Linux网卡bonding的7种模式模式一&#xff1a;balance-rr 轮询均衡模式模式二&#xff1a;active-backup 主备策略模式模式三&#xff1a;balance-xor 平衡策略模式四&#xff1a;broadcast…

【python】枚举的基本使用,及如何实现枚举属性的自增长

▒ 目录 ▒ &#x1f6eb; 问题描述环境 1️⃣ 枚举的基本使用自定义枚举成员的值枚举值唯一&#xff1a;unique枚举成员的别名&#xff1a;property枚举成员的元数据 2️⃣ 实现枚举属性的自增长python3.6python3.5.2python2不支持enum模块 &#x1f6ec; 结论&#x1f4d6; 参…

智慧医疗救护车数据采集、远程管理物联网方案-5G工业路由器应用

随着5G通信技术发展成熟&#xff0c;逐渐普遍应用于物联网中&#xff0c;救护车是医疗中不可缺少的部分&#xff0c;在救护车的物联网中具备车辆定位、数据采集、在线传输、远程监控等功能&#xff0c;5G工业路由器需要对救护车提供全程联网&#xff0c;实现智慧医疗的信息化、…

【JUC进阶】08. 重量级锁

目录 1、前言 2、重量级锁 3、数据结构和控制流程 3.1、Monitor 对象 3.2、控制流程 4、性能分析 5、同其他锁的对比 1、前言 前面我们介绍了偏向锁&#xff0c;轻量级锁&#xff0c;自旋锁相关知识。初次之外&#xff0c;锁升级过程还会涉及到重量级锁。重量级锁是并发…

基于Java珠宝首饰交易平台设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

新品预告——旗舰级DG4Pros最详技术解析及应用方案介绍

旗舰级DG4Pros RIY-DG4Pros是目前睿铂性能指标最高的一款全画幅倾斜摄影相机&#xff0c;其核心光学组件部分由睿铂结合多年来的用户反馈与对倾斜摄影技术的探索成果&#xff0c;完全自主研发设计&#xff0c;技术水平领先于市面同类产品。相机镜头内置双高斯结构和超低色散非…

Spring Boot 中的 Type-safe Configuration Properties:原理、用法与示例

Spring Boot 中的 Type-safe Configuration Properties&#xff1a;原理、用法与示例 前言 Spring Boot 是一个快速开发 Spring 应用程序的框架&#xff0c;它提供了很多有用的功能和特性。其中&#xff0c;Type-safe Configuration Properties 是一个常用的功能&#xff0c;…

基于STL的演讲比赛流程管理

比赛规则: 学校举行一场演讲比赛&#xff0c;共有12个人参加。比赛共两轮&#xff0c;第一轮为淘汰赛&#xff0c;第二轮为决赛。每名选手都有对应的编号&#xff0c;如10001~10012 比赛方式:分组比赛&#xff0c;每组6个人&#xff1b; 第一轮分为两个小组&#xff0c;整体按…

python: more Layer Architecture and its Implementation in Python and mysql 8.0

mysql 8.0 drop table DuStudentList;#学生表create table DuStudentList (StudentId INT NOT NULL AUTO_INCREMENT comment主键id, #自动增加,StudentName nvarchar(50) comment学生姓名,StudentNO varchar(50) comment学号, #学号StudentBirthday datet…