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

mysql实战——Mysql8.0高可用之双主+keepalived

一、介绍

利用keepalived实现Mysql数据库的高可用,Keepalived+Mysql双主来实现MYSQL-HA,两台Mysql数据库的数据保持完全一致,实现方法是两台Mysql互为主从关系,通过keepalived配置VIP,实现当其中的一台Mysql数据库宕机后,应用能够自动切换到另外一台Mysql数据库上去,保证系统的高可用。

二、搭建前准备

mysql8.0.25
keepalivedkeepalibed-2.2.8
Mysql-master-1192.168.1.80
Mysql-master-2192.168.1.81
Mysql——vip192.168.1.82(这个只是虚拟IP,不用准备虚拟机)

准备两台机器都安装mysql。 

三、搭建

3.1 关闭防火墙

两台机器都关闭firewalld

systemctl stop firewalld

systemctl disable firewalld

systemctl status firewalld

 

3.2 搭建双主同步

3.2.1修改master-1配置文件

现在需要搭建两个机器的主主同步

vi /etc/my.cnf
 
[mysqld]
 
log-bin=mysql-bin                               #开启主从binlog(二进制日志),主库必须开启
binlog_format=mixed                             #指定二进制日志格式为mixed,即在语句和行两种模式之间自动切换
server-id=1                                     #配置server-id(唯一)标识主机,必须与从库不一致
relay-log=relay-bin                             #指定中继日志文件的名称为relay-bin,用于在主从复制中传输数据
relay-log-index=slave-relay-bin.index           #指定中继日志索引文件的名称,用于记录中继日志文件的位置。
auto_increment_increment=2                      #指定自增长ID的增量为2,用于在主从复制中避免ID冲突。
auto_increment_offset=1                         #指定自增长ID的起始值为1,用于在主从复制中避免ID冲突。
 
##保存退出,并重启MySQL服务
[root@skymachine ~]# service mysql restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL.. SUCCESS! 

3.2.2修改master-2配置文件

vi /etc/my.cnf 

[mysqld]

log-bin=mysql-bin                               #开启主从binlog(二进制日志),主库必须开启
binlog_format=mixed                             #指定二进制日志格式为mixed,即在语句和行两种模式之间自动切换
server-id=2                                    #配置server-id(唯一)标识主机,必须与从库不一致
relay-log=relay-bin                             #指定中继日志文件的名称为relay-bin,用于在主从复制中传输数据
relay-log-index=slave-relay-bin.index           #指定中继日志索引文件的名称,用于记录中继日志文件的位置。
auto_increment_increment=2                      #指定自增长ID的增量为2,用于在主从复制中避免ID冲突。
auto_increment_offset=2                         #指定自增长ID的起始值为2,用于在主从复制中避免ID冲突。

##保存退出,并重启MySQL服务
[root@skymachine ~]# service mysql restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL.. SUCCESS! 

 

 3.2.3 在两台节点分别创建同步用户

mysql> create user 'test'@'%' identified by 'test123';
Query OK, 0 rows affected (0.04 sec)
mysql> grant replication slave on *.* to 'test'@'%';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.02 sec)

 

3.2.4搭建并启动双主复制

master-2

 show master status;

 记录file和position的值,在master-1中会用到

master-1

 change master to master_host='192.168.1.81',master_user='test',master_password='test123',master_log_file='mysql-bin.000001',master_log_pos=870,get_master_public_key=1;

start slave; 

 

如上图io和 sql线程都为yes即成功;

master-1

show master status;

记录file和position,master-2会用到 

 master-2

change master to master_host='192.168.1.80',master_user='test',master_password='test123',master_log_file='mysql-bin.000001',master_log_pos=871,get_master_public_key=1;

start slave; 

 

如上图两个线程都为yes,即成功。

两个机器都成功,即双主复制搭建成功。

3.2.5测试双主复制

master-1测试

master-2测试

如上面两图,主1创建数据库创建表之后在主2可以看到,主2插入数据主1也可以看到。

3.2.6主备库都关机后需要重新开启同步

若双主都关机后需要重新配置第3.2.4步

3.2.7配置过程中参数说明

 状态参数说明
