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

mysql集群NDB方式部署

1. 基本信息

部署机器角色部署路径
192.168.0.1管理节点部署目录: /alidata1/mysql-cluster-8.4.3
192.168.0.2管理节点
192.168.0.3数据/SQL节点数据目录:
192.168.0.4数据/SQL节点/alidata1/mysql-cluster-8.4.3/data/ndb-mgmd
192.168.0.5数据节点 – 新增/alidata1/mysql-cluster-8.4.3/data/ndb-data
192.168.0.6数据节点 – 新增/alidata1/mysql-cluster-8.4.3/data/ndb-mysqld

2. 安装NDB

## 1.将包上传 并解压
# pwd
/alidata1/
# tar zxf mysql-cluster-8.4.3-linux-glibc2.17-x86_64.tar.xz
# mv mysql-cluster-8.4.3-linux-glibc2.17-x86_64 mysql-cluster-8.4.3
# useradd mysql -s /sdbin/nologin -M  ## 新建用户## 2.配置与启动
############ 2.1 管理节点 192.168.0.1 和 192.168.0.2 操作 ############
## 2.1.1 创建目录
# mkdir /alidata1/mysql-cluster-8.4.3/data/ndb-mgmd## 2.1.2 新建配置
# cat mgmd.ini
[tcp default]
SendBufferMemory=2M
ReceiveBufferMemory=2M[ndb_mgmd default]
DataDir=/alidata1/mysql-cluster-8.4.3/data/ndb-mgmd[NDBD DEFAULT]
NoOfReplicas = 2
DataMemory = 512M
LockPagesInMainMemory=1
ODirect=1
NoOfFragmentLogFiles=300
DataDir=/alidata1/mysql-cluster-8.4.3/data/ndb-data
MaxNoOfConcurrentOperations=100000
SchedulerSpinTimer=400
SchedulerExecutionTimer=100
RealTimeScheduler=1
TimeBetweenGlobalCheckpoints=1000
TimeBetweenEpochs=200
RedoBuffer=32M
MaxNoOfTables=1024
MaxNoOfOrderedIndexes=256[NDB_MGMD]
NodeId = 1
hostname = 192.168.0.1
[NDB_MGMD]
NodeId = 2
hostname = 192.168.0.2[NDBD]
NodeId = 13
hostname = 192.168.0.3[NDBD]
NodeId = 14
hostname = 192.168.0.4[mysqld]
NodeId = 53
hostname = 192.168.0.3
[mysqld]
NodeId = 54
hostname = 192.168.0.4## 数据恢复时需要, 否则会报错
[mysqld]
[mysqld]## 2.1.3 启动管理节点  -- 第一次启动需要加上-initial初始化 以后不需要
# chown -R mysql.mysql /alidata1/mysql-cluster-8.4.3
# ./bin/ndb_mgmd --initial -f /alidata1/mysql-cluster-8.4.3/mgmd.ini --configdir=/alidata1/mysql-cluster-8.4.3}/data/ndb-mgmd   ## 192.168.0.1 执行(其中一个管理节点)
# ./bin/ndb_mgmd -c 192.168.0.1,192.168.0.2 --ndb-nodeid=2 -f /alidata1/mysql-cluster-8.4.3/mgmd.ini --configdir=/alidata1/mysql-cluster-8.4.3/data/ndb-mgmd/  ## 另外一个管理节点执行############ 2.2 数据节点 192.168.0.3 192.168.0.4 操作 ############
## 2.2.1 创建相关目录
# mkdir /alidata1/mysql-cluster-8.4.3/data/ndb-data## 2.2.2 启动
# chown -R mysql.mysql /alidata1/mysql-cluster-8.4.3
# ./bin/ndbd --ndb-mgmd-host=192.168.0.1,192.168.0.2############ 2.3 mysql节点 192.168.0.3 192.168.0.4 操作 ############
## 2.3.1 创建目录
# mkdir /alidata1/mysql-cluster-8.4.3/data/ndb-mysqld/ -p
# mkdir /alidata1/admin/logs/mysql/ -p
## 2.3.2 修改配置
# vim /etc/my.cnf
[mysqld]
ndbcluster
ndb-connectstring=192.168.0.1,192.168.0.2basedir=/alidata1/mysql-cluster-8.4.3
datadir=/alidata1/mysql-cluster-8.4.3/data/ndb-mysqld
socket=/alidata1/mysql-cluster-8.4.3/data/ndb-mysqld/mysql.sock
user=mysql
port=3306
mysql_native_password=ON
sql_mode=''character-set-server = utf8mb4
open_files_limit = 65535
max_connections = 2000
max_connect_errors = 100000
lower_case_table_names = 1
default_time_zone = '+8:00'#logs
log-output=file
slow_query_log = 1
slow_query_log_file = /alidata1/admin/logs/mysql/slow.log
log-error = /alidata1/admin/logs/mysql/error.log
long_query_time = 10 ## 默认10s
binlog_format = row
#server-id 1
log-bin = mysql-bin
binlog_cache_size = 4M
max_binlog_size = 1G
max_binlog_cache_size = 2G
sync_binlog = 1
binlog_expire_logs_seconds = 864000#relay log 主从复制需要
#max_relay_log_size = 1G       ## 0
#relay_log_purge = 1           
#relay_log_recovery = 1 #buffers & cache              ## 默认值
table_open_cache = 2048       ## 4000
table_definition_cache = 2048 ## 2000
table_open_cache = 2048       ## 4000
max_heap_table_size = 96M     ## 16M
sort_buffer_size = 2M         ## 256K
join_buffer_size = 2M         ## 256K
thread_cache_size = 256       ## 9
thread_stack = 192K           ## 1M
tmp_table_size = 96M          ## 16M
key_buffer_size = 8M          ## 8M
read_buffer_size = 2M         ## 128K
read_rnd_buffer_size = 16M    ## 256K
bulk_insert_buffer_size = 32M ## 8M#innodb
innodb_buffer_pool_size = 1G    ##--linux system memory*40%  128M
innodb_buffer_pool_instances = 8                ## 1
innodb_data_file_path = ibdata1:1G:autoextend   ## ibdata1:12M:autoextend
innodb_flush_log_at_trx_commit = 1              ## 1
innodb_log_buffer_size = 64M                    ## 64M
innodb_log_file_size = 512M                     ## 48M
innodb_log_files_in_group = 3                   ## 2
innodb_max_dirty_pages_pct = 50                 ## 90
innodb_file_per_table = 1                       ## on
innodb_rollback_on_timeout                      ## off
innodb_status_file = 1                          ## 空
innodb_io_capacity = 5000                       ## 10000
transaction_isolation = READ-COMMITTED          ## REPEATABLE-READ
innodb_flush_method = O_DIRECT                  ## O_DIRECT[mysql_cluster]
ndb-connectstring=192.168.0.1,192.168.0.2[ndbd]
ndb-connectstring=192.168.0.1,192.168.0.2[mysqld_safe]
log-error=/alidata1/admin/logs/mysql/error.log
pid-file=/alidata1/admin/data/ndb-mysqld/mysql.pid[mysql]
socket=/alidata1/mysql-cluster-8.4.3/data/ndb-mysqld/mysql.sock
#!includedir /etc/my.cnf.d## 2.3.3初始化
# chown -R mysql.mysql /alidata1/mysql-cluster-8.4.3/data/ndb-mysqld/
# chown -R mysql.mysql /alidata1/admin/logs/mysql/
# ./bin/mysqld --initialize --user=mysql \--datadir=/alidata1/mysql-cluster-8.4.3/data/ndb-mysqld \--explicit_defaults_for_timestamp > /dev/null## 2.3.4 启动
# ./bin/mysqld_safe --defaults-file=/etc/my.cnf &## 2.3.5 修改默认密码
## echo `cat /alidata1/admin/logs/mysql/error.log |grep root|awk -F ':' '{print $NF}' `| sed 's/ //g'   ## 获取默认密码
# mysql -uroot -p
mysql> alter user 'root'@'localhost' identified with mysql_native_password by 'your_pass';## 3.验证集群状态
# ./bin/ndb_mgm -e show
onnected to management server at localhost port 1186 (using cleartext)
Cluster Configuration
---------------------
[ndbd(NDB)]	2 node(s)
id=13	@192.168.0.3  (mysql-8.4.3 ndb-8.4.3, Nodegroup: 0, *)
id=14	@192.168.0.4  (mysql-8.4.3 ndb-8.4.3, Nodegroup: 0)[ndb_mgmd(MGM)]	2 node(s)
id=1	@192.168.0.1  (mysql-8.4.3 ndb-8.4.3)
id=2	@192.168.0.2  (mysql-8.4.3 ndb-8.4.3)[mysqld(API)]	4 node(s)
id=53	@192.168.0.3  (mysql-8.4.3 ndb-8.4.3)
id=54	@192.168.0.4  (mysql-8.4.3 ndb-8.4.3)
id=55 (not connected, accepting connect from any host)
id=56 (not connected, accepting connect from any host)

