高可用的 MFS 文件分布式系统(Drdb+heartbeat+MFS )

理论拓扑

环境准备: 

N 台 Linux 测试服务器 

操作系统版本  CentOS 6.5 32bit 

***系统分区要求:需要为格式化的空分区*** 

IP 地址:  mfsmaster:10.3.0.81    心跳 ip  192.168.1.11 

mfsbackup:10.3.0.82    心跳 ip  192.168.1.12 

#######All machine do it ############################ 

更改 yum 源 
mv /etc/yum.repos.d/CentOS‐Base.repo /etc/yum.repos.d/CentOS‐Base.repo.backup cd /etc/yum.repos.d/  wget http://mirrors.163.com/.help/CentOS5‐Base‐163.repo yum makecache   yum install ‐y kernel‐headers kernel‐devel

####################mfmaster config################### 

vi /etc/sysconfig/network  hostname=mfsmaster    
vi /etc/hosts    
#add line10.3.0.81 mfsmaster  
10.3.0.82 mfsbackup 

#########copy hosts file to 10.3.0.82################ 

scp /etc/hosts root@10.3.0.82:/etc/  

##############mfsbackup config##################### 

vi /etc/sysconfig/network  
hostname=mfsbackup   

####################download resource and scp to mfsbackup############# 

mfsmaster  
mkdir /usr/src/download  

####download drdb##############

wget http://oss.linbit.com/drbd/8.4/drbd‐8.4.0.tar.gz  

####download heartbeat############## 

wget http://hg.linux‐ha.org/heartbeat‐STABLE_3_0/archive/STABLE‐3.0.4.tar.bz2  scp ‐a /usr/src/download root@10.3.0.82  

############install drbd###################### 

tar zxvf drbd‐8.4.0.tar.gz  
cd drbd‐8.4.0  
./configure ‐‐prefix=/usr/local/drbd   
make && make install  

##########yum  源安装 drbd 

yum install ‐y kmod‐drbd83 drbd83  
检查 drbd  模块  
lsmod | grep ‐i drbd drbd                  228528  0   
假如为空,需要导入 drbd 模块  
modprobe drbd     
vi /etc/drbd.conf    
global { usage‐count yes; }  
common { syncer { rate 50M; } }  
resource r0 { protocol C;     
net {          
cram‐hmac‐alg sha1;         shared‐secret "secret string";      
}  # every machine must be use the "on" beginon mfsmaster {      # /dev/drbd1 use the "/dev/sda1"          
device    /dev/drbd1;         disk      /dev/sdb1;            
# set DRBD port,used connection to other machine         address   10.3.0.81:7898;          
meta‐disk  internal;         }     
on mfsbackup {          
device    /dev/drbd1;          
disk      /dev/sdb1;          
address   10.3.0.82:7898;          
meta‐disk  internal;          
}  
}  初始化资源组    
格式:drbdadm create‐md resource_name   
drbdadm create‐md r0 

###########初次运行提示信息############### 

 ‐‐==  Thank you for participating in the global usage survey  ==‐‐  The server's response is:  
you are the 12052th user to install this version  
Writing meta data...  
initializing activity log  NOT initialized bitmap  New drbd meta data block successfully created.  
success    
service drbd start  ________________________________________________________________________

############提示信息################# 

