案例——Mysql主从复制与读写分离

news2024/9/21 12:41:10

 

目录

 

一、为什么需要主从复制

二、主从复制原理

2.1复制类型

2.2mysql主从复制的工作过程

2.2.1mysql主从复制延迟

2.3mysql的三种同步方式

2.3.1异步复制

2.3.2同步复制

2.3.3半同步复制

2.4mysql应用场景

三、主从复制实验

3.1主从服务器事件同步

3.1.1master服务器配置

3.1.2两台slave服务器配置

3.2mysql手动编译安装

3.3配置主从同步

3.4测试数据同步

四、mysql读写分离

4.1什么是读写分离

4.2为什么要读写分离

4.3什么时候要读写分离

4.4主从复制与读写分离

4.5mysql读写分离原理

4.6企业用mysql读写分离场景

五、读写分离实验

5.1搭建mysql读写分离

5.1.1Amoeba服务器配置

5.1.2测试读写分离


一、为什么需要主从复制

在企业应用中,成熟的业务通常数据量都比较大

单台MySQL在安全性、 高可用性和高并发方面都无法满足实际的需求

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

二、主从复制原理

2.1复制类型

  • 基于语句的复制(statenent,mysql类型)
  • 基于行的复制(row)
  • 混合语句的复制(mixed)

2.2mysql主从复制的工作过程

(1)在每个事务更新数据完成之前,Master 在二进制日志(Binary log)记录这些改变。写入二进制 日志完成后,Master 通知存储引擎提交事务。

(2)Slave 将 Master 的复制到其中继日志(Relay log)。首先slave 开始一个工作线程(I/O),I/O 线程在 Master 上打开一个普通的连接,然后开始 Binlog dump process。Binlog dump process 从 Master 的二进制日志中读取事件,如果已经跟上 Master,它会睡眠并等待 Master 产生新的事件,I/O 线程将这些事件写入中继日志。

(3)SQL slave thread(SQL从线程)处理该过程的最后一步,SQL线程从中继日志读取事件,并重放 其中的事件而更新 Slave 数据,使其与 Master 中的数据一致,只要该线程与 I/O 线程保持一致,中继 日志通常会位于 OS 缓存中,所以中继日志的开销很小。 复制过程有一个很重要的限制,即复制在 Slave 上是串行化的,也就是说 Master 上的并行更新操作不 能在 Slave 上并行操作。

2.2.1mysql主从复制延迟

1、master服务器高并发,形成大量事务

2、网络延迟

3、主从硬件设备导致 cpu主频、内存io、硬盘io

4、本来就不是同步复制、而是异步复制

从库优化Mysql参数。比如增大innodb_buffer_pool_size,让更多操作在Mysql内存中完成,减少磁盘 操作。

从库使用高性能主机。包括cpu强悍、内存加大。避免使用虚拟云主机,使用物理主机,这样提升了i/o 方面性。

从库使用SSD磁盘

网络优化,避免跨机房实现同步

问题解决方法

半同步复制- 解决数据丢失的问题

并行复制---解决从库复制延迟的问题

2.3mysql的三种同步方式

1、异步复制(Async Replication)

2、同步复制(sync Replication)

3、半同步复制(Async Replication)

2.3.1异步复制

主库将更新写入Binlog日志文件后,不需要等待数据更新是否已经复制到从库中,就可以继续处理更多 的请求。Master将事件写入binlog,但并不知道Slave是否或何时已经接收且已处理。在异步复制的机制 的情况下,如果Master宕机,事务在Master上已提交,但很可能这些事务没有传到任何的Slave上。假 设有Master->Salve故障转移的机制,此时Slave也可能会丢失事务。MySQL复制默认是异步复制,异步 复制提供了最佳性能。

2.3.2同步复制

主库将更新写入Binlog日志文件后,需要等待数据更新已经复制到从库中,并且已经在从库执行成功, 然后才能返回继续处理其它的请求。同步复制提供了最佳安全性,保证数据安全,数据不会丢失,但对 性能有一定的影响。