Slave_IO_state 显示当前IO线程的状态,一般情况下就是显示等待主服务器发送二进制日志。
Master_log_file 显示当前同步的主服务器的二进制日志。
Read_master_log_pos 显示当前同步到主服务器上二进制日志的偏移量位置。
Relay_master_log_file 当前中继日志同步的二进制日志。
Relay_log_file 显示当前写入的中继日志。
Relay_log_pos 显示当前执行到中继日志的偏移量位置。
Slave_IO_running 从服务器中IO线程的运行状态,yes代表正常
Slave_SQL_running 从服务器中sql线程的运行状态,YES代表正常
Exec_Master_log_pos 表示同步到主服务器的二进制日志的偏移量位置。


slave启停常用命令
STOP SLAVE IO_THREAD; 停止IO进程
STOP SLAVE SQL_THREAD; 停止SQL进程
STOP SLAVE; 停止IO和SQL进程
START SLAVE IO_THREAD; 启动IO进程
START SLAVE SQL_THREAD; 启动SQL进程
START SLAVE; 启动IO和SQL进程
RESET SLAVE; 用于让从属服务器忘记其在主服务器的二进制日志中的复制位置, 它会删除master.info和relay-log.info文件,以及所有的中继日志,并启动一个新的中继日志,当你不需要主从的时候可以在从上执行这个操作。
SHOW SLAVE STATUS; 查看MySQL同步状态
STOP SLAVE;SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;START SLAVE; 经常会朋友mysql主从同步遇到错误的时候,比如一个主键冲突等,那么我就需要在确保那一行数据一致的情况下临时的跳过这个错误,那就需要使用SQL_SLAVE_SKIP_COUNTER = n命令了,n是表示跳过后面的n个事件
CHANGE MASTER TO MASTER_HOST=‘10.1.1.75’, MASTER_USER=‘replication’, MASTER_PASSWORD=‘123456’, MASTER_LOG_FILE=‘mysql-bin.000006’, MASTER_LOG_POS=106; START SLAVE; 从指定位置重新同步

3.3keepalived安装部署

在master-1,master-2服务器分别安装keepalived,安装步骤相同,配置文件不同。按照我的步骤即可完成。

3.3.1安装依赖包,下载keepalived(两个节点步骤相同,下面就写一份)

下载到/opt目录下并解压

yum -y install gcc openssl-devel popt-devel psmisc

 ​yum install wget
Is this ok [y/d/N]: y              #安装wget提示,输入y

 

cd /opt/
wget --no-check-certificate https://www.keepalived.org/software/keepalived-2.2.8.tar.gz
ll
tar -zxvf keepalived-2.2.8.tar.gz   

 

 3.3.2配置keepalived并编译(两个节点步骤相同,下面就写一份)

cd keepalived-2.2.8
 ./configure --prefix=/opt/keepalived-2.2.8

 

如上图即成功。 

make && make install 

 

 如上图即编译成功。

3.3.3将文件复制到对应目录下(两个节点步骤相同,下面就写一份)

[root@128 keepalived-2.2.7]# mkdir /etc/keepalived
[root@128 keepalived-2.2.7]# cp keepalived/etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf
[root@128 keepalived-2.2.7]# cp keepalived/etc/init.d/keepalived /etc/init.d/
[root@128 keepalived-2.2.7]# cp keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@128 keepalived-2.2.7]# cp bin/keepalived /usr/sbin/

 

3.3.4新建shutdown.sh文件(两个节点步骤相同,下面就写一份)

 vi /etc/keepalived/keepalived.conf

复制下面内容,:wq保存并退出。 

#!/bin/bash
#该脚本是在mysql服务出现异常时,将keepalived应用停止,从而使虚拟vip主机自动连接到另一台mysql上
killall keepalived 

将执行权限设置为可执行 

 [root@skymachine keepalived]# chmod +x /etc/keepalived/shutdown.sh

 

3.3.5ifconfig查看网卡名称

master-1,master-2网卡名称为ens33

3.3.6 修改master-1服务器keepalived配置文件(配置文件两个机器不同,3.3.7是master-2的配置)

把原有的keepalived.conf更名为keepalived_bak.conf,然后新建keepalived.conf配置文件