Starting DRBD resources: [   
r0  Found valid meta data in the expected location, 1011671040 bytes into /dev/sdb1.  d(r0) s(r0) n(r0) ].......... 
***************************************************************    DRBD's startup script waits for the peer node(s) to appear.    ‐ In case this node was already a degraded cluster before the     reboot the timeout is 0 seconds. [degr‐wfc‐timeout]    ‐ If the peer was available before the reboot the timeout will     expire after 0 seconds. [wfc‐timeout]     (These values are for resource 'r0'; 0 sec ‐> wait forever)    To abort waiting enter 'yes' [  20]:  .  ________________________________________________________________________  
cat /proc/drbd  
________________________________________________________________________  version: 8.3.8 (api:88/proto:86‐94)  
GIT‐hash:  d78846e52224fd00562f7c225bcc25b2d422321d  build  by  mockbuild@builder10.centos.org, 2010‐06‐04 08:04:16    1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r‐‐‐‐  ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:987896  
对输出的含义解释如下:  
ro 表示角色信息,第一次启动 drbd 时,两个 drbd 节点默认都处于 Secondary 状态,  
ds 是磁盘状态信息,“Inconsistent/Inconsisten”,即为“不一致/不一致”状态,表示两个节 点的磁盘数据处于不一致状态。  
Ns 表示网络发送的数据包信息。  
Dw 是磁盘写信息  
Dr 是磁盘读信息    
在 MFSMASTER  
设置主节点    
初次运行  
drbdadm ‐‐ ‐‐overwrite‐data‐of‐peer primary all  
/sbin/drbdadm primary r0    
主备节点切换  
主备节点切换有两种方式,分别是停止 drbd 服务切换和正常切换,依次介绍:  
停止 drbd 服务切换  
1.  关闭主节点服务切换  
此时挂载的 drbd 分区就自动在主节点卸载了,然后在备用节点执行切换命令:  drbdadm primary all  此时会报错:  
State change failed: (‐7) Refusing to be Primary while peer is not outdated  Command 'drbdsetup 2 primary' terminated with exit code 11  
因此,必须在备用节点执行如下命令:  
drbdsetup /dev/drbd1 primary –o 
或者  drbdadm ‐‐ ‐‐overwrite‐data‐of‐peer primary all  
此时就可以正常切换了。  当在备用节点执行切换到主节点命令后,原来的主用节点自动变为备用节点。无需在主用节 点再次执行切换到备用节点的命令。  
2.  
正常切换  
在主节点卸载磁盘分区,  umount /mnt/mfs  然后执行  drbdadm secondary all  如果不执行这个命令,直接在备用节点执行切换到主节点的命令,会报错:  2: State change failed: (‐1) Multiple primaries not allowed by config  Command 'drbdsetup 2 primary' terminated with exit code 11  
接着,在备用节点执行  
drbdadm primary all  
最后在备用节点挂载磁盘分区即可:  
mount /dev/drbd1  /mnt/mfs  DRBD 
脑裂后的处理:  
脑裂后,两个节点间数据不同步,主从关系失效,需要按下面的步骤修复:  
a.在从节点如下操作:  #drbdadm secondary all  
#drbdadm ‐‐ ‐‐discard‐my‐data connect all  
b.在主节点上,通过 cat /proc/drbd 查看状态,如果不是 WFConnection 状态,需要再手动连 接:  #drbdadm connect all

########################  HA  config###############################

安装基础包和 heartbeat 包 yum install ‐y libnet heartbeat‐devel heartbeat‐ldirectord heartbeat  
配置 ha 环境  
cp /usr/share/doc/heartbeat‐2.1.3/ha.cf /etc/ha.d/   
cp /usr/share/doc/heartbeat‐2.1.3/authkeys /etc/ha.d/   
cp /usr/share/doc/heartbeat‐2.1.3/haresources /etc/ha.d/     
更改配置文件  
/etc/ha.d/ha.cf  
logfile /var/log/ha‐log.log  
logfacility     local0  
keepalive 2  
deadtime 30  
warntime 10  
udpport 694  
ucast eth1 192.168.1.12  
auto_failback on 
node    mfsmaster  
node    mfsbackup hopfudge 1    
更改配置文件  
/etc/ha.d/authkeys  
auth 1  
1 crc  
更改 authkeys  权限为 600  
chmod 600 /etc/ha.d/authkeys    
更改配置文件  
/etc/ha.d/haresource  
mfsmaster  Initdrbd  10.3.0.83 mfsmaster  mfsmaster  10.3.0.83  
mfsmaster  10.3.0.83 httpd    
#测试 heartbeat 专用,测试完毕之后可以注释掉  

#第一个字段是主机名,是 uname ‐a 得到的 

# 第二个字段作用是执行当前的脚本命令此脚本可以定义在

#/etc/init.d/ 或 /etc/ha.d/resource.d,此处我定义了一个名叫 Initdrbd  的脚本命令,具体的见下面演示。 

#第三个字段作用定义启动 mfsmaster 进程,必须在/etc/init.d/或/etc/ha.d/resource.d 能找到 的可执行的脚本文件。 

#第四个字段作用是启动虚拟的 IP 

编辑 Initdrbd 