3. 配置开机自启

## 1. 开机自启文件
# cat /etc/systemd/system/ndb-mgmd.service 
[Unit]
Description=NDB MGMD Server
After=network.target[Service]
ExecStart=/alidata1/mysql-cluster-8.4.3/bin/ndb_mgmd -c 192.168.0.1,192.168.0.2 --ndb-nodeid=1 -f /alidata1/mysql-cluster-8.4.3/mgmd.ini --configdir=/alidata1/mysql-cluster-8.4.3/data/ndb-mgmd/
PIDFile=/alidata1/mysql-cluster-8.4.3/data/ndb-mgmd/ndb_1.pid
Restart=always
PrivateTmp=true
LimitNOFILE=65535
LimitMEMLOCK=infinity[Install]
WantedBy=multi-user.target# cat /etc/systemd/system/ndb-mysqld.service 
[Unit]
Description=NDB MySQL Server
After=network.target[Service]
User=mysql
Group=mysql
ExecStart=/alidata1/mysql-cluster-8.4.3/bin/mysqld --daemonize --pid-file=/alidata1/mysql-cluster-8.4.3/data/ndb-mysqld/mysql.pid
ExecStop=/alidata1/mysql-cluster-8.4.3/bin/mysqladmin shutdown
PIDFile=/alidata1/mysql-cluster-8.4.3/data/ndb-mysqld/mysql.pid
Restart=always
PrivateTmp=true
LimitNOFILE=65535
LimitMEMLOCK=infinity[Install]
WantedBy=multi-user.target## 由于NDB集群有启停顺序, 因此开机自启只做了 ndb-mgmd,   待管理节点启动后手动启动数据节点和mysqld
## 启动/关闭顺序
## 启动顺序: 管理节点 --> 数据节点  --> mysqld
## 关闭顺序: 管理节点( ./bin/ndb_mgm -e shutdown 会自动关闭数据节点) --> mysqld

