MySQL高可用 集群(MHA)

news2024/10/3 10:43:34

1. MHA集群概述

  • 集群的定义:多台服务器一起提供相同的服务,如(web集群)等。
  • 常见集群的分类:
  1. LB(负载均衡集群):服务器共同平均分摊处理客户端的多次连接请求。
    HA(高可用集群):主备模式,主宕机后备用服务器自动接替工作。
  • 常见集群服务软件:
    LB:LVS、Nginx、haproxy等。
    HA:Keepalived、heartbeat、

1.1. 软件介绍

  • MHA(Master High Availability)
  • 由日本DeNA公司youshimaton通过perl脚本语言开发。
  • 是一套优秀的实现MySQL高可用的解决方案。
  • 数据库的自动故障切换操作能做到在0~30秒之内完成。
  • MHA能确保在故障切换过程中最大限度保证数据的一致性,以达到真正意义的高可用。

1.2. MHA组成

  • MHA Master(管理节点)
  • 管理所有数据库服务器
  • 可以单独部署在一台独立的机器上
  • 也可以部署在某台数据库服务器上
  • MHA Node(数据节点)
  • 存储数据的MySQL服务器
  • 运行在每台MySQL服务器上

1.3. MHA工作过程

  • MHA集群架构图:
    在这里插入图片描述
  • MHA 工作过程:
  • 由Manager 定时探测集群中的master节点
  • 当master故障时,Manager自动将拥有最新数据的slave提升为新的master,另一台slave主机将自动变为新master的从库,所以集群组里面的主机应该是一主多从结构。

1.4. IP规划

IP地址主从同步角色集群角色主机名
192.168.2.10客户端client10
192.168.2.20管理主机mha20
192.168.2.30主库当前主库mysql30
192.168.2.40从库备用主库mysql40
192.168.2.50从库备用主库mysql50
192.168.2.100VIP地址

2. 部署MHA集群

2.1. 准备集群环境

2.1.1. 安装依赖包

  • 安装系统自带prel包
##需要在mha20、mysql30、mysql40、mysql50安装
[root@mha20 ~]# 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

[root@mha20 ~]# ls
perl-Config-Tiny-2.14-7.el7.noarch.rpm          perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm  perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm       perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Mail-Sender-0.8.23-1.el7.noarch.rpm        perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
##在mha20、mysql30、mysql40、mysql50安装
[root@mha20 ~]# yum -y install perl-*.rpm

2.1.2. 配置ssh密钥对认证登录

  • 配置管理主机mha20可以ssh免密登录所有数据库服务器
##在mha20上创建秘钥对
[root@mha20 ~]# ssh-keygen  ---全部回车即可
##把秘钥对中公钥拷贝给mysql30、mysql40、mysql50
[root@mha20 ~]# ssh-copy-id root@192.168.2.30
[root@mha20 ~]# ssh-copy-id root@192.168.2.40
[root@mha20 ~]# ssh-copy-id root@192.168.2.50
##验证mha20 ssh登录mysql30、mysql40、mysql50是否需要密码,不用密码才是对的,这里不展示了。
  • 配置所有数据库服务器彼此之间可以ssh免密登录
##在mysql30操作如下:
[root@mysql30 ~]# ssh-keygen
[root@mysql30 ~]# ssh-copy-id root@192.168.2.40
[root@mysql30 ~]# ssh-copy-id root@192.168.2.50
##在mysql40操作如下:
[root@mysql40 ~]# ssh-keygen
[root@mysql40 ~]# ssh-copy-id root@192.168.2.30
[root@mysql40 ~]# ssh-copy-id root@192.168.2.50
##在mysql50操作如下:
[root@mysql50 ~]# ssh-keygen
[root@mysql50 ~]# ssh-copy-id root@192.168.2.30
[root@mysql50 ~]# ssh-copy-id root@192.168.2.40
##执行完后验证mysql30、mysql40、mysql50是否可以彼此之间免密登录,这里就不展示了。

2.1.3. 配置一主多从

  • 需要关闭防火墙和selinux