2.3.3半同步复制

主库提交更新写入二进制日志文件后,等待数据更新写入了从服务器中继日志中,然后才能再继续处理 其它请求。该功能确保至少有1个从库接收完主库传递过来的binlog内容已经写入到自己的relay log里面 了,才会通知主库上面的等待线程,该操作完毕。 半同步复制,是最佳安全性与最佳性能之间的一个折中。 MySQL 5.5版本之后引入了半同步复制功能,主从服务器必须安装半同步复制插件,才能开启该复制功 能。如果等待超时,超过rpl_semi_sync_master_timeout参数设置时间(默认值为10000,表示10 秒),则关闭半同步复制,并自动转换为异步复制模式。当master dump线程发送完一个事务的所有事 件之后,如果在rpl_semi_sync_master_timeout内,收到了从库的响应,则主从又重新恢复为增强半同 步复制。 ACK (Acknowledge character)即是确认字符。

2.4mysql应用场景

mysql 数据库

主要的性能是读和写,一般场景来说读请求更多。

根据主从复制可以演变成读写分离,因为读写分离基于主从复制,使用读写分离从而解决高并发的问题。

mysql架构演变的方向:

1、单台mysql有单点故障

2、集群---》 主从复制

3、主从复制渡河写的压力不均衡

4、读写分离

5、读写分离的基础是主从复制

6、mysql的高可用架构MHA(master HA高可用) MGR MMM

三、主从复制实验

实验准备

环境部署 cetos7.6

虚拟机服务环境

Master服务器:192.168.10.16 mysql5.7

slave1服务器:192.168.10.14 mysql5.7

Slave2服务器:192.168.10.15 mysql5.7

Amoeba服务器:192.168.10.80 (预备机器) jdk1.6

客户端服务器:192.168.10.13 测试

3.1主从服务器事件同步

3.1.1master服务器配置

1.安装ntp,修改配置文件

[root@master ~]# yum install ntp -y
[root@master ~]# vim /etc/ntp.conf
[root@master ~]# yum -y install ntpdate ntp #安装ntp软件
[root@master ~]# ntpdate ntp.aliyun.com #时间同步
[root@master ~]# vi /etc/ntp.conf #编辑配置文件
fudge 127.127.1.0 stratum 10
#设置本机的时间层级为10级,0级表示时间层级为0级,是向其他服务器提供时间同步源的意思,不要设置为0
级
server 127.127.1.0 #设置本机为时间同步源

2.开启ntp服务,关闭防火墙,关闭增强型安全功能

[root@master ~]# systemctl start ntpd
[root@master ~]# systemctl stop firewalld.service
[root@master ~]# setenforce 0

3.1.2两台slave服务器配置

1.安装ntp,ntpdate服务

 

[root@localhost ~]# yum install ntp ntpdate -y

 2.开启ntp服务,关闭防火墙,关闭增强型安全功能

 3.时间同步master服务器

[root@localhost ~]# ntpdate 192.168.10.16

 4.两台slave服务器配置相同

#master服务器同步阿里云时钟服务器
ntpdate ntp.aliyun.com
ntpdate 192.168.10.16
crontable -e
*/10 * * * * /usr/sbin/ntpdate 192.168.10.16

3.2mysql手动编译安装

........省略部分内容 详情参考mysql编译安装 三台MySQL同时手工编译安装

3.3配置主从同步

1.master服务器修改配置文件