4. 数据验证

##  在192.168.0.3上执行建库建表语句, 注意建表语句需要指定引擎 ENGINE=ndbcluster; 在192.168.0.4 mysql客户端也可以看到新建的库/表
mysql> create database db_test;
mysql> show create table db_test.t_test \G
*************************** 1. row ***************************Table: t_test
Create Table: CREATE TABLE `t_test` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.01 sec)## 通过命令行插入1000个数据 -- 192.168.0.3/4 操作
# for i in `seq 1 1000`; do ./bin/mysql -uroot -p'you_pass' -e "insert into db_test.t_test(id, name) values($i,$i);"; done## 命令行产看会有1000行数据 -- 192.168.0.3/4 操作
mysql> select count(*) from db_test.t_test;
+----------+
| count(*) |
+----------+
|     1000 |
+----------+
1 row in set (0.00 sec)## 查看表数据在数据节点的分布情况 -- 任一机器都可以
# ./bin/ndb_desc -c 192.168.0.1,192.168.0.2 -d db_test t_test -p
...............
-- Per partition info -- 
Partition	Row count	Commit count	Frag fixed memory	Frag varsized memory	Extent_space	Free extent_space	
0        510      	510         	32768            	32768               	0            	0                 	
1        490      	490         	32768            	32768               	0            	0        

5. 新增数据节点

## 在管理节点的配置文件 mgmd.ini 中有以下参数, 所以新增的数据节点也必须是成对存在,否则要另外设置NoOfReplicas, 
## 首先必须确保新加入的数据节点作为新的group加入, 默认2个数据节点为1个group, Group数量 = NDB节点总数 / NoOfReplicas数。
[NDBD DEFAULT]
NoOfReplicas = 2现新增数据节点 192.168.0.5, 192.168.0.6, 操作步骤如下
## 1. 修改管理节点配置 192.168.0.1 192.168.0.2 新增以下内容
# vim mgmd.ini
[NDBD]
NodeId = 15
hostname = 192.168.0.5[NDBD]
NodeId = 16
hostname = 192.168.0.6## 2. 关闭其中一个管理节点(192.168.0.1) 然后重新加载配置  -- 其中一台管理节点操作即可
# systemctl stop ndb-mgmd.service   ## 此时在192.168.0.2 执行./bin/ndb_mgm -e show 会发现管理节点只剩下一个 整个集群还能正常对外提供服务 数据的增删改查操作正常
# ./bin/ndb_mgmd --ndb-nodeid=1 --reload -f /alidata1/mysql-cluster-8.4.3/mgmd.ini --configdir=/alidata1/mysql-cluster-8.4.3/data/ndb-mgmd/   ## 此命令会启动管理节点
# kill -9 `ps aux|grep ndb_mgmd |grep -v 'grep'|awk '{print $2}'`   ## kill掉自动起来的进程, 使用systemctl 来启动
# systemctl start ndb-mgmd.service    ## 启动
# ./bin/ndb_mgm -e show               ## 查看状态 
Connected to management server at localhost port 1186 (using cleartext)
Cluster Configuration
---------------------
[ndbd(NDB)]	4 node(s)
id=13	@192.168.0.3  (mysql-8.4.3 ndb-8.4.3, Nodegroup: 0, *)
id=14	@192.168.0.4  (mysql-8.4.3 ndb-8.4.3, Nodegroup: 0)
id=15 (not connected, accepting connect from 192.168.0.5)
id=16 (not connected, accepting connect from 192.168.0.6)[ndb_mgmd(MGM)]	2 node(s)
id=1	@192.168.0.1  (mysql-8.4.3 ndb-8.4.3)
id=2	@192.168.0.2  (mysql-8.4.3 ndb-8.4.3)[mysqld(API)]	4 node(s)
id=53	@192.168.0.3  (mysql-8.4.3 ndb-8.4.3)
id=54	@192.168.0.4  (mysql-8.4.3 ndb-8.4.3)
id=55 (not connected, accepting connect from any host)
id=56 (not connected, accepting connect from any host)## 3. 循环重启旧的数据节点, sql节点
# ./bin/ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> 13 restart 
....
ndb_mgm> 14 restart
....# systemctl restart ndb-mysqld## 4. 启动新的数据节点 -- 192.168.0.5 192.168.0.6 操作
## 4.1.将包上传 并解压
# pwd
/alidata1/
# tar zxf mysql-cluster-8.4.3-linux-glibc2.17-x86_64.tar.xz
# mv mysql-cluster-8.4.3-linux-glibc2.17-x86_64 mysql-cluster-8.4.3
# useradd mysql -s /sdbin/nologin -M                   ## 新建用户
# mkdir -p /alidata1/mysql-cluster-8.4.3/data/ndb-data ## 新增目录## 4.2 启动
# chown -R mysql.mysql /alidata1/mysql-cluster-8.4.3
# cd /alidata1/mysql-cluster-8.4.3
# ./bin/ndbd --ndb-mgmd-host=192.168.0.1,192.168.0.2## 5. 为新节点增加分组
## 5.1 新的数据节点加入集群后 执行 show命令发现新的数据节点状态没有分组
....
id=15	@192.168.0.5  (mysql-8.4.3 ndb-8.4.3, no nodegroup)
id=16	@192.168.0.6  (mysql-8.4.3 ndb-8.4.3, no nodegroup)## 5.2 执行分组命令
# ./bin/ndb_mgm 
-- NDB Cluster -- Management Client --
ndb_mgm> create nodegroup 15,16
Connected to management server at localhost port 1186 (using cleartext)
Nodegroup 1 created
ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]	4 node(s)
id=13	@192.168.0.3  (mysql-8.4.3 ndb-8.4.3, Nodegroup: 0, *)
id=14	@192.168.0.4  (mysql-8.4.3 ndb-8.4.3, Nodegroup: 0)
id=15	@192.168.0.5  (mysql-8.4.3 ndb-8.4.3, Nodegroup: 1)
id=16	@192.168.0.6  (mysql-8.4.3 ndb-8.4.3, Nodegroup: 1)## 6. 原来的数据重新分片 -- 没找到相关命令## 7. 插入10W条数据再次查看数据分布情况
# ./bin/ndb_desc -c 192.168.0.1,192.168.0.2 -d db_test t_test -p
..........
-- Per partition info -- 
Partition	Row count	Commit count	Frag fixed memory	Frag varsized memory	Extent_space	Free extent_space	
0        	24943    	24943       	819200           	425984              	0            	0                 	
1        	25089    	25089       	819200           	425984              	0            	0                 	
2        	25007    	25007       	819200           	425984              	0            	0                 	
3        	24961    	24961       	819200           	425984              	0            	0  