2.1.3.1. 配置主库(mysql30)

##修改配置文件开启binlog日志
[root@mysql30 ~]# vim /etc/my.cnf
[mysqld]
....
log_bin=mysql30
server_id=30
##安装半同步模块
plugin-load=rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so
##启动半同步模块
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
##禁止删除本机中继日志
relay_log_purge=0
##重启mysql服务
[root@mysql30 ~]# systemctl restart mysqld
##查看binlog日志文件名称和pos值
mysql> show master status;
+----------------+----------+--------------+------------------+-------------------+
| File           | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------+----------+--------------+------------------+-------------------+
| mysql30.000001 |      154 |              |                  |                   |
+----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
##创建授权用户
mysql> grant replication slave on *.* to 'master'@'%' identified by '1234';

2.1.3.2. 配置从服务器(mysql40)

##修改配置文件
[root@mysql40 ~]# vim /etc/my.cnf
[mysqld]
....
server_id=40
log_bin=master40
plugin-load=rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
relay_log_purge=0

##重启服务
[root@mysql40 ~]# systemctl restart mysqld
##指定主服务器,pos的值必须是在主库创建授权用户之前,不然从库无法同步授权用户,需要手动创建授权用户。
mysql> change master to
    -> master_host="192.168.2.30",
    -> master_user="master",
    -> master_password="1234",
    -> master_log_file="mysql30.000001",
    -> master_log_pos=154;
##启动slave
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
##查看是否配置成功
mysql> show slave status\G;  
查看Slave_IO_Running和Slave_SQL_Running是yes那就配置成功,这里不展示了。

2.1.3.3. 配置从服务器(mysql50)

##修改配置文件
[root@mysql50 ~]# vim /etc/my.cnf
[mysqld]
....
server_id=50
log_bin=master50
plugin-load=rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
relay_log_purge=0

##重启服务
[root@mysql50 ~]# systemctl restart mysqld
##指定主服务器
mysql> change master to
    -> master_host="192.168.2.30",
    -> master_user="master",
    -> master_password="1234",
    -> master_log_file="mysql30.000001",
    -> master_log_pos=154;
##启动slave
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
##查看是否配置成功
mysql> show slave status\G;  
查看Slave_IO_Running和Slave_SQL_Running是yes那就配置成功,这里不展示了。

2.2. 配置管理节点(mha20)

2.2.1. 安装mha软件包

##下载软件包
[root@mha20 ~]# wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz
[root@mha20 ~]# wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
##安装mha4mysql-node
[root@mha20 ~]# yum -y install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
##源码编译安装mha4mysql-manager
[root@mha20 ~]# tar -xf mha4mysql-manager-0.58.tar.gz -C /usr/local/
[root@mha20 ~]#  cd /usr/local/mha4mysql-manager-0.58/
[root@mha20 ~]#  perl Makefile.PL  --预编译有报错很有可能是依赖包的问题。
[root@mha20 ~]# make;make install
##配置环境变量:
[root@mha20 ~]#  echo "export PATH=/usr/local/mha4mysql-manager-0.58/bin:$PATH" >/etc/profile.d/mha4mysql.sh
[root@mha20 ~]# . /etc/profile.d/mha4mysql.sh
[root@mha20 ~]# echo $PATH

2.2.2. 管理集群命令

[root@mha20 ~]# ls /usr/local/mha4mysql-manager-0.58/bin/
masterha_check_repl  masterha_check_status  masterha_manager         masterha_master_switch    masterha_stop
masterha_check_ssh   masterha_conf_host     masterha_master_monitor  masterha_secondary_check
命令作用
masterha_check_ssh检查MHA的SSH配置状态
masterha_check_repl检查MySQL复制状态
masterha_manager启动MHA
masterha_check_status检测MHA运行状态
masterha_stop停止MHA
masterha_master_monitor检测master是否宕机
masterha_master_switch控制故障转移(自动或者手动)
masterha_conf_host添加或删除配置的server信息

2.2.3. 修改主配置文件

