MySQL详细案例 1:MySQL主从复制与读写分离

文章目录

  • 1. MySQL主从复制
    • 1.1 使用场景
    • 1.2 MySQL的复制类型
    • 1.3 主从复制的作用
    • 1.4 主从复制的工作过程
    • 1.5 实现MySQL主从复制
      • 1.5.1 前置准备
      • 1.5.2 主服务器mysql配置
      • 1.5.3 从服务器1 mysql配置
      • 1.5.4 从服务器2 mysql配置
    • 1.6 MySQL主从复制延时问题的原因和解决办法
      • 1.6.1 故障现象
      • 1.6.2 原因
      • 1.6.3 解决方案
      • 1.5.5 测试
    • 1.6 主从复制的3种同步模式
      • 1.6.1 异步复制(Asynchronous replication)
      • 1.6.2 全同步复制(Fully synchronous replication)
      • 1.6.3 半同步复制(Semisynchronous replication)
    • 1.7 半同步复制
      • 1.7.1 前置准备
      • 1.7.2 配置主服务器
      • 1.7.3 配置从服务器
      • 1.7.4 测试
      • 1.7.5 什么情况下半同步和异步会互相转换
  • 2. MySQL读写分离
    • 2.1 读写分离原理
    • 2.2 读写分离的使用场景
    • 2.3 主从复制和读写分离的关系
    • 2.4 常见的读写分离类型
      • 2.4.1 基于程序代码内部实现
      • 2.4.2 基于中间代理层实现
    • 2.5 实现读写分离
      • 2.5.1 前置准备
      • 2.5.2 配置amoeba
      • 2.5.3 测试读写分离

1. MySQL主从复制

1.1 使用场景

  • 在企业应用中,成熟的业务通常数据量都比较大
  • 单台MySQL在安全性、高可用性和高并发方面的无法满足实际的需求

配置多台主从数据库服务器以实现读写分离

1.2 MySQL的复制类型

  • 基于语句的复制(STATEMENT,MySQL默认类型)
    在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高。

  • 基于行的复制(ROW)
    把改变的内容复制过去,而不是把命令在从服务器上执行一遍。

  • 混合类型的复制(MIXED)
    默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。

1.3 主从复制的作用

  1. 读写分离:我们可以通过主从复制的方式来同步数据,然后通过读写分离提高数据库并发处理能力。
  2. 数据备份通过主从复制将主库上的数据复制到了从库上,相当于是一种热备份机制,也就是在主库正常运行的情况下进行的备份不会影响到服务
  3. 具有高可用性数据备份实际上是一种冗余的机制,通过这种冗余的方式可以换取数据库的高可用性,也就是当服务器出现故障或宕机的情况下,可以切换到从服务器上,保证服务器的正常运行。

1.4 主从复制的工作过程

在这里插入图片描述

  1. Master服务器更新数据,并写入二进制日志
  2. Slave 开启IO线程向Master请求二进制日志事件/记录
  3. Master为每个IO线程开启dump线程向Slave发送二进制日志事件
  4. Slave保存二进制日志事件到中继日志
  5. Slave开启SQL线程读取中继日志中的二进制事件并解析成sql语句进行重发/逐一执行
注:
中继日志通常会位于 OS 缓存中,所以中继日志的开销很小。
复制过程有一个很重要的限制,即复制在 Slave上是串行化的,也就是说 Master上的并行更新操作不能在 Slave上并行操作。

1.5 实现MySQL主从复制

在这里插入图片描述

1.5.1 前置准备

#主服务器
192.168.67.100
systemctl disable --now firewalld
setenforce 0
#关闭防火墙和selinux策略#从服务器1
192.168.67.101
systemctl disable --now firewalld
setenforce 0
#关闭防火墙和selinux策略#从服务器2
192.168.67.102
systemctl disable --now firewalld
setenforce 0
#关闭防火墙和selinux策略#所有服务器默认已经编译安装mysql服务

1.5.2 主服务器mysql配置

