Mariadb高可用(四十)

news2024/11/27 14:53:16

目录

一、概述

(一)概念

(二)组成

(三)特点

(四)工作原理

二、实验要求

三、构建MHA

(一)ssh免密登录

(二)安装mariadb数据库并启动

1、配置 master 机器

2、配置 slave1 机器

3、配置 slave2 机器

4、分别重启服务和设置开机自启

5、分别赋予权限

6、启动从数据库,进行主从数据库同步

6.1、进入数据库

6.2、停止从库

6.3、进行数据同步

(三)MHA安装

(四)停用master的mariadb服务

(五)故障恢复


一、概述

(一)概念

    MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。

    MHA 的出现就是解决MySQL 单点的问题。

    MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。

    MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用。

(二)组成

    MHA manager        管理节点

    MHA node        数据节点,每个节点上都需要安装

(三)特点

    自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失

    使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性

    目前MHA支持一主多从架构,最少三台服务,即一主两从

(四)工作原理

    从宕机崩溃的master 保存二进制日志事件(binlog events);

    识别含有最新的更新slave日志

    应用差异的中继日志(relay log)到其他的slave

    应用从master保存的二进制日志事件

    提升一个slave为新的master

    使其他的slave连接新的master进行复制

二、实验

(一)实验介绍

1、实验环境

manager、monitor、master和slave

IP地址搭建主机名
192.168.11.111/24

manager节点     monitor

mgt( managerment )
192.168.11.112/24node节点            mastermaster
192.168.11.113/24node节点             slaveslave1
192.168.11.114/24node节点             slaveslave2

2、实验拓补图

3、实验介绍

       本实验要求通过 MHA 监控 MySQL 数据库在master故障时进行自动切换到master salve,不影响业务。 

4、配置过程

4.1、配置 MySQL 一主两从

4.2、安装 MHA 软件

4.3、配置无密码认证

4.4、配置 MySQL MHA 高可用

4.5、模拟 master 故障切换

(二)实验基础配置

关闭防火墙、关闭SELinux、关闭图形化网络、配置静态IP地址

1、配置各台主机的主机名

hostnamectl set-hostname mgt
hostnamectl set-hostname master
hostnamectl set-hostname slave1
hostnamectl set-hostname slave2

2、刷新主机命令

bash

3、分别为四台虚拟机添加本地缓存

vim /etc/hosts

 内容:

192.168.11.111 mgt
192.168.11.112 master
192.168.11.113 slave1
192.168.11.114 slave2

scp /etc/hosts 192.168.11.113:/etc/
scp /etc/hosts 192.168.11.113:/etc/
scp /etc/hosts 192.168.11.114:/etc/

三、构建MHA

(一)ssh免密登录

mgt 端 192.168.11.111 需进行的操作

ssh-keygen

ssh-copy-id mgt

 查看是否创建成功

       注:余下三台机器均将生成密钥对上传至192.168.11.111服务端上,而后进行密钥文件回传,保证互为免密登录

master端 192.168.11.112 需进行的操作

ssh-keygen
ssh-copy-id mgt

slave1 端 192.168.11.113 需进行的操作

ssh-keygen
ssh-copy-id mgt

slave2 端 192.168.11.114 需进行的操作

ssh-keygen
ssh-copy-id mgt

 此时我们去IP地址为111的服务端查看密钥对是否接收到

将生成的密钥文件分别在四台机器上进行一次互传

for i in 2 3 4;do scp /root/.ssh/authorized_keys  root@192.168.11.11$i:/root/.ssh/;done

 

 

       注:此时需要在四台主机上分别进行一次免密登录,从而避免后续使用脚本时发生故障问题。(包括自己本身也需进行一次免密登录)

 这里演示一台机器,其余机器同理

(二)安装mariadb数据库并启动

yum install -y mariadb mariadb-server

 启动服务

systemctl start mariadb

 配置流程

1、配置 master 机器

vim /etc/my.cnf

插入内容: 

server-id = 20
log-bin = master-bin
log-slave-updates = true

2、配置 slave1 机器

vim /etc/my.cnf

插入内容: 

server-id=30
log-bin=master-bin
relay-log=relay-log-bin
relay-log-index=relay-log-bin.index

3、配置 slave2 机器

vim /etc/my.cnf

插入内容: 