vi /etc/ha.d/resource.d/Initdrbd  
#!/bin/shunset LC_ALL; export LC_ALL unset LANGUAGE; export LANGUAGE  
prefix=/usr  
exec_prefix=/usr  
. /etc/ha.d/shellfuncs    
case "$1" in     
'start')    
drbdadm primary r0    
mount /dev/drbd1 /mnt/mfs          
;;     
'stop')    
umount /mnt/mfs    
drbdadm  secondary r0           
;;  'restart')          
;;  
*)          
echo "Usage: $0 { start |  stop | restart }"          
;;  
esac 
exit 0 

同步 master 与 backup 之间配置 

scp /etc/ha.d/ha.cf root@10.3.0.82:/etc/ha.d/  
scp  /etc/ha.d/resource.d/Initdrbd root@10.3.0.82:/etc/ha.d/resource.d/  
scp  /etc/ha.d/haresources root@10.3.0.82:/etc/ha.d/  
scp  /etc/ha.d/authkeys root@10.3.0.82:/etc/ha.d/  

测试内容 

主机 mfsmaster  
vi /var/www/html    
<!DOCTYPE HTML PUBLIC "‐//W3C//DTD HTML 4.0 Transitional//EN">  
<HTML>    
<HEAD>    
<TITLE> New Document </TITLE>    
<META NAME="Generator" CONTENT="EditPlus">    
<META NAME="Author" CONTENT="">    
<META NAME="Keywords" CONTENT="">   <META NAME="Description" CONTENT="">    
</HEAD>    
<BODY>     mfsmaster is running    
</BODY>    
主机 mfsbackup    
<!DOCTYPE HTML PUBLIC "‐//W3C//DTD HTML 4.0 Transitional//EN">  
<HTML>    
<HEAD>   <TITLE> New Document </TITLE>    
<META NAME="Generator" CONTENT="EditPlus">   <META NAME="Author" CONTENT="">    
<META NAME="Keywords" CONTENT="">    
<META NAME="Description" CONTENT="">    
</HEAD>    
<BODY>     
mfsbackup is running    
</BODY>
主机 mfsbackup    
<!DOCTYPE HTML PUBLIC "‐//W3C//DTD HTML 4.0 Transitional//EN">  
<HTML>    
<HEAD>    
<TITLE> New Document </TITLE>    
<META NAME="Generator" CONTENT="EditPlus">    
<META NAME="Author" CONTENT="">    
<META NAME="Keywords" CONTENT="">    
<META NAME="Description" CONTENT="">    
</HEAD>    
<BODY>     
mfsbackup is running    
</BODY>  

测试   
a).  两台机器分别启动,并且启动 heartbeat     

  b).  然后在两台机器意外的其他机器上输入 http:// 10.3.0.83 

c).  正常会显示 mfsmaster is running, 

d).  把 mfsmaster 宕机或者关闭 heartbeat,  则会出现 mfsbackup 接管工作的状态,刷新浏览 器出现 mfsbackup is running 

e).  恢复 mfsmaster,过数秒后刷新浏览器出现 mfsmaster is running, 

f).  测试成功  Note:如果输入 http:// 10.3.0.83  出现错误,请检查配置文件里面的服务是否写对了,查看日 志文件看服务是否起来了,如果确定全部运行正常,还是没有 WEB 页面显示结果,请检查 防火墙。 

MFS  环境部署 

由于搭建的环境属于高可用环境,需要两台服务器的用户 ID、组 ID 都要保持一致  
创建组  :  
groupadd ‐g 600 mfs  
创建用户:
useradd mfs ‐u 600 ‐g mfs    
cd /usr/src  
wget  http://pro.hit.gemius.pl/hitredir/id=0sWa0S8ft4sTAHF1bGAAEZPcP3ziyq7f9SdhoQf7oeT.c7/url=m oosefs.org/tl_files/mfscode/mfs‐1.6.20‐2.tar.gz  
tar zxvf mfs‐1.6.20‐2.tar.gz  cd mfs‐1.6.20  
./configure  ‐‐prefix=/mnt/mfs  ‐with‐default‐user=mfs  ‐with‐default‐group=mfs  ‐‐disable‐mfschunkserver ‐‐disable‐mfsmount make && make install  
配置 mfs 文件  
cd /mnt/mfs/etc  
cp mfsmaster.cfg.dist mfsmaster.cfg cp mfsmetalogger.cfg.dist mfsmetalogger.cfg cp mfsexports.cfg.dist mfsexports.cfg  
cd /mnt/mfs/var/mfs/  cp metadata.mfs.empty metadata.mfs    
scp /etc/init.d/mfsmaster root@10.3.0.82:/etc/init.d/    _______________________________________________________________________________ 