cd /etc/keepalived/
[root@skymachine keepalived]# ll
总用量 4
-rw-r--r-- 1 root root 3550 6月  27 09:34 keepalived.conf
[root@skymachine keepalived]# mv keepalived.conf  keepalived_bak.conf
[root@skymachine keepalived]# ll
总用量 4
-rw-r--r-- 1 root root 3550 6月  27 09:34 keepalived_bak.conf
[root@skymachine keepalived]#  vi /etc/keepalived/keepalived.conf 

 

 将以下内容复制进去

! Configuration File for keepalived

#主要配置故障发生时的通知对象及机器标识
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id MYSQL-1                   #主机标识符,唯一即可
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

#用来定义对外提供服务的VIP区域及相关属性
vrrp_instance VI_1 {
    state BACKUP                     #表示keepalived角色,都是设成BACKUP则以优先级为主要参考
    interface ens33                 #指定HA监听的网络接口,刚才ifconfig查看的接口名称
    virtual_router_id 151            #虚拟路由标识,取值0-255,master-1和master-2保持一致
    priority 100                     #优先级,用来选举master,取值范围1-255
    advert_int 1                     #发VRRP包时间间隔,即多久进行一次master选举
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {              #虚拟出来的地址
        192.168.1.82
    }
}

#虚拟服务器定义
virtual_server 192.168.1.82 3306 { #虚拟出来的地址加端口
    delay_loop 2                     #设置运行情况检查时间,单位为秒
    lb_algo rr                       #设置后端调度器算法,rr为轮询算法
    lb_kind DR                       #设置LVS实现负载均衡的机制,有DR、NAT、TUN三种模式可选
    persistence_timeout 50           #会话保持时间,单位为秒
    protocol TCP                     #指定转发协议,有 TCP和UDP可选

        real_server 192.168.1.80 3306 {          #实际本地ip+3306端口
       weight=5                      #表示服务器的权重值。权重值越高,服务器在负载均衡中被选中的概率就越大
        #当该ip 端口连接异常时,执行该脚本
        notify_down /etc/keepalived/shutdown.sh   #检查mysql服务down掉后执行的脚本
        TCP_CHECK {
            #实际物理机ip地址
            connect_ip 192.168.1.80
            #实际物理机port端口
            connect_port 3306
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3

        }
    }
}
 

注:如果你的ip和我不同,需要更改的位置有(master-2同理): 

 

 

 如果网卡和我不同也需要改网卡

 

3.3.7修改master-2服务器keepalived配置文件

下图和master-1步骤相同

 

 配置文件就和master-1配置不同了,不同的地方为router_id、priority、real_server、connect_ip四个配置

! Configuration File for keepalived

#主要配置故障发生时的通知对象及机器标识
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id MYSQL-2                   #主机标识符,唯一即可
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

#用来定义对外提供服务的VIP区域及相关属性
vrrp_instance VI_1 {
    state BACKUP                     #表示keepalived角色,都是设成BACKUP则以优先级为主要参考
    interface ens33                 #指定HA监听的网络接口,刚才ifconfig查看的接口名称
    virtual_router_id 151            #虚拟路由标识,取值0-255,master-1和master-2保持一致
    priority 40                      #优先级,用来选举master,取值范围1-255
    advert_int 1                     #发VRRP包时间间隔,即多久进行一次master选举
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {              #虚拟出来的地址
        192.168.1.82
    }
}

#虚拟服务器定义
virtual_server 192.168.1.82 3306 { #虚拟出来的地址加端口
    delay_loop 2                     #设置运行情况检查时间,单位为秒
    lb_algo rr                       #设置后端调度器算法,rr为轮询算法
    lb_kind DR                       #设置LVS实现负载均衡的机制,有DR、NAT、TUN三种模式可选
    persistence_timeout 50           #会话保持时间,单位为秒
    protocol TCP                     #指定转发协议,有 TCP和UDP可选

        real_server 192.168.1.81 3306 {          #实际本地ip+3306端口
       weight=5                      #表示服务器的权重值。权重值越高,服务器在负载均衡中被选中的概率就越大
        #当该ip 端口连接异常时,执行该脚本
        notify_down /etc/keepalived/shutdown.sh   #检查mysql服务down掉后执行的脚本
        TCP_CHECK {
            #实际物理机ip地址
            connect_ip 192.168.1.81
            #实际物理机port端口
            connect_port 3306
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3

        }
    }
}
 