ntpdate ntp.aliyun.com
#与阿里云进行时间同步vim /etc/my.cnf
#编辑mysql配置文件#在[mysqld]项添加
server-id=1
log-bin=mysql-bin						#添加,主服务器开启二进制日志
binlog_format=mixed#选配项
expire_logs_days=7						#设置二进制日志文件过期时间,默认值为0,表示logs不过期
max_binlog_size=500M					#设置二进制日志限制大小,如果超出给定值,日志就会发生滚动,默认值是1GB
skip_slave_start=1						#阻止从库崩溃后自动启动复制,崩溃后再自动复制可能会导致数据不一致的#如果对安全性有需求
#"双1设置",数据写入最安全
innodb_flush_logs_at_trx_commit=1		#redo log(事务日志)的刷盘策略,每次事务提交时MySQL都会把事务日志缓存区的数据写入日志文件中,并且刷新到磁盘中,该模式为系统默认
sync_binlog=1                           #在进行每1次事务提交(写入二进制日志)以后,Mysql将执行一次fsync的磁盘同步指令,将缓冲区数据刷新到磁盘

在这里插入图片描述

#添加完后
systemctl restart mysqld
#重启服务

在这里插入图片描述

#前往/usr/local/mysql/data/目录下查看二进制文件是否创建成功
cd /usr/local/mysql/data
ls

在这里插入图片描述

#进入数据库服务器
grant replication slave on *.* to 'aaa-slave'@'192.168.67.%' identified by '12323';
#授权做主从复制,指定所有库和所有表,指定网段192.168.67使用aaa-slave用户并设定密码
flush privileges;
#刷新权限
show master status;
#查看主服务器二进制文件与位置点偏移量

在这里插入图片描述

1.5.3 从服务器1 mysql配置

yum install ntp ntpdate -yservice ntpd start
#开启服务
/usr/sbin/ntpdate 192.168.67.100				#与主服务器进行时间同步#设置计划任务
crontab -e
*/30 * * * * /usr/sbin/ntpdate 192.168.67.100
#每半小时与主服务器进行一次时间同步

在这里插入图片描述

vim /etc/my.cnf
#编辑配置文件server-id = 2								#修改,注意id与Master的不同,两个Slave的id也要不同
relay-log=relay-log-bin						#开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=relay-log-bin.index			#定义中继日志文件的位置和名称,一般和relay-log在同一目录#选配项
innodb_buffer_pool_size=2048M		#用于缓存数据和索引的内存大小,让更多数据读写内存中完成,减少磁盘操作,可设置为服务器总可用内存的 70-80%
sync_binlog=0						#MySQL不做任何强制性的磁盘刷新指令,而是依赖操作系统来刷新数据到磁盘
innodb_flush_log_at_trx_commit=2	#每次事务log buffer会写入log file,但一秒一次刷新到磁盘
log-slave-updates=0					#slave 从 master 复制的数据会写入二进制日志文件里,从库做为其他从库的主库时设置为 1
relay_log_recovery=1				#当 slave 从库宕机后,假如 relay-log 损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的 relay-log, 并且重新从 master 上获取日志,这样就保证了 relay-log 的完整性。默认情况下该功能是关闭的,将 relay_log_recovery 的值设置为 1 时, 可在 slave 从库上开启该功能,建议开启。

在这里插入图片描述

systemctl restart mysqld
#重启服务

在这里插入图片描述

#登录mysql
CHANGE master to master_host='192.168.67.100',master_user='aaa-slave',master_password='123123',master_log_file='mysql-bin.000002',master_log_pos=777;
#指定master主机地址、端口号、用户名、密码、日志文件、位置点偏移量start slave;
#启动同步,如有报错执行 reset slave;
show slave status\G					#查看 Slave 状态
//确保 IO 和 SQL 线程都是 Yes,代表同步正常。

在这里插入图片描述

1.5.4 从服务器2 mysql配置

yum install ntp ntpdate -yservice ntpd start
#开启服务
/usr/sbin/ntpdate 192.168.67.100				#与主服务器进行时间同步#设置计划任务
crontab -e
*/30 * * * * /usr/sbin/ntpdate 192.168.67.100
#每半小时与主服务器进行一次时间同步

在这里插入图片描述

vi /etc/my.cnf
#编辑配置文件#添加
server-id = 3
relay-log=relay-log-bin
relay-log-index=relay-log-bin.index	

在这里插入图片描述

systemctl restart mysqld
#重启服务

在这里插入图片描述

#登录mysql
CHANGE master to master_host='192.168.67.100',master_user='aaa-slave',master_password='123123',master_log_file='mysql-bin.000002',master_log_pos=777;
#指定master主机地址、端口号、用户名、密码、日志文件、位置点偏移量start slave;
#启动同步,如有报错执行 reset slave;
show slave status\G					#查看 Slave 状态
//确保 IO 和 SQL 线程都是 Yes,代表同步正常。

在这里插入图片描述