server-id=40
log-bin=master-bin
relay-log=relay-log-bin
relay-log-index=relay-log-bin.index

4、分别重启服务和设置开机自启

systemctl restart mariadb
systemctl enable mariadb

5、分别赋予权限

master端

mysql -e "grant replication slave on *.* to 'myslave'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.111' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.113' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.114' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'mgt' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'slave1' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'slave2' identified by '123123';"

 注:本来只需赋予第一条命令即可使用,为了防止出现异常,指定后续三个ip段。

slave1端

mysql -e "grant replication slave on *.* to 'myslave'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.111' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.112' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.114' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'mgt' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'master' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'slave2' identified by '123123';"

slave2端

mysql -e "grant replication slave on *.* to 'myslave'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.%' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.111' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.112' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'192.168.11.113' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'mgt' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'master' identified by '123123';"
mysql -e "grant all privileges on *.* to 'mha'@'slave1' identified by '123123';"

6、启动从数据库,进行主从数据库同步

6.1、进入数据库

mysql

6.2、停止从库

stop slave;
exit

6.3、进行数据同步

主库查看文件编号,pos值

mysql -e "show master status;"

 从库输入命令:(两个从库都是一样的)

mysql -e "change master to master_host='192.168.11.112',master_user='myslave',master_password='123123',master_log_file='master-bin.000001',master_log_pos=1159;"

 分别进入两个从库启动slave

mysql

 进入MySQL数据库

start slave;

 启动从服务

show slave status\G;
exit

查看状态

 主库创建数据库,从库进行查看

mysql -e "create database zn;"

 从:(两个从数据库都是一样的命令,在此不过多追述)

mysql -e "show databases;"

 

 此时基本的主从复制已经搭建完成

(三)MHA安装

    所有节点安装perl环境(使用此命令两次,升级到最新的epel源)

yum install -y epel-release

     下载后续使用安装包缺失的依赖

yum -y install perl-DBD-MySQL perl-ExtUtils-MakeMaker perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes perl-CPAN

node节点

node节点是计算机网络中的一个设备或主机

        所有节点安装node

tar xf mha4mysql-node-0.57.tar.gz 
cd mha4mysql-node-0.57/
perl Makefile.PL && make && make install

  在一台机器上远程将tar包传给其余三台机器 

for i in master slave1 slave2;do scp mha4mysql-node-0.57.tar.gz $i:/root/;done

步骤同上,进行安装 

  验证:看到脚本就OK

cd /usr/local/bin
ls

    manager

tar xf mha4mysql-manager-0.57.tar.gz
cd /root/mha4mysql-manager-0.57
perl Makefile.PL && make && make install

cp /root/mha4mysql-manager-0.57/samples/scripts/master_ip_failover /usr/local/bin/
cp /root/mha4mysql-manager-0.57/samples/scripts/master_ip_online_change /usr/local/bin/

        脚本说明

cd /root/mha4mysql-manager-0.57/samples/scripts

            master_ip_failover    自动切换时 VIP 管理的脚本

            master_ip_online_change    在线切换时 vip 的管理

            power_manager    故障发生后关闭主机的脚本

            send_report    因故障切换后发送报警的脚本

 注:master_ip_failover安装包自带的配置文件有问题,脚本没有写全,需重新进行编辑

这里使用以下命令将其备份

mv master_ip_failover master_ip_failover_bak

然后创建新的文件,并赋予权限

