当前位置: 首页 > 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. 字符串中的单词反转 …...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...