MySQL-MHA高可用

一、MHA概述:


 MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。
 MHA 的出现就是解决MySQL 单点的问题。
 MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。
 MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用。

二 、MHA 的组成:


●MHA Node(数据节点):
 MHA Node 运行在每台 MySQL 服务器上。

●MHA Manager(管理节点):
 MHA Manager 可以单独部署在一台独立的机器上,管理多个 master-slave 集群;也可以部署在一台 slave 节点上。
 MHA Manager 会定时探测集群中的 master 节点。当 master 出现故障时,它可以自动将最新数据的 slave 提升为新的 master, 然后将所有其他的 slave 重新指向新的 master。整个故障转移过程对应用程序完全透明。

三、MHA 的特点:


 ●自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
 ●使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性
 ●目前MHA支持一主多从架构,最少三台服务,即一主两从 

四、主从复制的方法:


1.异步:


  在主从架构中加入当客户端发送了一条update语句,主服务器上I/O 线程将二进制日志写入到binlog文件之后就返回客户端结构,不管从服务器是否已经同步到了自己的relay-log(中继日志中)。

优点:性能是最好的。
缺点:主服务器宕机,容易造成数据不一致,mysql中默认的就是异步复制。

2.同步:


  也称全同步,当主服务器完成更新,并且同步到所有从服务器才会返回成功结果。

优点:安全
缺点:效率低,影响性能。

3.半同步:


  将两个方法折中,当主服务器完成更新,至少有一个从服务器接收到并完成更新,主服务器就返回成功。

五、MHA高可用搭建:

 1.搭建准备  :     
MHA manager 节点:CentOS7.4(64 位) manager/192.168.88.104 ,安装MHA node 和 manager 组件
Master 节点:CentOS7.4(64 位) mysql1/192.168.88.100 ,安装mysql5.7、MHA node 组件
Slave1 节点:CentOS7.4(64 位) mysql2/192.168.88.102 ,安装mysql5.7、MHA node 组件
Slave2 节点:CentOS7.4(64 位) mysql3/192.168.88.103 ,安装mysql5.7、MHA node 组件


1.关闭防火墙:
systemctl disable --now firewalld
setenforce 02.修改 Master、Slave1、Slave2 节点的主机名
hostnamectl set-hostname mysql1
hostnamectl set-hostname mysql2
hostnamectl set-hostname mysql33.所有节点添加主机映射:
vim /etc/hosts192.168.88.100 mysql1192.168.88.102 mysql2192.168.88.103 mysql3192.168.88.104 manager

2.搭建主从复制:

 2.1 开启二进制日志和中继日志:
##Master 节点##
vim /etc/my.cnf
[mysqld]
server-id = 1                       #注意server-id不能一样
log_bin = mysql-bin                 #二进制日志
binlog_format = mixed               #混合类型复制
log-slave-updates = true         #slave 从 master 复制的数据会写入二进制日志文件里,从库做为 其他从库的主库时设置为 1或ture
relay-log = relay-log-bin               #开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index = slave-relay-bin.index  #定义中继日志文件的位置和名称slave1 节点:
server-id = 2
log_bin = mysql-bin
binlog_format = mixed
log-slave-updates = true
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.indexslave2 节点:
server-id = 3          
log_bin = mysql-bin
binlog_format = mixed
log-slave-updates = true
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.indexsystemctl restart mysqld     ##重启刷新配置文件
 
 2.2 主从节点时间同步:

1.mster节点:
yum -y install chrony与阿里云同步时间:
vim /etc/chrony.confserver ntp.aliyun.com iburstallow 192.168.88.0/24           ##设置允许同步主机systemctl restart chronycrontab -e
*/30 * * * *   /usr/sbin/ntpdate ntp.aliyun.com  #添加计划任务2.两台从节点:
yum -y install chronyvim /etc/chrony.confserver 192.168.88.100 iburstsystemctl restart chronycrontab -e
*/30 * * * *   /usr/sbin/ntpdate 192.168.88.100  #添加计划任务

 2.3  在 Master、Slave1、Slave2 节点上都创建软链接
     ln -s /usr/local/mysql/bin/mysql /usr/sbin/
     ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/

 2.4 配置mysql一主两从:

1.所有节点进行 mysql 授权:grant replication slave on *.* to 'myslave'@'192.168.88.%' identified by '123';	#从数据库同步使用
grant all privileges on *.* to 'mha'@'192.168.88.%' identified by 'manager';		 #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;  ##刷新2.Master 节点查看二进制文件和同步点:
show master status;3.Slave1、Slave2 节点执行同步操作:
change master to master_host='192.168.88.100',master_user='myslave',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=154; start slave;4.Slave1、Slave2 节点查看数据同步结果:
show slave status\G		
//确保 IO 和 SQL 线程都是 Yes,代表同步正常。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes5。两个从库必须设置为只读模式:
set global read_only=1;

