MySQL主从复制
华子目录
- 实验环境准备
- 修改配置文件
- 实验
- `主`开启`bin-log日志`
- 创建用于`主从复制`的`用户`
- `master配置`
- `salve配置`
- 测试
- `添加一台新的slave`,如何实现`数据的全部同步`呢
- 什么环境下`主`比较多,什么环境下`从`比较多?
- 延迟复制
- 测试
- 并行复制
- `gtid`模式
- 未启用`gtid`时
- 当激活`gtid`后
- 设置`gtid`
- 测试
- 主从复制的原理
- 架构
- 三个线程
- 主从复制三步骤
- 具体操作
- 架构缺陷
- `半同步`模式
- 原理
- 启用`半同步模式`
- 什么时候我们需要`多个slave`
- 总结
- `show master status`显示信息中的`position`字段
实验环境准备
node1
为主
,node2
为从
修改配置文件
node1
上
[root@mysql-node1 ~]# vim /etc/my.cnf
服务器ID
(对于主从复制环境
,每个服务器
都需要一个唯一的ID
)
node2
上
[root@mysql-node2 ~]# vim /etc/my.cnf
服务器ID
(对于主从复制环境
,每个服务器
都需要一个唯一的ID
)
- 重启
mysql
[root@mysql-node1 ~]# /etc/init.d/mysqld restart
Shutting down MySQL... SUCCESS!
Starting MySQL. SUCCESS!
[root@mysql-node2 ~]# /etc/init.d/mysql.server restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
- 验证
标识变量
#-e指定sql语句
[root@mysql-node1 ~]# mysql -uroot -p123456 -e "select @@server_id";
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------+
| @@server_id |
+-------------+
| 10 |
+-------------+
[root@mysql-node2 ~]# mysql -uroot -p123456 -e "select @@server_id";
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------+
| @@server_id |
+-------------+
| 20 |
+-------------+
实验
主
开启bin-log日志
主
开启二进制日志
(bin-log日志
会记录所有更改数据
的语句
(insert、update、delete
等),不记录查询语句
)从
不开启二进制日志
功能
[root@mysql-node1 ~]# vim /etc/my.cnf
重启mysql
[root@mysql-node1 ~]# /etc/init.d/mysqld restart
Shutting down MySQL. SUCCESS!
Starting MySQL. SUCCESS!
- 查看
二进制日志
在主机上
的位置
[root@mysql-node1 ~]# cd /data/mysql/
- 使用
mysqlbinlog
查看二进制日志
的内容
[root@mysql-node1 mysql]# mysqlbinlog mysql-bin.000001
创建用于主从复制
的用户
master配置
[root@mysql-node1 ~]# mysql -uroot -p
Enter password:#生成专门用来做复制的用户,此用户是用于slave端做认证用的
mysql> create user huazi@"%" identified by "123456";#给他主从复制的权限
mysql> grant replication slave on *.* to huazi@"%";
#查看master的状态
mysql> show master status\G;
*************************** 1. row ***************************File: mysql-bin.000001Position: 481Binlog_Do_DB:Binlog_Ignore_DB:
Executed_Gtid_Set:
salve配置
[root@mysql-node2 ~]# mysql -uroot -p
Enter password:mysql> change master to master_host='172.25.254.10', -> master_user='huazi', -> master_password='123456', -> master_log_file='mysql-bin.000001', -> master_log_pos=481;
mysql> start slave;
mysql> show slave status\G;
测试
- 在
master
上建立一个db_hua库
mysql> create database db_hua;
- 在
slave
上查看
,发现从
上实现了与主
的同步
#我们发现从上出现了db_hua这个库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db_hua |
| mysql |
| performance_schema |
| sys |
+--------------------+
- 在
master
上建立一个表
,并插入数据
mysql> use db_hua;mysql> create table userlist(-> name varchar(10) not null,-> password varchar(20) not null-> );mysql> insert into userlist values-> ("huazi","123456");
- 在
slave
上查看,发现实现了数据同步
mysql> use db_hua;mysql> show tables;
+------------------+
| Tables_in_db_hua |
+------------------+
| userlist |
+------------------+mysql> select * from userlist;
+-------+----------+
| name | password |
+-------+----------+
| huazi | 123456 |
+-------+----------+
- 在
slave
上插入数据
mysql> insert into userlist values-> ("hua","789");mysql> select * from userlist;
+-------+----------+
| name | password |
+-------+----------+
| huazi | 123456 |
| hua | 789 |
+-------+----------+
- 在
master
上查看,发现数据
没有同步过来
mysql> select * from userlist;
+-------+----------+
| name | password |
+-------+----------+
| huazi | 123456 |
+-------+----------+
slave
上不能插入数据
,如果插入数据
后,master
上同步不到
- 回收
mysql> delete from userlist where name="hua";
添加一台新的slave
,如何实现数据的全部同步
呢
- 准备一台机子
mysql-node3
,ip
:172.25.254.30
- 修改
配置文件
,设置server-id
为30
[root@mysql-node3 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=30
master
中对db_hua
中的userlist表
进行锁表
,防止在备份的过程中
不断有数据写入
,保证备份前后数据
的一致性
#锁表
mysql> flush tables with read lock;
#我们发现,此时不能插入数据
mysql> insert into userlist values-> ("hua","123");
ERROR 1223 (HY000): Can't execute the query because you have a conflicting read lock
- 使用
mysqldump命令
从master
节点上备份数据
[root@mysql-node1 ~]# mysqldump -uroot --password=123456 db_hua userlist > back1.sql
- 将
back1.sql
复制到node3主机
中
[root@mysql-node1 ~]# rsync back1.sql root@172.25.254.30:/root/
- 在
node3
上通过非交互式
建库
[root@mysql-node3 ~]# mysql -uroot -p123456 -e "create database db_hua;"
- 在
node3
上通过非交互式
导入back1.sql
文件
[root@mysql-node3 ~]# mysql -uroot -p123456 db_hua < back1.sql
- 进入
node3
的数据库
,发现已经导入成功
[root@mysql-node3 ~]# mysql -uroot -p123456
mysql> use db_hua;mysql> select * from userlist;
+-------+----------+
| name | password |
+-------+----------+
| huazi | 123456 |
+-------+----------+
- 在
master
上查看状态
mysql> show master status\G;
*************************** 1. row ***************************File: mysql-bin.000002Position: 154Binlog_Do_DB:Binlog_Ignore_DB:
Executed_Gtid_Set:
node3
上加入主从集群
mysql> change master to master_host='172.25.254.10',master_user='huazi',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=154;mysql> start slave;
- 查看
node3
上的slave状态
mysql> show slave status\G;
master
上解锁
mysql> unlock tables;
master
上插入数据
mysql> insert into userlist values -> ("hua","123");mysql> select * from userlist;
+-------+----------+
| name | password |
+-------+----------+
| huazi | 123456 |
| hua | 123 |
+-------+----------+
- 在
node3
上查看,发现数据已经同步过来
mysql> select * from userlist;
+-------+----------+
| name | password |
+-------+----------+
| huazi | 123456 | #原数据
| hua | 123 | #新数据
+-------+----------+
- 在
node2
上查看,发现数据正常同步
mysql> select * from userlist;
+-------+----------+
| name | password |
+-------+----------+
| huazi | 123456 |
| hua | 123 |
+-------+----------+
至此,就实现了一主两从
什么环境下主
比较多,什么环境下从
比较多?
- 有
大量数据
需要写入
时,主
比较多。有大量数据
需要读取
时,从
比较多
延迟复制
延迟复制
是用来控制sql线程
的,和i/o线程
无关延迟复制
不是i/o线程
过段时间来复制
,i/o
是正常工作
的- 是
日志
已经保存在slave端
了,那个sql
要等多久进行回放
- 设置
延迟
是为了防止主
的误操作
在node2
上设置延迟
#先关闭sql线程
mysql> stop slave sql_thread;#设置延迟时间为60秒
mysql> change master to master_delay=60;#再开启sql线程
mysql> start slave sql_thread;
#我们发现时间已经改为了60秒
#即:每次主上修改数据后,从要等上60秒再进行数据同步
mysql> show slave status\G;
测试
- 在
master
上不小心删除
了一条数据
mysql> select * from userlist;
+-------+----------+
| name | password |
+-------+----------+
| huazi | 123456 |
| hua | 123 |
+-------+----------+mysql> delete from userlist where name="hua";
60秒
之前,node2
上
mysql> select * from userlist;
+-------+----------+
| name | password |
+-------+----------+
| huazi | 123456 |
| hua | 123 |
+-------+----------+#立即将数据导出
[root@mysql-node2 ~]# mysqldump -uroot --password=123456 db_hua userlist > back2.sql
60秒
之后,node2
上
mysql> select * from userlist;
+-------+----------+
| name | password |
+-------+----------+
| huazi | 123456 |
+-------+----------+
master
上做数据恢复
[root@mysql-node2 ~]# rsync back2.sql root@172.25.254.10:/root/[root@mysql-node1 ~]# mysql -uroot -p123456 db_hua < back2.sqlmysql> select * from userlist;
+-------+----------+
| name | password |
+-------+----------+
| huazi | 123456 |
| hua | 123 |
+-------+----------+
数据恢复
后,slave
上也会进行数据同步
并行复制
- 查看
slave
中的线程信息
mysql> show processlist;
+----+-------------+-----------+--------+---------+-------+--------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+-----------+--------+---------+-------+--------------------------------------------------------+------------------+
| 5 | root | localhost | db_hua | Sleep | 52137 | | NULL |
| 6 | system user | | NULL | Connect | 54465 | Waiting for master to send event | NULL |
| 7 | system user | | NULL | Connect | 53053 | Slave has read all relay log; waiting for more updates | NULL |
| 8 | root | localhost | NULL | Query | 0 | starting | show processlist |
+----+-------------+-----------+--------+---------+-------+--------------------------------------------------------+------------------+
- 默认情况下
slave
中使用的是sql单线程回放
复制master
数据的 - 在
master
中多用户读写
,如果使用sql单线程回放
,那么就会造成组从复制延迟严重
- 开启
MySQL
的多线程回放
可以解决上述问题
注意:如果
slave
上有延迟时间
的设置
,则不设置多线程回放
多线程回放
是在slave
中设置的
#在node3上
[root@mysql-node3 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=30gtid_mode=on
enforce-gtid-consistency=on
slave-parallel-type=LOGICAL_CLOCK #基于组提交
slave-parallel-workers=16 #开启线程数量
master_info_repository=TABLE #master信息在表中记录,默认记录
relay_log_info_repository=TABLE #回放日志信息在表中记录,默认记录
relay_log_recovery=ON #日志回放恢复功能开启
#重启
[root@mysql-node3 ~]# /etc/init.d/mysqld restart[root@mysql-node3 ~]# mysql -uroot -p
Enter password:mysql> show processlist;
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
| 2 | system user | | NULL | Connect | 18 | Slave has read all relay log; waiting for more updates | NULL |
| 3 | system user | | NULL | Connect | 18 | Waiting for an event from Coordinator | NULL |
| 4 | system user | | NULL | Connect | 18 | Waiting for an event from Coordinator | NULL |
| 6 | system user | | NULL | Connect | 18 | Waiting for an event from Coordinator | NULL |
| 7 | system user | | NULL | Connect | 18 | Waiting for an event from Coordinator | NULL |
| 8 | system user | | NULL | Connect | 18 | Waiting for an event from Coordinator | NULL |
| 9 | system user | | NULL | Connect | 18 | Waiting for an event from Coordinator | NULL |
| 10 | system user | | NULL | Connect | 18 | Waiting for an event from Coordinator | NULL |
| 11 | system user | | NULL | Connect | 18 | Waiting for an event from Coordinator | NULL |
| 12 | system user | | NULL | Connect | 18 | Waiting for an event from Coordinator | NULL |
| 13 | system user | | NULL | Connect | 18 | Waiting for an event from Coordinator | NULL |
| 14 | system user | | NULL | Connect | 18 | Waiting for an event from Coordinator | NULL |
| 15 | system user | | NULL | Connect | 18 | Waiting for an event from Coordinator | NULL |
| 16 | system user | | NULL | Connect | 18 | Waiting for an event from Coordinator | NULL |
| 17 | system user | | NULL | Connect | 18 | Waiting for an event from Coordinator | NULL |
| 18 | system user | | NULL | Connect | 18 | Waiting for an event from Coordinator | NULL |
| 19 | system user | | NULL | Connect | 18 | Waiting for an event from Coordinator | NULL |
| 20 | root | localhost | NULL | Query | 0 | starting | show processlist |
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
- 此时
sql线程
转化为协调线程
,16
个worker
负责处理sql协调线程
发送过来的处理请求
gtid
模式
未启用gtid
时
- 在
master端
的写入
时多用户读写
,在slave端
复制时单线程日志回放
,所以slave端
一定会延迟
- 这种
延迟
在slave端
的延迟
可能会导致数据同步不一致
,当master挂掉
后slave接管
,一般会挑选
一个和master延迟日志
最接近
的充当
新的master
- 那么
未接管master
的主机
继续充当slave角色
并会指向
到新的master
上,作为其slave
- 这时候
按照之前
的配置
我们需要知道新的master
上的pos
的id
,但是我们无法确定
新的master
和slave之间差多少
当激活gtid
后
- 当
master出现问题
后,slave2
和master
的数据最接近
,会被作为新的master
slave1
指向新的master
,但是slave1
不会去检测新的master
的pos id
,只需要继续
读取自己gtid_next
即可
设置gtid
master端
和slave端
都开启gtid
#master上
[root@mysql-node1 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10
log-bin=mysql-bin
gtid_mode=on
enforce-gtid-consistency=on
#slave上
[root@mysql-node2 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=20
gtid_mode=on
enforce-gtid-consistency=on
#slave上
[root@mysql-node3 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=30
gtid_mode=on
enforce-gtid-consistency=on
- 重启
mysql
[root@mysql-node1 ~]# /etc/init.d/mysqld restart[root@mysql-node2 ~]# /etc/init.d/mysql.server restart[root@mysql-node3 ~]# /etc/init.d/mysqld restart
- 检测
是否开启
[root@mysql-node1 ~]# mysql -uroot -p123456 -e "select @@session.gtid_next;"
+---------------------+
| @@session.gtid_next |
+---------------------+
| AUTOMATIC | #开启
+---------------------+[root@mysql-node2 ~]# mysql -uroot -p123456 -e "select @@session.gtid_next;"
+---------------------+
| @@session.gtid_next |
+---------------------+
| AUTOMATIC |
+---------------------+[root@mysql-node3 ~]# mysql -uroot -p123456 -e "select @@session.gtid_next;"
+---------------------+
| @@session.gtid_next |
+---------------------+
| AUTOMATIC |
+---------------------+
slave端设置
[root@mysql-node2 ~]# mysql -uroot -p
Enter password:
#先停掉slave
mysql> stop slave;mysql> change master to-> master_host="172.25.254.10",-> master_user='huazi',-> master_password="123456",-> master_auto_position=1;#再开启
mysql> start slave;
[root@mysql-node3 ~]# mysql -uroot -p
Enter password:#先停掉
mysql> stop slave;mysql> change master to-> master_host="172.25.254.10",-> master_user="huazi",-> master_password="123456",-> master_auto_position=1;#再开启
mysql> start slave;
测试
#master上
mysql> show master status\G;
*************************** 1. row ***************************File: mysql-bin.000003Position: 154Binlog_Do_DB:Binlog_Ignore_DB:
Executed_Gtid_Set:
#slave上(node2)
mysql> show slave status\G;
#slave上(node3)
mysql> show slave status\G;
主从复制的原理
架构
三个线程
实际上主从同步
的原理
就是基于bin-log日志
进行数据同步
的。在主从复制
过程中,会基于3个线程
来操作,一个主库线程
,两个从库线程
。
二进制日志转储线程
(Binlog dump thread
)是一个主库线程
。当从库线程
连接的时候,主库线程
可以将bin-log日志
发送给从库I/O线程
,当主库读取事件
(Event
)的时候,会在Bin-log
上加锁
,读取完成之后
,再将锁释放掉
从库I/O线程
会连接到主库
,向主库
发送请求
更新Bin-log
。这时从库的I/O线程
就可以读取
到主库
的二进制日志转储线程
发送的Bin-log
更新部分,并且拷贝
到本地
的中继日志
(Relay log
)从库SQL线程
会读取从库
中的中继日志
,并且执行日志
中的事件
,将从库
中的数据
与主库
保持同步
主从复制三步骤
步骤1
:Master
将修改操作
记录到二进制日志
(bin-log
)步骤2
:Slave
将Master
的binary log
拷贝到它的中继日志
(relay log
)步骤3
:Slave
重做中继日志
中的事件
,将改变应用
到自己的数据库
中。MySQL
复制是异步且串行化的
,而且重启
后从接入点
开始复制
具体操作
slave端
中设置了master端
的ip
,用户名
,用户密码
、日志文件名
,和日志的Position
,通过这些信息
取得master
的认证及信息
master端
在设定好bin-log
启动后会开启binlog dump
的线程
master端
的binlog dump线程
把二进制
的更新
发送到slave端
slave端
开启两个线程
,一个是I/O线程
,一个是sql线程
i/o线程
用于接收master端
的二进制日志
,此线程
会在本地
打开relay-log中继日志
,并且保存
到本地磁盘
sql线程
读取本地relog中继日志
进行回放
架构缺陷
主从架构
采用的是异步机制
master
更新完成后直接
发送二进制日志
到slave
,但是slave
是否真正保存了数据
,master端
不会检测
master端
直接保存二进制日志
到磁盘
- 当
master端
到slave端
的网络出现问题
或者master端
直接挂掉
,二进制日志
可能根本没有到达slave
master
出现问题后,slave端
接管master
,这个过程中数据就丢失了
这样的问题出现
就无法达到数据
的强一致性
,零数据丢失
半同步
模式
原理
用户线程写入完成
后master
中的dump线程
会把二进制日志
推送到slave端
slave
中的i/o线程
接收后保存
到relay-log中继日志
保存完成
后slave
向master端
返回ack
进行确认- 在
未接受
到slave
的ack
时,master端
是不做提交的
,一直处于等待
,当收到ack
后提交
到存储引擎
- 在
5.6版本
中用到的是after_commit模式
,after_commit模式
是先提交再等待ack返回
后输出ok
启用半同步模式
- 做
半同步之前
需要开启gtid
什么时候我们需要多个slave
- 当
读取操作
远远高于写操作
时。我们采用一主多从
架构 - 数据库
外层接入负载均衡层
并搭配高可用机制
总结
show master status
显示信息中的position
字段
在MySQL
中,SHOW MASTER STATUS
命令的输出包含了关于当前主服务器
(Master
)二进制日志
(Binary Log
)状态的信息
。其中,Position
字段提供了关于二进制日志文件
中当前写入位置
的关键信息
。
- 具体来说,
Position
字段表示的是在当前二进制日志文件
中,下一个
即将被写入的事件的起始字节偏移量
。这个偏移量
是从二进制日志文件
的开头
算起的。每当主服务器
执行一个会改变数据库状态
的操作
(如INSERT
、UPDATE
或DELETE
语句)时,这个操作
会被记录为一个事件
,并追加
到当前的二进制日志文件
中。Position
字段的值
会随着新事件
的写入
而递增
- 在
复制
(Replication
)环境
中,从服务器
(Slave
)会使用这个Position
值来确定它应该从主服务器
的二进制日志文件
的哪个位置
开始读取事件
。这样,从服务器
就能够准确
地复制主服务器上
的所有更改
。
举个例子,如果 SHOW MASTER STATUS
命令的输出如下:
+------------------+----------+--------------+------------------+---------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+---------------------------------------+
| mysql-bin.000001 | 1543 | | | |
+------------------+----------+--------------+------------------+---------------------------------------+
- 在这个例子中,
Position
字段的值是1543
。这意味着在当前
的二进制日志文件mysql-bin.000001
中,下一个事件
将从文件
的第1543
个字节开始写入
(实际上,由于字节偏移量
是从0
开始的,所以第1543
个字节
是文件中
的第1544
个位置,但通常我们按照偏移量
来理解这个值) - 如果设置了
复制
,从服务器
将会从这个位置
开始读取事件
,以确保
它能够复制主服务器
上的所有最新更改
相关文章:
MySQL主从复制
华子目录 实验环境准备修改配置文件 实验主开启bin-log日志创建用于主从复制的用户master配置salve配置 测试 添加一台新的slave,如何实现数据的全部同步呢什么环境下主比较多,什么环境下从比较多?延迟复制测试 并行复制gtid模式未启用gtid时…...
贝叶斯统计:高斯分布均值μ的后验分布推导
使用贝叶斯统计方法 均值 ( μ \mu μ ) 的后验分布解析 在贝叶斯统计中,后验分布表示在观察到数据后,对参数的更新后的信念。本篇文章将结合高斯分布的假设,详细解析均值 ( μ \mu μ ) 的后验分布推导过程,并对 ( μ \mu μ…...
linux常用指令都是工作中遇到的
前端打war包 jar -cvf dist.war *创建 WAR 文件的命令 jar -cvf dist.war * 用于将当前目录下的所有文件和文件夹打包成一个名为 dist.war 的 WAR 文件。以下是该命令的详细解释: jar: Java Archive 工具,用于创建 JAR、WAR 或 EAR 文件。 -c: 创建新的…...
亚马逊自研大语言模型 Olympus 即将亮相,或将在 LLM 竞赛中掀起新波澜
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
droppath
DropPath 是一种用于正则化深度学习模型的技术,它在训练过程中随机丢弃路径(或者说随机让某些部分的输出变为零),从而增强模型的鲁棒性和泛化能力。 代码解释: import torch import torch.nn as nn # 定义 DropPath…...
通信与网络安全之IPSEC
IPSec(IP Security)是IETF制定的为保证在Internet上传送数据的安全保密性能的三层隧道加密协议。IPSec在网络层对IP报文提供安全服务。IPSec协议本身定义了如何在IP数据包中增加字段来保证IP包的完整性、 私有性和真实性,以及如何加密数据包。…...
Linux内核编译流程(Ubuntu24.04+Linux Kernel 6.8.12)
万恶的拯救者,使用Ubuntu没有声音,必须要自己修改一下Linux内核中的相关驱动逻辑才可以,所以被迫学习怎么修改内核&编译内核,记录如下 准备工作 下载Linux源码:在Linux发布页下载并使用gpg签名验证 即:…...
什么是GAN?
一、基本概念 生成对抗网络(Generative Adversarial Network,GAN)是一种由两个神经网络共同组成深度学习模型:生成器(Generator)和判别器(Discriminator)。这两个网络通过对抗的方式…...
torch_geometric使用手册-Creating Graph Datasets(专题四)
虽然 PyG 已经提供了很多有用的数据集,但你可能希望创建自己的数据集,使用自己收集的数据或非公开的数据。 自己实现数据集是非常简单的,你可能想查看源代码,了解各种数据集是如何实现的。然而,这里简要介绍一下如何设置你自己的数据集。 我们提供了两个抽象类用于数据集…...
编程语言之Python
Python是一种高级编程语言,自其诞生以来,便因其简洁明了的语法、强大的功能和广泛的应用领域而备受青睐。以下是对Python的详细介绍,包括其历史、特点、应用领域,以及通过代码示例展示其语法、库、函数等关键概念。同时࿰…...
【Go】-调度器简介
目录 数据结构 G M P 调度器启动 创建 Goroutine 初始化结构体 运行队列 调度信息 调度循环 小结 数据结构 Go的运行时调度器的三个重要组成部分 — 线程 M、Goroutine G 和处理器 P: 图 6-29 Go 语言调度器 G — 表示 Goroutine,它是一个待…...
在Ubuntu 22.04上设置Python 3的Jupyter Notebook
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 Jupyter Notebook 是一个作为 Web 应用程序的交互式计算命令 shell。该工具可与多种语言一起使用,包括 Python、Julia…...
通讯专题4.1——CAN通信之计算机网络与现场总线
从通讯专题4开始,来学习CAN总线的内容。 为了更好的学习CAN,先从计算机网络与现场总线开始了解。 1 计算机网络体系的结构 在我们生活当中,有许多的网络,如交通网(铁路、公路等)、通信网(电信、…...
将jar包导入maven
1.将jar包放repository 2.执行命令:mvn install:install-file -DgroupIdcom.oracle -DartifactIdojdbc7 -Dversion12.1.0.2 -Dpackagingjar -DfileD:\dev\utils\idea\repository\ojdbc7.jar -Dfile: 指定要安装的JAR文件的路径。 -DgroupId: 指定项目的groupId。 -…...
Mysql实现定时自动备份(Windows环境)
一.新建数据库备份目录 二.新建批处理文件 创建批处理文件mysql_backup.bat echo off set BACKUP_DIRD:\backup set MYSQL_USERroot set MYSQL_PASS123456 set MYSQL_HOSTlocalhost set DATABASE_NAMEphoenix set DATE%date:~0,4%-%date:~5,2%-%date:~8,2%_%time:~0,2%-%time…...
kafka数据在服务端时怎么写入的
学习背景 接着上篇,我们来聊聊kafka数据在服务端怎么写入的 服务端写入 在介绍服务端的写流程之前,我们先要理解服务端的几个角色之间的关系。 假设我们有一个由3个broker组成的kafka集群,我们在这个集群上创建一个topic叫做shitu-topic&…...
2024算法基础公选课练习七(BFS1)
一、前言 还是偏基础的bfs,但是有几个题不是很好写 二、题目总览 三、具体题目 3.1 问题 A: 数据结构-队列-奇怪的电梯 我的代码 可以看成求一维平面的bfs最短路 #include <bits/stdc.h> using i64 long long; using pii std::pair<int,int>; co…...
算法刷题Day1
BM47 寻找第k大 第一天就随便记录吧,万事开头难,我好不容易开的头,就别难为自己,去追求高质量了。嘿嘿嘿 题目 传送门 解题思路一:维护一个大小为k的最小堆。最后返回堆顶元素。 代码: # # 代码中的类名…...
你还没有将 Siri 接入GPT对话功能吗?
由于各种原因,国内ios用户目前无缘自带 AI 功能,但是这并不代表国内 ios 无法接入 AI 功能,接下来手把手带你为iPhone siri 接入 gpt 对话功能。 siri 接入 chatGPT 暂时还无法下载 ChatGPT app,或者没有账号的读者可以直接跳到…...
LabVIEW 标准状态机设计模式
LabVIEW 标准状态机设计模式 LabVIEW 软件框架介绍LabVIEW编程模式及其应用分析状态机模式的类型分析标准状态机设计模式及状态机应用学习顺序结构它的一个缺点是什么? 状态机结构 LabVIEW 软件框架介绍 源于虚拟仪器技术的LabVIEW程序设计语言,从被创建…...
Scala学习记录,统计成绩
统计成绩练习 1.计算每个同学的总分和平均分 2.统计每个科目的平均分 3.列出总分前三名和单科前三名,并保存结果到文件中 解题思路如下: 1.读入txt文件,按行读入 2.处理数据 (1)计算每个同学的总分平均分 import s…...
使用 client-go 实现 Kubernetes 节点 Drain:详解与实战教程
在 Kubernetes 中使用 client-go 实现 drain 功能涉及多个步骤,需要模仿 kubectl drain 的行为。这包括将节点标记为不可调度(cordon)、驱逐 Pod,并处理 DaemonSet 和不可驱逐 Pod 的逻辑。以下是实现 drain 的主要步骤࿱…...
C#VB.Net项目一键多国语言显示
如何在项目什么都不做一键支持多国语言显示 开始我们的一键快捷使用之旅 01.创建多语言项目 02.一键批量窗口开启本地化,添加选中内容添加Mu方法 03.一键快捷翻译 04.运行查看效果 01.创建多语言项目 创建多语言项目前,请先下载安装,注册并登录. 为了便于演示这…...
【关闭or开启电脑自带的数字键盘】
目录 一、按数字键盘左上角的按键【NumLK Scroll】 二、修改注册表中数字键盘对应的数值【InitialKeyboardIndicators】 1、步骤: 2、知识点: 一、按数字键盘左上角的按键【NumLK Scroll】 这是最简单快捷的方法。 关闭后若想开启,再按一…...
如何在Bash中等待多个子进程完成,并且当其中任何一个子进程以非零退出状态结束时,使主进程也返回一个非零的退出码?
文章目录 问题回答参考 问题 如何在 Bash 脚本中等待该脚本启动的多个子进程完成,并且当这其中任意一个子进程以非零退出码结束时,让该脚本也返回一个非零的退出码? 简单的脚本: #!/bin/bash for i in seq 0 9; docalculations $i & d…...
Asio2网络库
header only,不依赖boost库,不需要单独编译,在工程的Include目录中添加asio2路径,在源码中#include <asio2/asio2.hpp>即可使用;支持tcp, udp, http, websocket, rpc, ssl, icmp, serial_port;支持可靠UDP(基于KCP),支持SSL;TCP支持各种数据拆包功能(单个字符或字符串或用…...
Uniapp 微信小程序内打开web网页
技术栈:Uniapp Vue3 简介 实际业务中有时候会需要在本微信小程序内打开web页面,这时候可以封装一个路由页面专门用于此场景。 在路由跳转的时候携带路由参数,拼接上web url,接收页面进行参数接收即可。 实现 webview页面 新…...
学习线性表_3
单链表的删除 直接删除即可删除后要free //删除第i个位置的元素 //删除时L是不会变的,所以不需要加引用 bool ListDelect(LinkList L,int i) {//i 1,即删除头指针//拿到要删除结点的前一个结点LinkList p GetElem(L,i-1);if(NULLp){return false;}//拿到要删除的结…...
智能桥梁安全运行监测系统守护桥梁安全卫士
一、方案背景 桥梁作为交通基础设施中不可或缺的重要组成部分,其安全稳定的运行直接关联到广大人民群众的生命财产安全以及整个社会的稳定与和谐。桥梁不仅是连接两地的通道,更是经济发展和社会进步的重要纽带。为了确保桥梁的安全运行,桥梁安…...
Arrays.asList()新增报错,该怎么解决
一、前言 在 Java 开发中,Arrays.asList() 是一个常用的工具方法,它允许开发者快速将数组转换为列表。尽管这个方法非常方便,但许多开发者在使用时可能会遭遇一个常见的错误:尝试向由 Arrays.asList() 返回的列表中添加元素时抛出…...
28.UE5实现对话系统
目录 1.对话结构的设计(重点) 2.NPC对话接口的实现 2.1创建类型为pawn的蓝图 2.2创建对话接口 3.对话组件的创建 4.对话的UI设计 4.1UI_对话内容 4.2UI_对话选项 4.3UI_对话选项框 5.对话组件的逻辑实现 通过组件蓝图,也就是下图中的…...
会议直击|美格智能亮相2024紫光展锐全球合作伙伴大会,融合5G+AI共拓全球市场
11月26日,2024紫光展锐全球合作伙伴大会在上海举办,作为紫光展锐年度盛会,吸引来自全球的众多合作伙伴和行业专家、学者共同参与。美格智能与紫光展锐竭诚合作多年,共同面向5G、AI和卫星通信为代表的前沿科技,聚焦技术…...
IDEA报错: java: JPS incremental annotation processing is disabled 解决
起因 换了个电脑打开了之前某个老项目IDEA启动springcloud其中某个服务直接报错,信息如下 java: JPS incremental annotation processing is disabled. Compilation results on partial recompilation may be inaccurate. Use build process “jps.track.ap.depen…...
面对深度伪造:OWASP发布专业应对指南
从美国大选造谣视频到AI编写的网络钓鱼邮件,深度伪造(deepfake)诈骗和生成式人工智能攻击日益猖獗,人眼越来越难以辨识,企业迫切需要为网络安全团队制定AI安全事件响应指南。 深度伪造攻击威胁日益增加 全球范围内&…...
IDEA全局设置-解决maven加载过慢的问题
一、IDEA全局设置 注意:如果不是全局设置,仅仅针对某个项目有效;例在利用网上教程解决maven加载过慢的问题时,按步骤设置却得不到解决,原因就是没有在全局设置。 1.如何进行全局设置 a.在项目页面,点击f…...
【阅读笔记】Android广播的处理流程
关于Android的解析,有很多优质内容,看了后记录一下阅读笔记,也是一种有意义的事情, 今天就看看“那个写代码的”这位大佬关于广播的梳理, https://blog.csdn.net/a572423926/category_11509429.html https://blog.c…...
queue 和 Stack
import scala.collection.mutable //queue:队列.排队打饭.... //特点:先进先出 //Stack:栈 //特点:先进后出 class ob5 { def main(args: Array[String]): Unit { val q1 mutable.Queue(1) q1.enqueue(2)//入队 q1.enqueue(3)//入队 q1.enqueue(4)…...
C#窗体小程序计算器
使其能完成2个数的加、减、乘、除基本运算。界面如下图,单击相应的运算符按钮,则完成相应的运算,并将结果显示出来,同时不允许在结果栏中输入内容 代码如下: private void button1_Click(object sender, EventArgs e)…...
Linux——自定义简单shell
shell 自定义shell目标普通命令和内建命令(补充) shell实现实现原理实现代码 自定义shell 目标 能处理普通命令能处理内建命令要能帮助我们理解内建命令/本地变量/环境变量这些概念理解shell的运行 普通命令和内建命令(补充) …...
大模型开发和微调工具Llama-Factory-->WebUI
WebUI LLaMA-Factory 支持通过 WebUI 零代码微调大模型。 通过如下指令进入 WebUI llamafactory-cli webui# 如果是国内, # USE_MODELSCOPE_HUB 设为 1,表示模型从 ModelScope 魔搭社区下载。 # 避免从 HuggingFace 下载模型导致网速不畅 USE_MODELSC…...
【网络】应用层协议HTTPHTTPcookie与sessionHTTPS协议原理
主页:醋溜马桶圈-CSDN博客 专栏:计算机网络原理_醋溜马桶圈的博客-CSDN博客 gitee:mnxcc (mnxcc) - Gitee.com 目录 1.应用层协议HTTP 2.认识 URL 2.1 urlencode 和 urldecode 3.HTTP 协议请求与响应格式 3.1 HTTP 请求 3.2 HTTP 响应 …...
基于LSTM的文本多分类任务
概述: LSTM(Long Short-Term Memory,长短时记忆)模型是一种特殊的循环神经网络(RNN)架构,由Hochreiter和Schmidhuber于1997年提出。LSTM被设计来解决标准RNN在处理序列数据时遇到的长期依赖问题…...
Git忽略文件
在Git中,你可以通过修改 .gitignore 文件来忽略整个文件夹。以下是具体步骤: 打开或创建 .gitignore 文件 确保你的项目根目录下有一个 .gitignore 文件。如果没有,创建一个: touch .gitignore 在 .gitignore 文件中添加要忽略…...
Spring的事务管理
tx标签用于配置事务管理用于声明和配置事务的相关属性 transaction-manager指定一个事务管理器的引用,用于管理事务的生命周期。propagation指定事务的传播属性,决定了在嵌套事务中如何处理事务。isolation指定事务的隔离级别,用于控制事务之…...
java int值可以直接赋值给char类型 详解
在 Java 中,int 值可以直接赋值给 char 类型,但有一定的限制和机制。以下是详细的解释: 1. Java 中的 char 和 int 类型关系 char 的本质 char 是一个 16 位无符号整数类型,用于表示 Unicode 字符。范围为 0 到 65535࿰…...
淘宝商品数据获取:Python爬虫技术的应用与实践
引言 随着电子商务的蓬勃发展,淘宝作为中国最大的电商平台之一,拥有海量的商品数据。这些数据对于市场分析、消费者行为研究、商品推荐系统等领域具有极高的价值。然而,如何高效、合法地从淘宝平台获取这些数据,成为了一个技术挑…...
【力扣】389.找不同
问题描述 思路解析 只有小写字母,这种设计参数小的,直接桶排序我最开始的想法是使用两个不同的数组,分别存入他们单个字符转换后的值,然后比较是否相同。也确实通过了 看了题解后,发现可以优化,首先因为t相…...
何时在 SQL 中使用 CHAR、VARCHAR 和 VARCHAR(MAX)
在管理数据库表时,考虑 CHAR、VARCHAR 和 VARCHAR(MAX) 是必不可少的。此外,使用正确的工具(例如dbForge Studio for SQL Server) ,与数据库相关的任务都会变得更加容易。它是针对 SQL Server 专业人员的强大的一体化解…...
pnpm安装electron出现postinstall$ node install.js报错
pnpm install --registryhttp://registry.npm.taobao.org安装依赖包的时候出现了postinstall$ node install.js报错 找到install.js 找到downloadArtifact方法,添加如下代码 mirrorOptions:{mirror:"http://npmmirror.com/mirrors/electron/"}http://n…...
如何从 Hugging Face 数据集中随机采样数据并保存为新的 Arrow 文件
如何从 Hugging Face 数据集中随机采样数据并保存为新的 Arrow 文件 在使用 Hugging Face 的数据集进行模型训练时,有时我们并不需要整个数据集,尤其是当数据集非常大时。为了节省存储空间和提高训练效率,我们可以从数据集中随机采样一部分数…...