#一般 Slave_IO_Running: No 的可能性:
1、网络不通
2、my.cnf配置有问题
3、密码、file文件名、pos偏移量不对
4、防火墙没有关闭

1.6 MySQL主从复制延时问题的原因和解决办法

1.6.1 故障现象

MySQL主从复制延时问题的故障现象通常表现为主库上的数据变更在从库上出现延迟。
这可能导致从库上的数据与主库不同步,并可能对应用程序或业务产生一些问题。

一些常见的故障现象包括:

从库数据延迟:主库上的数据变更在从库上出现延迟,通常可以通过查看从库的 Seconds_Behind_Master 参数来确定延迟的时间。

延迟逐渐增加:从库上的延迟可能会逐渐增加,从几秒钟到几分钟甚至更长。

复制停止:复制进程可能会在某些情况下停止,导致复制完全中断。

数据丢失:如果出现严重的复制延迟或复制停止,可能会导致从库上的数据丢失。在复制延迟问题得到解决之前,从库上的数据可能无法与主库保持同步。

1.6.2 原因

  1. master服务器高并发,形成大量事务;
  2. 网络延迟;
  3. 主从硬件设备导致(cpu主频、内存io、硬盘io);
  4. 是同步复制、而不是异步复制;

1.6.3 解决方案

  • 从库优化Mysql参数;
  • 比如增大innodb_buffer_pool_size,让更多操作在Mysql内存中完成,减少磁盘操作。
  • 从库使用高性能主机;
  • 包括cpu强悍、内存加大。避免使用虚拟云主机,使用物理主机,这样提升了i/o方面性。
  • 从库使用SSD磁盘;
  • 网络优化,避免跨机房实现同步。

1.5.5 测试

#前往主服务器
create database scj;
#创建新库create table scj.scj1 (id int, name varchar(10), age int, sex char(1));
#创建新表#添加数据
insert into scj.scj1 values (1, '张三', 20, '男');
insert into scj.scj1 values (2, '李四', 22, '男');
insert into scj.scj1 values (3, '赵四', 21, '男');
insert into scj.scj1 values (4, '尼古拉斯', 24, '男');

在这里插入图片描述

#前往从服务器查看#从服务器1

在这里插入图片描述

#从服务器2

在这里插入图片描述

1.6 主从复制的3种同步模式

1.6.1 异步复制(Asynchronous replication)

MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给客户端,并不关心从库是否已经接收并处理
这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。

1.6.2 全同步复制(Fully synchronous replication)

指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。
因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。

1.6.3 半同步复制(Semisynchronous replication)

介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。
相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间
所以,半同步复制最好在低延时的网络中使用

1.7 半同步复制

1.7.1 前置准备

主:192.168.67.100
从:192.168.67.101

1.7.2 配置主服务器

vim /etc/my.cnf
#编辑配置文件
#在 [mysqld] 区域添加下面内容plugin-load=rpl_semi_sync_master=semisync_master.so			#加载mysql半同步复制的插件
rpl_semi_sync_master_enabled=ON								#或者设置为"1",即开启半同步复制功能
rpl-semi-sync-master-timeout=1000							#超时时间为1000ms,即1s

在这里插入图片描述

systemctl restart mysqld
#重启服务

在这里插入图片描述

1.7.3 配置从服务器

vim /etc/my.cnf	plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=ON

在这里插入图片描述

systemctl restart mysqld
#重启服务

在这里插入图片描述

1.7.4 测试

#前往主服务器
#进入mysqlshow status like 'Rpl_semi_sync_master_status';
#查看是否开启半同步复制
show variables like 'rpl_semi_sync_master_timeout';
#查看超时时间

在这里插入图片描述

#前往从服务器开启mysql
show status like 'Rpl_semi_sync_slave_status';

在这里插入图片描述

STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
#重启io进程

在这里插入图片描述

#在主库查询半同步状态
show status like '%Rpl_semi%';	

在这里插入图片描述

#参数说明:
Rpl_semi_sync_master_clients              		#半同步复制客户端的个数
Rpl_semi_sync_master_net_avg_wait_time    		#平均等待时间(默认毫秒)
Rpl_semi_sync_master_net_wait_time        		#总共等待时间
Rpl_semi_sync_master_net_waits            		#等待次数
Rpl_semi_sync_master_no_times             		#关闭半同步复制的次数
Rpl_semi_sync_master_no_tx                		#表示没有成功接收slave提交的次数
Rpl_semi_sync_master_status               		#表示当前是异步模式还是半同步模式,on为半同步
Rpl_semi_sync_master_timefunc_failures    		#调用时间函数失败的次数
Rpl_semi_sync_master_tx_avg_wait_time     		#事物的平均传输时间
Rpl_semi_sync_master_tx_wait_time         		#事物的总共传输时间
Rpl_semi_sync_master_tx_waits             		#事物等待次数
Rpl_semi_sync_master_wait_pos_backtraverse		#可以理解为"后来的先到了,而先来的还没有到的次数"
Rpl_semi_sync_master_wait_sessions        		#当前有多少个session因为slave的回复而造成等待
Rpl_semi_sync_master_yes_tx               		#成功接受到slave事物回复的次数