[root@master ~]# vi /etc/my.cnf
#在mysqld模块下修改一下内容
#开启二进制日志文件(之后生成的日志名为master-bin)
log_bin=master-bin
#开启从服务器日志同步
log_slave-updates=true
#主服务器id为1(不可重复)
server_id = 1
--------》wq
重启服务
[root@master ~]# systemctl restart mysqld
配置规则
[root@master ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
mysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.10.%' IDENTIFIED BY
'123456';
Query OK, 0 rows affected (0.00 sec)
#刷新权限表
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
规则解析:GRANT REPLICATION SLAVE ON *.* TO ‘myslave’@‘192.168.10.%’ IDENTIFIED BY
‘123456’;
给从服务器提权,允许使用slave的身份复制master的所有数据库的所有表,并指定密码为123456
查看master数据库状态
mysql> show master status;
+-------------------+----------+--------------+------------------+---------------
----+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+---------------
----+
| master-bin.000001 | 412 | | |
|
+-------------------+----------+--------------+------------------+---------------
----+
1 row in set (0.00 sec)
mysql>
#以上可见产生了master-bin.000001日志文件,定位为412
#从服务器需要定位到此处进行复制

2.从服务器配置

[root@slave1 ~]# vi /etc/my.cnf
#开启二进制日志文件
log-bin=master-bin
#设置server id为22,slave2 为23
server_id = 22
#从主服务器上同步日志文件记录到本地
relay-log=relay-log-bin
#定义relay-log的位置和名称(index索引)
relay-log-index=slave-relay-bin.index
--------》wq
log_bin=master-bin
server_id = 22
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
开启从服务器功能
[root@slave1 ~]# mysql -uroot -p
...............
mysql> change master to
master_host='192.168.10.16',master_user='myslave',master_password='123456',maste
r_log_file='master-bin.000001',master_log_pos=412;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
change master to
master_host='192.168.10.16',master_user='myslave',master_password='123456',maste
r_log_file='master-bin.000003',master_log_pos=412;
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
查看从服务器状态
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.226.129
Master_User: myslave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 412
Relay_Log_File: relay-log-bin.000002
Relay_Log_Pos: 284
Relay_Master_Log_File: master-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 412
Relay_Log_Space: 455
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:

在两台从服务器上直接查看数据库列表
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 11
Master_UUID: c59043ec-5ad8-11ea-b895-000c29fe085b
Master_Info_File: /home/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the
slave I/O thread to update it
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
1 row in set (0.00 sec)
同理、开启另一台从服务器同步

3.4测试数据同步

1.在主服务器上创建一个数据库

 

mysql> create database work;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| work |
+--------------------+
5 rows in set (0.00 sec)

 2.两台服务器上查看数据库列表

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| work |
+--------------------+
5 rows in set (0.00 sec)

 以上,主从同步复制配置完成

四、mysql读写分离

4.1什么是读写分离

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

4.2为什么要读写分离

因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。

但是数据库的“读”(读10000条数据可能只要5秒钟)。

所以读写分离,解决的是,数据库的写入,影响了查询的效率。

4.3什么时候要读写分离

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

4.4主从复制与读写分离

在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是 在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式 来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似于rsync,但是不同的是rsync是 对磁盘文件做备份,而mysql主从复制是对数据库中的数据、语句做备份。

4.5mysql读写分离原理

读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性操作,而从 数据库处理 select 查询。数据库复制被用来把主数据库上事务性操作导致的变更同步到集群中的从数据 库。

4.6企业用mysql读写分离场景

1)基于程序代码内部实现 在代码中根据 select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。 优点是性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支;缺点是需要开发人员来 实现,运维人员无从下手。 但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代 码中实现读写分离对代码改动就较大。

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

(1)MySQL-Proxy。MySQL-Proxy 为 MySQL 开源项目,通过其自带的 lua 脚本进行SQL 判断。

(2)Atlas。是由奇虎360的Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项 目。它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使 用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程。

(3)Amoeba。由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用 于生产环境。但是它不支持事务和存储过程。 由于使用MySQL Proxy 需要写大量的Lua脚本,这些Lua并不是现成的,而是需要自己去写。这对于并 不熟悉MySQL Proxy 内置变量和MySQL Protocol 的人来说是非常困难的。 Amoeba是一个非常容易使用、可移植性非常强的软件。因此它在生产环境中被广泛应用于数据库的代 理层

五、读写分离实验

整个实验的环境 以及服务器信息

环境部署 cetos7.6

虚拟机服务环境

Master服务器:192.168.10.16 slave1