备份服务器配置 Backup server (metalogger)   10.3.0.84 

groupadd mfs  
useradd ‐g mfs mfs  
tar zxvf mfs‐1.6.20‐2.tar.gz   
./configure  ‐‐prefix=/usr/local/mfs  ‐sysconfdir=/etc  ‐‐localstatedir=/var/lib  ‐‐with‐default‐user=mfs ‐‐with‐default‐group=mfs ‐‐disable‐mfschunkserver ‐‐disable‐mfsmount   
make && make install cp /etc/mfsmetalogger.cfg.dist /etc/mfsmetalogger.cfg  
启动 mfsmetalogger  
/usr/local/mfs/sbin/mfsmetalogger start vi /etc/rc.local  
#add this lie to start mfsmetalogger  
/usr/local/mfs/sbin/mfsmetalogger start 

存储块服务器 Chunk servers  安装    10.3.0.85~10.3.0.86 

groupadd mfs useradd ‐g mfs mfs  
tar zxvf mfs‐1.6.20‐2.tar.gz    
./configure  ‐‐prefix=/usr/local/mfs  ‐sysconfdir=/etc  ‐‐localstatedir=/var/lib  ‐‐with‐default‐user=mfs ‐‐with‐default‐group=mfs ‐‐disable‐mfsmaster  cp /etc/mfschunkserver.cfg.dist /etc/mfschunkserver.cfg  cp /etc/mfshdd.cfg.dist /etc/mfshdd.cfg  
vi /etc/mfshdd.cfg  
#add this line   
/opt/mfschunks1  
/opt/mfschunks2    
建立 mfs 存储所用到的文件夹  
mkdir /opt/mfschunks1  
mkdir /opt/mfschunks2  
更改文件夹权限  
chown ‐R mfs:mfs /opt/mfschunks1  
chown ‐R mfs:mfs /opt/mfschunks2  
更改 host 文件  10.3.0.83     mfsmaster  
为了方便程序的自动运行,编辑 rc.local 文件 /usr/local/mfs/sbin/mfschunkserver start      _______________________________________________________________________  
挂载客户端  
相关设置  
groupadd mfs  
useradd ‐g mfs mfs      
安装 fuse wget http://cdnetworks‐kr‐1.dl.sourceforge.net/project/fuse/fuse‐2.X/2.8.5/fuse‐2.8.5.tar.gz   tar zxvf fuse‐2.8.5.tar.gz  
cd fuse‐2.8.5  
./configure    ‐‐prefix=/usr  make  meke install  cd /usr/src  tar zxvf mfs‐1.6.20‐2.tar.gz   
cd mfs‐1.6.20‐2  
./configure  ‐‐prefix=/usr/local/mfs  ‐sysconfdir=/etc  ‐‐localstatedir=/var/lib  ‐‐with‐default‐user=mfs ‐‐with‐default‐group=mfs ‐‐disable‐mfsmaster ‐‐disable‐mfschunkserver    编辑 hosts 文件  
10.3.0.83 mfsmaster    
mkdir ‐p /mnt/mfs    
mfsmount /mnt/mfs ‐H mfsmaster  
##################提示内容################  
mfsmaster  accepted  connection  with  parameters:  read‐write,restricted_ip  ;  root  mapped  to  root:root  

集成与测试 

  heartbeat 与 drbd 的集成 

DRBD 的主从的切换依赖与 heartbeat 的服务,所以集成的关键点在于定义 Initdrbd 的脚本文 件的定义和 heartbeat 的服务定义文件/etc/ha.d/resource.d。如 server1  Initdrbd  就是集成 DRBD 和 heartbeat。   

heartbeat 与 MFS 的集成 