vim 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.11.100';								#指定vip的地址
my $brdc = '192.168.11.255';								#指定vip的广播地址
my $ifdev = 'ens33';										#指定vip绑定的网卡
my $key = '1';												#指定vip绑定的虚拟网卡序列号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";		#代表此变量值为ifconfig ens33:1 192.168.11.100
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";		#代表此变量值为ifconfig ens33:1 192.168.11.100 down
my $exit_code = 0;											#指定退出状态码为0
#my $ssh_start_vip = "/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -A -c 1 -I $ifdev $vip;iptables -F;";
#my $ssh_stop_vip = "/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key";
##################################################################################
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 \"`;
}
## A simple system call that disable the VIP on the old_master
sub stop_vip() {
`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";
}

赋予权限:

chmod 755 master_ip_failover
ll

        创建配置文件

mkdir /etc/masterha
vim /etc/masterha/app1.cnf
[server default]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/var/lib/mysql
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
password=manager
[server default]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/var/lib/mysql
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
password=123123
ping_interval=1
remote_workdir=/tmp
repl_password=123123
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.11.113 -s 192.168.11.114
shutdown_script=""
ssh_user=root
user=mha

[server1]
hostname=192.168.11.112
port=3306

[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.11.113
port=3306

[server3]
hostname=192.168.11.114
port=3306

文件内容解析: 

  • manager_log:MHA管理器的日志文件路径。
  • manager_workdir:MHA管理器的工作目录。
  • master_binlog_dir:MySQL主服务器的二进制日志目录。
  • master_ip_failover_script:用于执行IP故障切换的脚本路径。
  • master_ip_online_change_script:用于执行在线IP更改的脚本路径。
  • password:MySQL的密码。
  • ping_interval:MHA管理器检测服务器存活状态的时间间隔。
  • remote_workdir:远程主机的工作目录。
  • repl_password:复制用户的密码。
  • repl_user:复制用户的用户名。
  • secondary_check_script:用于检查从服务器的脚本路径。
  • shutdown_script:关机时执行的脚本路径。
  • ssh_user:用于通过SSH连接到服务器的用户名。
  • user:MHA管理器的用户名。

接下来是每个服务器的具体配置:

  • server1:主服务器的配置。

  • hostname:服务器的主机名或IP地址。

  • port:MySQL服务的端口号。

  • server2:备选主服务器的配置。

  • candidate_master:指示该服务器是否可以成为主服务器的标志。1表示是,0表示否。

  • check_repl_delay:检查复制延迟的时间(以秒为单位)。

  • server3:从服务器的配置。

  • hostname:服务器的主机名或IP地址。

  • port:MySQL服务的端口号。

 

mkdir /var/log/masterha/app1 -p

        测试MHA

masterha_check_ssh --conf=/etc/masterha/app1.cnf

 显示ok即为成功,没有错误

masterha_check_repl --conf=/etc/masterha/app1.cnf

        启动命令

nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &

 命令解析:

  • nohup: 这是一个命令,用于在后台运行指定的命令,并忽略挂起信号。这意味着即使关闭终端也不会停止该进程。
  • masterha_manager: 这是要运行的命令或可执行文件的名称,即masterha_manager。
  • --conf=/etc/masterha/app1.cnf: 这是指定masterha_manager的配置文件路径和名称。
  • --remove_dead_master_conf: 这是masterha_manager的一个选项,用于在故障转移后自动删除已死亡主节点的配置。
  • --ignore_last_failover: 这是masterha_manager的一个选项,用于忽略最后一次故障转移。
  • < /dev/null: 这是将空设备/dev/null作为masterha_manager的输入。这意味着不会从标准输入读取任何输入。
  • > /var/log/masterha/app1/manager.log: 这是将masterha_manager的输出重定向到指定的日志文件,即/var/log/masterha/app1/manager.log。
  • 2>&1: 这是将标准错误输出也重定向到与标准输出相同的位置,即将错误信息写入到manager.log中。
  • &: 这是一个特殊符号,表示将命令放入后台运行。

因此,这段命令的意思是以后台模式运行masterha_manager,并将其输出重定向到指定的日志文件中。同时,还忽略了最后一次故障转移的记录,自动删除已死亡主节点的配置,并且不从标准输入读取任何输入。

  查看

jobs

         启动时masterIP异常

            需要工程手动配置VIP

(四)停用master的mariadb服务,模拟故障

systemctl stop mariadb

 在slave1里查看

ip a

  注:服务在完成以后自动回掉,此时需手动重启

停止命令

jobs
fg 1

将后台进程掉到前台,ctrl+c进行打断即可 

(五)故障恢复

在停掉master以后,配置文件中内容回消失

vim /etc/masterha/app1.cnf 

     修改app1.cnf启动配置,添加master主机配置信息

将内容添加进去即可

[server1]
hostname=192.168.11.112
port=3306

     分别在slave上重新指定master主机及binlog日志同步信息

master 端进行操作

启动服务

systemctl start mariadb

进入数据库

mysql

 停止从库

stop slave;
exit

 查看状态

mysql -e "show master status;"

 slave1 、2端进行操作

重启服务

systemctl restart mariadb

进入数据库 

mysql

停止从服务 

stop slave;
exit

同步数据

mysql -e "change master to master_host='192.168.11.112',master_user='myslave',master_password='123123',master_log_file='master-bin.000003',master_log_pos=245;"

分别从两个从库进入数据库

mysql

启动 

start slave;

查看状态并退出 

show slave status\G;
exit

 主库创建内容

mysql -e "create database zm;"

从库进行查看

mysql -e "show databases;"

这样可以看到主从复制又恢复原有了

注:但是有一点需要注意,在恢复完毕后,在主的机器上还是看不见设置的虚IP地址。如果想看见的话,就关闭主的服务,然后去从上进行查看!!!感觉不是很灵活的样子,做完还得重新进行配置然后再给改回来,然后还是看不见。。。陷入了俄罗斯套娃。。。。 

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

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

相关文章

数学建模--一维插值法的多种插值方式的Python实现

目录 1.算法流程步骤 2.算法核心代码 3.算法效果展示 1.算法流程步骤 #算法的核心就是利用scipy中的interpolate来完成工作 #一共是5种一维插值算法形式: #插值方法&#xff1a;1.阶梯插值 2.线性插值 3.2阶样条插值 4.3阶样条插值 #"nearest"阶梯插值 #"zero&…

硬盘数据恢复的基础操作方法分享

确定硬盘故障类型&#xff1a;在进行硬盘数据恢复之前&#xff0c;首先需要确定故障类型是硬件故障还是软件故障。如果是软件故障&#xff0c;可以尝试使用数据恢复软件进行恢复&#xff1b;如果是硬件故障&#xff0c;则需要求助专业数据恢复公司进行处理。 使用数据恢复软件…

JavaScript基础05——字面量、变量介绍及变量基本使用

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 说起变量感觉很熟悉&#xff0c;但要让解释什么是变量时&#xff0c;却有点语塞&#xff0c;就像解释下为啥112一样&#xff0c;感觉非常熟悉&#xff0c;就是知道&#xff0c;但确解释不出来。 不过虽然在其他场景比较…

机器学习——线性回归/岭回归

0、前言&#xff1a; 线性回归会用到python第三方库&#xff1a;sklearn.linear_model中的LinearRegression导入第三方库的方法&#xff1a;from sklearn.linear_model import LinearRegression使用LinearRegression(二维数据&#xff0c;一维数据)进行预测&#xff0c;其中数…

MySQL中的索引事务(2)事务----》数据库运行的原理知识+面试题~

本篇文章建议读者结合&#xff1a;MySQL中的索引事务&#xff08;1&#xff09;索引----》数据库运行的原理知识面试题~_念君思宁的博客-CSDN博客此时&#xff0c;如果你根据name来查询&#xff0c;查到叶子节点得到的只是主键id&#xff0c;还需要通过主键id去主键的B树里面在…

源码角度看待线程池的执行流程

文章目录 前言一、线程池的相关接口和实现类1.Executor接口2.ExecutorService接口3.AbstractExecutorService接口4.ThreadPoolExecutor 实现类 二、ThreadPoolExecutor源码解析1.Worker内部类2.execute()方法3.addWorker()方法 总结 前言 线程池内部维护了若干个线程&#xff…

RT-Thread 内核移植

内核移植 内核移植就是将RTT内核在不同的芯片架构、不同的板卡上运行起来&#xff0c;能够具备线程管理和调度&#xff0c;内存管理&#xff0c;线程间同步等功能。 移植可分为CPU架构移植和BSP&#xff08;Board support package&#xff0c;板级支持包&#xff09;移植两部…

1783_CMD启动MATLAB同时执行一个脚本

全部学习汇总&#xff1a; GitHub - GreyZhang/g_matlab: MATLAB once used to be my daily tool. After many years when I go back and read my old learning notes I felt maybe I still need it in the future. So, start this repo to keep some of my old learning notes…

【数据结构】树和二叉树的概念及结构(一)

目录 一&#xff0c;树的概念及结构 1&#xff0c;树的定义 2&#xff0c;树结点的分类及关系 3&#xff0c;树的表示 二&#xff0c;二叉树的概念及结构 1&#xff0c;二叉树的定义 2&#xff0c;特殊的二叉树 3&#xff0c;二叉树的性质 4&#xff0c;二叉树的存储结构 1&…

Unity中Shader 纹理属性 Tilling(缩放度) 和 Offset(偏移度)

文章目录 前言一、Tilling(缩放度)&#xff0c;个人理解有点像减小周期函数的周期的效果&#xff08;在单位空间内&#xff0c;容得下重复的函数图像的多少&#xff09;二、Offset&#xff08;偏移度&#xff09;&#xff0c;个人理解是函数的平移三、在Shader中使用 Tilling 和…

如何批量查询所有德邦快递的物流信息

当我们需要查询多个德邦快递的物流信息时&#xff0c;我们可以使用固乔快递查询助手来批量查询。以下是具体的操作步骤&#xff1a; 1. 在浏览器中搜索并下载【固乔快递查询助手】软件。这款软件支持多种快递公司&#xff0c;包括德邦快递&#xff0c;而且可以批量查询物流信息…

洞发现-APP应用之漏洞探针利用修复(44)

主要分为三个部分&#xff0c;第一部分抓包是很重要的&#xff0c;第二部分是协议&#xff0c;第三部分是逆向&#xff08;讲的不会太多&#xff0c;介绍根据使用不介绍原理&#xff09;&#xff0c; 关于反编译&#xff0c;app就分为安卓和苹果系统&#xff0c;苹果系统的源码…

基于STM32的简易示波器设计

疫情期间闲来无事&#xff0c;正好学习STM32F407&#xff0c;因此设计、制作了简易示波器&#xff0c;以助学习。长话短说方案如下&#xff1a; &#xff08;1&#xff09;单片机&#xff0c;选择STM32F407VET6&#xff0c;采用SWD方式仿真及程序烧写。五路独立按键和两个LED指…

[国产MCU]-W801开发实例-用户报文协议(UDP)数据接收和发送

用户报文协议(UDP)数据接收和发送 文章目录 用户报文协议(UDP)数据接收和发送1、UDP简单介绍2、W801的UDP创建逻辑2.1 UDP使用步骤2.2 代码实现1、UDP简单介绍 用户数据报协议 (UDP) 是一种跨互联网使用的通信协议,用于对时间敏感的传输,例如视频播放或 DNS查找。它通过在数…

OTFS-ISAC通信最新进展

测试场景 Tx DD域帧结构导频区域 Rx DD域帧导频区域 原始星座图 信道估计及数据检测 经过MP算法后的星座图 误码率曲线

串行协议——USB驱动[基础]

多年前的学习记录&#xff0c;整理整理。 一、USB协议基础 二、Linux内核USB驱动源码分析 USB中不同类型设备使用的 设备描述符(设备类\设备子类\设备协议) 配置不同,典型的以下几种:1)HID设备: Human Input Device人工输入设备, 如鼠标\键盘\游戏手柄等.2)CDC设备: Communi…

GB28181学习(二)——注册与注销

概念 使用REGISTER方法进行注册和注销&#xff1b;注册和注销应进行认证&#xff0c;认证方式应支持数字摘要认证方式&#xff0c;高安全级别的宜支持数字证书认证&#xff1b;注册成后&#xff0c;SIP代理在注册过期时间到来之前&#xff0c;应向注册服务器进行刷新注册&…

core dump管理在linux中的前世今生

目录 一、什么是core dump&#xff1f; 二、coredump是怎么来的&#xff1f; 三、怎么限制coredump文件的产生&#xff1f; ulimit 半永久限制 永久限制 四、从源码分析如何对coredump文件的名字和路径管理 命名 管理 一些问题的答案 1、为什么新的ubuntu不能产生c…

ApplicationRunner、InitializingBean、@PostConstruct 执行顺序

概述 开发中可能会有这样的场景&#xff0c;需要在容器启动的时候执行一些内容。比如读取配置文件&#xff0c;数据库连接之类的。SpringBoot给我们提供了两个接口来帮助我们实现这种需求。两个启动加载接口分别是&#xff1a;CommandLineRunner和ApplicationRunner。Spring 提…

【高阶数据结构】红黑树 {概念及性质;红黑树节点的定义;红黑树插入操作详细解释;红黑树的验证}

红黑树 一、红黑树的概念 红黑树&#xff08;Red Black Tree&#xff09; 是一种自平衡二叉查找树&#xff0c;在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有…