3.3.8启动服务 (两个节点步骤相同,下面就写一份)

[root@skymachine keepalived]# systemctl start keepalived
[root@skymachine keepalived]# systemctl status keepalived
systemctl enable keepalived #开机启动,根据需求设置

 

 3.3.9配置虚拟ip登录用户(两个节点步骤相同,下面就写一份)

在两台服务器上新建用户以验证keepalived服务是否配置成功

useradd -m keepalived
passwd keepalived
Qwe135.

 

 

3.3.10测试keepalived服务

启动后相当于虚拟出一个vip 192.168.15.100,用ssh工具连接服务器,输入ip和用户名及密码,登录至虚拟ip上

 连接进去使用ifconfig,可以看到虚拟vip实际上使用的实体服务器是master-1(192.168.1.80)服务器。

 

将master-1(192.168.1.80)服务器的keepalived应用停止,vip192.168.1.82服务器会断线,重新连接,再次查看192.168.1.82服务ifconfig,可以看到,192.168.1.82服务器自动将实体机ip漂移到了master-2(192.168.1.81)服务器上

master-1

[root@centos7 keepalived]# systemctl stop keepalived 

 

 开启master-1的keepalived vip自动飘过来了

3.4mysql双主双活+keepalived高可用整体测试

3.4.1启动服务

将master-1、master-2两台服务器mysql、keepalived应用全部启动,然后新建一个用户,配置权限可以外网访问

mysql> CREATE DATABASE IF NOT EXISTS mydb DEFAULT CHARSET utf8mb4 COLLATE utf8m                                                                                 b4_general_ci;
Query OK, 1 row affected (0.02 sec)mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
6 rows in set (0.01 sec)mysql> create user 'user01'@'%' identified by 'Mysql12#$';
Query OK, 0 rows affected (0.03 sec)mysql> grant all privileges on 'mydb'.* to 'user01'@'%';
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that                                                                                  corresponds to your MySQL server version for the right syntax to use near ''my                                                                                 db'.* to 'user01'@'%'' at line 1
mysql> grant all privileges on `mydb`.* to 'user01'@'%';
Query OK, 0 rows affected (0.02 sec)mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)mysql> select user,host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| test             | %         |
| user01           | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
6 rows in set (0.01 sec)

3.4.2连接keepalived虚拟服务器 

 用mysql连接工具连接keepalived虚拟出来的192.168.1.82服务器

3.4.3建立测试数据

3.4.4查看master-1、master-2同步情况

 

3.4.5查看192.168.1.82服务器实际物理机ip

 使用ifconfig命令查看实际使用的物理机为192.168.1.80,所以master-1(192.168.1.80)服务器mysql为主数据库。

 

3.4.6停止物理机mysql服务

 此时手动将master-1服务器mysql停止,keepalived检测到192.168.1.80服务3306端口连接失败,会执行/etc/keepalived/shutdown.sh脚本,将192.168.1.80服务器keepalived应用结束

mysql> shutdown;
Query OK, 0 rows affected (0.00 sec)mysql> exit
Bye
[mysql@centos7 ~]$ mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/data/mysql/3306/data/mysql.sock' (2)

3.4.7查看漂移ip执行情况

此时再连接192.168.1.82服务下,ifconfig查看,发现已经实际将物理机由master-1(192.168.1.80)到master-2(192.168.1.81)服务器上

3.4.8在新的主服务器插入数据进行测试

再使用mysql连接工具连接192.168.1.82的mysql,插入一条数据,测试是否将数据存入master-2(192.168.1.81)服务器mysql中

3.4.9查看新主服务器数据

查看master-2服务器mysql数据,数据已同步,说明keepalived搭建高可用成功,当master-1服务器mysql出现问题后keepalived自动漂移IP到实体机master-2服务器上,从而使master-2服务器mysql作为主数据库。

3.4.10重启master-1服务,查看数据同步情况(重启之后,vip会自动飘到master-1节点)

