MySQL高可用搭建方案MHA

news2024/11/22 19:47:13

MHA架构介绍

MHA是Master High Availability的缩写,它是目前MySQL高可用方面的一个相对成熟的解决方案,其核心是使用perl语言编写的一组脚本,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~ 30秒之内自动完数据库的故障切换操作,并且能在最大程度上保证数据的一致性,以达到真正意义上的高可用。

基于MHA的架构不像MMM那样需要搭建主主复制,只需要搭建基本的主从复制架构即可。因为MHA在主库挂掉时,是在多个从库中选取出一个从库作为新的主库。MHA集群中的各节点彼此之间均需要基于ssh 互信通信,以实现远程控制及数据管理功能。

MHA提供功能

  • 可以监控Master节点是否可用
  • 当Master不可用时,能在多个Slave中选举出新的Master
  • 提供了主从切换和故障转移功能,MHA会尝试在宕机的Master上保存binlog,在最大程度上保证事务不丢失。但如果是Master所在服务器已经无法访问,或硬件层面出现了问题,则无法成功保存binlog
  • MHA可以与半同步复制结合,避免从库之间出现数据不一致的情况
  • 支持MySQL基于GTID和基于日志点的两种复制方式

MHA故障转移过程

  1. 尝试使用 ssh登录到宕机崩溃的Master节点上保存二进制日志事件(binlog events);
  2. 从多个Slave中识别含有最新更新的Slave,将其作为备选的Master;
  3. 然后基于该Slave同步差异的中继日志(relaylog)到其他的Slave上;
  4. 接着同步从原Master上保存的二进制日志事件(binlog events);
  5. 将备选的Master提升为新的Master;
  6. 使其他的Slave连接新的Master进行复制;
  7. 在新的Master启动vip地址,保证前端请求可以发送到新的Master。

MHA架构图

本次实验所用机器说明 

操作系统: CentOS Stream  9

数据库版本:MySQL8.0.36

MHA版本:0.58

名称角色IP
manger集群管理节点192.168.0.110
master主库192.168.0.104
slave1从库192.168.0.103
slave2从库192.168.0.102

本次实验的前提是建立在已经搭建好主从复制集群的前提下,MySQL的主从复制可以参考这篇文章:MySQL5.7.43 GTID主从复制配置

但是在使用MySQL8.0.36配置主从复制的时候和MySQL5.7.43有些地方不同需要注意

等主从复制集群搭建好后就可以开始按下面的步骤开始本次实验了

配置ssh免密登陆

生成密钥

ssh-keygen

生成密钥和公钥后就可以在/root/.ssh/下面看到,当然这是默认的路径

将密钥拷贝到其他服务器上

ssh-copy-id -i /root/.ssh/id_rsa root@192.168.0.104
ssh-copy-id -i /root/.ssh/id_rsa root@192.168.0.103
ssh-copy-id -i /root/.ssh/id_rsa root@192.168.0.102

 然后到集群中其他节点上进行同样的操作,由于是重复的操作这里就不演示了,最后测试能否免密登陆即可

安装MHA软件包

MHA下载地址

mha4mysql-manager-0.58.tar.gz:

wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz

mha4mysql-node-0.58.tar.gz:

wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gz

manager上安装mha4mysql-manager软件包


#下载依赖包
yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN
 
#进入安装目录
cd mha4mysql-manager-0.58
 
#编译安装
perl Makefile.PL
make && make install

在所有节点上安装mha4mysql-node软件包

#下载依赖包
yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN

#进入安装目录
cd mha4mysql-node-0.58
 
#编译安装
perl Makefile.PL
make && make install

关于执行perl Makefile.PL报错解决方法参考文章

Can't locate IPC/Cmd.pm in @INC (you may need to install the IPC::Cmd module

https://blog.51cto.com/u_16175492/6651879

这里模块的安装可能很慢请nai'xi

配置manger节点

创建MHA的配置文件存放目录和工作目录

[root@manager ~]# mkdir /etc/mha
[root@manager ~]# mkdir /home/mysql_mha