6. 新增查询节点

## 1.将包上传 并解压
# pwd
/alidata1/
# tar zxf mysql-cluster-8.4.3-linux-glibc2.17-x86_64.tar.xz
# mv mysql-cluster-8.4.3-linux-glibc2.17-x86_64 mysql-cluster-8.4.3
# useradd mysql -s /sdbin/nologin -M                     ## 新建用户
# mkdir -p /alidata1/mysql-cluster-8.4.3/data/ndb-mysqld ## 新增目录
# mkdir -p /alidata1/admin/logs/mysql
# chown -R mysql.mysql /alidata1/mysql-cluster-8.4.3 /alidata1/admin/logs/mysql## 2.1 修改配置 初始化
# vim /etc/my.cnf  -- 和最开始安装雷同
# ./bin/mysqld --initialize --user=mysql --datadir=/alidata1/mysql-cluster-8.4.3/data/ndb-mysqld --explicit_defaults_for_timestamp > /dev/null## 2.2 修改默认密码 
## echo `cat /alidata1/admin/logs/mysql/error.log |grep root|awk -F ':' '{print $NF}' `| sed 's/ //g'   ## 获取默认密码
# mysql -uroot -p
mysql> alter user 'root'@'localhost' identified with mysql_native_password by 'your_pass';## 3. 修改管理节点配置 新增配置
# vim mgmd.ini
......
[mysqld]
NodeId = 55
hostname = 192.168.0.5[mysqld]
NodeId = 56
hostname = 192.168.0.6## 4. 关闭其中一个管理节点(192.168.0.1) 然后重新加载配置  -- 其中一台管理节点操作即可
# systemctl stop ndb-mgmd.service   ## 此时在192.168.0.2 执行./bin/ndb_mgm -e show 会发现管理节点只剩下一个 整个集群还能正常对外提供服务 数据的增删改查操作正常
# ./bin/ndb_mgmd --ndb-nodeid=1 --reload -f /alidata1/mysql-cluster-8.4.3/mgmd.ini --configdir=/alidata1/mysql-cluster-8.4.3/data/ndb-mgmd/   ## 此命令会启动管理节点
# kill -9 `ps aux|grep ndb_mgmd |grep -v 'grep'|awk '{print $2}'`   ## kill掉自动起来的进程, 使用systemctl 来启动
# systemctl start ndb-mgmd.service    ## 启动
# ./bin/ndb_mgm -e show               ## 查看状态 
Connected to management server at localhost port 1186 (using cleartext)
Cluster Configuration
---------------------
[ndbd(NDB)]	4 node(s)
id=13	@192.168.0.3  (mysql-8.4.3 ndb-8.4.3, Nodegroup: 0, *)
id=14	@192.168.0.4  (mysql-8.4.3 ndb-8.4.3, Nodegroup: 0)
id=15	@192.168.0.5  (mysql-8.4.3 ndb-8.4.3, Nodegroup: 1)
id=16	@192.168.0.6  (mysql-8.4.3 ndb-8.4.3, Nodegroup: 1)[ndb_mgmd(MGM)]	2 node(s)
id=1	@192.168.0.1  (mysql-8.4.3 ndb-8.4.3)
id=2	@192.168.0.2  (mysql-8.4.3 ndb-8.4.3)[mysqld(API)]	6 node(s)
id=53	@192.168.0.3  (mysql-8.4.3 ndb-8.4.3)
id=54	@192.168.0.4  (mysql-8.4.3 ndb-8.4.3)
id=55	@192.168.0.5  (mysql-8.4.3 ndb-8.4.3)
id=56	@192.168.0.6  (mysql-8.4.3 ndb-8.4.3)
id=57 (not connected, accepting connect from any host)
id=58 (not connected, accepting connect from any host)

7. 数据备份与恢复

