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

Linux下部署MySQL-MHA环境

目前的环境如下:centos7
有四台虚拟机,20,21,22,23
20为master,21,22,23 为20的从库,21 为管理节点。
搭建MySQL主从复制的,可以参考我之前的文章

MHA(Master High Availability)目前在 MySQL 高可用方面是一个相对成熟的解决方案,它由日本 DeNA 公司的 youshimaton(现就职于 Facebook 公司)开发,是一套优秀的作为 MySQL 高可用性环境下故障切换和主从提升的高可用软件。在 MySQL 故障切换过程中,MHA 能做到在 0~30 秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA 能在最大程度上保证数据的一致性,以达到真正意义上的高可用。

MHA软件组成

(1) MHA Manager(管理节点)

MHA Manager 可以单独部署在一台独立的机器上管理多个 master/slave 集群,也可以部署在一台 slave 节点上;

(2) MHA Node(数据节点)

MHA Node 运行在每台 MySQL 服务器上,MHA Manager 会定时探测集群中的 master 节点,当 master 出现故障时,它可以自动将拥有最新数据的 slave 提升为新的 master,然后将所有其他的 slave 重新指向新的 master。整个故障转移过程对应用程序完全透明

在 MHA 自动故障切换过程中,MHA 试图从宕机的主服务器上获取保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过 ssh 访问,MHA 没法保存二进制日志,只进行故障转移而丢失了最新的数据。使用 MySQL 5.5 的半同步复制,可以大大降低数据丢失的风险。MHA 可以与半同步复制结合起来。如果只有一个 slave 已经收到了最新的二进制日志,MHA 可以将最新的二进制日志应用于其他所有的 slave 服务器上,因此可以保证所有节点的数据一致性

前期准备

 # 4台机器都要安装 ifconfig命令yum install -y net-tools# 4台机器防火墙关闭systemctl stop firewalldsystemctl disable firewalld# 需要注意的是,关闭mysql从库的中继日志自动删除# 这里将3台机器(20,22,23)设置该值,因为20也可能会作为从库,需要重启mysql# /etc/my.cnfrelay_log_purge=0# 创建软链接,因为mha内部代码使用了绝对路径导致的坑,你不做软链接,下面检查主从复制的时候会出现找不命令的报错# 4台机器ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlogln -s /opt/mysql/mysql/bin/mysql /usr/bin/mysql# 创建mha专用监控用户# master节点上创建一个用户,从库自动会同步[我们这里4台机器都会同步]CREATE USER 'mha'@'%' IDENTIFIED WITH mysql_native_password BY '123456';grant all privileges on *.* to mha@'%' ;

安装master,node