创建MHA的配置文件,并添加如下内容

这个组件secondary_check_script在安装的时候路径可能在/usr/bin/下面,需要移动到/usr/local/bin/下面 ,或者在下面的配置文件中更改路径

# mha用于访问数据库的账户和密码
user=mha
password=密码
# 指定mha的工作目录
manager_workdir=/home/mysql_mha

# mha日志文件的存放路径
manager_log=/home/mysql_mha/manager.log

# 指定mha在远程节点上的工作目录
remote_workdir=/home/mysql_mha

# 可以使用ssh登录的用户
ssh_user=root

# 用于主从复制的MySQL用户和密码
repl_user=repl
repl_password=密码
# 指定间隔多少秒检测一次
ping_interval=1

# 指定master节点存放binlog日志文件的目录
master_binlog_dir=/var/lib/mysql

# 指定一个脚本,该脚本实现了在主从切换之后,将虚拟IP漂移到新的Master上
master_ip_failover_script=/usr/local/bin/master_ip_failover

# 指定用于二次检查节点状态的脚本
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.0.104 -s 192.168.0.103 -s 192.168.0.102

# 配置集群中的节点信息
[server1]
hostname=192.168.0.104
port=3306
# 指定该节点可以参与Master选举
candidate_master=1

[server2]
hostname=192.168.0.103
port=3306
candidate_master=1

[server3]
hostname=192.168.0.102
port=3306
# 指定该节点不能参与Master选举
no_master=1

编写配置文件中所配置的master_ip_failover脚本,该脚本是根据MHA的官方示例修改的,MHA默认并没有提供。需要注意脚本中的几处地方需要根据实际情况进行修改,已用注释标明

#!/usr/bin/env perl

use strict;
use warnings FATAL => 'all';

use Getopt::Long;

my (
    $command, $orig_master_host, $orig_master_ip,$ssh_user,
    $orig_master_port, $new_master_host, $new_master_ip,$new_master_port,
    $orig_master_ssh_port,$new_master_ssh_port,$new_master_user,$new_master_password
);

# 这里定义的虚拟IP可以根据实际情况进行修改
my $vip = '192.168.0.111/24';
my $brdc = '192.168.0.255';
my $ifdev = 'eth0';
my $key = '1';
# 这里的网卡名称 “eth0” 需要根据你机器的网卡名称进行修改
my $ssh_start_vip = "sudo /sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "sudo /sbin/ifconfig eth0:$key down";
my $ssh_Bcast_arp= "sudo /sbin/arping -I bond0 -c 3 -A $vip";

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,
    'orig_master_ssh_port=i' => \$orig_master_ssh_port,
    'new_master_host=s'  => \$new_master_host,
    'new_master_ip=s'    => \$new_master_ip,
    'new_master_port=i'  => \$new_master_port,
    'new_master_ssh_port' => \$new_master_ssh_port,
    'new_master_user' => \$new_master_user,
    'new_master_password' => \$new_master_password

);

exit &main();