## 1. 数据备份脚本
# cat /alidata1/admin/scripts/ndb_bak.sh
#!/bin/bashset -e ## 当前时间
mydate=`date +%Y%m%d`
## mysql部署路径
mysql_home=/alidata1/mysql-cluster-8.4.3
## 备份
${mysql_home}/bin/ndb_mgm -e "start backup ${mydate}"## 2. 使用命令行来备份刚才的数据  -- 192.168.0.1 操作
# ./bin/ndb_mgm -e "start backup 20241130"## 3. 数据恢复
## 3.1 使用命令行将表数据清空 -- 192.168.0.3 操作
# ./bin/mysql -uroot -p'your_pass'
mysql> truncate table db_test.t_test;
mysql> select count(*) from db_test.t_test;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.01 sec)# 3.2 数据恢复
## 恢复操作需要在所有ndb 数据节点操作
## --nodeid            当前数据节点的id
## --backupid          备份时使用的备份id 默认为日期
## --restore-data      恢复数据
## --include-databases 指定数据库
## --include-tables    指定表
## --backup_path       备份路径
## --remap-column=nacos.test.id:offset:10000  指定偏移量 一般不需要## 192.168.0.3 操作
# ./bin/ndb_restore --ndb-connectstring=192.168.0.1,192.168.0.2 --nodeid=13 --backupid=20241130 --restore-data --include-databases=db_test  --backup_path=/alidata1/mysql-cluster-8.4.3/data/ndb-data/BACKUP/BACKUP-20241130## 192.168.0.4 操作
./bin/ndb_restore --ndb-connectstring=192.168.0.1,192.168.0.2 --nodeid=14 --backupid=20241130 --restore-data --include-databases=db_test  --backup_path=/alidata1/mysql-cluster-8.4.3/data/ndb-data/BACKUP/BACKUP-20241130## 192.168.0.5 操作
./bin/ndb_restore --ndb-connectstring=192.168.0.1,192.168.0.2 --nodeid=15 --backupid=20241130 --restore-data --include-databases=db_test  --backup_path=/alidata1/mysql-cluster-8.4.3/data/ndb-data/BACKUP/BACKUP-20241130## 192.168.0.6 操作
./bin/ndb_restore --ndb-connectstring=192.168.0.1,192.168.0.2 --nodeid=16 --backupid=20241130 --restore-data --include-databases=db_test  --backup_path=/alidata1/mysql-cluster-8.4.3/data/ndb-data/BACKUP/BACKUP-20241130## 3.3 查看表数据分布情况
# ./bin/ndb_desc -c 192.168.0.1,192.168.0.2 -d db_test t_test -p
..........
-- Per partition info -- 
Partition	Row count	Commit count	Frag fixed memory	Frag varsized memory	Extent_space	Free extent_space	
0        	24943    	24943       	819200           	425984              	0            	0                 	
1        	25089    	25089       	819200           	425984              	0            	0                 	
2        	25007    	25007       	819200           	425984              	0            	0                 	
3        	24961    	24961       	819200           	425984              	0            	0                 	

相关文章:

mysql集群NDB方式部署

1. 基本信息 部署机器角色部署路径192.168.0.1管理节点部署目录: /alidata1/mysql-cluster-8.4.3192.168.0.2管理节点192.168.0.3数据/SQL节点数据目录:192.168.0.4数据/SQL节点/alidata1/mysql-cluster-8.4.3/data/ndb-mgmd192.168.0.5数据节点 – 新增/alidata1/mysql-clust…...

Fabric.js 中文文档

Fabric.js 中文文档 基于canvas画布的实用类Fabric.js的使用 4、Fabric.js 常用的方法&事件 Fabric.js 画布 defaultCursor 属性(1) 官网文档地址:http://fabricjs.com/docs/github 地址:https://github.com/fabricjs/fabric.js Demo地址&#x…...

【面试重难点问题】c++中为什么可以函数重载,但是c语言中不可以

本文章是对于“c中为什么可以函数重载,但是c语言中不可以”这个问题的探究: 当然这是一个值得深入探讨的问题。在面对难题时,我们常常会竭尽全力寻找答案,不惜挖掘三尺以探究竟。面对上面这个问题时,理解计算机系统的…...

Elasticsearch优化汇总

文章目录 引言硬件设置优化禁用swap给系统留足够的内存JVM配置使用更快的硬件,使用 SSD 参数优化分片设计增加Buffer大小(增加吞吐量)预热文件系统 cache es查询设计优化预索引数据使用filter代替query字段映射避免使用脚本优化日期搜索为只读索引执行 force-merge预热全局序号…...

【落羽的落羽 C语言篇】指针·之其四

文章目录 一、字符指针变量二、数组指针变量1. 创建2. 数组指针类型3. 二维数组传参的本质 三、函数指针变量1. 创建2. 函数指针类型3. 函数指针的使用4. 分析两句“有趣”的代码(doge)5. typedef关键字 四、函数指针数组1. 创建2. 函数指针数组的用途—…...

十二、正则表达式、元字符、替换修饰符、手势和对话框插件、字符串截取

1. 正则表达式 1.1 基本使用 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&g…...

嵌入式的应用领域有哪些

首先给大家介绍一下‌‌&#xff0c;STM32是‌意法半导体&#xff08;STMicroelectronics&#xff09;生产的32位微控制器&#xff08;‌MCU&#xff09;系列‌&#xff0c;采用‌ARM Cortex-M内核设计&#xff0c;以其高性能、低功耗和广泛的应用而闻名。‌ 那么意法半导体是在…...

git merge :开发分支与主分支的交互

一、开发分支&#xff08;dev&#xff09;上的代码达到上线的标准后&#xff0c;要合并到 master 分支 git checkout dev git pull git checkout master git merge dev git push -u origin master 二、当master代码改动了&#xff0c;需要更新开发分支&#xff08;dev&#x…...

OGRE 3D----4. OGRE和QML共享opengl上下文