3.安装 MHA :

 3.1 所有服务器上都安装 MHA 依赖的环境:
yum install epel-release --nogpgcheck -yyum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN

 3.2 安装 MHA node 组件:
   先在所有服务器上必须先安装 node 组件
   对于每个操作系统版本不一样,这里 CentOS7.4 必须选择 0.57 版本。
   在所有服务器上必须先安装 node 组件,最后在 MHA-manager 节点上安装 manager 组件,因为 manager 依赖 node 组件。

cd /opt
tar zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install
3.3 manager 节点上安装 manager 组件
cd /opt
tar zxvf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57
perl Makefile.PL
make && make install

#manager 组件安装后在/usr/local/bin 下面会生成几个工具,主要包括以下几个:

masterha_check_ssh 检查 MHA 的 SSH 配置状况
masterha_check_repl 检查 MySQL 复制状况
masterha_manger 启动 manager的脚本
masterha_check_status 检测当前 MHA 运行状态
masterha_master_monitor 检测 master 是否宕机
masterha_master_switch 控制故障转移(自动或者手动)
masterha_conf_host 添加或删除配置的 server 信息
masterha_stop  关闭manager
#node 组件安装后也会在/usr/local/bin 下面会生成几个脚本(这些工具通常由 MHAManager 的脚本触发,无需人为操作)主要如下:

save_binary_logs 保存和复制 master 的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的 slave
filter_mysqlbinlog 去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)
purge_relay_logs 清除中继日志(不会阻塞 SQL 线程)
4. 在所有服务器上配置无密码认证:
  4.1 manager 节点:


ssh-keygen -t rsa 				#一路按回车键
ssh-copy-id 192.168.88.100
ssh-copy-id 192.168.88.102
ssh-copy-id 192.168.88.103
  4.2 master节点:

ssh-keygen -t rsa 				#一路按回车键
ssh-copy-id 192.168.88.102
ssh-copy-id 192.168.88.103
  4.3  slave1节点:

ssh-keygen -t rsa 				#一路按回车键
ssh-copy-id 192.168.88.100
ssh-copy-id 192.168.88.103
 4.4 slave2节点:
ssh-keygen -t rsa 				#一路按回车键
ssh-copy-id 192.168.88.100
ssh-copy-id 192.168.88.102

5. manager编写配置文件:

 5.1 manager 节点上复制相关脚本到/usr/local/bin 目录:
