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

MySQL高可用 集群(MHA)

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=22repl_user=master       ---指定主库授权的用户名和密码
repl_password=1234user=mysqldb				---指定监控用户和密码,三台mysql需要一样。
password=1234ping_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 perluse 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 1500inet 192.168.2.100  netmask 255.255.255.0  broadcast 192.168.2.255ether 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 1500inet 192.168.2.100  netmask 255.255.255.0  broadcast 192.168.2.255ether 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: masterMaster_Port: 3306Connect_Retry: 60Master_Log_File: master40.000001Read_Master_Log_Pos: 154Relay_Log_File: mysql50-relay-bin.000002Relay_Log_Pos: 319Relay_Master_Log_File: master40.000001Slave_IO_Running: YesSlave_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

相关文章:

MySQL高可用 集群(MHA)

1. MHA集群概述 集群的定义&#xff1a;多台服务器一起提供相同的服务&#xff0c;如&#xff08;web集群&#xff09;等。常见集群的分类&#xff1a; LB&#xff08;负载均衡集群&#xff09;&#xff1a;服务器共同平均分摊处理客户端的多次连接请求。 HA&#xff08;高可用…...

【JavaScript速成之路】JavaScript运算符

&#x1f4c3;个人主页&#xff1a;「小杨」的csdn博客 &#x1f525;系列专栏&#xff1a;【JavaScript速成之路】 &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; 文章目录前言运算符1&#xff0c;算术运算符2&#xff0c;递增递减运算符3&#xff0c;比…...

计网个人作业05

R1 链路层可以提供如下服务 链路层服务IP能否提供&#xff1f;TCP能否提供&#xff1f;流量控制✔差错检测✔✔差错纠正全双工、半双工✔ R2 不冗余 IP层有丢包的情况⼀个⻓的 TCP 报⽂段会被分⽚成多个 IP 数据报形成不同的帧&#xff0c;不同的帧可能会被不同链路传输。同…...

码匠 × OpenAI :快速生成 SQL 语句,提升开发效率!

目录 使用 OpenAI 生成 SQL 码匠连接与集成 OpenAI 总结 关于码匠 在码匠中&#xff0c;编写 SQL 语句&#xff0c;并结合码匠一系列开箱即用的组件实现复杂的业务逻辑&#xff0c;是很常见的应用开发场景。然而&#xff0c;不同的数据库在 SQL 增删改查操作语法、类型字段和…...

电脑显示屏不亮但是主机已开机?5种原因以及解决方案

电脑与我们的日常生活和工作密切相关&#xff0c;缺了它我们工作就很难正常展开。电脑使用久了&#xff0c;难免出现一些小问题&#xff0c;比如&#xff1a;电脑显示屏不亮但是主机已开机&#xff0c;这是什么原因造成的&#xff1f;我们应该怎么处理&#xff1f; 可能很多人…...

公司项目vue cli2升级到vue cli3

背景&#xff1a;公司项目历时时间较长&#xff0c;通过长时间的迭代&#xff0c;目前项目文件较多&#xff08;src目录下有2217个文件&#xff09;&#xff0c;系统庞大&#xff0c; 之前通过vue cli2脚手架构建的项目框架&#xff0c;在本地开发时已经明显感觉到吃力&#xf…...

流程图培训

工具 wps 目前咱们在新建里面&#xff0c;可以新建流程图 构成流程图的图形符号及其作用 常用的流程图介绍 flowchart 和 BPMN 两种 flowchart: 最开始的全名是”Process Flow Charts”&#xff0c;即处理流程图表。 BPMN&#xff1a; 定义了业务流程图&#xff0c;其基…...

编写使用多buffer的应用程序

编写使用多buffer的应用程序 文章目录编写使用多buffer的应用程序一、 编写一个支持单buffer、多buffer的APP二、 编译程序2.1 设置工具链2.2 编译三、上机测试3.1 恢复内核使用自带的LCD驱动3.2 禁止开发板自带的GUI程序3.3 把测试程序放到板子上、执行四、 LCD自动黑屏致谢一…...

