- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章MySQL之高可用集群部署及故障切换实现由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
。
1、概念 。
2、mha 的组成 。
3、mha 的特点 。
。
思路和准备工作 。
1、mha架构 数据库安装 一主两从 mha搭建 。
2、故障模拟 模拟主库失效 备选主库成为主库 原故障主库恢复重新加入到mha成为从库 。
3、准备4台安装mysql虚拟机 mha高可用集群相关软件包 mhamanager ip:192.168.221.30 mysql1 ip:192.168.221.20 mysql2 ip:192.168.221.100 mysql3 ip: 192.168.221.110 。
1、关闭防火墙,检测端口是否开启 。
1
2
3
4
|
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
netstat -natp | grep 3306
|
2、修改mysql节点的主机名 。
mysql1(192.168.221.20) 。
1
2
3
4
5
6
|
hostnamectl
set
-hostname mysql1
su -
hostnamectl
set
-hostname mysql2
su -
hostnamectl
set
-hostname mysql3
su -
|
3、修改三台mysql服务器的主配置文件/etc/my.cnf,并创建命令软链接 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
mysql1
vim /etc/my.cnf
[mysqld]
server-id = 1
log_bin = master-bin
log-slave-updates =
true
systemctl restart mysqld
ln -s /usr/
local
/mysql/bin/mysql /usr/sbin/
ln -s /usr/
local
/mysql/bin/mysqlbinlog /usr/sbin/
mysql2
vim /etc/my.cnf
server-id = 2
#server-id = 3 mysql3则为3,三台服务器 server-id 不能一样
log_bin = master-bin
relay-log = relay-log-bin
relay-log-
index
= slave-relay-bin.
index
systemctl restart mysqld
ln -s /usr/
local
/mysql/bin/mysql /usr/sbin/
ln -s /usr/
local
/mysql/bin/mysqlbinlog /usr/sbin/
|
4、配置mysql一主两从 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
(1)所有mysql服务器进行mysql授权
mysql1(192.168.221.20)
mysql2(192.168.221.100)
mysql3(192.168.221.110)
3台都要配置
mysql -uroot -p123
grant
replication slave
on
*.*
to
'myslave'
@
'192.168.221.%'
identified
by
'123'
;
grant
all
privileges
on
*.*
to
'mha'
@
'192.168.221.%'
identified
by
'manager'
;
grant
all
privileges
on
*.*
to
'mha'
@
'mysql1'
identified
by
'manager'
;
grant
all
privileges
on
*.*
to
'mha'
@
'mysql2'
identified
by
'manager'
;
grant
all
privileges
on
*.*
to
'mha'
@
'mysql3'
identified
by
'manager'
;
flush
privileges
;
show master status;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
(2)在 slave1、slave2 节点执行同步操作
change master
to
master_host=
'192.168.221.20'
,master_user=
'myslave'
,master_password=
'123'
,master_log_file=
'master-bin.000005'
,master_log_pos=1991;
start slave;
show slave status\g
slave_io_running: yes
slave_sql_running: yes
#一般 slave_io_running:
no
的可能性:
#网络不通
#my.cnf配置有问题
#密码、file文件名、pos偏移量不对
#防火墙没有关闭
|
1
2
3
4
5
6
|
(3)slave1、slave2 节点设置为只读模式
mysql2(192.168.221.100)
mysql3(192.168.221.110)
set
global
read_only=1;
#改回读写状态
set
global
read_only=0;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
(4)主从复制验证
mysql1(192.168.221.20)
创建库
create
database
srs;
use test;
create
table
test(id
int
);
insert
into
test
values
(1);
mysql2(192.168.221.100)
mysql3(192.168.221.110)
查询库验证
show databases;
|
5、安装 mha 软件 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
(1)所有服务器上都安装 mha 依赖的环境
mhamanager(192.168.221.30)
mysql1(192.168.221.20)
mysql2(192.168.221.100)
mysql3(192.168.221.110)
首先安装 epel 源,需要在线源安装
再在所有服务器上安装 node 组件
#安装在线源
mv /etc/yum.repos.d/repos.bak/centos-* /etc/yum.repos.d/
yum list
yum install epel-release
--nogpgcheck -y
yum install -y perl-dbd-mysql \
perl-config-tiny \
perl-log-dispatch \
perl-parallel-forkmanager \
perl-extutils-cbuilder \
perl-extutils-makemaker \
perl-cpan
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
(2)所有服务器安装mha node软件包
mhamanager(192.168.221.30)
mysql1(192.168.221.20)
mysql2(192.168.221.100)
mysql3(192.168.221.110)
对于每个操作系统版本不一样,这里 centos7.4 必须选择 0.57 版本。
在所有服务器上必须先安装 node 组件,最后在 mha-manager 节点上安装 manager 组件,因为 manager 依赖 node 组件。
#将软件包mha4mysql-node-0.57.tar.gz放入/opt目录下
cd /opt
tar zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl makefile.pl
make && make install
在 mha manager 节点上安装 manager 组件
将软件包mha4mysql-manager-0.57.tar.gz放入/opt目录下
cd /opt
tar zxvf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57
perl makefile.pl
make && make install
#node组件安装后也会在/usr/
local
/bin 下面会生成几个脚本(这些工具通常由 mhamanager 的脚本触发,无需人为操作)
#manager 组件安装后在/usr/
local
/bin 下面会生成几个工具
|
6、在所有服务器上配置无密码认证 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
(1)在 manager 节点上配置到所有数据库节点的无密码认证
mhamanager(192.168.221.30)
ssh-keygen -t rsa #一路按回车键
ssh-copy-id 192.168.221.20
ssh-copy-id 192.168.221.100
ssh-copy-id 192.168.221.110
(2)在 mysql1 上配置到数据库节点 mysql2 和 mysql3 的无密码认证 ssh-keygen -t rsa
mysql1(192.168.221.20)
ssh-keygen -t rsa
ssh-copy-id 192.168.221.100
ssh-copy-id 192.168.221.110
(3)在 mysql2 上配置到数据库节点 mysql1 和 mysql3 的无密码认证
mysql2(192.168.221.100)
ssh-keygen -t rsa
ssh-copy-id 192.168.221.20
ssh-copy-id 192.168.221.110
(4)在 mysql3 上配置到数据库节点 mysql1 和 mysql2 的无密码认证
mysql3(192.168.221.110)
ssh-keygen -t rsa
ssh-copy-id 192.168.221.20
ssh-copy-id 192.168.221.100
篇幅太长不予演示
|
7、在 manager 节点上配置 mha 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
mhamanager(192.168.221.30)
(1)在 manager 节点上复制相关脚本到/usr/
local
/bin 目录
cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/
local
/bin
#复制后会有四个执行文件
ll /usr/
local
/bin/scripts/
(2)复制上述的自动切换时 vip 管理的脚本到 /usr/
local
/bin 目录,这里使用master_ip_failover脚本来管理 vip 和故障切换
cp /usr/
local
/bin/scripts/master_ip_failover /usr/
local
/bin
#先清空原有内容
echo
''
> /usr/
local
/bin/master_ip_failover
#直接复制并修改vip相关参数
vim /usr/
local
/bin/master_ip_failover
#!/usr/bin/env perl
use strict;
use warnings fatal =>
'all'
;
use getopt::long;
my (
$command, $ssh_user, $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip, $new_master_port
);
#############################添加内容部分#########################################
my $vip =
'192.168.221.200'
; #指定vip的地址
my $brdc =
'192.168.221.255'
; #指定vip的广播地址
my $ifdev =
'ens33'
; #指定vip绑定的网卡
my $
key
=
'1'
; #指定vip绑定的虚拟网卡序列号
my $ssh_start_vip =
"/sbin/ifconfig ens33:$key $vip"
; #代表此变量值为ifconfig ens33:1 192.168.221.200
my $ssh_stop_vip =
"/sbin/ifconfig ens33:$key down"
; #代表此变量值为ifconfig ens33:1 down
my $exit_code = 0; #指定退出状态码为0
#my $ssh_start_vip =
"/usr/sbin/ip addr add $vip/24 brd $brdc dev $ifdev label $ifdev:$key;/usr/sbin/arping -q -a -c 1 -i $ifdev $vip;iptables -f;"
;
#my $ssh_stop_vip =
"/usr/sbin/ip addr del $vip/24 dev $ifdev label $ifdev:$key"
;
##################################################################################
getoptions(
'command=s'
=> \$command,
'ssh_user=s'
=> \$ssh_user,
'orig_master_host=s'
=> \$orig_master_host,
'orig_master_ip=s'
=> \$orig_master_ip,
'orig_master_port=i'
=> \$orig_master_port,
'new_master_host=s'
=> \$new_master_host,
'new_master_ip=s'
=> \$new_master_ip,
'new_master_port=i'
=> \$new_master_port,
);
exit &main();
sub main {
print
"\n\nin script test====$ssh_stop_vip==$ssh_start_vip===\n\n"
;
if ( $command eq
"stop"
|| $command eq
"stopssh"
) {
my $exit_code = 1;
eval {
print
"disabling the vip on old master: $orig_master_host \n"
;
&stop_vip();
$exit_code = 0;
};
if ($@) {
warn
"got error: $@\n"
;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq
"start"
) {
my $exit_code = 10;
eval {
print
"enabling the vip - $vip on the new master - $new_master_host \n"
;
&start_vip();
$exit_code = 0;
};
if ($@) {
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq
"status"
) {
print
"checking the status of the script.. ok \n"
;
exit 0;
}
else
{
&usage();
exit 1;
}
}
sub start_vip() {
`ssh $ssh_user\@$new_master_host \
" $ssh_start_vip \"`;
}
## a simple system call that disable the vip on the old_master
sub stop_vip() {
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
sub usage {
print
"
usage: master_ip_failover
--command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
mkdir /etc/masterha
cp /opt/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha
echo
''
> /etc/masterha/app1.cnf
vim /etc/masterha/app1.cnf
[server
default
]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/usr/
local
/mysql/data
master_ip_failover_script=/usr/
local
/bin/master_ip_failover
master_ip_online_change_script=/usr/
local
/bin/master_ip_online_change
user
=mha
password
=manager
ping_interval=1
remote_workdir=/tmp
repl_user=myslave
repl_password=123
secondary_check_script=/usr/
local
/bin/masterha_secondary_check -s 192.168.221.100 -s 192.168.221.110
shutdown_script=
""
ssh_user=root
[server1]
hostname=192.168.221.20
port=3306
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.221.100
port=3306
[server3]
hostname=192.168.221.110
port=3306
#
--------------------------配置文件解释--------------------------------------------------------------------------
[server
default
]
manager_log=/var/log/masterha/app1/manager.log #manager日志
manager_workdir=/var/log/masterha/app1.log #manager工作目录
master_binlog_dir=/usr/
local
/mysql/data/ #master保存binlog的位置,这里的路径要与master里配置的binlog的路径一致,以便mha能找到
master_ip_failover_script=/usr/
local
/bin/master_ip_failover #设置自动failover时候的切换脚本,也就是上面的那个脚本
master_ip_online_change_script=/usr/
local
/bin/master_ip_online_change #设置手动切换时候的切换脚本
user
=mha #设置监控用户root
password
=manager #设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码
ping_interval=1 #设置监控主库,发送ping包的时间间隔1秒,默认是3秒,尝试三次没有回应的时候自动进行failover
remote_workdir=/tmp #设置远端mysql在发生切换时binlog的保存位置
repl_user=myslave #设置复制用户的用户
repl_password=123 #设置复制用户的密码
report_script=/usr/
local
/send_report #设置发生切换后发送的报警的脚本
secondary_check_script=/usr/
local
/bin/masterha_secondary_check -s 192.168.221.100 -s 192.168.221.110 #指定检查的从服务器ip地址
shutdown_script=
""
#设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机防止发生脑裂,这里没有使用)
ssh_user=root #设置ssh的登录用户名
[server1]
hostname=192.168.221.20
port=3306
[server2]
hostname=192.168.221.100
port=3306
candidate_master=1
#设置为候选master,设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中最新的slave
check_repl_delay=0
#默认情况下如果一个slave落后master 超过100m的relay logs的话,mha将不会选择该slave作为一个新的master, 因为对于这个slave的恢复需要花费很长时间;通过设置check_repl_delay=0,mha触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
[server3]
hostname=192.168.221.110
port=3306
|
8、第一次配置需要在 master 节点上手动开启虚拟ip 。
1
2
3
|
master(192.168.221.20)
/sbin/ifconfig ens33:1 192.168.221.200/24
|
9、在 manager 节点上测试 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
(1)在 manager 节点上测试 ssh 无密码认证
mhamanager(192.168.221.30)
masterha_check_ssh -conf=/etc/masterha/app1.cnf
#如果正常最后会输出 successfully;
#如果失败可以去配置服务器无密码认证的地方看看有没有问题
(2)在 manager 节点上测试 mysql 主从连接情况
mhamanager(192.168.221.30)
masterha_check_repl -conf=/etc/masterha/app1.cnf
#最后出现 mysql replication health
is
ok 字样说明正常;
#出现mysql replication health
is
not
ok!的,可以去看一下mysql服务器上的软链接是否少创建
-->本文位置:2、修改三台mysql服务器的主配置文件/etc/my.cnf,并创建命令软链接
(3)在 manager 节点上启动 mha
mhamanager(192.168.221.30)
nohup masterha_manager
--conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
#
------------------------组件解释----------------------------------------------------------------------------------
--remove_dead_master_conf:该参数代表当发生主从切换后,老的主库的 ip 将会从配置文件中移除。
--manger_log:日志存放位置。
--ignore_last_failover:在缺省情况下,如果 mha 检测到连续发生宕机,且两次宕机间隔不足 8 小时的话,则不会进行 failover, 之所以这样限制是为了避免 ping-pong 效应。该参数代表忽略上次 mha 触发切换产生的文件,默认情况下,mha 发生切换后会在日志记目录,也就是上面设置的日志app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failover。
|
10、查看相关状态 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
mhamanager(192.168.221.30)
查看 mha 状态,可以看到当前的 master 是 mysql1 节点。
masterha_check_status
--conf=/etc/masterha/app1.cnf
查看 mha 日志,也以看到当前的 master 是 192.168.221.20
cat /var/log/masterha/app1/manager.log | grep
"current master"
查看 mysql1 的 vip 地址,查看 mysql1 的 vip 地址 192.168.163.200 是否存在,这个 vip 地址不会因为 manager 节点停止 mha 服务而消失。
ifconfig
补充:若要关闭 manager 服务,可以使用如下命令。
masterha_stop
--conf=/etc/masterha/app1.cnf
或者可以直接采用 kill 进程 id 的方式关闭。
|
。
1、故障模拟 。
1
2
3
4
|
(1)在 manager 节点上监控观察日志记录
mhamanager(192.168.221.30)
tail -f /var/log/masterha/app1/manager.log
|
1
2
3
4
5
6
7
|
(2)在 master 节点 mysql1 上停止mysql服务
mysql1(192.168.221.20)
systemctl stop mysqld
或
pkill -9 mysql
正常自动切换一次后,mha 进程会退出。hma 会自动修改 app1.cnf 文件内容,将宕机的 mysql1 节点删除。
|
1
2
3
4
|
(3)查看 mysql2 是否接管 vip
mysql2(192.168.221.100)
ifconfig
|
1
2
3
4
5
6
7
8
9
10
|
(4)回到manager 节点上监控观察日志记录
tail -f /var/log/masterha/app1/manager.log
故障切换备选主库的算法:
1、一般判断从库的是从(position/gtid)判断优劣,数据有差异,最接近于master的slave,成为备选主。
2、数据一致的情况下,按照配置文件顺序,选择备选主库。
3、设定有权重(candidate_master=1),按照权重强制指定备选主。
(1)默认情况下如果一个slave落后master 100m的relay logs的话,即使有权重,也会失效。
(2)如果check_repl_delay=0的话,即使落后很多日志,也强制选择其为备选主。
|
2、故障修复 。
1
2
3
4
5
|
mysql1(192.168.221.20)
(1)修复master
systemctl restart mysqld
netstat -natp | grep 3306
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
mysql2(192.168.221.100)
(2)修复主从
在现主库服务器 mysql2查看二进制文件和同步点
mysql -uroot -p123 -e
'show master status;'
#在数据库中执行show master status;
在原主库服务器 mysql1 执行同步操作
mysql1(192.168.221.20)
change master
to
master_host=
'192.168.221.100'
,master_user=
'myslave'
,master_password=
'123'
,master_log_file=
'master-bin.000001'
,master_log_pos=1747;
start slave;
show slave status\g
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
(3)在 manager 节点上修改配置文件app1.cnf
mhamanager(192.168.221.30)
再把这个记录添加进去,因为它检测掉失效时候会自动消失
vim /etc/masterha/app1.cnf
……
secondary_check_script=/usr/
local
/bin/masterha_secondary_check -s 192.168.221.20 -s 192.168.221.110
......
[server1]
hostname=192.168.221.100
port=3306
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.221.20
port=3306
[server3]
hostname=192.168.221.110
port=3306
|
1
2
3
4
5
6
7
8
|
(4)在 manager 节点上启动 mha
mhamanager(192.168.221.30)
masterha_stop
--conf=/etc/masterha/app1.cnf
nohup masterha_manager
--conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
masterha_check_status
--conf=/etc/masterha/app1.cnf
|
到此这篇关于mysql之高可用集群部署及故障切换实现的文章就介绍到这了,更多相关mysql 高可用集群部署内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/s15212790607/article/details/115862925 。
最后此篇关于MySQL之高可用集群部署及故障切换实现的文章就讲到这里了,如果你想了解更多关于MySQL之高可用集群部署及故障切换实现的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
如何检测当前网络中计算机是否已连接/可用。 当然,它有多种用途,但我主要关心的是我的应用程序使用位于特定计算机中的资源,如果这些资源不可用,它甚至不会尝试连接,而是使用本地资源。 最佳答案 您可以尝试
雅虎建议load scripts at the bottom of an HTML pages出于性能原因。我使用遵守规则的 HTML5 Boilerplate。 这种方法的问题是 jQuery 也是
我有一个场景,我需要只向管理员而不是普通用户展示一个组件。 说, // This component should be rendered for public users.
我有一个数组,比方说 ["a","b","c"],我想把它变成一个对象,它以数组值作为键和一个默认值我可以设置。因此,如果默认值为 true,我希望我的输出为 {a:true, b:true, c:t
我假设在函数中创建一个新的 PS-Drive 会使该驱动器只能在该函数中访问。 如何通过从该函数可访问的 MAIN 调用函数来创建 PS 驱动器? $temproraryPSDriveName =
您会推荐哪些 .net 控制库作为企业必备的? 可以免费/非免费 至少应该包含一个真正强大的Datagrid Ajax 功能 有没有可用的比较? 最佳答案 我用过 Telerik ASP.NET控制之
假设我有一些像这样的 html: Hello World Javascript代码: var fooBar = document.getElementById('fooBar'); fooBar.
开始实现 camera plugin 时出现以下错误在我的 flutter 应用程序上: [VERBOSE-2:dart_error.cc(16)] Unhandled exception:
我想知道应该在哪里正确放置 countA,因为我希望将计数添加到所做的每个按钮中。开头的“count”变量用于制作新按钮,“countA”是我试图声明的计数,但它无法编译。这是我的代码片段:我的问题再
在python帮助文档中我经常看到带有函数名和命名参数的签名行,然后你会看到**kwarg(关键字参数)。 list? 打印到帮助文档字符串: Init signature: list(self, /
我是 UWP 的新手,想知道“Flyout”、“ContextFlyout”和“Popup”之间的区别。另外,我想知道“AppBar”和“CommandBar”之间的区别。我相信这些是容纳菜单或菜单项
我想显示可用的 Wifi 设备列表。这是我的代码,我不明白这里有什么错误: wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); i
这是我的代码: Random = function(name) { this.name = name; this.addSomething = function(a, b) {
我希望我的按钮持续动画直到用户触摸它,这是代码 func animate() { UIView.animateWithDuration(1, animations: { () -> Void
我正在为我正在参加的类(class)制作一个 HTTP 服务器作为项目,一周来我一直在尝试寻找解决方案。我有一个 DataInputStream,我需要等待客户端向我发送 http 请求,由于连接保持
我想创建一个 bash 脚本来检查我的 Linux 服务器中的哪些端口已关闭且未在特定范围(端口范围 (3000-3010))中使用。 打印输出只需1个端口,如果将输出保存为变量或保存在同一个文件中,
我写了一个我认为是最小的自定义设备来测试我对 QOM 和 QEMU 的总体理解。以下是省略注释的相关代码。不幸的是,当我启动 guest 并将我的设备名称作为命令行参数传递时,它无法找到我的设备并退出
调用Opencv函数时,通常会提供一个常量给函数调用,如: im_hsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV) 虽然我找不到对所有可用常量的引用。 Opencv
C++ 于 1998 年正式标准化,但我们能在多久以前找到一个名为 string 的类,它看起来像 C++2003 中的 std::string预标准 C++ 实现? 我问是因为 CString 作为
是否有一个官方的(或可能没有)git 命令列表,--porcelain 选项可用?或者我应该在 the porcelain commands list 中手动查看它们中的每一个吗? ? 我已经设法用谷
我是一名优秀的程序员,十分优秀!