服务器:192.168.10.14 Slave2

服务器:192.168.10.15 Amoeba

服务器:192.168.10.80 jdk1.6、

Amoeba 客户端服务器:192.168.10.13 mysql 测试

注:做读写分离实验之前必须有一 主 两从 环境

5.1搭建mysql读写分离

5.1.1Amoeba服务器配置

① ##安装 Java 环境##
因为 Amoeba 基于是 jdk1.5 开发的,所以官方推荐使用 jdk1.5 或 1.6 版本,高版本不建议使用。
cd /opt/
cp jdk-6u14-linux-x64.bin /usr/local/
cd /usr/local/
chmod +x jdk-6u14-linux-x64
./jdk-6u14-linux-x64.bin
//按yes,按enter
mv jdk1.6.0_14/ /usr/local/jdk1.6
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin
source /etc/profile
java -version
② ##安装 Amoeba软件##
mkdir /usr/local/amoeba
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba
//如显示amoeba start|stop说明安装成功
③ ##配置 Amoeba读写分离,两个 Slave 读负载均衡##
#先在Master、Slave1、Slave2 的mysql上开放权限给 Amoeba 访问
grant all on *.* to test@'192.168.10.%' identified by '123456';
#再回到amoeba服务器配置amoeba服务:
cd /usr/local/amoeba/conf/
cp amoeba.xml amoeba.xml.bak
vim amoeba.xml #修改amoeba配置文件
--30行--
<property name="user">amoeba</property>
--32行--
<property name="password">123456</property>
--115行--
<property name="defaultPool">master</property>
--117-去掉注释-
<property name="writePool">master</property>
<property name="readPool">slaves</property>
cp dbServers.xml dbServers.xml.bak
vim dbServers.xml #修改数据库配置文件
--23行--注释掉 作用:默认进入test库 以防mysql中没有test库时,会报错
<!-- <property name="schema">test</property> -->
--26--修改
<property name="user">test</property>
--28-30--去掉注释
<property name="password">123456</property>
--45--修改,设置主服务器的名Master
<dbServer name="master" parent="abstractServer">
--48--修改,设置主服务器的地址
<property name="ipAddress">192.168.10.16</property>
--52--修改,设置从服务器的名slave1
<dbServer name="slave1" parent="abstractServer">
--55--修改,设置从服务器1的地址
<property name="ipAddress">192.168.10.14</property>
--58--复制上面6行粘贴,设置从服务器2的名slave2和地址
<dbServer name="slave2" parent="abstractServer">
<property name="ipAddress">192.168.10.15</property>
--65行--修改
<dbServer name="slaves" virtual="true">
--71行--修改
<property name="poolNames">slave1,slave2</property>


/usr/local/amoeba/bin/amoeba start& #启动Amoeba软件,按ctrl+c 返回
netstat -anpt | grep java #查看8066端口是否开启,默认端口为
TCP 8066

5.1.2测试读写分离

#先安装数据库
yum install -y mariadb-server mariadb
systemctl start mariadb.service
在客户端服务器上测试
mysql -u amoeba -p123456 -h 192.168.10.80 -P8066
//通过amoeba服务器代理访问mysql ,在通过客户端连接mysql后写入的数据只有主服务会记录,然后同步
给从--从服务器
在主服务器上:
use db_test;
create table test (id int(10),name varchar(10),address varchar(20));
在两台从服务器上:
stop slave; #关闭同步
use db_test;
//在slave1上:
insert into test values('1','zhangsan','this_is_slave1');
//在slave2上:
insert into test values('2','lisi','this_is_slave2');
//在主服务器上:
insert into test values('3','wangwu','this_is_master');
//在客户端服务器上:
use db_test;
select * from test; //客户端会分别向slave1和slave2读取数据,显示的只有在两个从服务器
上添加的数据,没有在主服务器上添加的数据
insert into test values('4','qianqi','this_is_client'); //只有主服务器上有此数据
//在两个从服务器上执行 start slave; 即可实现同步在主服务器上添加的数据
start slave;