# 4台机器上下载node
wget https://qiniu.wsfnk.com/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
# 21机器上下载manager
wget https://qiniu.wsfnk.com/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm# 4台机器安装DBD::MYSQL
yum install -y perl-DBD-MySQL# 安装4台机器node
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm# 4台机器安装系统自带prel包
yum  -y install perl-*
# 下载除系统自带外的perl包rpm包搜索
wget http://rpmfind.net/linux/epel/7/x86_64/Packages/p/perl-Email-Date-Format-1.002-15.el7.noarch.rpm
wget http://rpmfind.net/linux/epel/7/x86_64/Packages/p/perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
wget http://rpmfind.net/linux/epel/7/x86_64/Packages/p/perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
wget http://rpmfind.net/linux/epel/7/x86_64/Packages/p/perl-MIME-Lite-3.030-1.el7.noarch.rpm
wget http://rpmfind.net/linux/epel/7/x86_64/Packages/p/perl-MIME-Types-1.38-2.el7.noarch.rpm
wget http://rpmfind.net/linux/epel/7/x86_64/Packages/p/perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
wget http://rpmfind.net/linux/centos/7.9.2009/os/x86_64/Packages/perl-Config-Tiny-2.14-7.el7.noarch.rpm
wget http://rpmfind.net/linux/epel/7/x86_64/Packages/p/perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
# 4台机器安装下载的prel包
yum -y install perl-*.rpm# 以上这些包装好之后,开始在21 机器上安装manager
[root@mysql-back opt]# rpm -ivh  mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
[root@mysql-back opt]# ll /usr/bin/masterha*
-rwxr-xr-x. 1 root root 1995 323 2018 /usr/bin/masterha_check_repl
-rwxr-xr-x. 1 root root 1779 323 2018 /usr/bin/masterha_check_ssh
-rwxr-xr-x. 1 root root 1865 323 2018 /usr/bin/masterha_check_status
-rwxr-xr-x. 1 root root 3201 323 2018 /usr/bin/masterha_conf_host
-rwxr-xr-x. 1 root root 2517 323 2018 /usr/bin/masterha_manager
-rwxr-xr-x. 1 root root 2165 323 2018 /usr/bin/masterha_master_monitor
-rwxr-xr-x. 1 root root 2373 323 2018 /usr/bin/masterha_master_switch
-rwxr-xr-x. 1 root root 5172 323 2018 /usr/bin/masterha_secondary_check
-rwxr-xr-x. 1 root root 1739 323 2018 /usr/bin/masterha_stop至此21机器上的manager,4台机器上的node都已经安装好了,接下来就是相关的配置了
管理节点(21机器)配置如下
#创建配置文件目录
mkdir -p /etc/mha
#创建日志目录,即工作目录
mkdir /var/log/mha/mysql_mha  -p
#创建日志文件
touch /var/log/mha/mysql_mha/manager.log
#编辑mha配置文件,定义一个配置文件名即可,因为一个配置文件对应一组mha管理的mysql主从集群
#如果有多组mysql集群的话,可以创建多个文件进行管理
vim /etc/mha/mysql_mha.cnf
chmod +x mysql_mha.cnf
# 如下是:mysql_mha.cnf配置
[server default]
manager_log=/var/log/mha/mysql_mha/manager.log
manager_workdir=/var/log/mha/mysql_mha
#指定master节点binlog日志的目录,查看master节点/etc/my.cnf里log_bin = /usr/local/mysql/data/binlog,
#注意binlog只是文件的前缀,不是目录,所以这里我们写到data目录即可
master_binlog_dir=/usr/local/mysql/data/
#指定mha用户,刚才我们创建了
user=mha
#指定mha用户的密码
password=123456
#探测主库时发送ping包的时间间隔                       
ping_interval=2
#指定主从复制的用户,在创建mysql主从复制的时候创建了这个用户			
repl_user=repl
#指定主从复制的用户密码			
repl_password=123456
#ssh的用户				
ssh_user=root
ssh_port=22
#下面几个就是定义mysql服务器的ip端口等信息 						
[server1]
hostname=172.16.185.20
port=3306
#指定该数据库服务器参与竞选主库,1代表参与
candidate_master=1
[server2]
hostname=172.16.185.22
port=3306
candidate_master=1
[server3]
hostname=172.16.185.23
port=3306
candidate_master=1

mha-manager命令介绍

/usr/bin/masterha_manager		 #启动mha-manager
/usr/bin/masterha_stop		     #停止hma-manager
/usr/bin/masterha_check_repl     #检查mysql的主从复制状况是否ok
/usr/bin/masterha_check_ssh		 #检查mysql的ssh配置是否正常
/usr/bin/masterha_check_status	 #检查当前mha-manager的运行状态
/usr/bin/masterha_conf_host	     #添加或删除配置文件的server信息
/usr/bin/masterha_master_monitor #检测master是否宕机
/usr/bin/masterha_master_switch	 #控制故障转移(自动或手动)
/usr/bin/masterha_secondary_check#检查多路由配置

mha-node命令介绍

/usr/bin/apply_diff_relay_logs	#识别差异的中继日志事件并应用于其它Slave
/usr/bin/purge_relay_logs		#清除中继日志(不会阻塞SQL线程)
/usr/bin/save_binary_logs		#保存和复制master的二进制日志
/usr/bin/filter_mysqlbinlog		#去除不必要的Rollback事件(MHA已不再使用该工具)

检查互信(ssh验证)

这里需要注意的是:4台机器ssh都能互相免密登陆,可以参考
如下地址:ssh免密登陆

#在manager上验证各个mysql节点的互信
[root@mysql-back etc]# masterha_check_ssh  --conf=/etc/mha/mysql_mha.cnf
Wed Nov  8 14:04:06 2023 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping
................................................
Wed Nov  8 14:04:10 2023 - [info] All SSH connection tests passed successfully.
[root@mysql-back etc]#

检查主从复制是否ok

[root@mysql-back etc]# masterha_check_repl  --conf=/etc/mha/mysql_mha.cnf
Wed Nov  8 14:26:01 2023 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
....
....
MySQL Replication Health is OK

启动管理服务

到现在为止,我们基础配置已经完成了