1.7.5 什么情况下半同步和异步会互相转换

当半同步复制发生超时(由rpl_semi_sync_master_timeout参数控制,默认为10000ms,即10s),会暂时关闭半同步复制,转而使用异步复制,也就是会自动降为异步工作。

当 master dump 线程发送完一个事务的所有事件之后,如果在rpl_semi_sync_master_timeout 内,收到了从库的响应, 则主从又重新恢复为半同步复制

注:
1) 在一主多从的架构中,如果要开启半同步复制,并不要求所有的从都是半同步复制。
2) MySQL 5.7极大的提升了半同步复制的性能。
5.6 版本的半同步复制,dump thread 承担了两份不同且又十分频繁的任务:传送binlog 给 slave ,还需要等待 slave 反馈信息,而且这两个任务是串行的,dump thread 必须等待 slave 返回之后才会传送下一个 events 事务。dump thread 已然成为整个半同步提高性能的瓶颈。在高并发业务场景下,这样的机制会影响数据库整体的系统吞吐量(TPS)5.7 版本的半同步复制中,独立出一个 ack collector thread ,专门用于接收 slave 的反馈信息。这样 master 上有两个线程独立工作,可以同时发送 binlog 到 slave ,和接收 slave 的反馈。

2. MySQL读写分离

2.1 读写分离原理

是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作
数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。

2.2 读写分离的使用场景

数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用
利用数据库主从同步,再通过读写分离可以分担数据库压力,提高性能。

2.3 主从复制和读写分离的关系

在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。

无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。

因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似于rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库中的数据、语句做备份。

2.4 常见的读写分离类型

2.4.1 基于程序代码内部实现

在代码中根据 select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。

优点是性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支;
缺点是需要开发人员来实现,运维人员无从下手。

但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。

2.4.2 基于中间代理层实现

代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有以下代表性程序。

  • MySQL-Proxy:MySQL-Proxy 为 MySQL 开源项目,通过其自带的 lua 脚本进行SQL 判断。
  • Atlas:是由奇虎360的Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。
  • Amoeba:由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。但是它不支持事务和存储过程。
  • Mycat:是一款流行的基于Java语言编写的数据库中间件,是一个实现了MySql协议的服务器,其核心功能是分库分表。配合数据库的主从模式还可以实现读写分离。

2.5 实现读写分离

在这里插入图片描述

2.5.1 前置准备

#主服务器
192.168.67.100#从服务器1
192.168.67.101
#从服务器1
192.168.67.102#amobeba
192.168.67.103#客户端
192.168.67.104

2.5.2 配置amoeba

systemctl disable --now firewalld
setenforce 0vim /etc/selinux/config

在这里插入图片描述

cd /opt#所需安装包
amoeba-mysql-binary-2.2.0.tar.gz  
jdk-6u14-linux-x64.bin chmod +x jdk-6u14-linux-x64.bin
#给予可执行权限./jdk-6u14-linux-x64.bin
#直接执行#ctrl C选择yes

在这里插入图片描述

mv jdk1.6.0_14/ /usr/local/jdk1.6
#移动jdk主目录到/usr/local下#添加环境变量
cd /etc/profile.d
vi java.shexport JAVA_HOME=/usr/local/jdk1.6                     #java家目录
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib   #编译路径
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH    #设置java环境变量
export AMOEBA_HOME=/usr/local/amoeba                   #设置amobeba家目录 
export PATH=$PATH:$AMOEBA_HOME/bin                     #设置amobeba环境变量source /etc/profile.d/java.sh
java -version
#查看当前脚本

在这里插入图片描述

mkdir amoeba
#创建amobeba工作目录tar zxvf /opt/amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
#解压缩软件包

在这里插入图片描述

cd /usr/local/amoeba/bin
#前往启动文件处./amoeba
#以当前目录启动

在这里插入图片描述