sub main {
    $ssh_user = defined $ssh_user ? $ssh_user : 'root';
    print "\n\nIN SCRIPT TEST====$ssh_user|$ssh_stop_vip==$ssh_user|$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();
     &start_arp();
            $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 $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
sub stop_vip() {
    `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}

sub start_arp() {
    `ssh $ssh_user\@$new_master_host \" $ssh_Bcast_arp \"`;
}
sub usage {
    print
    "Usage: master_ip_failover --command=start|stop|stopssh|status --ssh_user=user --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是无法调用的

[root@manager ~]# chmod a+x /usr/local/bin/master_ip_failover

根据配置文件中remote_workdir的配置,需在其他节点上创建MHA的远程工作目录

[root@master ~]# mkdir /home/mysql_mha
[root@slave-01 ~]# mkdir /home/mysql_mha
[root@slave-02 ~]# mkdir /home/mysql_mha

在配置文件中指定了让manager使用mha这个用户来访问数据库节点,所以需要在master节点上创建mha用户

create user 'mha'@'%' identified with mysql_native_password by '密码';
grant all privileges on *.* to 'mha'@'%';
flush privileges;

完成以上所有步骤后,在manager节点上使用masterha_check_sshmasterha_check_repl 对配置进行检查,其中masterha_check_ssh用于检查ssh登录是否正常,而masterha_check_repl则用于检查主从节点的复制链路是否正常

[root@manager ~]# masterha_check_ssh --conf=/etc/mha/mysql_mha.cnf
[root@manager ~]# masterha_check_repl --conf=/etc/mha/mysql_mha.cnf
[root@fa0b3e01d810 bin]# masterha_check_ssh --conf=/etc/mha/mysql_mha.cnf
Mon Apr  8 16:54:15 2024 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Mon Apr  8 16:54:15 2024 - [info] Reading application default configuration from /etc/mha/mysql_mha.cnf..
Mon Apr  8 16:54:15 2024 - [info] Reading server configuration from /etc/mha/mysql_mha.cnf..
Mon Apr  8 16:54:15 2024 - [info] Starting SSH connection tests..
Mon Apr  8 16:54:18 2024 - [debug]
Mon Apr  8 16:54:16 2024 - [debug]  Connecting via SSH from root@192.168.0.103(192.168.0.103:22) to root@192.168.0.104(192.168.0.104:22)..
Mon Apr  8 16:54:17 2024 - [debug]   ok.
Mon Apr  8 16:54:17 2024 - [debug]  Connecting via SSH from root@192.168.0.103(192.168.0.103:22) to root@192.168.0.102(192.168.0.102:22)..
Mon Apr  8 16:54:17 2024 - [debug]   ok.
Mon Apr  8 16:54:18 2024 - [debug]
Mon Apr  8 16:54:16 2024 - [debug]  Connecting via SSH from root@192.168.0.102(192.168.0.102:22) to root@192.168.0.104(192.168.0.104:22)..
Mon Apr  8 16:54:17 2024 - [debug]   ok.
Mon Apr  8 16:54:17 2024 - [debug]  Connecting via SSH from root@192.168.0.102(192.168.0.102:22) to root@192.168.0.103(192.168.0.103:22)..
Mon Apr  8 16:54:18 2024 - [debug]   ok.
Mon Apr  8 16:54:18 2024 - [debug]
Mon Apr  8 16:54:15 2024 - [debug]  Connecting via SSH from root@192.168.0.104(192.168.0.104:22) to root@192.168.0.103(192.168.0.103:22)..
Mon Apr  8 16:54:17 2024 - [debug]   ok.
Mon Apr  8 16:54:17 2024 - [debug]  Connecting via SSH from root@192.168.0.104(192.168.0.104:22) to root@192.168.0.102(192.168.0.102:22)..
Mon Apr  8 16:54:17 2024 - [debug]   ok.
Mon Apr  8 16:54:18 2024 - [info] All SSH connection tests passed successfully.
Use of uninitialized value in exit at /usr/local/bin/masterha_check_ssh line 44.

 

[root@fa0b3e01d810 bin]# masterha_check_repl --conf=/etc/mha/mysql_mha.cnf
Mon Apr  8 16:54:38 2024 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Mon Apr  8 16:54:38 2024 - [info] Reading application default configuration from /etc/mha/mysql_mha.cnf..
Mon Apr  8 16:54:38 2024 - [info] Reading server configuration from /etc/mha/mysql_mha.cnf..
Mon Apr  8 16:54:38 2024 - [info] MHA::MasterMonitor version 0.58.
Mon Apr  8 16:54:40 2024 - [info] Multi-master configuration is detected. Current primary(writable) master is 192.168.0.104(192.168.0.104:3306)
Mon Apr  8 16:54:40 2024 - [info] Master configurations are as below:
Master 192.168.0.103(192.168.0.103:3306), replicating from 192.168.0.104(192.168.0.104:3306), read-only
Master 192.168.0.104(192.168.0.104:3306), replicating from 192.168.0.103(192.168.0.103:3306)

Mon Apr  8 16:54:40 2024 - [info] GTID failover mode = 1
Mon Apr  8 16:54:40 2024 - [info] Dead Servers:
Mon Apr  8 16:54:40 2024 - [info] Alive Servers:
Mon Apr  8 16:54:40 2024 - [info]   192.168.0.104(192.168.0.104:3306)
Mon Apr  8 16:54:40 2024 - [info]   192.168.0.103(192.168.0.103:3306)
Mon Apr  8 16:54:40 2024 - [info]   192.168.0.102(192.168.0.102:3306)
Mon Apr  8 16:54:40 2024 - [info] Alive Slaves:
Mon Apr  8 16:54:40 2024 - [info]   192.168.0.103(192.168.0.103:3306)  Version=8.0.36 (oldest major version between slaves) log-bin:enabled
Mon Apr  8 16:54:40 2024 - [info]     GTID ON
Mon Apr  8 16:54:40 2024 - [info]     Replicating from 192.168.0.104(192.168.0.104:3306)
Mon Apr  8 16:54:40 2024 - [info]     Primary candidate for the new Master (candidate_master is set)
Mon Apr  8 16:54:40 2024 - [info]   192.168.0.102(192.168.0.102:3306)  Version=8.0.36 (oldest major version between slaves) log-bin:enabled
Mon Apr  8 16:54:40 2024 - [info]     GTID ON
Mon Apr  8 16:54:40 2024 - [info]     Replicating from 192.168.0.104(192.168.0.104:3306)
Mon Apr  8 16:54:40 2024 - [info]     Not candidate for the new Master (no_master is set)
Mon Apr  8 16:54:40 2024 - [info] Current Alive Master: 192.168.0.104(192.168.0.104:3306)
Mon Apr  8 16:54:40 2024 - [info] Checking slave configurations..
Mon Apr  8 16:54:40 2024 - [info] Checking replication filtering settings..
Mon Apr  8 16:54:40 2024 - [info]  binlog_do_db= , binlog_ignore_db=
Mon Apr  8 16:54:40 2024 - [info]  Replication filtering check ok.
Mon Apr  8 16:54:40 2024 - [info] GTID (with auto-pos) is supported. Skipping all SSH and Node package checking.
Mon Apr  8 16:54:40 2024 - [info] Checking SSH publickey authentication settings on the current master..
Mon Apr  8 16:54:40 2024 - [info] HealthCheck: SSH to 192.168.0.104 is reachable.
Mon Apr  8 16:54:40 2024 - [info]
192.168.0.104(192.168.0.104:3306) (current master)
 +--192.168.0.103(192.168.0.103:3306)
 +--192.168.0.102(192.168.0.102:3306)

Mon Apr  8 16:54:40 2024 - [info] Checking replication health on 192.168.0.103..
Mon Apr  8 16:54:40 2024 - [info]  ok.
Mon Apr  8 16:54:40 2024 - [info] Checking replication health on 192.168.0.102..
Mon Apr  8 16:54:40 2024 - [info]  ok.
Mon Apr  8 16:54:40 2024 - [info] Checking master_ip_failover_script status:
Mon Apr  8 16:54:40 2024 - [info]   /usr/local/bin/master_ip_failover --command=status --ssh_user=root --orig_master_host=192.168.0.104 --orig_master_ip=192.168.0.104 --orig_master_port=3306


IN SCRIPT TEST====root|sudo /sbin/ifconfig eth0:1 down==root|sudo /sbin/ifconfig eth0:1 192.168.0.111/24===

Checking the Status of the script.. OK
Mon Apr  8 16:54:40 2024 - [info]  OK.
Mon Apr  8 16:54:40 2024 - [warning] shutdown_script is not defined.
Mon Apr  8 16:54:40 2024 - [info] Got exit code 0 (Not master dead).

MySQL Replication Health is OK.

以上检测都通过后,就可以启动MHA服务了。启动命令如下

[root@manager ~]# nohup masterha_manager --conf=/etc/mha/mysql_mha.cnf &

启动完成后,可以使用ps命令查看masterha_manager进程是否存在,如下存在则代表启动成功

[root@manager ~]# ps aux |grep masterha_manager
root       2842  0.3  1.1 299648 22032 pts/0    S    18:30   0:00 perl /usr/bin/masterha_manager --conf=/etc/mha/mysql_mha.cnf
root       2901  0.0  0.0 112728   976 pts/0    R+   18:31   0:00 grep --color=auto masterha_manager
[root@manager ~]# 

 最后我们需要到master节点上,手动去配置虚拟IP。因为MHA只会在主从切换时漂移虚拟IP到新的Master节点,而不会在第一次启动时主动去设置Master的虚拟IP,所以我们需要手动设置。设置虚拟IP的命令如下

[root@master ~]# ifconfig eth0:1 192.168.0.111/24

 

到此为止,我们就已经完成了MHA高可用架构的搭建,接下来我们对其进行一些简单的测试。例如,测试下是否能正常ping 通虚拟IP,毕竟应用端访问数据库时连接的是虚拟IP,所以首先得确保虚拟IP是能够被访问的。如下

MHA架构优缺点

优点:

  • 使用Perl脚本语言开发并且完全开源,开发者可以根据自己的需求进行二次开发
  • 能够支持基于GTID和基于日志点的复制模式
  • MHA在进行故障转移时更不易产生数据丢失
  • 在一个监控节点上可以监控多个Replication集群

缺点:

  • MHA默认不提供虚拟IP功能,需要自行编写脚本或利用第三方工具来实现虚拟IP的配置
  • MHA启动后只会对Master进行监控,不会对Slave进行监控,也无法监控复制链路的情况
  • 集群环境需要能够通过 ssh免密登录,存在一定的安全隐患
  • MHA没有提供对Slave的读负载均衡功能,需要通过第三方工具来实现

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

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

相关文章

Xshell配置跳板机访问

文章目录 需求连接主机A配置连接主机B配置Xftp 需求 本机需要访问内网主机B,本机目前只能访问主机A,主机A能够访问主机B 思路:主机A作为跳板机(代理)访问主机B 工具:Xshell,Xftp 前提 你需要…

服务器安装完SqlServer远程电脑连接不了

1、将服务器的TCP/IP启用 2、重新启动服务 cmd输入services.msc

[从零开始学习Redis | 第九篇] 深入了解Redis数据类型

前言: 在现代软件开发中,数据存储和处理是至关重要的一环。为了高效地管理数据,并实现快速的读写操作,各种数据库技术应运而生。其中,Redis作为一种高性能的内存数据库,广泛应用于缓存、会话存储、消息队列…

openGauss_5.1.0 企业版快速安装及数据库连接:单节点容器化安装

目录 📚第一章 官网信息📚第二章 安装📗下载源码📗下载安装包📗修改版本📗解压安装包📗运行buildDockerImage.sh脚本📗docker操作📕查看docker镜像📕启动dock…

面试算法-164-K 个一组翻转链表

题目 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内…

【会员单位】泰州玉安环境工程有限公司

中华环保联合会理事单位 水环境治理专业委员会副主任委员单位 我会为会员单位提供服务: 1、企业宣传与技术项目对接; 2、企业标准、行业标准制定; 3、院士专家指导与人才培训 4、国际与国内会议交流 5、专精特新、小巨人等申报认证 6…

Linux-docker安装数据库redis

1.拉取redis镜像 docker pull redis # 下载最新的redis版本 docker pull redis:版本号 # 下载指定的redis版本ps:我这是已经下载最新版本的redis 2.查看redis镜像 docker images3.创建挂在路径并授权 mkdir -p /usr/local/redis/data mkdir -p /usr/local…

微软Office吊打WPS ?不一定,WPS未来被它“拿捏”了

微软Office Plus吊打WPS Office? 微软的Office套件在全球范围内内享有盛誉,其强大的功能和广泛的应用场景使其在办公、娱乐乃至生活的各个角落都显得不可或缺。 而与之相对,WPS Office作为国内办公软件的佼佼者,与微软的较量已历…

python|reset_index

reset_index可以重置索引index,比如说将A、B、C删除一列后,重置成数字。

【LAMMPS学习】八、基础知识(1.4)多副本模拟

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

P8786 [蓝桥杯 2022 省 B] 李白打酒加强版

【dfs题解】---只有50分 (头一回自己用dfs做出来了dp的hard等级的大题&#xff0c;从来没有拿50分这么高兴过哈哈哈哈哈) #include <bits/stdc.h> using namespace std; int n,m; long long ans0; const long long mol1e97; void dfs(int h,int d,int sum) {if(h<0|…

【数据结构】稀疏矩阵的快速转置

【数据结构】稀疏矩阵的转置&#xff08;普通转置 和 快速转置&#xff09; 目录 【数据结构】稀疏矩阵的转置&#xff08;普通转置 和 快速转置&#xff09;三元表稀疏矩阵的转置方法一&#xff08;普通转置&#xff09;复杂度为O(T.muT.nu)方法二&#xff1a;快速转置 复杂度…

Socks5代理IP如何使用?详细教程解析

当我们在互联网上浏览网页、下载文件或者进行在线活动时&#xff0c;隐私和安全问题常常被提及。在这样的环境下&#xff0c;一个有效的解决方案是使用Sock5IP。本教程将向您介绍Sock5IP的使用方法&#xff0c;帮助您保护个人隐私并提升网络安全。 一、什么是Sock5IP&#xff1…

重看Spring聚焦ApplicationContext分析

一、理解下ApplicationContext的设计 &#xff08;一&#xff09;功能性的理解 ApplicationContext 提供了一个轻量级、灵活、可扩展的容器&#xff0c;能帮助我们更加轻松地构建和管理复杂的应用程序&#xff0c;其通过依赖注入和控制反转等技术&#xff0c;降低了组件之间的…

2024年第五届计算机视觉与信息技术国际会议(CVIT 2024)即将召开!

2024年第五届计算机视觉与信息技术国际会议&#xff08;CVIT 2024&#xff09;将于2024年8月16-18日在北京举行。CVIT 2024由北方工业大学主办&#xff0c;国内外的专家学者将齐聚一堂&#xff0c;共同分享最新的技术突破、研究方法和应用案例&#xff0c;共同推动计算机视觉与…

LeetCode-62. 不同路径【数学 动态规划 组合数学】

LeetCode-62. 不同路径【数学 动态规划 组合数学】 题目描述&#xff1a;解题思路一&#xff1a;动态规划&#xff0c;动规五部曲解题思路二&#xff1a;动态规划&#xff08;版本二&#xff09;解题思路三&#xff1a;数论 题目描述&#xff1a; 一个机器人位于一个 m x n 网…

泰山众筹模式:新零售市场的创新引领与共赢之路

在数字经济的浪潮下&#xff0c;传统的商业模式正面临挑战&#xff0c;而泰山众筹模式凭借其新颖的理念和独特的操作方式&#xff0c;正逐渐成为新零售市场的一股新势力。它不仅改变了消费者的购物体验&#xff0c;还为企业带来了新的发展机遇。 首先&#xff0c;泰山众筹模式将…

【Java】JDK1.8 HashMap源码,put源码详细讲解

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 在Java中&#xff0c;HashMap结构是被经常使用的&#xff0c;在面试当中也是经常会被问到的。这篇文章我给大家分享一下我对于HashMap结构源码的理解。 HashMap的存储与一般的数组不同&#xff0c;HashMap的每一个元素存…

Springboot集成RabbitMq+延时队列

1. 引入jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2.配置yml 2.1 配置生产者yml spring:rabbitmq:host: localhostport: 5672virtual-host: …

C语言.指针(5)

指针&#xff08;5&#xff09; 1.sizeof和strlen的对比1.1sizeof1.2strlen1.3sizeof和strlen的对比 2.数组和指针笔试题解析2.1一维数组2.2字符数组2.3二维数组 3.指针运算笔试题解析3.1 题目13.2 题目23.3 题目33.4 题目43.5 题目53.6 题目63.7 题目7 1.sizeof和strlen的对比…