与 DRBD 一样,mfsmaster 的脚本文件定义与 heartbeat 的服务定义文件/etc/ha.d/resource.d 中即可。   

drbd  与 mfs  的集成  在主服务器中,必须把MFS的安装文件全部安装到drbd的挂载目录中去,安装到块设备上去, 所以在主从切换的时候,备份机器拿到安装环境和主的一样,那么通过同样的方式来启动 MFS 进程,达到切换切换启动 MFS 的目的。   

测试  两台 server 上启动 DRBD,利用 cat /proc/drbd  查看启动情况和网络状态 

主机器上显示 Primary/Secondary  备份机器上显示 Secondary/Primary,启动成功

  启动 heartbeat,通过日志查看 heartbeat 包括关联的服务加载的情况,tail  –f
/var/log/ha_log/xxx.log 

在主机器上 Ps  的方式查看 heartbeat  和 MFS 进程,确保服务启动,如果没有启动,可手动 在启动一次。

此时备份机器的 mfs 没有启动。  停止主服务的 heartbeat,查看主服务的日志,发现所有的关联服务都会被关闭,包括 drbd,mfs,vip 等。 

查看备份机器的日志,发现已经开始启动关联的服务,此时备份机器上 cat /proc/drbd  出现 Primary/Secondary  主机器上显示 Secondary/Primary,说明 DRBD 切换成功,然后查看 mfs 是否启动,如果启动成功,

恭喜您,高可用的 MFS 文件分布式系统已经搭建好了

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

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

相关文章

k-means 聚类过程演示

k-means是一种非监督 &#xff08;从下图 0 当中我们可以看到训练数据并没有标签标注类别&#xff09;的聚类算法&#xff1a; K-Means clustering intends to partition n objects into k clusters in which each object belongs to the cluster with the nearest mean. This …

html网页距离顶部50像素,HTML5 教程之CSS Padding(填充)

CSS Padding(填充)CSS Padding(填充)属性定义元素边框与元素内容之间的空间。Padding(填充)当元素的 Padding(填充)(内边距)被清除时&#xff0c;所"释放"的区域将会受到元素背景颜色的填充。单独使用填充属性可以改变上下左右的填充。缩写填充属性也可以使用&#x…

PHP在金山游戏运营中的应用

PHP在金山游戏官方网站中的应用&#xff1a; ①、PHP团队协作开发&#xff1b; ②、PHP系统架构应用。 PHP在金山游戏运营系统 Keyes 中的应用&#xff1a; ①、分层架构设计模型&#xff1b; ②、通用性API接口设计 PHP在金山游戏官方网站中的应用 PHP团队协作开发环境 PHP…

[Leedcode][JAVA][第236题][二叉树的公共祖先][后序遍历][BFS]

【问题描述】 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可…

html鼠标离开点击停留,Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)...

本文实例总结了Javascript DOM事件操作。分享给大家供大家参考&#xff0c;具体如下&#xff1a;使用JavaScript可以对HTML页面上的各种事件进行监听&#xff0c;如鼠标点击/释放&#xff0c;鼠标悬停/离开&#xff0c;等等。效果图&#xff1a;代码&#xff1a;/p>"ht…

天猫系统的流控降级

目录 1交易应用介绍 2系统挑战及应对 3优雅降级思路 4心得总结 交易应用介绍 购物袋 下单 确认订单 系统挑战及应对 挑战 • 高并发 • 低时延 • 容量有限 • 多外部系统协力&下单信息准确 目标 • 不挂掉 – 不因为容量原因导致网站瘫痪 – 自身的容量 – 后…

[剑指offer]面试题第[68-1]题[Leedcode][JAVA][第235题][二叉搜索树的最近公共祖先][递归][BFS]

【问题描述】[第235题][二叉搜索树的最近公共祖先][简单] 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖…

天猫服务系统的架构和经验

主要内容 业务介绍 分析设计过程 过程推演 事件/流程架构及使用场景讨论 基础组件介绍 改进点 业务介绍 业务介绍-业务关键点 产品定位 买家&#xff1a;提供标准的、优质的服务体验卖家&#xff1a;整合各环节资源&#xff0c;提供便捷的产品&#xff1b;提升服务质量、降低…

[Leedcode][JAVA][第50题][Pow(x, n)][快速幂][分治][转换类型]