#在主从服务器同时操作grant all on *.* to amoeba@'192.168.67.%' identified by '123123';
#在Master、Slave1、Slave2 的mysql上开放权限给 Amoeba 访问

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#前往amoeba
cd /usr/local/amoeba/conf
#前往配置文件处
cp amoeba.xml amoeba.xml.bak
#备份xml文件vim amoeba.xml									
#修改amoeba配置文件

在这里插入图片描述
在这里插入图片描述

cp dbServers.xml dbServers.xml.bak
#拷贝数据库配置文件vi dbServers.xml
#修改数据库配置文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

/usr/local/amoeba/bin/amoeba start&					
#启动Amoeba软件,在后台执行ss -natp |grep java
#查看是否启动成功

在这里插入图片描述

2.5.3 测试读写分离

#该步骤沿用主从复制配置
#前往客户端
yum install -y mariadb-server mariadb
#安装一个简单配置的mysql数据库
systemctl start mariadb.service
#开启服务mysql -uamoeba -padmin123 -h 192.168.67.103 -P8066
#登录原先设置的账户

在这里插入图片描述

show databases;select * from scj.scj1;
#查看库和表数据内容是否同步

在这里插入图片描述

#在表中添加数据查看同步情况
insert into scj.scj1 values (5, 'sakula酱', 20, '女');

在这里插入图片描述

#前往主服务器、从服务器1、从服务器2查看
#进入数据库
select * from scj.scj1;
#查看表数据

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#同步没有问题
#证明连接amoeba可以在三台服务器中进行写入操作
#需要证明连接amoeba执行写入操作是写入哪一台服务器的#前往从服务器1-2关掉同步
stop slave;

在这里插入图片描述

#现在前往客户端添加数据
insert into scj.scj1 values (6, '日川冈板', 28, '男');

在这里插入图片描述

#验证能否实现读的负载均衡
#在从服务器1添加数据
insert into scj.scj1 values (7, '强者', 23, '男');#在从服务器2添加数据
insert into scj.scj1 values (8, '弱者', 20, '男');

在这里插入图片描述

#前往客户端查看
#进入数据库
select * from scj.scj1

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机专业毕业设计项目推荐09-个人医疗系统(Spring+Js+Mysql)

个人医疗系统(SpringJsMysql) **介绍****系统总体开发情况-功能模块****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及…

【数据结构与算法】链表的实现以及一些基本算法