【java 8】强大的 Stream API

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…...

自动驾驶仿真:ECU TEST自动化测试常用API调用

文章目录一、 API调用运行环境二、ET API帮助文档三、如何导入ET API四、 ET常用接口1、 创建用于添加测试步骤的Package2、 在Package的TestStep中添加precondition块3、 在Package的TestStep中添加Block块4、在Package的TestStep中添加PostconditionBlock块5、 在Package的Te…...

notepad++中使用正则表达式

目录 notepad中使用正则表达式 notepad中正则表达式的语法notepad中常用的正则表达式类notepad中查找窗口的关于正则表达式的参数说明notepad正则表达式不能选择匹配内容notepad正则表达式使用举例 正则表达式提取分隔符前的内容正则表达式替换一个分隔符为换行符删除多余的空…...

什么蓝牙耳机打游戏好?打游戏好用的无线蓝牙耳机

午休或是周末约上好友玩两局游戏&#xff0c;是忙里偷闲的快乐时刻&#xff0c;对于普通游戏玩家&#xff0c;其实耳机够用就行&#xff0c;下面就分享几款打游戏好用的蓝牙耳机。 一、南卡小音舱蓝牙耳机 蓝牙版本&#xff1a;5.3 推荐系数&#xff1a;五颗星 南卡小音舱li…...

基于appium的app自动化测试框架

App自动化测试主要难点在于环境的搭建&#xff0c;appium完全是基于selenium进行的扩展&#xff0c;所以app测试框架也是基于web测试框架开发的 一、设备连接 &#xff08;即构建基础的测试环境&#xff0c;保证可以驱动设备进行操作&#xff09; 0.准备测试环境 1&#xff0…...

【拿好了!Linux 运维必备的 13 款实用工具!】

​本文介绍几款 Linux 运维比较实用的工具&#xff0c;希望对 Linux 运维人员有所帮助。 查看进程占用带宽情况 – Nethogs Nethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽。 下载&#xff1a; http://sourceforge.net/projects/nethogs/files/ne…...

软考中级--嵌入式系统设计师考试培训教程开始了

1.考试时间: 1.1 上半年5月下旬考试 1.2 下半年11月上旬考试 2.考试内容 2.1 系统基础 满分75分 时间150分钟 2.2 系统设计 满分75分 时间150分钟 3.计划安排 3.1 熟悉考试大纲 3.2 按考纲学习相关内容 整理设计知识 快速学习形成知识印象 3.3 复习整理的知识 …...

JDBC学习(复习)-面试总结详细

JDBC详细介绍一、JDBC详细介绍二、jdbc面试总结2.1 JDBC操作数据库的步骤 &#xff1f;2.2 JDBC中的Statement 和PreparedStatement&#xff0c;CallableStatement的区别&#xff1f;2.3 JDBC中大数据量的分页解决方法?2.4 说说数据库连接池工作原理和实现方案&#xff1f;2.4…...

前端:你不知道的async await

1.先抛出一个场景&#xff1a;你是否在日常开发中经常使用类似代码&#xff1f;async function getXXList () {const result await this.getArrListApi({page:1,id:2})this.arr result.data.listconsole.log(结果是…, this.arr)……………………其他逻辑代码 }1.1 问题那你是…...

c#前端实现对pcl点云颜色根据强度特征动态变化突出指定对象

前言 本文主要介绍如何使用c# winform对点云颜色根据点云强度信息对显示的点云颜色进行动态调整。 目的是根据强度信息采用不同的颜色特征突出不同的物体。 一、点云强度是什么&#xff1f; 点云强度又可以叫做反射率&#xff0c; 通常常见的点云格式包括&#xff1a;以pcl为…...

如何制定达人营销策略

如今&#xff0c;达人营销不再是一个新兴趋势&#xff0c;而是公司整个数字营销战略的一部分。虽然十年前&#xff0c;达人还不存在&#xff0c;但随着公司对数字化营销依赖度地提升&#xff0c;各个领域的大V群体逐渐壮大&#xff0c;越来越多的公司已经采用了达人营销策略。如…...