在现代图形应用开发中,OGRE(Object-Oriented Graphics Rendering Engine)和QML(Qt Modeling Language)都是非常流行的工具。OGRE提供了强大的3D渲染能力,而QML则用于构建灵活的用户界面。在某些应用场景中,我们需要在同一个应用程序中同时使用OGRE和QML,并且共享OpenGL…...

ArcGIS 软件中路网数据的制作

内容导读 路网数据是进行网络分析的基础&#xff0c;它是建立网络数据集的数据来源。 本文我们以OSM路网数据为例&#xff0c;详细介绍OSM路网数据从下载&#xff0c;到数据处理&#xff0c;添加属性&#xff0c;完成符合网络分析的网络数据集的全部过程。 01 数据获取 比较…...

Milvus 2.5:全文检索上线,标量过滤提速,易用性再突破!

01. 概览 我们很高兴为大家带来 Milvus 2.5 最新版本的介绍。 在 Milvus 2.5 里&#xff0c;最重要的一个更新是我们带来了“全新”的全文检索能力&#xff0c;之所以说“全新”主要是基于以下两点&#xff1a; 第一&#xff0c;对于全文检索基于的 BM25 算法&#xff0c;我们采…...

Windows常用DOS指令(附案例)

文章目录 1.dir 查看当前目录2.cd 进入指定目录3.md 创建指定目录4.cd> 创建指定文件5.rd 删除指定空目录6.del 删除指定文件7.copy 复制文件8.xcopy 批量复制9.ren 改名10.type 在命令行空窗口打开文件11.cls 清空DOS命令窗口12.chkdsk 检查磁盘使用情况13.time 显示和设置…...

搜索二维矩阵 II(java)

题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 代码思路&#xff1a; 用暴力算法&#xff1a; class Solution {public boolean searchMatrix(…...

Webpack 的构建流程

Webpack 的构建流程可以概括为以下几个步骤&#xff1a; 1. 初始化&#xff1a; Webpack 读取配置文件&#xff08;webpack.config.js&#xff09;&#xff0c;合并默认配置和命令行参数&#xff0c;初始化Compiler对象。 2. 构建依赖图&#xff1a; 从入口文件开始递归地分…...

Kylin Server V10 下 RocketMQ 主备自动切换模式部署

一、NameServer简介 NameServer 是一个注册中心,提供服务注册和服务发现的功能。NameServer 可以集群部署,集群中每个节点都是对等的关系,节点之间互不通信。 服务注册 Broker 启动的时候会向所有的 NameServer 节点进行注册,注意这里是向集群中所有的 NameServer 节点注册…...

Linux启动中出现“psi: inconsistent task state!”错误可能原因

在Linux系统中&#xff0c;psi: inconsistent task state! 异常日志通常与 PSI&#xff08;Pressure Stall Information&#xff09;相关。PSI 是 Linux 内核中的一个特性&#xff0c;用于监控系统资源的压力情况&#xff0c;如 CPU、内存和 I/O 等。该日志信息表明在处理任务状…...

FCBP 认证考试要点摘要

理论知识 数据处理与分析&#xff1a;包括数据的收集、清洗、转换、存储等基础操作&#xff0c;以及数据分析方法&#xff0c;如描述性统计分析、相关性分析、数据挖掘算法等的理解和应用 。数据可视化&#xff1a;涉及图表类型的选择与应用&#xff0c;如柱状图、折线图、饼图…...

ubuntu防火墙入门(一)——设置服务、关闭端口

本机想通过git clone gitgithub.com:skumra/robotic-grasping.git下载代码&#xff0c;firewall-config中需要为当前区域的防火墙开启SSH服务吗 是的&#xff0c;如果你想通过 git clone gitgithub.com:skumra/robotic-grasping.git 使用 SSH 协议从 GitHub 下载代码&#xff0…...

yt6801 ubuntu有线连接驱动安装

耀世16pro的有线网卡驱动安装 下载地址: YT6801 千兆PCIE以太网控制器芯片 1. 创建安装目录 mkdir yt68012. 解压驱动文件 unzip yt6801-linux-driver-1.0.27.zip -d yt68013. 进入驱动目录 cd yt68014. 安装驱动 以 root 权限运行安装脚本&#xff1a; sudo su ./yt_ni…...

ASP.NET Core Web API 控制器

文章目录 一、基类&#xff1a;ControllerBase二、API 控制器类属性三、使用 Get() 方法提供天气预报结果 在深入探讨如何编写自己的 PizzaController 类之前&#xff0c;让我们先看一下 WeatherController 示例中的代码&#xff0c;了解它的工作原理。 在本单元中&#xff0c;…...

【论文笔记】Tool Learning with Foundation Models 论文笔记

Tool Learning with Foundation Models 论文笔记 文章目录 Tool Learning with Foundation Models 论文笔记摘要背景&#xff1a;工作&#xff1a; 引言工具学习的发展本文工作&#xff08;大纲&目录&#xff09; 背景2.1 工具使用的认知起源2.2 工具分类&#xff1a;用户界…...

STM32 + CubeMX + 串口 + IAP升级

这篇文章分享一个简单的串口IAP Demo&#xff0c;实现使用串口更新我们自己的App程序。 目录 一、IAP简介二、Stm32CubeMx配置三、Boot代码及配置1、代码2、配置 四、App代码及配置1、代码2、配置 五、效果展示 一、IAP简介 IAP介绍可以在网上找找&#xff0c;相关资料很多&am…...

Oracle-—系统包使用