提示:

--23行--注释掉 作用:默认进入test库 以防mysql中没有test库时,会报错 报错 amoeba连接mysql--ERROR 2006 (HY000): MySQL server has gone away

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

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

相关文章

Web 地图服务 简介

网络地图服务 网络地图服务 由通过互联网托管的地理空间数据组成&#xff0c;其标准由开放地理空间联盟 (OGC) 制定。WMS 支持在 Web 浏览器中以地图或图像的形式交换空间信息并通过 Web 查看。 网络地图服务有很多种类型。例如&#xff0c;一些最常见的格式是 WMS、WFS、WCS…

C140 杨辉三角

C140 杨辉三角 题目题解(94)讨论(102)排行面经 new 简单 通过率&#xff1a;29.57% 时间限制&#xff1a;1秒 空间限制&#xff1a;256M 知识点C工程师牛客 校招时部分企业笔试将禁止编程题跳出页面&#xff0c;为提前适应&#xff0c;练习时请使用在线自测&#xff0c;…

tomato靶场攻略

1.使用nmap扫描同网段的端口&#xff0c;发现靶机地址 2.访问到主页面&#xff0c;只能看到一个大西红柿 3.再来使用dirb扫面以下有那些目录&#xff0c;发现有一个antibot_image 4.访问我们扫到的地址 &#xff0c;点金目录里看看有些什么文件 5.看到info.php很熟悉&#xff0…

Java对象拷贝的浅与深:如何选择?

在日常开发中&#xff0c;我们经常需要将一个对象的属性复制到另一个对象中。无论是使用第三方工具类还是自己手动实现&#xff0c;都会涉及到浅拷贝和深拷贝的问题。本文将深入讨论浅拷贝的潜在风险&#xff0c;并给出几种实现深拷贝的方式&#xff0c;帮助大家避免潜在的坑。…

SpringBoot开发——整合Logbook进行HTTP API请求响应日志输出

文章目录 1. 简介依赖管理2. 实战案例2.1 基本用法2.2 结合Logback日志记录到文件2.3 自定义核心类Logbook2.4 自定义日志输出Sink2.5 与RestTemplate集成1. 简介 记录HTTP API请求响应日志对于监控、调试和性能优化至关重要。它帮助开发者追踪API的使用情况,包括请求来源、参…

基于ssm+vue+uniapp的“健康早知道”小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

好尴尬,借用的轮子在我这里还是没有运行起来

前期引用flask框架&#xff0c;由于版本不兼容&#xff0c;像是捅了flask-bug的窝。一开始是减低版本&#xff0c;然后一换卡一环&#xff0c;直接百度&#xff0c;试了很多办法都没有成功。 之后添加语句 下面展示一些 内联代码片。 # -*— coding:utf-8 -*— from datetime…

四战搜索,抖音难造“百度”

转载&#xff1a;新熵 原创 作者丨余寐 编辑丨九犁 抖音搜索野心暴露无遗&#xff01;接连4次发起猛攻&#xff0c;这是要颠覆搜索市场的节奏&#xff1f;还是因为流量触顶&#xff0c;急寻新入口&#xff1f; 执念太深&#xff01;抖音还是没放弃搜索&#xff0c;并发起一场…

人工智能在C/C++中的应用

随着技术的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经成为我们日常生活中不可或缺的一部分。从智能手机的语音助手到自动驾驶汽车&#xff0c;AI的应用无处不在。在众多编程语言中&#xff0c;C和C因其高性能和灵活性&#xff0c;成为实现复杂AI算法的理想选…

回调函数是什么,为什么要有回调函数?有什么优缺点?回调的本质是什么?

目录 前言 一、回调函数是什么&#xff1f; 二、为什么要有回调函数&#xff1f; 三、回调函数的优缺点 四、回调的本质是什么&#xff1f; 五、回调函数的实现方式 六、函数指针、Lambda 表达式、std::function&#xff1a; std::function这三者有什么不一样 1. 函数指…

仪表盘echarst