目录 单选链表的基本实现 有序列表的合并(双指针法) 链表的反转 链表实现两数之和 判定链表是否有环 单选链表的基本实现 public class LinkedList1 {//头节点Node first;//尾节点Node last;//大小int size 0;//头插法public void addFirst(int…

【2023年11月第四版教材】第15章《风险管理》(第四部分)

第15章《风险管理》(第四部分) 8 过程4-实施定量风险分析8.1 实施定量风险分析★★★8.2 数据分析★★★8.3 定量成本风险分析S曲线示例8.4 决策树示例8.5 龙卷风图示例8.6 项目文件(更新)★★★ 9 过程5-规划风险应对9.1 规划风险…

中间件 - 分布式协调服务Zookeeper

目录 一. 前言 二. 树状结构 2.1. ZNode 2.1.1. stat 2.1.2. ACL 三. NameService命名服务 四. Configuration 配置管理 五. GroupMembers 集群管理 六. 集群三个角色及状态 七. 选举算法 八. Watcher 九. 设计目的 十. 典型使用场景 一. 前言 Zookeeper是一个分布…

Vue简单的页面计算器

实现一个简单的页面计算器&#xff0c;练习组件的定义和注册方法&#xff0c;以及组件之间的数据传递 <div id"aa"> <ul> <li> <span>第一个数&#xff1a;</span><input v-model.number"first"/> </li> <…

安卓修改ROM 修改固件中的一些基本常识 自己做rom注意事项

修改rom 制作rom 解包rom的一些问题解析 安卓系列机型如何内置app 如何选择so文件内置 修改设置里 添加选项 添加文字 修改图标 修改版本号等等 实例解析 最近有几个粉丝对修改rom有兴趣。今天主要给这些友友提供一些自己初学修改rom的一些建议和思路&#xff0c;可以供大家…

打点初级技巧

什么是打点&#xff1f; 打点的目的获取一个服务器的控制权限。获得一个webshell。 步骤 如果你拿到一个网站的名字&#xff0c;该如何进行打点呢&#xff1f;首先&#xff0c;在天眼查上查询该网站&#xff0c;进入查询到的官网&#xff1a; 天眼查-商业查询平台_企业信息查…

Linux驱动开发笔记

疑问 file_operation中每个操作函数的形参中inode的作用 设备树中compatible属性中厂商和型号如何填写 file_operation定义了Linux内核驱动的所有的操作函数&#xff0c;每个操作函数与一个系统调用对应&#xff0c;对于字符设备来说&#xff0c;常用的函数有&#xff1a;lls…

Java项目实战-查询用户列表接口服务搭建

概述 这里通过设计一个对用户进行增删改查的接口服务&#xff0c;来练习java项目工程化、Spring框架、Mybatis框架的实际应用 本项目目录 上一节初始化项目&#xff0c;已经controller层了&#xff0c;下方新建包&#xff1a;pojo、mapper、service pojo:所有的实体类都放这…

手机相机系统介绍

目录 一张照片是如何生成的? 相机的成像原理 相机硬件 颜色四要素 相机硬件三大块 模组结构 镜头 镜头光路 镜头常见参数 镜头-FOV&EFL 镜头-焦距 镜头-光圈 图像传感器 图像传感器-像素-底 RGB排布 图像传感器-Pattern & PDAF Sensor CMOS sensor …

Kafka的消息传递保证和一致性

前言 通过前面的文章&#xff0c;相信大家对Kafka有了一定的了解了&#xff0c;那接下来问题就来了&#xff0c;Kafka既然作为一个分布式的消息队列系统&#xff0c;那它会不会出现消息丢失或者重复消费的情况呢&#xff1f;今天咱们就来一探。 实现机制 Kafka采用了一系列机…

怎样找到NPM里面开源库下载地址

场景 最近帮忙找一个开源库地址。这里以vue/language-core为例子。 解决 https://registry.npmmirror.com/vue/language-core/1.8.13这里就是如下格式&#xff1a; https://registry.npmmirror.com/{包名}/{版本号}打开这个页面后&#xff0c;得到开源库下载地址&#xff0c…

Java基于SSM+JSP的服装定制系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 .技术栈3 分析4系统设计4.1 软件功能模块设计4.2.2 物理模型设计 5系统详细设计5.1系统功…

力扣:110. 平衡二叉树(Python3)

题目&#xff1a; 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff…

目前很火的养猫微信小程序源码带流量主+搭建教程

目前很火的养猫微信小程序源码带流量主搭建教程。 搭建教程 进入小程序我们下载开发者工具 开发者工具安装好了 我们就把前端源码导入进开发者工具中 这里的APPID我们填写自己的小程序APPID 修改siteinfo.js里的uniacid和acid 这两个ID在刚才后端添加的小程序那里看 在把…

2023年信创云管平台选哪家?咨询电话多少?

随着云计算和信创国产化的快速发展&#xff0c;越来越多企业需要支持信创系统的云管平台。但很多企业不知道市面上信创云管平台有哪些&#xff0c;也不知道选哪家&#xff1f;这里我们小编就给大家来回答一下。 2023年信创云管平台选哪家&#xff1f;咨询电话多少&#xff1f;…

九日集训 Leetcode 371.两整数之和

给你两个整数 a 和 b &#xff0c;不使用 运算符 和 - &#xff0c;计算并返回两整数之和。 示例 1&#xff1a; 输入&#xff1a;a 1, b 2 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;a 2, b 3 输出&#xff1a;5提示&#xff1a; -1000 < a, b < 10…

智能生活从这里开始:数字孪生驱动的社区

数字孪生技术&#xff0c;这个近年来备受瞩目的名词&#xff0c;正迅速渗透到社区发展领域&#xff0c;改变着我们居住的方式、管理的方式以及与周围环境互动的方式。它不仅仅是一种概念&#xff0c;更是一种变革&#xff0c;下面我们将探讨数字孪生技术如何推动社区智能化发展…

力扣-169. 多数元素(C语言+分治递归)

1. 题目 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 2. 输入输出样例 示例1 输入&#xff1a;nums [3,2,3] 输出&#xff…

代码随想录算法训练营第四十九天 | 动态规划 part 10 | 买卖股票的最佳时机i、ii

目录 121. 买卖股票的最佳时机思路代码 122.买卖股票的最佳时机II思路代码 121. 买卖股票的最佳时机 Leetcode 思路 贪心&#xff1a;记录最低值&#xff0c;并且遍历股票逐个寻找股票卖出最大值 动态规划&#xff1a; dp[i][0] 表示第i天持有股票所得最多现金 dp[i][1] 表示…