100种思维模型之三层解释思维模型-020

很多人认为&#xff0c;世界首富巴菲特的日子很轻松&#xff0c;因为他想要什么就可以买什么。 所以&#xff0c;人人都学巴菲特&#xff0c;但很多人不知道学习他什么…… 润米咨询董事长刘润老师在2020年干了这样一件事情&#xff1a;向100个不认识的人学习。如&#xff0c;向…...

RK系列(RK3568) i2s 音频输入 麦克风驱动

平台&#xff1a;Android12SOC&#xff1a;RK3568外围芯片&#xff1a;XS9922i2s简介&#xff1a;从上图看I2s主要的线有&#xff1a;SDO SCLK LRCK MCLK I2S协议只定义三根信号线&#xff1a;串行时钟信号SCLK(BCLK)、数据信号SD和左右声道选择信号WS。&#xff08;1&#xff…...

Python|Pymol的安装

​Pymol的使用其实可以分为两种&#xff0c;一种是GUI图形操作界面&#xff0c;直接可以去Pymol官网上下&#xff0c;另一种则是使用API的方式直接调用&#xff0c;适合写脚本批量处理一些东西。建议画图&#xff0c;看结构直接用GUI&#xff0c;但是计算RMSD啥的&#xff0c;用…...

Mysql中关于查询日志的配置详解

查询日志 MySQL中的查询日志保存在文本文件中&#xff0c;能够记录MySQL中的所有数据操作。 开启查询日志 MySQL默认情况下没有开启查询日志&#xff0c;如果需要开启查询日志&#xff0c;则需要在 my.cnf 文件或者 my.ini 文件的 [mysqld] 选项下进行配置。例如&#xff0c;…...

外包整整干了一年,废了。。。

先说一下自己的个人情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了…...

内网渗透(五十六)之域控安全和跨域攻击-非约束委派攻击

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…...

初阶C语言——指针【详解】

文章目录1.指针是什么2.指针和指针类型2.1 指针的解引用2.2 指针 -整数3.野指针3.1 野指针成因3.2 如何规避野指针4. 指针运算4.1 指针-整数4.2 指针-指针4.3 指针的关系运算5. 指针和数组6. 二级指针7. 指针数组1.指针是什么 指针理解的2个要点&#xff1a; 指针是内存中一个最…...

MySQL tinyint(1) 、int(32) 与 varchar(255) 长度含义不同

MySQL tinyint(1) 、int(32) 与 varchar(255) 长度含义不同 发现 tinyint(1)&#xff0c;int(32) 和 varchar(255) 这里面的数字的含义是不同的。 先说数字类型 tinyint 和 int 等 他们能存储的字节大小是与类型绑定的&#xff0c;即定义了 tinyint 或者 int 就确定了能存储…...

搜索旋转排序数组、路径总和 II、拆分数字

文章目录搜索旋转排序数组&#xff08;数组、二分查找&#xff09;路径总和 II&#xff08;树、深度优先搜索&#xff09;拆分数字&#xff08;算法&#xff09;搜索旋转排序数组&#xff08;数组、二分查找&#xff09; 整数数组 nums 按升序排列&#xff0c;数组中的值 互不…...

QT自绘标题和边框

在QT中如果想要自绘标题和边框&#xff0c;一般步骤是&#xff1a; 1&#xff09; 在创建窗口前设置Qt::FramelessWindowHint标志&#xff0c;设置该标志后会创建一个无标题、无边框的窗口。 2&#xff09;在客户区域的顶部创建一个自绘标题栏。 3&#xff09;给窗口绘制一个背…...

数据库浅谈之 LLVM

数据库浅谈之 LLVM HELLO&#xff0c;各位博友好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 这里是数据库浅谈系列&#xff0c;收录在专栏 DATABASE 中 &#x1f61c;&#x1f61c;&#x1f61c; 本系列阿呆将记录一些数据库领域相关的知识 &#x1f3c…...