##创建工作目录
[root@mha20 ~]# mkdir  /etc/mha
[root@mha20 ~]# cp -r /usr/local/mha4mysql-manager-0.58/samples/conf/app1.cnf /etc/mha/
## 修改配置文件
[root@mha20 mha]# vim /etc/mha/app1.cnf
修改内容如下:
[server default]          ---管理服务的默认配置
manager_workdir=/etc/mha      ---指定工作目录路径
manager_log=/etc/mha/manager.log    ---指定管理服务运行后日志文件的名称和存放路径
master_ip_failover_script=/etc/mha/master_ip_failover      ---指定故障切换脚本
ssh_user=root    ---指定ssh连接时候的用户名和端口号
ssh_port=22

repl_user=master       ---指定主库授权的用户名和密码
repl_password=1234

user=mysqldb				---指定监控用户和密码,三台mysql需要一样。
password=1234

ping_interval=1         ---ping间隔时长
[server1]       			---指定第一台mysql服务器
hostname=192.168.2.30       ---指定第一台mysqlIP地址
port=3306                   ---端口号
candidate_master=1          ---指定该数据库服务器参与竞选主库,1代表参与。

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

[server3]
hostname=192.168.2.50
port=3306
candidate_master=1

2.2.4. 创建故障切换脚本