[mysql@centos7 ~]$ mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/data/mysql/3306/data/mysql.sock' (2)
[mysql@centos7 ~]$ mysqld_safe --defaults-file=/etc/my.cnf &
[2] 11910
[1]   Exit 127                mysql_safe --defaults-file=/etc/my.cnf
[mysql@centos7 ~]$ 2024-05-22T05:19:42.269350Z mysqld_safe Logging to '/data/mysql/3306/data/mysqld.err'.
2024-05-22T05:19:42.427430Z mysqld_safe Starting mysqld daemon with databases from /data/mysql/3306/data
^C
[mysql@centos7 ~]$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.25 MySQL Community Server - GPLCopyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> select 1+2 from dual;
+-----+
| 1+2 |
+-----+
|   3 |
+-----+
1 row in set (0.00 sec)

查看master-1数据库test2表数据,数据已同步成功。 

至此,双主双活+keepalived高可用部署并测试完成。

四、总结

1、 采用keepalived作为高可用方案时,两个节点最好都设置成BACKUP模式,避免因为意外情况下相互抢占导致两个节点内写入相同的数据而引发冲突;

2、 把两个节点的auto_increment_increment(自增步长)和auto_increment_offset(字增起始值)设置成不同值,其目的是为了避免master节点意外宕机时,可能会有部分binlog未能及时复制到slave上被应用,从而会导致slave新写入数据的自增值和原master上冲突,因此一开始就错开;

3、 Slave节点服务器配置不要太差,否则更容易导致复制延迟,作为热备节点的slave服务器,硬件配置不能低于master节点;

如果对延迟很敏感的话,可考虑使用MariaDB分支版本,利用多线程复制的方式可以很大降低复制延迟。

参考文章

Mysql8高可用之双主+keepalived_mysql keepalived-CSDN博客

相关文章:

mysql实战——Mysql8.0高可用之双主+keepalived

一、介绍 利用keepalived实现Mysql数据库的高可用,KeepalivedMysql双主来实现MYSQL-HA,两台Mysql数据库的数据保持完全一致,实现方法是两台Mysql互为主从关系,通过keepalived配置VIP,实现当其中的一台Mysql数据库宕机…...

关于同一个地址用作两个不同页面时,列表操作栏按钮混淆状态

同一个地址用作两个不同页面时,列表页的操作栏中有好多个按钮,如果用了v-if,可能会导致按钮混淆状态如disabled等属性混乱 解决方法1: 将v-if换成v-show,用了v-show之后意味着所有按钮都在只是在页面上隐藏了 解决方…...

Oracle段延迟分配(Deferred Segment Creation)解析

目录 一、基本概念二、工作原理三、优势四、潜在风险与注意事项五、配置与管理 Oracle段延迟分配(Deferred Segment Creation)是Oracle 11g引入的一项重要特性,旨在优化资源使用和提高数据库管理效率。 一、基本概念 段延迟分配意味着当创建…...

Linux:IPC - System V

Linux:IPC - System V 共享内存 shm创建共享内存shmgetshmctlftok 挂接共享内存shmatshmdt shm特性 消息队列 msgmsggetmsgctlmsgsndmsgrcv 信号量 semSystem V 管理机制 System V IPC 是Linux系统中一种重要的进程间通信机制,它主要包括共享内存 shm&am…...

Laravel 图片添加水印

和这个配合使用 Laravel ThinkPhP 海报生成_laravel 制作海报-CSDN博客 代码 //水印 $x_length $imageInfo[0]; $y_length $imageInfo[1];$color imagecolorallocatealpha($posterImage, 255, 255, 255, 70); // 增加透明度参数alpha$font_size 40; //字体大小 $angle …...

嵌入式进阶——矩阵键盘

🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 矩阵按键原理图按键状态检测单行按键状态检测多行按键状态检测 状态记录状态优化循环优化 矩阵按键 矩阵键盘是一种常见的数字输入…...

请说出vue.cli项目中src目录每个文件夹和文件的用法

在Vue CLI项目中,src目录是存放项目源码及需要引用的资源文件的主要位置。以下是src目录下常见文件夹和文件的用法: components 用途:存放可重用的Vue组件。这些组件通常用于在多个页面或布局中共享UI和功能。特点:组件应该是模块…...

【MySQL精通之路】InnoDB磁盘I/O和文件空间管理(11)