--remove_dead_master_conf是指当主库宕机的时候,会删除宕机主库的配置,
否则主库宕机后服务就会无法启动;
–ignore_last_failover是指忽略 xxx.health 文件,意思是当主库宕机之后,
服务会在规定的时间内连接剩下的从服务器来选举出主库。
如果启动服务的时候不加这个选项,那么超过规定时间还没连接上的时候,就不会再去切换主库了,
加上这个选项后,既是在规定时间内没能连接上剩下的从服务器,之后也会继续尝试连接,
知道选举出主库进行切换。nohup: 这个指的是后台启动[root@mysql-back etc]# nohup masterha_manager --conf=/etc/mha/mysql_mha.cnf  --remove_dead_master_conf --ignore_last_failover  < /dev/null> /var/log/mha/mysql_mha/manager.log 2>&1 &
[1] 8958
[root@mysql-back etc]# masterha_check_status --conf=/etc/mha/mysql_mha.cnf
mysql_mha (pid:8958) is running(0:PING_OK), master:172.16.185.20
##如果想停止服务可以输入下面命令
[root@mysql-back etc]# masterha_stop --conf=/etc/mha/mysql_mha.cnf
#查看进程,已经启动mha-manager了
[root@mysql-back etc]# ps -ef | grep mha

测试故障漂移

这里就不演示了,手动将20 机器的mysql 停掉,就会自动将22或者23机器提为新主库,22或者23为新的主库的从库了。

mha 实现了master故障,自动切换master,但是这对于应用程序而言,数据库IP变了,这怎么能行呢?,所以mha 自身提供了vip 来实现漂移机制。

vip故障漂移

mha 实现vip漂移也是使用脚本实现的,脚本可以在官网的源码包里面找到:

# 在github 下载mha4mysql-manager,将其上传到linux的/opt目录
[root@mysql-back opt]# wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz
[root@mysql-back opt]# tar -zxvf mha4mysql-manager-0.58.tar.gz
[root@mysql-back opt]# cp ./mha4mysql-manager-0.58/samples/scripts/* /etc/mha/
[root@mysql-back opt]# ll /etc/mha/
-rwxr-xr-x. 1 root root  3648 118 14:45 master_ip_failover
-rwxr-xr-x. 1 root root  9870 118 14:45 master_ip_online_change
-rw-r--r--. 1 root root   931 118 14:04 mysql_mha.cnf
-rwxr-xr-x. 1 root root 11867 118 14:45 power_manager
-rwxr-xr-x. 1 root root  1360 118 14:45 send_report# 这里我们将master_ip_failover 备份一份 
[root@mysql-back mha]# cp master_ip_failover master_ip_failover_bak
[root@mysql-back mha]# echo '' > 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 = '172.16.185.30';#指定vip的地址
my $brdc = '172.16.185.255';#指定vip的广播地址
my $ifdev = 'ens33';#指定vip绑定的网卡
my $key = '1'; #指定vip绑定的虚拟网卡序列号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";   #代表此变量值为ifconfig ens33:1 1172.16.185.30
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";    #代表此变量值为ifconfig ens33:1 172.16.185.30 down
my $exit_code = 0;#指定退出状态码为0
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" ) {my $exit_code = 1;eval {print "Disabling the VIP on old master: $orig_master_host \n";&stop_vip();$exit_code = 0;};if ($@) {warn "Got Error: $@\n";exit $exit_code;}exit $exit_code;}elsif ( $command eq "start" ) {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";exit 0;}else {&usage();exit 1;}
}
sub start_vip() {#这里指定ssh的用户时root,因为发现不指定会报错的my $ssh_user = 'root';`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的用户时root,因为发现不指定会报错的my $ssh_user = 'root';`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";
}#修改mha-manager的配置文件
[server default]
.............
#添加vip脚本
master_ip_failover_script=/etc/mha/master_ip_failover#第一次配置,需要在master上创建vip
[root@mysql-master opt]# ifconfig ens33:1 172.16.185.30/24接下来就是启动,可以参考上面的启动管理服务

实验演示