[root@mha20 mha]# cp -r /usr/local/mha4mysql-manager-0.58/samples/scripts/master_ip_failover /etc/mha/
##给脚本添加执行权限
[root@mha20 mha]# chmod +x /etc/mha/master_ip_failover
##下面是完整的脚本文件,需要修改VIP地址和网卡名称。
[root@mha20 mha]# vim  /etc/mha/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.2.100/24';     #指定VIP地址
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";   #这里需要注意的就是网卡名称,没人的主机网卡名不一样需要注意。
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";

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 $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
sub stop_vip() {
    return 0  unless  ($ssh_user);
    `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";
}

2.2.5. 在主库上创建VIP地址(mysql30)

[root@mysql30 ~]# ifconfig ens33:1 192.168.2.100
[root@mysql30 ~]# ifconfig ens33:1
ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.2.100  netmask 255.255.255.0  broadcast 192.168.2.255
        ether 00:0c:29:88:4f:b0  txqueuelen 1000  (Ethernet)

2.3. 配置数据库服务器(mysql30-50)

2.3.1. 在数据库服务器安装mha4mysql-node软件包

##在mysql30、mysql40、mysql50执行如下命令
[root@mysql30 ~]# wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
[root@mysql30 ~]# yum -y install mha4mysql-node-0.58-0.el7.centos.noarch.rpm

2.3.2. 创建监控用户

##监控用户是在管理服务器配置文件上指定的:user=xxx,password=xxxx
##在主库上执行,从库自然同步过去。
mysql> grant all on *.* to 'mysqldb'@'%' identified by '1234';
Query OK, 0 rows affected, 1 warning (0.00 sec)

3. 验证配置

3.1. 测试ssh配置

##在mha20服务器上执行测试:
[root@mha20 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
....
All SSH connection tests passed successfully    ---最后出现这个就说明配置正确。

3.2. 测试主从配置

[root@mha20 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf
...
MySQL Replication Health is OK.    ---出现这个说明MySQL复制运行状况正常

3.3. 启动管理服务

  • 使用 masterha_manager 命令启动管理服务

—— --remove_dead_master_conf是指当主库宕机的时候,会删除宕机主库的配置,否则主库宕机后服务就会无法启动;–ignore_last_failover是指忽略 xxx.health 文件,意思是当主库宕机之后,服务会在规定的时间内连接剩下的从服务器来选举出主库。如果启动服务的时候不加这个选项,那么超过规定时间还没连接上的时候,就不会再去切换主库了,加上这个选项后,既是在规定时间内没能连接上剩下的从服务器,之后也会继续尝试连接,知道选举出主库进行切换。

##启动
[root@mha20 ~]# masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf   --ignore_last_failover
##后台启动
nohup  masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf   --ignore_last_failover  &
##查看mha运行状态:
[root@mha20 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:39934) is running(0:PING_OK), master:192.168.2.30
##如果想停止服务可以输入下面命令
[root@mha20 ~]# masterha_stop --conf=/etc/mha/app1.cnf

4 测试高可用

4.1. 模拟主库服务器故障

  • 模拟故障的方法:
  • 停止mysqld服务
  • 关机
  • 故障切换过程:
    当管理主机连接不上mysql主服务器时,就认为mysql主服务器宕机了,然后管理主机的服务自动停掉,然后调用故障切换脚本,删除管理主机中关于mysql主服务器的内容(/etc/mha/app1.cnf)然后脚本会在选举出来的主服务器创建VIP地址。
##在mysql30主服务关闭mysql服务
[root@mysql30 ~]# systemctl stop mysqld.service
##检查管理主机的配置文件是否删除mysql30的信息。
[root@mha20 ~]# grep "192.168.2.30" /etc/mha/app1.cnf   --执行这条命令可以看的出来,已经没有mysql30的信息了。
##在管理主机上查看日志文件master现在是哪台?
[root@mha20 ~]# grep "new master" /etc/mha/manager.log
Fri Feb 24 14:58:16 2023 - [info] Searching new master from slaves..
192.168.2.40(192.168.2.40:3306) (new master)
Fri Feb 24 14:58:16 2023 - [info] Getting new master's binlog name and position..
Enabling the VIP - 192.168.2.100/24 on the new master - 192.168.2.40
Fri Feb 24 14:58:17 2023 - [info]  Resetting slave 192.168.2.50(192.168.2.50:3306) and starting replication from the new master 192.168.2.40(192.168.2.40:3306)..
Fri Feb 24 14:58:18 2023 - [info] Resetting slave info on the new master..
Selected 192.168.2.40(192.168.2.40:3306) as a new master.
##可以看的出来mysql40被选举出来作为master
##在mysql40上查看VIP地址是否在
[root@mysql40 ~]# ifconfig ens33:1
ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.2.100  netmask 255.255.255.0  broadcast 192.168.2.255
        ether 00:0c:29:83:e3:d4  txqueuelen 1000  (Ethernet)
##查看mysql50的slave状态
[root@mysql50 ~]# mysql -uroot -p1234 -e "show slave status \G;"|head -13|tail -11
mysql: [Warning] Using a password on the command line interface can be insecure.
                  Master_Host: 192.168.2.40     ---可以看的出来mysql40已经是masterl 
                  Master_User: master
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master40.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: mysql50-relay-bin.000002
                Relay_Log_Pos: 319
        Relay_Master_Log_File: master40.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes	
##启动管理主机的mha服务
[root@mha20 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf   --ignore_last_failover &
##查看mha状态
[root@mha20 ~]# masterha_check_status  --conf=/etc/mha/app1.cnf
app1 (pid:57758) is running(0:PING_OK), master:192.168.2.40

4.2. 修复故障的数据库服务器

4.2.1. 数据服务器的配置

  • 具体操作如下:
  1. 启动mysql服务
  2. 与主服务器数据一致
  3. 指定主服务器信息
  4. 启动slave进程
  5. 查看slave状态信息
## 启动mysql30服务
[root@mysql30 ~]# systemctl start mysqld
##指定主库服务器信息。
mysql> change master to
    -> master_host="192.168.2.40",
    -> master_user="master",
    -> master_password="1234",
    -> master_log_file="master40.000001",
    -> master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.00 sec)
##注意这里指定的binlog的文件名称master40.000001的原因是因为mysql40第一次变成master所以他的文件名是从master40.000001开始的。
##然而pos值=154的原因是为了mysql30和mysql40数据一致,因为假如你查看现在的mysql40的pos值应该会有变化,因为mysql30宕机后生产环境下肯定会往里面写入数据,但是pos值是从154开始的所以直接指定154才能很快的保证数据一致。
mysql> start slave;
##这里就不显示slave的状态了。

4.2.2. 配置管理主机

##停止mha服务
[root@mha20 ~]# masterha_stop   --conf=/etc/mha/app1.cnf
##修改mha主配置文件
[root@mha20 ~]# vim /etc/mha/app1.cnf
....
##添加如下:
[server1]
candidate_master=1
hostname=192.168.2.30
port=3306
##启动mha服务
[root@mha20 ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf   --ignore_last_failover &
##查看mha状态
[root@mha20 ~]# masterha_check_status   --conf=/etc/mha/app1.cnf
app1 (pid:60567) is running(0:PING_OK), master:192.168.2.40

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

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

相关文章

python库streamlit学习笔记

什么是streamlit&#xff1f; Streamlit是一个免费的开源框架&#xff0c;用于快速构建和共享漂亮的机器学习和数据科学Web应用程序。它是一个基于Python的库&#xff0c;专为机器学习工程师设计。数据科学家或机器学习工程师不是网络开发人员&#xff0c;他们对花几周时间学习…

Python近红外光谱分析与机器学习、深度学习方法融合实践技术

、 第一n入门基础【理论讲解与案 1、Python环境搭建&#xff08; 下载、安装与版本选择&#xff09;。 2、如何选择Python编辑器&#xff1f;&#xff08;IDLE、Notepad、PyCharm、Jupyter…&#xff09; 3、Python基础&#xff08;数据类型和变量、字符串和编码、list和tu…

教你如何搭建培训机构-教务管理系统,demo可分享

1、简介 1.1、案例简介 本文将介绍&#xff0c;如何搭建培训机构-教务管理。 1.2、应用场景 可对排课、上课点名、课堂点评、作业发布进行管理。 2、设置方法 2.1、表单搭建 1&#xff09;新建表单【学员】&#xff0c;字段设置如下&#xff1a; 名称类型学员成员单选姓…

STM32—独立看门狗(IWDG)

什么是看门狗&#xff1f; 在由单片机构成的微型计算机系统中&#xff0c;由于单片机的工作常常会收到来自外界电磁场的干扰&#xff0c;造成程序跑飞&#xff0c;而陷入死循环&#xff0c;程序的正常运行被打断&#xff0c;由单片机控制的系统无法继续工作&#xff0c;会造成…

Python Unittest框架

1、unittest简介 unittest是Python自带的单元测试框架,具备编写用例、组织用例、执行用例、输出报告等自动化框架的条件,主要适用于单元测试,可以用来作自动化测试框架的用例组织执行框架。 2、unittest框架的特性: 提供用例组织与执行:当测试用例只有几条的时候可以不考虑…

notepad++如何快速批量搜索复制,3步搜索+标记所在行+复制书签行

一。缘起 用习惯了 某edit, 突然用notepad很不习惯&#xff0c;至少3处不习惯&#xff1a;列操作&#xff0c;批量复制搜索行&#xff0c;和是txt文件比较。 另外一直坚持认为&#xff0c;不提供快捷键操作的软件不是好软件&#xff1a;&#xff09;当下屏幕对眼睛迫害至深的时…

【正点原子FPGA连载】第十七章双核AMP实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十七章双核AMP…

使用FVM管理Flutter SDK版本切换

window下配置fvm版本切换工具&#xff0c;管理flutter sdk版本的切换 一、配置flutter dart环境 使用前需要先配置flutter dart环境&#xff0c;才能下载jvm 已经配置好环境的&#xff0c;在命令框中输入dart --version验证是否安装成功 C:\Users\topqizhi>dart --versi…

前端导出表格 修改样式(xlsx-style)用法

一. 应用机制 xlsx-style 修改样式的机制 就是选中哪一行&#xff0c;那一列或者哪一个 然后去修改 比如表格最左上角的一个格子 坐标是&#xff08;0&#xff0c; 0&#xff09;下标 也可以叫做 A1 选中之后 可以修改其样式 二. 实战讲解 1. 下载依赖 npm install xls…

了解Python语言和版本

1.1 任务1了解Python语言和版本 Python 语言的名字来自于一个著名的电视剧"Monty Pythons Flying Cireus",Python之父 Guido van Rossum是这部电视剧的狂热爱好者&#xff0c;所以把他设计的语言命名为Python。 Python 是一门跨平台、开源、免费的解释型高级动态编…

2023年,尽量还是别裸辞了吧···

你知道什么叫 度日如年 吗&#xff1f;就是在家待业的每一天。你知道什么叫心焦如焚吗&#xff1f;就是投出100份简历却等不来一个回应。 当前就业环境&#xff0c;裁员、失业消息满天飞&#xff0c;好像能有一份工作就不错了&#xff0c;更别说高薪。其实这只是一方面。另一方…

电商平台商品详情接口的应用场景

API接口的定义价格、库存量、发货地点等。此外&#xff0c;它还可以提供商品的详细信息&#xff0c;包括商品的图片、详细描述、规格参数、售后服务等。这些信息可以帮助用户更好地了解商品&#xff0c;从而更好地选择商品。其次&#xff0c;电商平台商品详情接口的实现原理是基…

关于Qt程序打包后运行库依赖的常见问题分析及解决方法

目录 一. 大致如下常见问题&#xff1a; &#xff08;1&#xff09;找不到程序所依赖的Qt库 version Qt_5 not found (required by &#xff08;2&#xff09;Could not Load the Qt platform plugin "xcb" in "" even though it was found &#xff0…

Antd Select 设置偏移量

对于Select 组件我要想实现如下效果&#xff0c;该如何处理呢&#xff1f;我们查看你select组件https://ant.design/components/select-cn#select-props 并没有相关的属性API,如何去处理这个呢&#xff1f;添加 dropdownAlign{{ offset: [0, 30] }} 这个属性&#xff0c;可以设…

在Linux中进行rocketmq及rocketmq控制台安装与配置

rocketmq下载安装的版本&#xff1a;rocketmq-rocketmq-all-5.0.0.tar.gz rocketmq控制台下载安装的版本&#xff1a;rocketmq-externals-rocketmq-console-1.0.0.tar.gz rocketmq安装 第一步&#xff0c;下载server-jre-8u202-linux-x64.tar.gz安装包。 登录网址&#xff…

UVa 1604 Cubic Eight-Puzzle 立体八数码问题 双向BFS 状态设定

题目链接&#xff1a;Cubic Eight-Puzzle 题目描述&#xff1a; 给定一个初始状态和一个终止状态的3∗33*33∗3网格&#xff0c;网格中含有888个立方体和一个空白&#xff0c;每个立方体的颜色如下&#xff1a; 需要注意的是&#xff1a;只会给出终止状态的立方体的顶面朝向&a…

Android init 进程流程分析 一

init 进程流程分析 一1.1引入init进程1.2 init 进程入口函数参考博客预告下一章 FirstStageMain()分析1.1引入init进程 1.启动电源以及系统启动&#xff1a; 上电引导芯片从预定义的地放&#xff08;固化在ROM)开始执行&#xff0c;加载引导程序Bootloader 到RAM中&#xff0c…

格雷码的实现

格雷码&#xff1a;任意两个相邻的二进制数之间只有一位不同 想必通信专业的学生应该都接触过格雷码&#xff0c;它出现在数电、通信原理等课程里。 如下图所示一个四位格雷码是什么样子的&#xff1a; 格雷码的特点&#xff1a; 其最大的特点是任意上下相邻的两个码值间&am…

css学习-----web

引入方式 内嵌式 css写在style标签中 外链式 css写在一个单独的.css文件中 <link rel"stylesheet" href"./文件名.css">stylesheet关系为样式表&#xff1b; href地址 行內式 css写在标签的style属性中 可以配合js使用 选择器 标签选择器是选…

CTFer成长之路之XSS的魔力

XSS的魔力CTF XSS闯关 题目描述: 你能否过关斩将解决所有XSS问题最终获得flag呢&#xff1f; docker-compose.yml version: "3.2"services:xss:image: registry.cn-hangzhou.aliyuncs.com/n1book/web-xss:latestports:- 3000:3000启动方式 docker-compose up -…