主博客: 【MySQL精通之路】InnoDB存储引擎-CSDN博客 目录 1.InnoDB磁盘I/O 1.1 预读 1.2 双写缓冲区 2.文件空间管理 2.1 Pages, Extents, Segments, and Tablespaces(很重要) 2.2 配置保留文件段页面的百分比 2.3 页与表行的关系 …...

基于springboot+html的二手交易平台(附源码)

基于springboothtml的二手交易平台 介绍部分界面截图如下联系我 介绍 本系统是基于springboothtml的二手交易平台,数据库为mysql,可用于毕设或学习,附数据库 部分界面截图如下 联系我 VX:Zzllh_...

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-24.3,4 SPI驱动实验-I.MX6U SPI 寄存器

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…...

【Pandas】数据处理方法

1.数据拆分 pandas.Series.str.extract() Series.str.extract(pat, flags0, expandTrue)[source]extract(提取) 参数 pat: 带分组的正则表达式。 flag: re模块中的标志,例如re.IGNORECASE,修改正则表达式匹配的大小写、空格等 expand: 默认为True&…...

【ArcGIS For JS】前端geojson渲染行政区划图层并加标签

原理 通过DataV工具 生成行政区的geojson(得到各区的面元素数据), 随后使用手动绘制featureLayer与Label,并加载到地图。 //vue3加载geojson数据public/geojson/pt.json,在MapView渲染上加载geojson数据 type是"MultiPolygon"fetc…...

Spring AOP原理详解:动态代理与实际应用

1. Spring AOP概述 1.1 什么是AOP AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在将横切关注点(Cross-Cutting Concerns)从业务逻辑中分离出来。横切关注点是指那些分散在应用程序多…...

死锁的四个必要条件

死锁的四个必要条件如下: 互斥条件(Mutual Exclusion):资源是独占的,即在同一时间内一个资源只能被一个进程或线程所使用,其他进程或线程无法访问该资源。 请求与保持条件(Hold and Wait&#…...

源网络地址转换SNAT

左上角的是访问互联网发送的数据包,第一个是访问,第二个是网页传回来的 3、4项是源端口号和目的端口号(3是随机的(1024-65535),那个是http的网页服务端口就是80) 那么往回传数据的时候源和目的…...

【算法】平衡二叉搜索树的左旋和右旋

树旋转是一种维护平衡树结构的重要操作,主要用于平衡二叉搜索树(如AVL树和红黑树)。树旋转分为左旋和右旋。 1. 树旋转的定义 左旋 (Left Rotation) 左旋操作将节点及其右子树进行调整,使其右子树的左子节点成为根节点&#xf…...

介绍Django Ninja框架

文章目录 安装快速开始特性详解自动文档生成定义请求和响应模型异步支持中间件支持测试客户端 结论 Django Ninja是一个基于Python的快速API开发框架,它结合了Django和FastAPI的优点,提供了简单易用的方式来构建高性能的Web API。 安装 使用以下命令安…...

使用uniapp内置组件checkbox-group所遇到的问题

checkbox-group属性说明 属性名类型默认值说明changeEventHandle <checkbox-group> 中选项发生改变触发change事件 detail { value&#xff1a;[选中的checkbox的value的数组] } 问题代码 <checkbox-group change"handleEVent()"><view style&qu…...

嵌入式学习记录5.23(超时检测、抓包分析)

目录 一.自带超时参数的函数 1.1 select函数 1.2 poll函数的自带超时检测参数 二、不带超时检测参数的函数 三、通过信号完成时间的设置 四、更新下载源 五、wireshark使用 5.1. 安装 5.2. wireshark 抓包 5.2.1 wireshark与对应的OSI七层模型 ​编辑5.2.2 包头分析 …...

Linux|如何在 awk 中使用流控制语句

引言 当您从 Awk 系列一开始回顾我们迄今为止介绍的所有 Awk 示例时&#xff0c;您会注意到各个示例中的所有命令都是按顺序执行的&#xff0c;即一个接一个。但在某些情况下&#xff0c;我们可能希望根据某些条件运行一些文本过滤操作&#xff0c;这就是流程控制语句的方法。 …...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

C++--string的模拟实现

一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现&#xff0c;其目的是加强对string的底层了解&#xff0c;以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量&#xff0c;…...

医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor

1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...

深入理解 React 样式方案

React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...