# 我们先将20这台机器的mysql手动停掉,来看一下日志文件 /var/log/mha/mysql_mha/manager.log# 出现这个说明故障自动切换已经可以
----- Failover Report -----mysql_mha: MySQL Master failover 172.16.185.20(172.16.185.20:3306) to 172.16.185.22(172.16.185.22:3306) succeededMaster 172.16.185.20(172.16.185.20:3306) is down!Check MHA Manager logs at mysql-back:/var/log/mha/mysql_mha/manager.log for details.Started automated(non-interactive) failover.
Invalidated master IP address on 172.16.185.20(172.16.185.20:3306)
The latest slave 172.16.185.22(172.16.185.22:3306) has all relay logs for recovery.
Selected 172.16.185.22(172.16.185.22:3306) as a new master.
172.16.185.22(172.16.185.22:3306): OK: Applying all logs succeeded.
172.16.185.22(172.16.185.22:3306): OK: Activated master IP address.
172.16.185.23(172.16.185.23:3306): This host has the latest relay log events.
Generating relay diff files from the latest slave succeeded.
172.16.185.23(172.16.185.23:3306): OK: Applying all logs succeeded. Slave started, replicating from 172.16.185.22(172.16.185.22:3306)
172.16.185.22(172.16.185.22:3306): Resetting slave info succeeded.
Master failover to 172.16.185.22(172.16.185.22:3306) completed successfully.#查看22,23机器mysql的状态#22机器# 1. 这个可以说明22机器已经不是从库了mysql> show slave status \G;Empty set, 1 warning (0.00 sec)ERROR: No query specified# 2. 出现这个说明是该机器有一个从库,因为我们这里就只有23了,所以23是从库mysql> show slave hosts;+-----------+------+------+-----------+--------------------------------------+| Server_id | Host | Port | Master_id | Slave_UUID                           |+-----------+------+------+-----------+--------------------------------------+|         4 |      | 3306 |         3 | df697b44-787c-11ee-9923-000c29900fda |+-----------+------+------+-----------+--------------------------------------+1 row in set, 1 warning (0.00 sec)#23机器# 这个已经说明23机器是22机器的从库mysql> show slave status \G;*************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: 172.16.185.22# 接下来我们还得看一下虚拟ip 是否从20机器到22机器上了#20机器,已经没有我们之前配这个了 ifconfig ens33:1 172.16.185.30/24[root@mysql-master opt]# ifconfigens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 172.16.185.20  netmask 255.255.255.0  broadcast 172.16.185.255inet6 fe80::a245:faff:1cfc:ebb  prefixlen 64  scopeid 0x20<link>inet6 fd15:4ba5:5a2b:1002:2821:dfdd:6485:4ef  prefixlen 64  scopeid 0x0<global>ether 00:0c:29:0e:bc:4f  txqueuelen 1000  (Ethernet)RX packets 106118  bytes 131404826 (125.3 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 69936  bytes 6834138 (6.5 MiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 127.0.0.1  netmask 255.0.0.0inet6 ::1  prefixlen 128  scopeid 0x10<host>loop  txqueuelen 1000  (Local Loopback)RX packets 32  bytes 2592 (2.5 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 32  bytes 2592 (2.5 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0#22机器 可以看出这个 ens33:1 已经漂移到22机器了[root@mysql-slave01 opt]# ifconfigens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 172.16.185.22  netmask 255.255.255.0  broadcast 172.16.185.255inet6 fe80::4f79:c1f3:2f3c:94dd  prefixlen 64  scopeid 0x20<link>inet6 fd15:4ba5:5a2b:1002:24c6:beab:f31c:1c2d  prefixlen 64  scopeid 0x0<global>ether 00:0c:29:2d:5b:50  txqueuelen 1000  (Ethernet)RX packets 99583  bytes 131426306 (125.3 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 66377  bytes 6593894 (6.2 MiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 172.16.185.30  netmask 255.255.0.0  broadcast 172.16.255.255ether 00:0c:29:2d:5b:50  txqueuelen 1000  (Ethernet)lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 127.0.0.1  netmask 255.0.0.0inet6 ::1  prefixlen 128  scopeid 0x10<host>loop  txqueuelen 1000  (Local Loopback)RX packets 407  bytes 56888 (55.5 KiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 407  bytes 56888 (55.5 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0# 最后我们使用应用程序,还是可以正常访问30机器,因为30是我们虚拟出来的vip,
# 这样就实现了mha+vip故障自动切换,也不用更改应用程序的连接地址

故障恢复步骤

当master故障之后,mha实现了master故障切换,应用只需要连接vip即可,但是我们恢复故障节点却有点麻烦,首先,当故障发生后,mha会删除配置文件的故障节点信息,如下所示:

# 我们的mha配置文件 /etc/mha/mysql_mha.cnf 中的变化
[server default]
manager_log=/var/log/mha/mysql_mha/manager.log
manager_workdir=/var/log/mha/mysql_mha
master_binlog_dir=/usr/local/mysql/data/
master_ip_failover_script=/etc/mha/master_ip_failover
password=123456
ping_interval=2
repl_password=123456
repl_user=repl
ssh_port=22
ssh_user=root
user=mha### 这个地方的之前我们是有server1的也就是20机器的配置,现在没有了,### 因为我们手动关闭了20机器的mysql,mha会自动将其移除### 现在我们故障恢复的话,就需要手动加上去的
[server2]
candidate_master=1
hostname=172.16.185.22
port=3306[server3]
candidate_master=1
hostname=172.16.185.23
port=3306

需要注意的是,故障发生后,masterha_manager进程还会自动退出。所以,现在我们需要做这么几件事:

 # 1. 修复原来崩掉的mysql; [root@mysql-master opt]# /usr/local/mysql/support-files/mysql.server start# 2. 登陆mysql,让其重新加入现在的主从集群,而如何加入现在的主从集群呢?#  这可以在manager的日志找到相关信息:
Thu Nov  9 16:59:22 2023 - [info]  All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='172.16.185.22', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=157, MASTER_USER='repl', MASTER_PASSWORD='xxx';
Thu Nov  9 16:59:22 2023 - [info] Executing master IP activate script:# 3. 即登陆20机器的mysql,执行CHANGE MASTER语句,启动slave,注意修改密码;
mysql> CHANGE MASTER TO MASTER_HOST='172.16.185.22', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=157, MASTER_USER='repl', MASTER_PASSWORD='123456';
mysql> start slave;# 这样20机器就成22的从库了
mysql> show slave status \G;;
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 172.16.185.22# 4. 把节点信息增加回配置文件 vim /etc/mha/mysql_mha.cnf[server1]candidate_master=1hostname=172.16.185.20port=3306# 5、重启mha即可。

相关文章:

Linux下部署MySQL-MHA环境

目前的环境如下&#xff1a;centos7 有四台虚拟机&#xff0c;20&#xff0c;21&#xff0c;22&#xff0c;23 20为master&#xff0c;21&#xff0c;22&#xff0c;23 为20的从库&#xff0c;21 为管理节点。 搭建MySQL主从复制的&#xff0c;可以参考我之前的文章 MHA&#…...

DaoWiki(基于Django)开发笔记 20231114-阿里云mysql外部访问

文章目录 创建mysql用户&#xff0c;用户远程访问配置阿里云安全策略下载安装mysql workbench 创建mysql用户&#xff0c;用户远程访问 创建用户 CREATE USER dao_wiki% IDENTIFIED BY password;授权访问dao_wiki数据库 GRANT ALL PRIVILEGES ON dao_wiki.* TO dao_wiki%; F…...

【UE5】 虚拟制片教程

目录 效果 步骤 一、下载素材 二、将视频转成PNG序列 三、开始虚拟制片 效果 步骤 一、下载素材 首先下载绿幕视频素材 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;jyfk 二、将视频转成PNG序列 打开“Adobe Premiere Pro”&#xff0c;导入素材 …...

集成Line、Facebook、Twitter、Google、微信、QQ、微博、支付宝的三方登录sdk

下载地址&#xff1a; https://githubfast.com/anerg2046/sns_auth 安装方式建议使用composer进行安装 如果linux执行composer不方便的话&#xff0c;可以在本地新建个文件夹&#xff0c;然后执行上面的composer命令&#xff0c;把代码sdk和composer文件一起上传到项目适当位…...

