源码编译 Galera、MySQL 5.7 Wsrep 和安装 MySQL 5.7 Galera集群
源码编译 Galera、MySQL 5.7 Wsrep 和安装 MySQL 5.7 Galera集群
- 说明
- 1、源码编译 Galera
- 1.1、安装依赖
- 1.2、源码编译安装 openSSL
- 1.2.1、下载源码
- 1.2.2、编译安装
- 1.3、源码编译安装 Galera 3
- 1.3.1、下载源码
- 1.3.2、注意
- 1.3.3、编译安装
- 2、源码编译 MySQL-Wsrep
- 2.1、安装依赖
- 2.2、编译安装 MySQL-Wsrep
- 2.2.1、下载 MySQL-Wsrep 源码和 boost
- 2.2.2、编译安装
- 2.3、配置 MySQL
- 2.3.1、配置用户
- 2.3.2、配置 my.cnf 文件
- 2.3.3、初始化数据库
- 2.3.4、配置为系统服务
- 2.3.5、配置环境变量
- 2.3.6、创建软连接
- 2.3.7、数据库服务状态
- 2.3.8、登录并修改密码
- 3、安装 MySQL - Galera集群
- 3.1、准备环境
- 3.2、清理 Mariadb
- 3.3、配置 galera 集群,防火墙放行端口
- 3.3.1、修改 /etc/my.cnf 配置文件
- 3.3.2、开启防火墙端口
- 3.3.3、安装 rsync
- 3.3.4、添加 hosts
- 3.4、启动第一个节点
- 3.5、接下来的每一台机器都做以上操做
- 3.5.1、node02
- 3.5.2、node03
- 3.5.3、从服务器启动服务后,在主服务器察看集群信息
- 4、Galera 集群搭建完成,进行测试
- 4.1、测试一
- 4.2、测试二
- 4.3、测试三
- 4.4、测试四
- 5、负载均衡
- 5.1、TCP 负载均衡
- 5.2、日志记录
- 5.3、测试
说明
由于是基于源码编译,所以适用于各个版本的 Linux 和系统架构(如 x86、arm 等)
1、源码编译 Galera
1.1、安装依赖
yum install -y gcc gcc-c++ cmake boost-devel check-devel python3 net-tools lsof
yum -y install pcre-devel zlib-devel gcc gcc-c++ make cmake libtirpc-devel rpcgen perl
yum -y install bison bison-devel zlib-devel libcurl-devel libarchive-devel ncurses-devel gnutls-devel libxml2-devel libevent-devel libaio-devel
pip3 install --index-url https://pypi.tuna.tsinghua.edu.cn/simple scons
1.2、源码编译安装 openSSL
1.2.1、下载源码
openssl 版本至少大于等于 1.1.1
cd /usr/local/
wget -O openssl-1.1.1w.tar.gz https://github.com/openssl/openssl/releases/download/OpenSSL_1_1_1w/openssl-1.1.1w.tar.gz
tar -xzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
mkdir -p /usr/local/openssl /usr/local/ssl
1.2.2、编译安装
cd openssl-1.1.1w
CFLAGS="-fPIC" ./config shared zlib-dynamic --prefix=/usr/local/openssl
make -j4 && make -j4 install
/usr/local/openssl/bin/openssl versioncp -f /usr/local/openssl-1.1.1w/libssl.so.1.1 /usr/lib64/
cp -f /usr/local/openssl-1.1.1w/libcrypto.so.1.1 /usr/lib64/
ln -s /usr/lib64/libssl.so.1.1 /usr/lib64/libssl.so.11
ln -s /usr/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.11
1.3、源码编译安装 Galera 3
1.3.1、下载源码
cd /usr/local/
wget -O galera-3-25.3.37.tar.gz https://releases.galeracluster.com/galera-3.37/source/galera-3-25.3.37.tar.gz
tar -xzf galera-3-25.3.37.tar.gz
cd galera-3-25.3.37
1.3.2、注意
文件 gcs/src/unit_tests/SConscript 的 env.Append(LIBS=[‘m’, ‘ssl’, ‘crypto’]) 需要注释
CNT=$(cat gcs/src/unit_tests/SConscript | grep -n "env.Append(LIBS" | grep -n "ssl" | awk -F ":" '{print $2}')
# 添加#
awk -v n="${CNT}" 'NR==n && !/^#/ {print "#", $0; next} {print}' gcs/src/unit_tests/SConscript > gcs/src/unit_tests/temp.txt \
&& mv -f gcs/src/unit_tests/temp.txt gcs/src/unit_tests/SConscript
文件 wsrep/tests/SConscript 的第37行 env.Test 需要注释,不然会编译失败
CNT=$(cat wsrep/tests/SConscript | grep -n "env.Test" | awk -F ":" '{print $1}')
# 给第37行添加#
awk -v n="${CNT}" 'NR==n && !/^#/ {print "#", $0; next} {print}' wsrep/tests/SConscript > wsrep/tests/temp.txt \
&& mv -f wsrep/tests/temp.txt wsrep/tests/SConscript
1.3.3、编译安装
export CXXFLAGS="-I/usr/local/openssl/include"cd /usr/local/galera-3-25.3.37
scons -v
scons -c static_ssl=/usr/local/openssl/lib
scons static_ssl=/usr/local/openssl/lib
生成 libgalera_smm.so 文件就是我们需要使用的
2、源码编译 MySQL-Wsrep
2.1、安装依赖
yum -y install pcre-devel zlib-devel gcc gcc-c++ make cmake libtirpc-devel rpcgen perl
yum -y install bison bison-devel zlib-devel libcurl-devel libarchive-devel ncurses-devel gnutls-devel libxml2-devel libevent-devel libaio-devel
2.2、编译安装 MySQL-Wsrep
2.2.1、下载 MySQL-Wsrep 源码和 boost
boost 版本至少大于1.40.0
cd /usr/local/
wget -O mysql-wsrep-5.7.44-25.36.tar.gz https://releases.galeracluster.com/mysql-wsrep-5.7.44-25.36/source/mysql-wsrep-5.7.44-25.36.tar.gz
tar -xf mysql-wsrep-5.7.44-25.36.tar.gz
# 下载boost
wget -O boost_1_59_0.tar.gz 'https://nchc.dl.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz?viasf=1'
tar -xf boost_1_59_0.tar.gz
2.2.2、编译安装
cd /usr/local/mysql-wsrep-5.7.44-25.36
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DWITH_BOOST=/usr/local/boost_1_59_0 -DWITH_SSL=/usr/local/openssl \
-DWITH_WSREP=ON -DWITH_INNODB_DISALLOW_WRITES=ON \&& make -j4 && make -j4 install
参数说明
- -DCMAKE_INSTALL_PREFIX=
/usr/local/mysql
#指定mysql的安装路径
-DWITH_BOOST=/usr/local/boost_1_59_0
#指定boost的路径
-DWITH_SSL=/usr/local/openssl
#指定openssl位置
编译出来的可执行文件在 /usr/local/mysql
目录中,需要拷贝到部署的机器上
注意,有符号连接,不能 scp 直接拷贝目录,需要 tar 压缩后再拷贝、解压
cd /usr/local
tar -czvf mysql.tar.gz --dereference mysql
2.3、配置 MySQL
2.3.1、配置用户
useradd -s /sbin/nologin mysql
mkdir -p /usr/local/mysql/ /data/mysql/
chown -R mysql:mysql /usr/local/mysql/
chown -R mysql:mysql /data/mysql/
2.3.2、配置 my.cnf 文件
vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/tmp/mysql.sock
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'[mysqld_safe]
log-error=/var/log/mysql.log
pid-file=/var/run/mysql.pid[client]
default-character-set=utf8mb4[mysql]
default-character-set = utf8mb4
2.3.3、初始化数据库
cd /usr/local/mysql/bin
./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/ \
--pid-file=/data/mysql/mysql.pid
上面命令输出的结果会得到一个mysql登录的临时密码,需要记住,后面登录会用到
2.3.4、配置为系统服务
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
ldconfig
chmod 755 /etc/init.d/mysqld
chkconfig --add mysqld
2.3.5、配置环境变量
echo "PATH=$PATH:/usr/local/mysql/bin" > /etc/profile.d/mysql.sh
source /etc/profile
chkconfig mysqld on
2.3.6、创建软连接
ln -s /usr/local/mysql/bin/mysqladmin /usr/bin
2.3.7、数据库服务状态
chkconfig mysqld on
systemctl start mysqld
systemctl status mysqld
# 也可以
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --user=mysql &
2.3.8、登录并修改密码
mysql --user=root --password='1zQ1=%yoExiU'
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'CWCcwy@123!';
use mysql;
update user set host ='%' where user='root';
flush privileges;
use mysql;
# wxhntmy用户用于集群间连接
grant all on *.* TO 'wxhntmy'@'%' identified by 'CWCcwy@123!';
flush privileges;
3、安装 MySQL - Galera集群
3.1、准备环境
主机名 | IP | 注释 |
---|---|---|
node01 | 192.168.50.121 | 主服务 |
node03 | 192.168.50.122 | 从服务 |
node02 | 192.168.50.123 | 从服务 |
node04 | 192.168.50.124 | 负载均衡 |
3.2、清理 Mariadb
rpm -qa | grep mariadb
rpm -qa | grep -i mariadb | xargs rpm -e --nodeps
rpm -qa | grep mariadb
3.3、配置 galera 集群,防火墙放行端口
3.3.1、修改 /etc/my.cnf 配置文件
vim /etc/my.cnf
在 [mysqld] 加入以下内容
server_id=1
binlog_format=row
default_storage_engine=InnoDB
innodb_file_per_table=1
innodb_autoinc_lock_mode=2wsrep_on=ON
wsrep_provider=/usr/local/galera-3-25.3.37/libgalera_smm.so
wsrep_cluster_name='galera'
wsrep_cluster_address='gcomm://'
wsrep_node_name='node01'
wsrep_node_address='192.168.50.121'
wsrep_sst_auth=wxhntmy:CWCcwy@123!
wsrep_sst_method=rsync
- server_id 要集群内唯一,比如 node1的为1,node2的为2…
- binlog_format=row binlog的格式
- innodb_file_per_table=1 独立的表空间
- innodb_autoinc_lock_mode=2 自增锁模式取值
- 0 这个表示 tradition 传统
- 1 这个表示 consecutive 连续
- 2 这个表示 interleaved 交错
- wsrep_on=ON wsrep功能开启
- wsrep_provider=/usr/local/galera-3-25.3.37/libgalera_smm.so 开启so模块
- wsrep_cluster_name 集群名字,可以自定义,但是同一集群要保持一致
- wsrep_cluster_address 第一个节点的值为’gcomm://',第一个节点起来后,其他节点可以配置为集群除自身外所有节点ip地址 如:‘gcomm://192.168.50.121,192.168.50.122’
- wsrep_node_name 节点主机名
- wsrep_node_address 节点ip
- wsrep_sst_auth 创建的用于同步的用户和密码 (我创建的用户为 wxhntmy 密码为 CWCcwy@123!)
3.3.2、开启防火墙端口
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --add-port=4567/tcp --permanent
firewall-cmd --add-port=4567/udp --permanent
firewall-cmd --add-port=4568/tcp --permanent
firewall-cmd --add-port=4444/tcp --permanent
firewall-cmd --reload
- 4567 , Galera做数据复制的通讯和数据传输端口,需要在防火墙放开TCP和UDP
- 4568 , Galera做增量数据传输使用的端口(Incremental State Transfer, IST),需要防火墙放开TCP
- 4444 , Galera做快照状态传输使用的端口(State Snapshot Transfer, SST),需要防火墙放开TCP
必须关闭 SELINUX
sed -ri '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
setenforce 0
3.3.3、安装 rsync
yum -y install rsync
systemctl enable rsyncd
systemctl start rsyncd
3.3.4、添加 hosts
cat >> /etc/hosts << EOF
192.168.50.121 node01
192.168.50.122 node02
192.168.50.123 node03
EOF
3.4、启动第一个节点
systemctl restart mysqld
systemctl status mysqld
mysql -uroot -p'CWCcwy@123!'
show status like 'wsrep%';
mysql> show status like 'wsrep%';
+------------------------------+--------------------------------------+
| Variable_name | Value |
+------------------------------+--------------------------------------+
| wsrep_local_state_uuid | f1c652cf-edd1-11ed-a10f-968ace4bc2c6 |
| wsrep_protocol_version | 9 |
| wsrep_last_committed | 0 |
| wsrep_replicated | 0 |
| wsrep_replicated_bytes | 0 |
| wsrep_repl_keys | 0 |
| wsrep_repl_keys_bytes | 0 |
| wsrep_repl_data_bytes | 0 |
| wsrep_repl_other_bytes | 0 |
| wsrep_received | 2 |
| wsrep_received_bytes | 144 |
| wsrep_local_commits | 0 |
| wsrep_local_cert_failures | 0 |
| wsrep_local_replays | 0 |
| wsrep_local_send_queue | 0 |
| wsrep_local_send_queue_max | 1 |
| wsrep_local_send_queue_min | 0 |
| wsrep_local_send_queue_avg | 0.000000 |
| wsrep_local_recv_queue | 0 |
| wsrep_local_recv_queue_max | 2 |
| wsrep_local_recv_queue_min | 0 |
| wsrep_local_recv_queue_avg | 0.500000 |
| wsrep_local_cached_downto | 18446744073709551615 |
| wsrep_flow_control_paused_ns | 0 |
| wsrep_flow_control_paused | 0.000000 |
| wsrep_flow_control_sent | 0 |
| wsrep_flow_control_recv | 0 |
| wsrep_flow_control_active | false |
| wsrep_flow_control_requested | false |
| wsrep_cert_deps_distance | 0.000000 |
| wsrep_apply_oooe | 0.000000 |
| wsrep_apply_oool | 0.000000 |
| wsrep_apply_window | 0.000000 |
| wsrep_apply_waits | 0 |
| wsrep_commit_oooe | 0.000000 |
| wsrep_commit_oool | 0.000000 |
| wsrep_commit_window | 0.000000 |
| wsrep_local_state | 4 |
| wsrep_local_state_comment | Synced |
| wsrep_cert_index_size | 0 |
| wsrep_causal_reads | 0 |
| wsrep_cert_interval | 0.000000 |
| wsrep_open_transactions | 0 |
| wsrep_open_connections | 0 |
| wsrep_incoming_addresses | 192.168.50.121:3306 |
| wsrep_cluster_weight | 1 |
| wsrep_desync_count | 0 |
| wsrep_evs_delayed | |
| wsrep_evs_evict_list | |
| wsrep_evs_repl_latency | 0/0/0/0/0 |
| wsrep_evs_state | OPERATIONAL |
| wsrep_gcomm_uuid | f1c5fe7f-edd1-11ed-be51-52686bc6b62c |
| wsrep_gmcast_segment | 0 |
| wsrep_cluster_conf_id | 1 |
| wsrep_cluster_size | 1 |
| wsrep_cluster_state_uuid | f1c652cf-edd1-11ed-a10f-968ace4bc2c6 |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| wsrep_local_bf_aborts | 0 |
| wsrep_local_index | 0 |
| wsrep_provider_name | Galera |
| wsrep_provider_vendor | Codership Oy <info@codership.com> |
| wsrep_provider_version | 3.37(rf47405c8) |
| wsrep_ready | ON |
+------------------------------+--------------------------------------+
64 rows in set (0.00 sec)mysql>
注意:如果第一台节点起不来就将 /data/mysql 目录下的两个缓存文件删除再启动。
ls -l /data/mysql
rm -rf /data/mysql/grastate.dat
rm -rf /data/mysql/galera.cache
3.5、接下来的每一台机器都做以上操做
3.5.1、node02
在第一加入(node02 192.168.50.122)修改(/etc/my.cnf)
vim /etc/my.cnf
server_id=2
binlog_format=row
default_storage_engine=InnoDB
innodb_file_per_table=1
innodb_autoinc_lock_mode=2wsrep_on=ON
wsrep_provider=/usr/local/galera-3-25.3.37/libgalera_smm.so
wsrep_cluster_name='galera'
wsrep_cluster_address='gcomm://192.168.50.121,192.168.50.123'
wsrep_node_name='node02'
wsrep_node_address='192.168.50.122'
wsrep_sst_auth=wxhntmy:CWCcwy@123!
wsrep_sst_method=rsync
systemctl restart mysqld
systemctl status mysqld
3.5.2、node03
在第二加入(node03 192.168.50.123)修改(/etc/my.cnf)
vim /etc/my.cnf
server_id=3
binlog_format=row
default_storage_engine=InnoDB
innodb_file_per_table=1
innodb_autoinc_lock_mode=2wsrep_on=ON
wsrep_provider=/usr/local/galera-3-25.3.37/libgalera_smm.so
wsrep_cluster_name='galera'
wsrep_cluster_address='gcomm://192.168.50.121,192.168.50.122'
wsrep_node_name='node03'
wsrep_node_address='192.168.50.123'
wsrep_sst_auth=wxhntmy:CWCcwy@123!
wsrep_sst_method=rsync
systemctl restart mysqld
systemctl status mysqld
3.5.3、从服务器启动服务后,在主服务器察看集群信息
登录 node01
mysql -uwxhntmy -P3306 -h192.168.50.121 -p'CWCcwy@123!'
show status like 'wsrep%';
4、Galera 集群搭建完成,进行测试
4.1、测试一
分别向三个节点 建库,建表, 插入数据操作,验证多点写入,观察数据是否同步
mysql -uwxhntmy -P3306 -h192.168.50.121 -p'CWCcwy@123!'
mysql -uwxhntmy -P3306 -h192.168.50.122 -p'CWCcwy@123!'
mysql -uwxhntmy -P3306 -h192.168.50.123 -p'CWCcwy@123!'
create database test;
show databases;
use test;
CREATE TABLE test.test_table (message VARCHAR(250));
---节点1
INSERT INTO test.test_table VALUES ('node01');
---节点2
INSERT INTO test.test_table VALUES ('node02');
---节点3
INSERT INTO test.test_table VALUES ('node03');
select * from test.test_table;
在所有其余两个数据库中都可以查询到插入数据的存在
4.2、测试二
下线其中一个节点 systemctl stop mysqld
(不能是发起人 192.168.50.121 ),剩余节点继续添加数据, 拉开距离。
此时离线数据库重新上线,启动服务即可,观察是否能追上其他人的数据
当断开后一段时间重新连接会发现数据一样能够自动同步回来
4.3、测试三
让 发起人节点 离线,剩余服务器继续插入数据,拉开距离
再让 发起人 重新上线
vim /etc/my.cnf
wsrep_cluster_address='gcomm://192.168.50.122,192.168.50.123'
此时 gcomm:// 不再为空,要向其他服务器同步数据
4.4、测试四
停止集群所有数据库
最后离开集群/停止的数据库 主机,要最先启动。否则可能导致数据丢失
如果要一台不是最后离开的主机强制启动。 修改 /mysql/grastate.dat
修改 safe_to_bootstrap: 0 为1,修改最先启动的数据库/etc/my.cnf
修改 wsrep_cluster_address=‘gcomm://’ 为空,不向任何主机进行同步
然后再启动数据库服务,接着启动其他数据库!
5、负载均衡
5.1、TCP 负载均衡
以下为示意图
NGINX 充当数据库服务器的反向代理,监听 MySQL 默认端口 3306。这为客户端提供了一个简单的接口,同时后端 MySQL 节点可以向外扩展(甚至脱机),且不会对客户端产生任何影响。
TCP 负载均衡在 stream 配置上下文中进行配置,因此我们在 nginx.conf 主文件中添加了一个 stream 块来创建基本的 MySQL 负载均衡配置。
vim /etc/nginx/nginx.conf
stream { include stream.conf;
}
- 这可以将我们的 TCP 负载均衡配置与主配置文件分隔开来。然后我们在与 nginx.conf 相同的目录下创建 stream.conf。请注意,默认情况下,conf.d 目录是留给 http 配置上下文的,因此无法向该目录添加 stream 配置文件。
- 首先,我们定义一个名为 galera_cluster 的上游组,其中包含 Galera 集群中的三个 MySQL 节点。在我们的测试环境中,它们都支持在本地主机上通过唯一的端口号进行访问。zone 指令定义了所有 NGINX worker 进程共享的内存容量,以维持负载均衡状态。Server{} 块配置了 NGINX 处理客户端的方式。NGINX 监听 MySQL 默认端口 3306,并将所有流量转发到在上游块中定义的 Galera 集群。
- 然而,如果我们的应用使用连接池访问数据库,那么以轮询方式打开集群连接可能会导致每个节点上的连接数量不均衡。此外,我们不能将连接视为给定的工作负载,因为连接可能处于空闲状态(等待应用查询)或正在处理查询。因此,对于 TCP 长连接,更合适的负载均衡算法是 Least Connections,配置 least_conn 指令
- 现在,当客户端打开到数据库的新连接时,NGINX 会选择当前连接数最少的集群节点。
- 跨集群共享数据库工作负载的一大优势在于它还可提供高可用性。进行上述配置后,NGINX 将服务器标记为 “不可用”,如果无法建立新的 TCP 连接则停止向其发送 TCP 数据包。
vim /etc/nginx/stream.conf
upstream galera_cluster {server 192.168.50.121:3306; # node1server 192.168.50.122:3306; # node2server 192.168.50.123:3306; # node3zone tcp_mem 64k;least_conn;
}server {listen 3306; # MySQL defaultproxy_pass galera_cluster;
}
5.2、日志记录
NGINX 支持灵活地记录日志,因此它所有的 TCP/UDP 处理进程都可以被记录下来,以便进行调试或离线分析。对于 TCP 协议(例如 MySQL),NGINX 会在连接关闭时写入日志条目。log_format 指令定义了该日志中出现的值。我们可以从 Stream 模块中的任何变量中进行选择。我们在 stream.conf 文件顶部的 stream 上下文中定义了日志格式。
log_format mysql '$remote_addr [$time_local] $protocol $status $bytes_received ''$bytes_sent $upstream_addr $upstream_connect_time ''$upstream_first_byte_time $upstream_session_time $session_time';
添加 access_log 指令以启用日志记录,并指定日志文件的路径以及上个代码段中定义的日志格式的名称。
access_log /var/log/nginx/galera_access.log mysql;
vim /etc/nginx/nginx.conf
这会生成日志条目,示例见下。
tail -f /var/log/nginx/galera_access.log
5.3、测试
yum install -y net-tools
netstat -tulnp | grep 3306
mysql -uwxhntmy -P3306 -h192.168.50.124 -p'CWCcwy@123!'
SHOW VARIABLES WHERE Variable_name = 'hostname';
相关文章:
源码编译 Galera、MySQL 5.7 Wsrep 和安装 MySQL 5.7 Galera集群
源码编译 Galera、MySQL 5.7 Wsrep 和安装 MySQL 5.7 Galera集群 说明1、源码编译 Galera1.1、安装依赖1.2、源码编译安装 openSSL1.2.1、下载源码1.2.2、编译安装 1.3、源码编译安装 Galera 31.3.1、下载源码1.3.2、注意1.3.3、编译安装 2、源码编译 MySQL-Wsrep2.1、安装依赖…...
【SLAM】ubuntu 18.04 下 OpenCV 3.2.0 的 opencv_example 运行闪退
本文首发于❄慕雪的寒舍 ubuntu 18.04 下 OpenCV 3.2.0 的 opencv_example 运行闪退问题探究。 1. 问题说明 在之前的ORB-SLAM3项目于ROS运行的博客中,提到过安装ROS时会自己安装一个OpenCV 3.2.0版本,所以最好不要安装其他版本的OpenCV,避…...
Linux网络编程——数据链路层详解,以太网、MAC地址、MTU、ARP、DNS、NAT、代理服务器......
目录 一、前言 二、以太网 二、以太网帧格式 三、 MAC地址 四、MTU 1、数据链路层的数据分片 2、MTU对UDP协议的影响 3、MTU对TCP协议的影响 五、ARP协议 1、什么是ARP 2、ARP的作用 3、ARP协议的工作流程 4、ARP缓存表 5、ARP请求报文 6、中间人 六、DNS&…...
Android7 Input(四)InputReader
概述 本文主要描述了Android Input框架中的InputReader的功能,InputReader模块的功能,总结成一句话就是InputReader获取输入设备的事件并将事件进行加工处理,然后传递给QueuedInputListener,最终QueuedInputListener将事件传递给…...
游戏报错?MFC140.dll怎么安装才能解决问题?提供多种MFC140.dll丢失修复方案
MFC140.dll 是 Microsoft Visual C 2015 运行库的重要组成部分,许多软件和游戏依赖它才能正常运行。如果你的电脑提示 "MFC140.dll 丢失" 或 "MFC140.dll 未找到",说明系统缺少该文件,导致程序无法启动。本文将详细介绍 …...
寻找最大美丽数
# 输入:nums1 [4,2,1,5,3], nums2 [10,20,30,40,50], k 2 # 输出:[80,30,0,80,50] import random class Solution:def findMaxSum(self, nums1, nums2, k):hash_table []sum1 0data []print(**31,\n,\t数据)for key,values in enumerate(nums1):da…...
[Linux]进程地址空间
前言 我们在学习C语言期间,经常可以提及到这些区域,有一个问题:这里的地址空间是内存吗?答案是这里的地址空间并不是内存。这里的地址空间是进程地址空间,下面我们就讲解进程地址空间。 这段空间中自下而上ÿ…...
dfs和bfs算法
DFS(深度优先搜索,Depth-First Search)和 BFS(广度优先搜索,Breadth-First Search)是图遍历或搜索算法中的两种基本方法。它们在探索图的节点时采用不同的策略,适用于不同的场景。 ### 深度优先…...
跨站请求是什么?
介绍 跨站请求(Cross-Site Request)通常是指浏览器在访问一个网站时,向另一个域名的网站发送请求的行为。这个概念在 Web 安全中非常重要,尤其是在涉及到“跨站请求伪造(CSRF)”和“跨域资源共享ÿ…...
【深度学习与大模型基础】第9章-条件概率以及条件概率的链式法则
简单理解条件概率 条件概率就是在已知某件事发生的情况下,另一件事发生的概率。用数学符号表示就是: P(A|B) 在B发生的前提下,A发生的概率。 计算机例子:垃圾邮件过滤 假设你写了一个程序来自动判断邮件是否是垃圾邮件…...
C++: 获取auto的实际类型
auto a "hello";auto* b "hello";auto& c "hello";上述 a, b, c 类型分别是什么? 在不使用 IDE 提供的 inlay hints 情况下, 可以编译期获取,然后运行时打印出来: 方法: 用 decltype(var)…...
谷歌开源代理开发工具包(Agent Development Kit,ADK):让多智能体应用的构建变得更简
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
揭开人工智能与机器学习的神秘面纱:开发者的视角
李升伟 编译 人工智能(AI)和机器学习(ML)早已不再是空洞的流行语——它们正在彻底改变我们构建软件、做出决策以及与技术互动的方式。无论是自动化重复性任务,还是驱动自动驾驶汽车,AI/ML都是现代创新的核…...
35.Java线程池(线程池概述、线程池的架构、线程池的种类与创建、线程池的底层原理、线程池的工作流程、线程池的拒绝策略、自定义线程池)
一、线程池概述 1、线程池的优势 线程池是一种线程使用模式,线程过多会带来调度开销,进而影响缓存局部性和整体性能,而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务,这避免了在处理短时间任务时创建与…...
【NumPy科学计算:高性能数组操作核心指南】
目录 前言:技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解关键技术模块技术选型对比 二、实战演示环境配置要求核心代码实现运行结果验证 三、性能对比测试方法论量化数据对比结果分析 四、最佳实践推荐方案 ✅常见错误 ❌调试技…...
软考 系统架构设计师系列知识点之杂项集萃(50)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(49) 第78题 著作权中,()的保护期不受限制。 A. 发表权 B. 发行权 C. 署名权 D. 展览权 正确答案:C。 所属知识点:旧版…...
实现定长的内存池
池化技术 所谓的池化技术,就是程序预先向系统申请过量的资源,然后自己管理起来,以备不时之需。这个操作的价值就是,如果申请与释放资源的开销较大,提前申请资源并在使用后并不释放而是重复利用,能够提高程序…...
定制一款国密浏览器(7):铜锁和BoringSSL
上一章简单介绍了一下国密算法,本章开始进入实战,进行国密算法的移植。算法的移植以铜锁为蓝本,移植到 BoringSSL 中。 BoringSSL 也是由 OpenSSL fork 而来,那能否修改 Chromium 的源码,使用铜锁库呢?这种方式我也考虑并尝试过,最后发现两者的接口差别太大,Chromium …...
Docker 安装CRMEB陀螺匠教程
首先下载代码到服务器中,打开终端,并切换到项目源码根目录: 通过 Docker compose 启动项目 第一次启动时需要拉取和打包相关镜像,所需时长视网络情况而定,需耐心等待。 配置反向代理 参考 Nginx 配置 Nginx 反向代…...
Java中的static都能用来修饰什么?
在Java编程语言中,static关键字是非常重要的修饰符,可以用于多种不同的地方。可用来修饰变量、方法、代码块以及类。 1.静态变量 定义:静态变量属于类本身,而不是类的任何特定实例(new出来的对象)。 特点&a…...
词法分析器设计实验
掌握生成词法分析器的方法,加深对词法分析原理的理解。掌握设计、编制并调试词法分析程序的思想和方法。本实验是高级语言程序设计、数据结构和编译原理中词法分析原理等知识的综合。 【实验内容及要求】完善以下代码(红色标注处)并加上注释(蓝色标注处) int Getsym…...
matlab求和∑函数方程编程?
matlab求和∑函数方程编程? 一 题目:求下列函数方程式的和 二:代码如下: >> sum_result 0; % 初始化求和变量 for x 1:10 % 设…...
Vue3.5 企业级管理系统实战(十四):动态主题切换
动态主题切换是针对用户体验的常见的功能之一,我们可以自己实现如暗黑模式、明亮模式的切换,也可以利用 Element Plus 默认支持的强大动态主题方案实现。这里我们探讨的是后者通过 CSS 变量设置的方案。 1 组件准备 1.1 修改 Navbar 组件 在 src/layo…...
Python中for循环及其相关函数range(), zip(), enumerate()等
一、Python中的for循环及其相关函数 Python的for循环是算法竞赛中最常用的迭代工具之一,因其简洁和灵活性非常适合快速实现逻辑。以下详细讲解for循环及相关函数在竞赛中的使用场景。 1. for循环基本语法 Python的for循环用于遍历可迭代对象(如列表、…...
数据结构与算法——链表OJ题详解(2)
文章目录 一、前言二、OJ续享2.1相交链表2.2环形链表12.2环形链表2 三、总结 一、前言 哦了兄弟们,咱们上次在详解链表OJ题的时候,有一部分OJ题呢up并没有整理完,这一个星期呢,up也是在不断的学习并且沉淀着,也是终于…...
免费送源码:Java+ssm+MySQL 基于PHP在线考试系统的设计与实现 计算机毕业设计原创定制
摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对在线考试等问题,对如何通过计算…...
Android之JNI详解
Android之JNI详解 简介创建项目注册动态注册静态注册 关键词解读基础数据类型引用java对象JNI引用与释放cmake配置文件 简介 JNI(Java Native Interface) 是 Java 提供的一种编程框架,用于在 Java 应用程序中调用和与用其他编程语言…...
React Hooks: useRef,useCallback,useMemo用法详解
1. useRef(保存引用值) useRef 通常用于保存“不会参与 UI 渲染,但生命周期要长”的对象引用,比如获取 DOM、保存定时器 ID、WebSocket等。 新建useRef.js组件,写入代码: import React, { useRef, useSt…...
Java基础知识
概念 请介绍全局变量和局部变量的区别 Java中的变量分为成员变量和局部变量,它们的区别如下: 成员变量: 1. 成员变量是在类的范围里定义的变量; 2. 成员变量有默认初始值; 3. 未被static修饰的成员变量也叫…...
体验智能体构建过程:从零开始构建Agent
1. 什么是智能体? 智能体(Agents)是一种能够感知环境、做出决策并采取行动来实现特定目标的自主实体。智能体的复杂程度各不相同,从简单的响应式智能体(对刺激直接做出反应)到更高级的智能体(能…...
如何从项目目标到成功标准:构建可量化、可落地的项目评估体系
引言 在项目管理领域,"项目成功"的定义往往比表面看起来更复杂。根据PMI的行业报告,67%的项目失败源于目标与成功标准的不匹配。当项目团队仅关注"按时交付"或"预算达标"时,常会忽视真正的价值创造。本文将通…...
大模型论文:Language Models are Few-Shot Learners(GPT3)
大模型论文:Language Models are Few-Shot Learners(GPT3) 文章地址:https://proceedings.neurips.cc/paper_files/paper/2020/file/1457c0d6bfcb4967418bfb8ac142f64a-Paper.pdf 一、摘要 我们证明了,扩大语言模型的规模在任务无关的 few…...
驱动学习专栏--字符设备驱动篇--1_chrdevbase
字符设备驱动简介 字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节 流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、 IIC 、 SPI , LCD 等等都是字符设备&…...
muduo库源码分析: TcpConnection
一. 主要成员: socket_:用于保存已连接套接字文件描述符。channel_:封装了上面的socket_及其各类事件的处理函数(读、写、错误、关闭等事件处理函数)。这个Channel中保存的各类事件的处理函数是在TcpConnection对象构造函数中注册…...
【SLAM】ubuntu 18.04 编译安装 OpenCV 3.2.0 时出现哈希错误
本文首发于❄慕雪的寒舍 1. 前言 1.1. 问题说明 在amd64的ubuntu 18.04 desktop上编译安装 OpenCV 3.2.0 的时候,我遇到了cmake构建错误。错误的核心报错如下 for file: [/home/king/slam/pkg/opencv-3.2.0/3rdparty/ippicv/downloads/linux-808b791a6eac9ed78d32…...
挂马漏洞 asp连接冰蝎webshell (附webshell源码 仅限学习研究)
目录 ASP WebShell代码 代码说明: 部署步骤: 使用冰蝎客户端连接: 注意事项: ASP WebShell代码 <% 冰蝎连接密码(需与冰蝎客户端配置一致) Dim key key "mysecretkey123" 自定义密码…...
Grafana将弃用AngularJS-我们该如何迁移
AngularJS 弃用时间线 AngularJS 支持已在 Grafana 9 中正式弃用。在 2024 年 5 月发布的 Grafana 11 中,所有 Grafana Cloud 和自托管安装默认关闭该功能。到 Grafana 12 版本时,将完全移除对 AngularJS 的支持,包括配置参数开关 angular_s…...
基于单片机的病房呼叫系统设计
2.1 总体方案设计 本课题为基于单片机的病房呼叫系统设计,在此将整个系统架构设计如图2.1所示,在此采用八个按键模拟8个不同的病房号,再通过8个LED指示灯对病房号的状态进行指示,当用户按键按键时,相应的LED灯会点亮…...
简述一下Unity的UnityWebRequest
UnityWebRequest是Unity引擎中用于处理网络请求的强大工具,尤其适用于与Web服务器进行交互,比如获取数据、上传文件或下载资源等。相较于旧版的WWW类,UnityWebRequest提供了更灵活、更高效的API,支持多种HTTP方法,并能…...
文件操作和IO - 2
目录 Java 中操作文件 File 概述 属性 构造方法 方法 getParent getName getPath getAbsolutePath getCanonicalPath exists isFile isDirectory createNewFile delete deleteOnExit list listFiles mkdir mkdirs 完! Java 中操作文件 Java 对于文件操…...
⑪数据中心网络M-LAG实战
一、DeviceA-M-LAG-Mater配置 1、M-LAG 系统配置。 # m-lag mad exclude interface GigabitEthernet1/0/7 m-lag mad exclude interface Vlan-interface100 m-lag mad exclude interface Vlan-interface101 m-lag system-mac 0002-0002-0002 m-lag system-number 1 m-la…...
Win10系统安装WSL2-Ubuntu, 并使用VScode开始工作
本教程基于博主当前需要使用 WSL2(Windows Subsystem for Linux 2) 而编写,将自己使用的经过分享给大家。有什么意见建议敬请大家批评指正。此过程需要打开 Microsoft Store 话不多说,立即开始~ 文章目录 1. 检查系统版本2. 启动 WSL 功能3. 安装Ubuntu4…...
Node.js种cluster模块详解
Node.js 中 cluster 模块全部 API 详解 1. 模块属性 const cluster require(cluster);// 1. isMaster // 判断当前进程是否为主进程 console.log(是否为主进程:, cluster.isMaster);// 2. isWorker // 判断当前进程是否为工作进程 console.log(是否为工作进程:, cluster.isW…...
Window 10使用WSL2搭建Linux版Android Studio应用开发环境
一、背景 公司基于高通SA8155、SA8295等车载芯片进行座舱系统开发,使用repo统一管理系统及应用源码仓库。 Android应用端使用Ubuntu环境Android Studio进行开发,使用repo进行平台性管理,包含所有应用仓库。由于gradle配置使用了linux下文件软链接,无法直接使用Window环境…...
PostgreSQL 的统计信息
PostgreSQL 的统计信息 PostgreSQL 的统计信息是查询优化和性能调优的基础,系统通过多种统计信息来评估数据分布和访问模式,从而生成高效的执行计划。 一 统计信息类型与用途 1.1 核心统计类别 统计类型存储位置主要用途更新机制表和索引扫描统计pg_…...
【Linux】Linux基础指令
Linux系统初步介绍 Linux是一种自由和开放源代码的类UNIX操作系统,该操作系统的内核由林纳斯托瓦兹在1991年首次发布,之后,在加上用户空间的应用程序之后,就成为了Linux操作系统。 严格来讲,Linux 只是操作系统内核本身,但通常采用“Linux内核”来表达该意思&#…...
【SLAM】在ORB_SLAM2的ROS模式下使用RealSense D435相机
本文介绍了如何在ORB_SLAM2项目中使用RealSense D435相机作为RGB-D输入源,包括ROS下启动D435相机、ORB_SLAM2订阅Topic、ORB_SLAM2读取realsense-viewer录制的rosbag文件等步骤。。 本文首发于❄慕雪的寒舍 1. 前言 先前已经编写了如何用TUM数据集运行ORB_SLAM3以及…...
scapy使用
https://scapy.readthedocs.io/en/latest/introduction.html 在 Mac 上使用 Scapy 抓取特定 IP 的流量并保存到 a.pcap 的步骤如下: 步骤 1:安装 Scapy 在终端中执行以下命令安装: pip install scapy步骤 2:创建 Python 脚本 …...
C2000 系统控制(4) — CPU Memory
CPU 内存 内存控制器 在 C2000 实时微控制器上,RAM 具有不同的特性。这些特性包括: CPU 专用:M0、M1 RAMCPU 和 CLA 共享:LSx RAMCPU、DMA 和 HIC 共享:GSx RAM用于在处理器之间发送和接收消息:MSG RAM …...
Linux网络编程——详解网络层IP协议、网段划分、路由
目录 一、前言 二、IP协议的认识 1、什么是IP协议? 2、IP协议报头 三、网段划分 1、初步认识IP与路由 2、IP地址 I、DHCP动态主机配置协议 3、IP地址的划分 I、CIDR设计 II、子网数目的计算 III、子网掩码的确定 四、特殊的IP地址 五、IP地址的数量限…...