【问题描述】[第50题][Pow(x, n)][中等] 实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数。输入: 2.10000, 3 输出: 9.26100 示例 3:输入: 2.00000, -2 输出: 0.25000 解释: 2-2 1/22 1/4 0.25【解答思路】 1.快速幂 时间复杂度&#xff1a;O(logN) 空间复杂度&#x…

淘宝网商品管理?技术 ?

目录 技术挑战 商品管理 系统的演化过程 技术细节 展望 技术挑战淘宝商品管理 十亿级商品数百万级用户数每天处理TB级数据数据沉淀成本控制业务多变上千条业务规则 发展过程淘宝商品管理 第一阶段&#xff1a;基于搜索 基于搜索的商品管理 〙实现 存储用户设置的规则&…

考计算机网络证书转深户,惊?这个证书能帮你直接入深户,还没有学历要求? 你还在等什么...

原标题&#xff1a;惊&#xff1f;这个证书能帮你直接入深户&#xff0c;还没有学历要求&#xff1f; 你还在等什么只要持有中级职称&#xff0c;40周岁以内申请入户时&#xff0c;有连续半年以上社保&#xff0c;就可以直接入户了&#xff0c;没有学历的要求&#xff01;而之前…

[Leedcode][JAVA][第155题][最小栈][基本类型包装类]

【问题描述】 【解答思路】 1. 两个栈实现 1.1、辅助栈和数据栈同步 特点&#xff1a;编码简单&#xff0c;不用考虑一些边界情况&#xff0c;就有一点不好&#xff1a;辅助栈可能会存一些“不必要”的元素。 1.2、辅助栈和数据栈不同步 特点&#xff1a;由“辅助栈和数据…

淘宝主站Cgroup资源控制

目录 项目背景&#xff1a;主站的现状 选型的过程 Cgroup/LinuxContainer介绍 定制和开发 存在的问题和对策 项目背景 主站&#xff1a; 跑在xen虚拟机上的Java应用 处理业务逻辑&#xff0c;本地无重要存储&#xff0c;无状态。 一台物理机部署3台虚拟机 双路Xeon&#…

[Leedcode][JAVA][第102题][二叉树的层序遍历][递归][迭代][BFS]

【问题描述】[第102题][二叉树的层序遍历][中等] 给你一个二叉树&#xff0c;请你返回其按 层序遍历 得到的节点值。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。示例&#xff1a; 二叉树&#xff1a;[3,9,20,null,null,15,7],3/ \9 20/ \15 7 返…

java学习(178):终篇?静态代理?动态代理?

总体设计 包com.xzit.aop DynlnvokeProducerProxy 包com.xzit.db db 包com.xzit.entity ClientDepartmentEmployeeGoodsProducer 包com.xzit.interfaces DepartmentDaoImpEmployeeDaoImpIGoodsIObject 包com.xzit.proxy TeatDynProxyTestStaticProxy 咱直接上代码&#xff0c;…

[Leedcode][JAVA][第94/144/145题][前中后序遍历][递归][迭代][二叉树]

【问题描述】[] 前序遍历 先输出当前结点的数据&#xff0c;再依次遍历输出左结点和右结点 中序遍历 先遍历输出左结点&#xff0c;再输出当前结点的数据&#xff0c;再遍历输出右结点 后续遍历 先遍历输出左结点&#xff0c;再遍历输出右结点&#xff0c;最后输出当前结点的数…

sqlserver:(2):window下SQL server数据库数据源的配置

1首先打开控制面板 2选择64位数据源 3添加 4选择sql server 做好配置&#xff0c;下一步 下一步 下一步 测试

聚类算法:K-Means

1.K-Means定义&#xff1a; K-Means是一种无监督的基于距离的聚类算法&#xff0c;简单来说&#xff0c;就是将无标签的样本划分为k个簇&#xff08;or类&#xff09;。它以样本间的距离作为相似性的度量指标&#xff0c;常用的距离有曼哈顿距离、欧几里得距离和闵可夫斯基距离…

html:(1) 登录界面

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><!-- content属性值 :width:可视区域的宽度&#xff0c;值可为数字或关键词device-widthheight:同widthintial-scale:页面首次被显示是可视区域的缩放级别&#x…