2022年09月 Python(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 已知字符串:s=“语文,数学,英语”,执行print(s.split(“,”))语句后结果是?( ) A: [‘语文’, ‘数学’, ‘英语’] B: [语文, 数学, 英语] C: [‘语文, 数学, 英语’] D: [‘语…...

C. Number of Pairs

time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You are given an array a&#xfffd; of n&#xfffd; integers. Find the number of pairs (i,j)(&#xfffd;,&#xfffd;) (1≤i<j≤n1≤…...

Js 保留关键字

JavaScript 关键字用于标识要执行的操作&#xff0c;和其他任何编程语言一样&#xff0c;JavaScript 保留了一些关键字为自己所用&#xff1b;这些关键字有些在目前的版本中可能没有使用&#xff0c;但在以后 JavaScript 扩展中会用到。 以下是JS中最重要的保留关键字&#xf…...

nodejs+vue+python+PHP+微信小程序-安卓-房产中介管理信息系统的设计与实现-计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…...

【系统架构设计】架构核心知识: 3.5 Redis和ORM

目录 一 Redis 1 Redis与MemCache 2 Redis分布式存储方案 3 Redis集群切片的方式 4 Redis数据分片...

linux时间同步

搭建集群时&#xff0c;都会先设置时间同步&#xff0c;否则会出现多种问题。 方式一&#xff1a; 1.安装ntp软件 yum install -y ntp 2.更新时区 删除原有时区&#xff1a;sudo rm -f /etc/localtime 加载新时区&#xff1a;sudo ln -s /usr/share/zoneinfo/Asia/Shangh…...

mysql++库connected与ping方法的区别

mysql库connected与ping方法的区别 前段时间开发公司代码的时候&#xff0c;我写了一个多线程调用数据库的函数&#xff0c;每个线程都是要连接数据库的&#xff0c;为了防止在查找数据之前&#xff0c;线程连接数据库断开&#xff0c;我使用定时器每20s检测一下线程连接数据库…...

拆位线段树 E. XOR on Segment

Problem - E - Codeforces 区间求和&#xff0c;区间异或的操作跟线段树的区间求和、区间相见相似&#xff0c;考虑用线段树。 发现数组初始值最多是1e6&#xff0c;有不到25位&#xff0c;可以知道异或最大值是这些位数全是1的情况。 发现可以对每一位进行运算就和。 我们开…...

JVM及其垃圾回收机制(GC)

目录 一.JVM内存区域划分 二.JVM类加载机制 类加载过程 类加载的时机 双亲委派模型 三.JVM垃圾回收机制&#xff08;GC) GC工作过程 1.找到垃圾/判断垃圾 &#xff08;1&#xff09;引用计数【python/PHP】 &#xff08;2&#xff09;可达性分析【Java】 2.对象释放…...

友元的三种实现

友元的三种实现 全局函数做友元类做友元成员函数做友元 #include <iostream> #include <string> using namespace std;//友元的三种实现 // //* 全局函数做友元 //* 类做友元 //* 成员函数做友元class Building {//告诉编译器 goodGay全局函数 是 Building类的好…...

聊聊logback的DuplicateMessageFilter

序 本文主要研究一下logback的DuplicateMessageFilter TurboFilter ch/qos/logback/classic/turbo/TurboFilter.java public abstract class TurboFilter extends ContextAwareBase implements LifeCycle {private String name;boolean start false;/*** Make a decision …...

WordPress 文档主题模板Red Line -v0.2.2

此主题作为框架&#xff0c;做承载第三方页面之用&#xff0c;例如飞书文档等&#xff0c; 您可以将视频图片等资源放第三方文档上&#xff0c;通过使用此主题做目录用。 此主题使用前后端分离开发&#xff0c;也使用了一些技术尽量不影响正常的SEO&#xff0c;还望注意。 源码…...

网络和Linux网络_1(网络基础)网络概念+协议概念+网络通信原理

目录 1. 网络简介 1.1 独立模式和互联网络模式 1.2 局域网LAN和广域网WAN 2. 协议和协议分层 2.1 协议的作用 2.2 协议分层 2.3 OSI七层模型 3.2 TCP/IP四层(五层)模型 3. 网络通信原理 3.1 协议报头 3.2 局域网和解包分用 3.3 广域网和跨网络 4. 网络中的地址 4…...

AI生成PPT工具——Gamma,结合GPT生成不错的效果

AI生成PPT工具——Gamma&#xff0c;结合GPT生成不错的效果 先告诉GPT我现在要参加一个比赛&#xff0c;请他帮忙梳理一下内容。当然整个过程需要不断调整&#xff0c;GPT生成的内容也不是一次就是最好的 不断调整之后让其列出提纲即可&#xff0c;如下&#xff1a; 紧接着我们…...

DcatAdmin使用模版文件时模板标签不生效

伪源码 PHP代码如下 public function 方法名(){return view(view_dir.view_name,[key1>value1]); }模版代码如下 <tr><td>键名</td> </tr> <tr><td>{{ $key1 }}</td> </tr>现象&#xff1a; 页面htmlt元素正常展示&…...

【算法】算法题-20231114

这里写目录标题 一、LCR 181. 字符串中的单词反转二、557. 反转字符串中的单词 III三、344. 反转字符串四、给定一个已按照升序排列的有序数组&#xff0c;找到两个数使得它们相加之和等于目标数。五、力扣第49题&#xff1a;字母异位词分组 一、LCR 181. 字符串中的单词反转 …...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...