文章目录 系统包dbms_redefinition 系统包 dbms_redefinition 功能介绍&#xff1a;该包体可以实现将Oracle库下的表在线改为分区结构或者重新定义&#xff1b; 说明&#xff1a;在检查表是否可以重定义和开始重定义的过程中&#xff0c;按照表是否存在主键&#xff0c;参数 o…...

使用Hugo和GitHub Pages创建静态网站个人博客

不需要服务器&#xff0c;不需要域名&#xff0c;不需要数据库&#xff0c;可以选择模版&#xff0c;内容为Markdown格式。 Hugo&#xff1a;https://gohugo.io 文档&#xff1a;https://gohugo.io/getting-started/quick-start/ 中文文档&#xff1a;https://www.gohugo.or…...

群晖系统证书延期

群晖系统默认证书过期了 接下来操作续期证书 一直下一步会让下载一个压缩包里面包含私钥和签发证书请求 下载后解压出来 在群晖里用证书续期 对以前的证书签署签发请求 选择刚刚解压出来的证书 执行完成后会下载一个压缩包&#xff0c;解压出来就会得到新证书 给群晖新增证书 选…...

android shader gl_Position是几个分量

在Android的OpenGL ES中&#xff0c;gl_Position是顶点着色器&#xff08;Vertex Shader&#xff09;的一个内置输出变量&#xff0c;它用于指定顶点在裁剪空间&#xff08;Clip Space&#xff09;中的位置。gl_Position是一个四维向量&#xff08;4-component vector&#xff…...

JAVA练习-ArrayList数组

需求 建立3个Student类的实例 原始数组&#xff1a; public class Student {private String name;private int score;public Student(String name, int score) {this.name name;this.score score;}Overridepublic String toString() {return name "的分数&#xff1…...