var bgColor #041F34,borderColor "#fff"let dataVal20 option {backgroundColor: bgColor,color: [borderColor],title: [{text: 处理率,x: center,top: 40%,textStyle: {color: #FFE600,fontSize: 56,fontWeight: 600,},},],series: [{type: pie,zlevel: 1,radi…

数据结构----高度为h的m叉树(记录一题)

&#xff08;1&#xff09;各层结点个数&#xff1a; 类比二叉树可得&#xff1a; 所以各层结点个数&#xff1a; &#xff08;2&#xff09;编号为i的结点的双亲结点(若存在)的编号是多少? 若存在表示&#xff1a;i>1(根节点没有双亲结点) 假设i结点有左兄弟和右兄弟&a…

javaweb项目1

1.配置servlet 注意&#xff1a;需要在web.xml进行操作。 2.执行原理 3.五个方法 1.init 在servlet创建的时候&#xff0c;执行&#xff0c;并且只执行一次。 init 方法可以用来执行 Servlet 的初始化逻辑&#xff0c;比如&#xff1a; 读取配置参数初始化数据库连接加载资…

深入理解Docker核心原理:全面解析Docker Client

随着云计算与容器技术的飞速发展&#xff0c;Docker已经成为软件开发、部署和运维中的重要工具之一。在Docker的架构中&#xff0c;Docker Client作为用户操作Docker系统的接口&#xff0c;起着至关重要的作用。本文将详细解析Docker Client的核心原理、工作机制、常用命令以及…

Ignis公链探索生态建设新范式:产业区块链与GameFi双轨驱动

Ignis公链凭借其独特的技术架构&#xff0c;选择了产业区块链与GameFi这两个赛道作为生态建设的双轮驱动&#xff0c;逐步形成了一个多元化的Web3生态系统。 一、产业区块链的革新&#xff1a;Vessel Chain的成功案例 在产业区块链领域&#xff0c;Ignis公链通过推出Vessel Ch…

JUC面试知识点手册

第一章&#xff1a;Java并发简介 1.1 什么是并发编程 并发编程是指在同一时间段内执行多个任务的编程方式。在单核处理器上&#xff0c;并发通过时间分片来实现&#xff0c;即在同一时间只有一个任务在执行&#xff0c;其他任务被暂停等待。在多核处理器上&#xff0c;并发可…

C语言函数原理——深入底层机制

概述 在C语言中&#xff0c;函数是封装代码复用和模块化的关键机制。为了更好地理解函数如何工作&#xff0c;我们需要深入了解函数的定义、调用机制、参数传递方式、以及函数与内存管理的关系。本文将探讨函数的底层实现、调用过程、以及它们如何影响程序的行为。 函数定义 …

优盘数据丢失怎么办?本文带你一览优盘数据恢复

u盘格式化后数据能恢复吗&#xff1f;答案是肯定的。现在数据通过一些优盘或者移动硬盘之类介质进行传输已经一种很常见的文件传输方式了。但是我们偶尔就因为一些意外导致数据的丢失&#xff0c;这次我就来分享一些可以找回丢失数据的工具。 1.福昕数据恢复 链接直达&#…

cesium 使用异步函数 getHeightAtPoint,获取指定经纬度点的地形高度。

这个函数使用 CesiumJS 库的 sampleTerrain 方法来获取地形数据。下面是代码的详细解释&#xff1a; async getHeightAtPoint(LngLat) {// 将经纬度转为 Cartographic 对象let cartographics [Cesium.Cartographic.fromDegrees(LngLat[0], LngLat[1])];// console.log("…

数组与贪心算法——605、121、122、561、455、575(5简1中)

605. 种花问题&#xff08;简单&#xff09; 假设有一个很长的花坛&#xff0c;一部分地块种植了花&#xff0c;另一部分却没有。可是&#xff0c;花不能种植在相邻的地块上&#xff0c;它们会争夺水源&#xff0c;两者都会死去。 给你一个整数数组 flowerbed 表示花坛&#xf…