cp -rp /opt/mha4mysql-manager-0.57/samples/scripts/* /usr/local/bin

拷贝后会有四个执行文件:
master_ip_failover                 #自动切换时 VIP 管理的脚本
master_ip_online_change     #在线切换时 VIP 的管理
power_manager                    #故障发生后关闭主机的脚本
send_report                          #因故障切换后发送报警的脚本

 5.2 编写VIP 管理脚本:
删除原有内容,直接复制并修改vip相关参数。可在拷贝前输入 :set paste 解决vim粘贴乱序问题
 


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.88.200';									#指定vip的地址
my $brdc = '192.168.88.255';								#指定vip的广播地址
my $ifdev = 'ens33';										#指定vip绑定的网卡
my $key = '1';												#指定vip绑定的虚拟网卡序列号
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";		#代表此变量值为ifconfig ens33:1 192.168.80.200
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";		#代表此变量值为ifconfig ens33:1 192.168.80.200 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";
}

5.3 创建 MHA 软件目录并拷贝配置文件: 


#创建相关目录(所有节点)
mkdir -p /opt/mysql-mha/mha-node# manager节点
mkdir -p /opt/mysql-mha/mha
vim /opt/mysql-mha/mysql_mha.cnf[server default]
manager_log=/opt/mysql-mha/manager.log		#指定manager日志路径
manager_workdir=/opt/mysql-mha/mha			#指定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					#设置mha访问数据库的账号
password=manager			#设置mha访问数据库的账号密码
ping_interval=1				#设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行failover
remote_workdir=/opt/mysql-mha/mha-node		#指定mha在远程节点上的工作目录
repl_user=myslave			#设置主从复制的用户
repl_password=123			#设置主从复制的用户密码
report_script=/usr/local/send_report     #设置发生故障切换的时候发送邮件提醒
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.88.102 -s 192.168.88.103	#指定检查的从服务器IP地址
shutdown_script=""			#设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机防止发生脑裂,这里没有使用)
ssh_user=root				#设置ssh的登录用户名[server1]
hostname=192.168.88.100
port=3306[server2]
hostname=192.168.88.102
port=3306
candidate_master=1
#设置为候选master,设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个从库不是集群中最新的slavecheck_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.88.103
port=3306

 6. Master 节点上手动开启虚拟IP:

ifconfig ens33:1 192.168.88.200/24

 

7. manager 节点上测试:

  7.1 测试 ssh 无密码认证:
masterha_check_ssh -conf=/opt/mysql-mha/mysql_mha.cnf

  7.2  测试 mysql 主从连接情况: 

masterha_check_repl -conf=/opt/mysql-mha/mysql_mha.cnf

8. manager 节点上启动 MHA:


nohup masterha_manager \
--conf=/opt/mysql-mha/mysql_mha.cnf \
--remove_dead_master_conf \
--ignore_last_failover < /dev/null > /var/log/mha_manager.log 2>&1 &

9.测试:

    查看 MHA 状态,可以看到当前的 master 是 mysql1 节点。

六、故障修复:

 1.修复mysql:

systemctl restart mysqld

 2.修复主从:

   #在现主库服务器 mysql2 查看二进制文件和同步点

show master status;

  #在原主库服务器 mysql1 执行同步操作

change master to master_host='192.168.88.102',master_user='myslave',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=1745;start slave;

3.在 manager 节点上修改配置文件:


/opt/mysql-mha/mysql_mha.cnf......
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.88.100 -s 192.168.88.103
......
[server1]
hostname=192.168.88.102
port=3306                        再把这个记录添加进去,因为它检测掉失效时候会自动消失[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.88.100
port=3306[server3]
hostname=192.168.88.103
port=3306

4.在 manager 节点上启动 MHA:


nohup masterha_manager \
--conf=/opt/mysql-mha/mysql_mha.cnf \
--remove_dead_master_conf \
--ignore_last_failover < /dev/null > /var/log/mha_manager.log 2>&1 &

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio Giraffe | 2022.3.1

Android Gradle 插件和 Android Studio 兼容性 Android Studio 构建系统以 Gradle 为基础&#xff0c;并且 Android Gradle 插件 (AGP) 添加了几项专用于构建 Android 应用的功能。下表列出了各个 Android Studio 版本所需的 AGP 版本。 如果您的项目不受某个特定版本的 Andr…

(ubuntu) 安装JDK

文章目录 前言参看java版本的命令&#xff1a;安装jdk命令安装jps关闭防火墙&#xff1a;查看端口占用&#xff1a;&#xff08;坑&#xff09;ubuntu上Mysql默认标明 区分大小写 前言 提示&#xff1a;常以为人是一个容器&#xff0c;盛着快乐&#xff0c;盛着悲哀。但是人不…

QCustomPlot实现曲线拖拽

本文内容目录 需求场景:一、选择控件二、将QCustomPlot库整合到你的Qt项目中1、下载源代码2、创建.pri三、鼠标框选,实现坐标缩放四、曲线拖动1、定位曲线2、移动时改变曲线五、问题的产生与解决1、查看源码2、修改本项目代码需求场景: 曲线图应该同时具有以下功能点: 1、…

【Eclipse】取消按空格自动补全,以及出现没有src的解决办法

【Eclipse】设置自动提示 教程 根据上方链接&#xff0c;我们已经知道如何设置Eclipse的自动补全功能了&#xff0c;但是有时候敲变量名的时候按空格&#xff0c;本意是操作习惯&#xff0c;不需要自动补全&#xff0c;但是它却给我们自动补全了&#xff0c;这就造成了困扰&…

解决笔记本无线网络5G比2.4还慢的奇怪问题

环境&#xff1a;笔记本Dell XPS15 9570&#xff0c;内置无线网卡Killer Wireless-n/a/ac 1535 Wireless Network Adapter&#xff0c;系统win10家庭版&#xff0c;路由器H3C Magic R2Pro千兆版 因为笔记本用的不多&#xff0c;一直没怎么注意网络速度&#xff0c;直到最近因为…

QT10_16

X-mind #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {this->resize(536,412);this->setWindowTitle(" 坤坤之家");this->setWindowIcon(QIcon("D:/Ubuntushare/preview.gif"));this->setWindowFlag…

Kafka序列化反序列化解析、kafka schema

Kafka序列化反序列化解析、kafka schema。 kafka有自己的rpc协议,即nio bytebuf中的数据格式,详见之前的kafka相关介绍的文章。这里我们来看一下大家常用,有时又疑惑的序列化反序列化,对应rpc协议中的records,kafka叫Serdes,实际上也是字面上的意思serialize and deseri…

智能油烟机 优化烹饪体验

如果说空调是夏天最伟大的发明&#xff0c;那么油烟机则是健康厨房的伟大推进者。随着科技的发展&#xff0c;智能化的油烟机逐渐走进了人们的日常生活。每当我们在爆炒、油炸食物的时候&#xff0c;油烟总能呛得人眼睛痛、鼻子难受&#xff0c;传统的油烟机面前我们还需要手动…

亚马逊、eBay,速卖通,国际站买家账号支付异常问题解决方法

如何解决下单被砍、封号问题&#xff0c;建议采取以下措施&#xff1a; 买家账号下单&#xff0c;不单纯只是解决支付卡、IP问题就可以了&#xff0c;因为平台大数据风控点很多&#xff0c; 我们防关联具体要解决几个问题 一&#xff1a;要硬件参数的关联、安全码、地区码、…

众和策略:几点开盘和收盘股票?

股票开盘和收盘时间是投资者有必要知道的要害信息&#xff0c;因为它们挑选了股票生意的初步和结束时间。在此文章中&#xff0c;咱们将从多个视点分析股票开盘和收盘时间&#xff0c;包括全球商场开盘时间、技术分析对开盘前后价格不坚决的影响、以及日内生意者如安在开盘和收…

github 终端克隆操作,以及对 https/ssh 的理解

前言 最近瞎搞 github 的一些配置&#xff0c;结果搞得有一段时间克隆不了仓库。不过经历了这次风波后&#xff0c;我对 github 的一些原理有了更清楚的了解。所以想稍微写一小篇文章总结输出一下&#xff0c;也欢迎有疑问的读者与博主进一步交流&#xff0c;我的理解还是有限…

Linux网络编程系列之UDP广播

Linux网络编程系列 &#xff08;够吃&#xff0c;管饱&#xff09; 1、Linux网络编程系列之网络编程基础 2、Linux网络编程系列之TCP协议编程 3、Linux网络编程系列之UDP协议编程 4、Linux网络编程系列之UDP广播 5、Linux网络编程系列之UDP组播 6、Linux网络编程系列之服务器编…

【linux】日志和journalctl 管理查看日志

目录 既看即用 简略介绍 linux的日志类型 系统日志 介绍 区别的简单说明 区别的详细说明 journalctl是什么&#xff1f;&#xff08;查看系统日志的工具&#xff09; 详细内容 linux的日志类型 systemd日志&#xff08;systemd-journald&#xff09; 放在哪个目录 …

(C++ STL) 详解vector模拟实现

目录 一.vector的介绍 1.vector的介绍 二.vector的定义模拟实现 三.vector各接口的模拟实现 1.vector迭代器的模拟实现 2.构造函数 2.1无参构造 2.2 n个val构造 2.3迭代器区间构造 2.4通过对象初始化&#xff08;拷贝构造&#xff09; 3.析构函数 4.size 5.operato…

RabbitMQ清除积压消息/管理界面出现 Unacked 消息

1.问题&#xff1a; rabbitmq的生产者端循环产生了多条消息给消费者&#xff0c;而消费者无法及时将消息处理掉&#xff0c;在消费端积压了多条消息&#xff08;消费失败的时候&#xff0c;消息队列会一直重复的发送消息&#xff0c;导致程序死循环&#xff09;需要清理项目因为…

寻找可靠的软件外包开发公司

寻找可靠的软件外包开发公司是关键&#xff0c;以确保项目的顺利交付和质量。以下是一些方法和步骤&#xff0c;帮助您找到可靠的软件外包开发公司&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 明确…

linux 学习:查找命令 find | grep

作者: 苏丙榅 原文链接: https://subingwen.cn/linux/commpress/ 在使用Linux系统的时候, 我们经常会需要查找某些文件&#xff0c;但是大多数情况下我们并不能确定这些文件的具体位置&#xff0c;这样的话就非常浪费我们的时间。Linux为我们提供了很多的用于文件搜索的命令, 如…

【Eclipse】安装与卸载教程

目录 1.绿色版免安装版本 2.安装版本 3.卸载 首先打开官网&#xff1a;Eclipse Downloads | The Eclipse Foundation 选择download package 如图所示&#xff0c;到如下界面 1.绿色版免安装版本 按图片点击&#xff0c;即可开始下载 下载好后解压 &#xff0c;在桌面创建…

LeetCode24.两两交换链表中的节点

这道题还是比较简单&#xff0c;我看完题目的想法就是借助一个第三变量&#xff0c;来改变两个节点的指针的指向&#xff0c;比如我要改变1和2节点的指向&#xff0c;我用h1表示节点1&#xff0c;我创建一个新的节点ans&#xff0c;先拿ans指向节点2&#xff08;ans.next h1.n…

超简单小白攻略:如何利用黑群晖虚拟机和内网穿透实现公网访问

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…