springboot339javaweb的新能源充电系统pf(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;新能源充电系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解…...

数据结构——排序第三幕(深究快排(非递归实现)、快排的优化、内省排序,排序总结)超详细!!!!

文章目录 前言一、非递归实现快排二、快排的优化版本三、内省排序四、排序算法复杂度以及稳定性的分析总结 前言 继上一篇博客基于递归的方式学习了快速排序和归并排序 今天我们来深究快速排序&#xff0c;使用栈的数据结构非递归实现快排&#xff0c;优化快排&#xff08;三路…...

Jackson:Java对象和JSON字符串的转换处理库使用指南

Jackson介绍 Jackson 是一个非常流行的 Java JSON 处理库&#xff0c;它能够将 Java 对象与 JSON 字符串相互转换。 Jackson 工具主要用于将请求的参数&#xff08;例如前端发送的 JSON 数据&#xff09;和响应的数据&#xff08;例如后端返回给前端的数据&#xff09;转换成…...

mac maven编译出现问题

背景 进行maven install 命令&#xff0c;报错&#xff1a; [ERROR] COMPILATION ERROR : [INFO] ------------------------------------------------------------- [ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a J…...

深入讲解Spring Boot和Spring Cloud,外加图书管理系统实战!

很抱歉&#xff0c;我的疏忽&#xff0c;说了这么久还没有给大家详细讲解过Spring Boot和Spring Cloud,那今天给大家详细讲解一下。 大家可以和下面这三篇博客一起看&#xff1a; 1、Spring Boot 和 Spring Cloud 微服务开发实践详解https://blog.csdn.net/speaking_me/artic…...

【AIGC】2023-ICCV-用于高保真语音肖像合成的高效区域感知神经辐射场

2023-ICCV-Efficient Region-Aware Neural Radiance Fields for High-Fidelity Talking Portrait Synthesis 用于高保真语音肖像合成的高效区域感知神经辐射场摘要1. 引言2. 相关工作3. 方法3.1 准备工作和问题设置3.2 三平面哈希表示3.3. 区域注意模块3.4 训练细节 4. 实验4.1…...

如何写一份优质技术文档

作者简介&#xff1a; 本文作者拥有区块链创新专利30&#xff0c;是元宇宙标准化工作组成员、香港web3标准工作组成员&#xff0c;参与编写《数据资产确权与交易安全评价标准》、《链接元宇宙&#xff1a;应用与实践》、《香港Web3.0标准化白皮书》等标准&#xff0c;下面提供…...

ML 系列:第 35 节 - 机器学习中的数据可视化

ML 系列&#xff1a;第 35 天 - 机器学习中的数据可视化 文章目录 一、说明二、数据可视化2.1 直方图2.2 箱线图2.3 散点图2.4 条形图2.5 线图2.6 热图 三、结尾 一、说明 描述性统计和数据可视化是理解和解释机器学习数据的基础。它们有助于总结和直观地呈现数据&#xff0c…...

存储服务器一般做是做什么阵列?详细列举一下

存储服务器通常使用 RAID&#xff08;Redundant Array of Independent Disks&#xff09; 阵列技术来管理磁盘&#xff0c;以提高数据的性能、可靠性和可用性。所选择的 RAID 类型取决于存储服务器的具体用途和需求&#xff0c;比如性能要求、容量需求、容错能力等。 以下是存…...

uniapp使用扩展组件uni-data-select出现的问题汇总

前言 不知道大家有没有学习过我的这门课程那&#xff0c;《uniCloud云开发Vue3版本官方推荐用法》&#xff0c;这么课程已经得到了官方推荐&#xff0c;想要快速上手unicloud的小伙伴们&#xff0c;可以学习一下这么课程哦&#xff0c;不要忘了给一键三连呀。 在录制这门课程…...

pdf.js 预览pdf的时候发票数据缺失显示不全:字体加载出错(缺失)导致部分缺失

首先&#xff0c;排除后端返回的PDF文件流是没有问题的&#xff1a; 但是在vue项目中是这样的&#xff1a; 明显是显示不全&#xff0c;F12查看报错信息&#xff0c;有以下警告&#xff1a; pdf.js:2153 Warning: Error during font loading: The CMap “baseUrl” paramet…...

【设计模式】【结构型模式(Structural Patterns)】之外观模式(Facade Pattern)

1. 设计模式原理说明 外观模式&#xff08;Facade Pattern&#xff09; 是一种结构型设计模式&#xff0c;它提供了一个统一的接口&#xff0c;用来访问子系统中的一群接口。外观模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。通过隐藏子系统的复杂…...

Redis使用场景-缓存-缓存穿透

前言 之前在针对实习面试的博文中讲到Redis在实际开发中的生产问题&#xff0c;其中缓存穿透、击穿、雪崩在面试中问的最频繁&#xff0c;本文加了图解&#xff0c;希望帮助你更直观的了解缓存穿透&#x1f600; &#xff08;放出之前写的针对实习面试的关于Redis生产问题的博…...

介绍 Apache Spark 的基本概念和在大数据分析中的应用

Apache Spark 是一个开源的大数据处理框架&#xff0c;它提供了快速、通用、可扩展的数据处理能力。Spark可以处理大规模数据集&#xff0c;并且在内存中进行数据操作&#xff0c;从而实现高速的数据处理和分析。 Spark的核心概念是弹性分布式数据集&#xff08;Resilient Dis…...

OpenCPN-插件之Dashboard Tactics

1&#xff1a;相关链接Dashboard Tactics :: OpenCPN Dashboard Tactics Plugin rgleason/dashboard_tactics_pi: OpenCPN dashboard built-in plugin merger with external tactics_pi plugin NMEAconverter :: OpenCPN 2&#xff1a;显示样式 3&#xff1a;代码 这个插件…...

【LeetCode面试150】——20有效的括号

博客昵称&#xff1a;沈小农学编程 作者简介&#xff1a;一名在读硕士&#xff0c;定期更新相关算法面试题&#xff0c;欢迎关注小弟&#xff01; PS&#xff1a;哈喽&#xff01;各位CSDN的uu们&#xff0c;我是你的小弟沈小农&#xff0c;希望我的文章能帮助到你。欢迎大家在…...

JWT介绍和结合springboot项目实践(登录、注销授权认证管理)

目录 一、JWT介绍&#xff08;一&#xff09;基本介绍&#xff08;二&#xff09;jwt有哪些库1、jjwt&#xff08;Java JWT&#xff09;2、nimbus - jwt - jwt - api 和 nimbus - jwt - jwt - impl3、spring - security - jwt&#xff08;已弃用&#xff0c;但在旧项目中有参考…...

Linux 下安装 Golang环境

Linux 下安装 Golang 获取Golang下载地址 安装 进入终端&#xff0c;登入root来到应用安装目录使用 wget 下载解压文件配置环境变量查看golang版本&#xff0c;测试是否配置成功GO设置代理环境变量 本篇教程 以 centos7 为环境基础 不使用软件包管理器安装&#xff0c;原因&am…...

「Mac畅玩鸿蒙与硬件36」UI互动应用篇13 - 数字滚动抽奖器

本篇将带你实现一个简单的数字滚动抽奖器。用户点击按钮后&#xff0c;屏幕上的数字会以滚动动画的形式随机变动&#xff0c;最终显示一个抽奖数字。这个项目展示了如何结合定时器、状态管理和动画实现一个有趣的互动应用。 关键词 UI互动应用数字滚动动画效果状态管理用户交…...

安装使用Ubuntu18.04超级大全集最初版(anaconda,pycharm,代理,c/c++环境)

本文介绍ubuntu1804中我目前用到的环境的完整配置&#xff0c;包括ubuntu安装软件&#xff0c;更新环境变量等都有涉及。图片非常多&#xff0c;能给的连接和材料都给了。希望能帮助到新同学。 目录 目录 目录 环境及镜像文件 安装Ubuntu ​编辑 开机之后 ​编辑 更新…...

Redis设计与实现第16章 -- Sentinel 总结1(初始化、主从服务器获取信息、发送信息、接收信息)

Sentinel是Redis的高可用解决方案&#xff1a;由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器&#xff0c;以及这些主服务器属下的所有从服务器&#xff0c;被监视的主服务器进入下线状态时&#xff0c;自动将下线主服务器属下的某个从服务器升级为新的主…...

ChatGPT科研应用、论文写作、课题申报、数据分析与AI绘图

随着人工智能技术的飞速发展&#xff0c;ChatGPT等先进语言模型正深刻改变着科研工作的面貌。从科研灵感的激发、论文的高效撰写&#xff0c;到课题的成功申报&#xff0c;乃至复杂数据的深度分析与可视化呈现&#xff0c;AI技术均展现出前所未有的潜力。其实众多科研前沿工作者…...

OceanBase数据库系列之:基于docker快速安装OceanBase数据库,基于linux服务器快速部署OceanBase数据库

OceanBase数据库系列之&#xff1a;基于docker快速安装OceanBase数据库&#xff0c;基于linux服务器快速部署OceanBase数据库 一、docker快速安装OceanBase数据库下载OceanBase数据库镜像查看镜像启动OceanBase数据库查看OceanBase数据库是否启动成功 二、基于linux部署OceanBa…...