HA概述

  1. 所谓HA(high available),即高可用(7*24小时不中断服务)。

  2. 实现高可用最关键的策略是消除单点故障。HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA。

  3. Hadoop2.0之前,在HDFS集群中NameNode存在单点故障(SPOF)。

  4. NameNode主要在以下两个方面影响HDFS集群

    ​ NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启

    ​ NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用

    HDFS HA功能通过配置Active/Standby两个nameNodes实现在集群中对NameNode的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切换到另外一台机器。

HDFS-HA工作机制

​ 通过双namenode消除单点故障

HDFS-HA工作要点

(1)元数据管理方式需要改变:

​ 内存中各自保存一份元数据;

​ Edits日志只有Active状态的namenode节点可以做写操作;

​ 两个namenode都可以读取edits;

​ 共享的edits放在一个共享存储中管理(qjournal和NFS两个主流实现);

(2)需要一个状态管理功能模块

​ 实现了一个zkfailover,常驻在每一个namenode所在的节点,每一个zkfailover负责监控自己所在namenode节点,利用zk进行状态标识,当需要进行状态切换时,由zkfailover来负责切换,切换时需要防止brain split现象的发生。

(3)必须保证两个NameNode之间能够ssh无密码登录。

(4)隔离(Fence),即同一时刻仅仅有一个NameNode对外提供服务

HDFS-HA自动故障转移机制

​ 自动故障转移为HDFS部署增加了两个新组件:ZooKeeperZKFailoverController(ZKFC)进程。ZooKeeper是维护少量协调数据,通知客户端这些数据的改变和监视客户端故障的高可用服务。HA的自动故障转移依赖于ZooKeeper的以下功能:

(1)故障检测:集群中的每个NameNode在ZooKeeper中维护了一个持久会话,如果机器崩溃,ZooKeeper中的会话将终止,ZooKeeper通知另一个NameNode需要触发故障转移。

(2)现役NameNode选择:ZooKeeper提供了一个简单的机制用于唯一的选择一个节点为active状态。如果目前现役NameNode崩溃,另一个节点可能从ZooKeeper获得特殊的排外锁以表明它应该成为现役NameNode。

​ ZKFC是自动故障转移中的另一个新组件,是ZooKeeper的客户端,也监视和管理NameNode的状态。每个运行NameNode的主机也运行了一个ZKFC进程,ZKFC负责:

(1)健康监测:ZKFC使用一个健康检查命令定期地ping与之在相同主机的NameNode,只要该NameNode及时地回复健康状态,ZKFC认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。

(2)ZooKeeper会话管理:当本地NameNode是健康的,ZKFC保持一个在ZooKeeper中打开的会话。如果本地NameNode处于active状态,ZKFC也保持一个特殊的znode锁,该锁使用了ZooKeeper对短暂节点的支持,如果会话终止,锁节点将自动删除。

(3)基于ZooKeeper的选择:如果本地是健康的,且发现没有其它的节点当前持有锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地为。故障转移进程与前面描述的手动故障转移相似,首先如果必要保护之前的现役,然后本地转换为状态。

HDFS-HA集群配置

环境准备

​ 1)修改IP

​ 2)修改主机名及主机名和IP地址的映射

​ 3)关闭防火墙

​ 4)ssh免密登录

​ 5)安装JDK,配置环境变量等

​ 以上步骤可参照如下文章:

https://www.cnblogs.com/ShadowFiend/p/11449593.html

https://www.cnblogs.com/ShadowFiend/p/11450457.html

​ 配置好的三台机器名称分别为:bigdata111,bigdata112,bigdata113;

规划集群

三台机器实现目标:

bigdata111 bigdata112 bigdata113
NameNode NameNode
DataNode DataNode DataNode
JournalNode JournalNode JournalNode
ZK ZK ZK
ZKFC ZKFC

配置Zookeeper集群

​ 可参考如下文章:

​ 搭建zookeeper分布式集群 :https://www.cnblogs.com/ShadowFiend/p/11445756.html

配置HDFS-HA集群

下载包

​ 官方网址:http://hadoop.apache.org/ 找到hadoop安装包下载。

上传包

​ 将下载好的hadoop包上传到/opt/soft/文件夹下;

[root@bigdata111 hadoop]# cd /opt/soft
[root@bigdata111 soft]# rz
解压包

​ 将上传的tar.gz包解压到/opt/module/HA/目录下,如果HA没有,则新建一个目录HA;

[root@bigdata111 module]# mkdir /opt/module/HA
[root@bigdata111 module]# tar -zvxf /opt/soft/hadoop-2.8.4.tar.gz -C /opt/module/HA/
配置hadoop-env.sh

​ 切换目录到/opt/module/HA/hadoop-2.8.4/etc/hadoop目录下,修改hadoop-env.sh;

[root@bigdata111 hadoop]# vi hadoop-env.sh

​ 将JAVA_HOME修改为如下值:

export JAVA_HOME=/opt/module/jdk1.8.0_144
配置core-site.xml

​ 与上面的目录一样,执行vi core-site.xml命令,修改配置;

[root@bigdata111 hadoop]# vi core-site.xml

​ 将Configuration节点修改如下值:

<configuration>
<!-- 把两个NameNode)的地址组装成一个集群mycluster -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property> <!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/HA/hadoop-2.8.4/data</value>
</property>
</configuration>
配置hdfs-site.xml

​ 执行vi hdfs-site.xml命令,修改hdfs配置;

[root@bigdata111 hadoop]# vi hdfs-site.xml

​ 修改Configuration节点:

<configuration>

		<!-- 完全分布式集群名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property> <!-- 集群中NameNode节点都有哪些 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property> <!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>bigdata111:9000</value>
</property> <!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>bigdata112:9000</value>
</property> <!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>bigdata111:50070</value>
</property> <!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>bigdata112:50070</value>
</property> <!-- 指定NameNode元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://bigdata111:8485;bigdata112:8485;bigdata113:8485/mycluster</value>
</property> <!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property> <!-- 使用隔离机制时需要ssh无秘钥登录-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property> <!-- 声明journalnode服务器存储目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/module/HA/hadoop-2.8.4/data/jn</value>
</property> <!-- 关闭权限检查-->
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property> <!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property> </configuration>
修改slaves

​ 执行 vi slaves命令,修改配置;

[root@bigdata111 hadoop]# vi slaves

​ slaves内容如下:

bigdata111
bigdata112
bigdata113
发送其他机器

​ 通过scp命令将/opt/module/HA/hadoop-2.8.4 目录发送到其他两台机器对应HA目录下;

[root@bigdata111 hadoop-2.8.4]# scp -r /opt/module/HA/hadoop-2.8.4/ root@bigdata112:/opt/module/HA/
[root@bigdata111 hadoop-2.8.4]# scp -r /opt/module/HA/hadoop-2.8.4/ root@bigdata113:/opt/module/HA/

启动HDFS-HA集群

启动journalnode服务

​ 在三台机器上,分别输入以下命令启动journalnode服务,可以利用xshell的发送键到所有命令窗口功能;

[root@bigdata111 hadoop-2.8.4]# sbin/hadoop-daemon.sh start journalnode
starting journalnode, logging to /opt/module/HA/hadoop-2.8.4/logs/hadoop-root-journalnode-bigdata111.out
[root@bigdata112 hadoop-2.8.4]# sbin/hadoop-daemon.sh start journalnode
starting journalnode, logging to /opt/module/HA/hadoop-2.8.4/logs/hadoop-root-journalnode-bigdata112.out
[root@bigdata113 hadoop-2.8.4]# sbin/hadoop-daemon.sh start journalnode
starting journalnode, logging to /opt/module/HA/hadoop-2.8.4/logs/hadoop-root-journalnode-bigdata113.out
格式化nn1节点namenode

​ 在bigdata111(nn1)上格式化namenode;

[root@bigdata111 hadoop-2.8.4]# bin/hdfs namenode -format

​ 执行过程中,如果都是INFO,没有ERROR就代表格式化成功了;

​ 启动格式化完毕的namenode;

[root@bigdata111 hadoop-2.8.4]# sbin/hadoop-daemon.sh start namenode
starting namenode, logging to /opt/module/HA/hadoop-2.8.4/logs/hadoop-root-namenode-bigdata111.out
[root@bigdata111 hadoop-2.8.4]# jps
5537 Jps
5460 NameNode
5342 JournalNode
nn2同步nn1的元数据

​ 在bigdata112上同步bigdata111上的namenode元数据;

[root@bigdata112 hadoop-2.8.4]# bin/hdfs namenode -bootstrapStandby
启动nn2

​ 启动bigdata112的namenode

[root@bigdata112 hadoop-2.8.4]# sbin/hadoop-daemon.sh start namenode
starting namenode, logging to /opt/module/HA/hadoop-2.8.4/logs/hadoop-root-namenode-bigdata112.out
[root@bigdata112 hadoop-2.8.4]# jps
4467 Jps
4390 NameNode
4285 JournalNode
查看节点web页面

​ bigdata111对应ip:192.168.1.111 则对应的web:192.168.1.111:50070

​ bigdata111对应ip:192.168.1.111 则对应的web:192.168.1.112:50070

启动所有datanode

​ 启动所有的数据节点;(只需在bigdata111上执行即可)

[root@bigdata111 hadoop-2.8.4]# sbin/hadoop-daemons.sh start datanode
bigdata113: starting datanode, logging to /opt/module/HA/hadoop-2.8.4/logs/hadoop-root-datanode-bigdata113.out
bigdata111: starting datanode, logging to /opt/module/HA/hadoop-2.8.4/logs/hadoop-root-datanode-bigdata111.out
bigdata112: starting datanode, logging to /opt/module/HA/hadoop-2.8.4/logs/hadoop-root-datanode-bigdata112.out
[root@bigdata111 hadoop-2.8.4]# jps
5460 NameNode
5741 DataNode
5821 Jps
5342 JournalNode
将nn1切换为active

​ 将nn1设置为active状态。

[root@bigdata111 hadoop-2.8.4]# bin/hdfs haadmin -transitionToActive nn1

​ web查看状态

命令查看节点状态
[root@bigdata111 hadoop-2.8.4]# bin/hdfs haadmin -getServiceState nn1
active
[root@bigdata111 hadoop-2.8.4]# bin/hdfs haadmin -getServiceState nn2
standby
模拟故障转移

​ 将nn1的节点进程杀死;看是否nn2会切换为active;

[root@bigdata111 hadoop-2.8.4]# jps
5460 NameNode
6023 Jps
5741 DataNode
5342 JournalNode
[root@bigdata111 hadoop-2.8.4]# kill -9 5460
[root@bigdata111 hadoop-2.8.4]# jps
6033 Jps
5741 DataNode
5342 JournalNode
[root@bigdata111 hadoop-2.8.4]# bin/hdfs haadmin -getServiceState nn2
standby

​ 通过结果可以看到,nn2并没有切换为active;所以并未达到自动故障转移目的,下面还有一点配置;

配置HDFS-HA自动故障转移

​ 利用xshell的“发送键到所有命令窗口”功能,同时修改三台机器的配置;

​ 切换到/opt/module/HA/hadoop-2.8.4/etc/hadoop目录下,

修改hdfs-site.xml

[root@bigdata111 hadoop]# vi hdfs-site.xml

​ 在该文件Configuration节点下添加如下语句:

<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>

修改core-site.xml

​ 同样利用xshell的“发送键到所有命令窗口”功能,同时修改三台机器的配置;目录与上面一样;

[root@bigdata111 hadoop]# vi core-site.xml

​ 在Configuration节点添加如下语句:

<property>
<name>ha.zookeeper.quorum</name>
<value>bigdata111:2181,bigdata112:2181,bigdata113:2181</value>
</property>
安装fuser命令

​ linux默认不带fuser命令,安装此命令的目的,是避免HA在主备nn切换执行fuser失败的情况;

​ 利用xshell的“发送键到所有命令窗口”功能,在三台机器同时执行以下命令:

[root@bigdata111 hadoop-2.8.4]# yum -y install psmisc
验证自动故障转移

​ 启动服务

​ (1)关闭所有HDFS服务:

[root@bigdata111 hadoop-2.8.4]# sbin/stop-dfs.sh

​ (2)启动Zookeeper集群:

[root@bigdata111 hadoop-2.8.4]# zkServer.sh start

​ (3)初始化HA在Zookeeper中状态:

[root@bigdata111 hadoop-2.8.4]# bin/hdfs zkfc -formatZK

​ (4)启动HDFS服务:

[root@bigdata111 hadoop-2.8.4]# sbin/start-dfs.sh

​ (5)在各个NameNode节点上启动DFSZK Failover Controller,先在哪台机器启动,哪个机器的NameNode就是Active NameNode

[root@bigdata111 hadoop-2.8.4]# sbin/hadoop-daemon.sh start zkfc

3)验证

​ 将Active状态的NameNode进程kill

[root@bigdata111 hadoop-2.8.4]# jps
16977 DFSZKFailoverController
18257 ResourceManager
16482 JournalNode
16882 QuorumPeerMain
16628 NameNode
18359 NodeManager
19102 Jps
16767 DataNode
[root@bigdata111 hadoop-2.8.4]# bin/hdfs haadmin -getServiceState nn1
active
[root@bigdata111 hadoop-2.8.4]# bin/hdfs haadmin -getServiceState nn2
standby
[root@bigdata111 hadoop-2.8.4]# kill -9 16628
[root@bigdata111 hadoop-2.8.4]# jps
16977 DFSZKFailoverController
18257 ResourceManager
19185 Jps
16482 JournalNode
16882 QuorumPeerMain
18359 NodeManager
16767 DataNode
[root@bigdata111 hadoop-2.8.4]# bin/hdfs haadmin -getServiceState nn2
active

​ 通过以上结果可以看出,已经自动切换新的namenode;

​ 至此,HDFS-HA已经配置成功;

YARN-HA集群配置

YARN-HA工作机制

1)官方文档:

http://hadoop.apache.org/docs/r2.7.2/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html

2)YARN-HA工作机制

配置YARN-HA集群

环境准备

(1)修改IP

(2)修改主机名及主机名和IP地址的映射

(3)关闭防火墙

(4)ssh免密登录

(5)安装JDK,配置环境变量等

(6)配置Zookeeper集群

规划集群

三台机器实现目标
bigdata111 bigdata112 bigdata113
NameNode NameNode
DataNode DataNode DataNode
JournalNode JournalNode JournalNode
ZK ZK ZK
ZKFC ZKFC
ResourceManager ResourceManager
NodeManager NodeManager NodeManager
具体配置

​ 切换到 /opt/module/HA/hadoop-2.8.4/etc/hadoop 目录,修改yarn-site.xml

[root@bigdata111 hadoop]# vi yarn-site.xml
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property> <!--启用resourcemanager ha-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property> <!--声明两台resourcemanager的地址-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster-yarn1</value>
</property> <property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property> <property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>bigdata111</value>
</property> <property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>bigdata112</value>
</property> <!--指定zookeeper集群的地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>bigdata111:2181,bigdata112:2181,bigdata113:2181</value>
</property> <!--启用自动恢复-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property> <!--指定resourcemanager的状态信息存储在zookeeper集群-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
启动HDFS

(1)在各个JournalNode节点上,输入以下命令启动journalnode服务:

[root@bigdata111 hadoop-2.8.4]#  sbin/hadoop-daemon.sh start journalnode

(2)在[nn1]上,对其进行格式化,并启动:

[root@bigdata111 hadoop-2.8.4]#  bin/hdfs namenode -format
[root@bigdata111 hadoop-2.8.4]# sbin/hadoop-daemon.sh start namenode

(3)在[nn2]上,同步nn1的元数据信息:

[root@bigdata112 hadoop-2.8.4]# bin/hdfs namenode -bootstrapStandby

(4)启动[nn2]:

[root@bigdata112 hadoop-2.8.4]# sbin/hadoop-daemon.sh start namenode

(5)启动所有datanode

[root@bigdata112 hadoop-2.8.4]# sbin/hadoop-daemons.sh start datanode

(6)将[nn1]切换为Active

[root@bigdata111 hadoop-2.8.4]#  bin/hdfs haadmin -transitionToActive nn1
启动YARN

(1)在bigdata111中启动yarn集群:

[root@bigdata111 hadoop-2.8.4]# sbin/start-yarn.sh

(2)在bigdata112中启动yarn的rm节点:

[root@bigdata111 hadoop-2.8.4]# sbin/yarn-daemon.sh start resourcemanager

(3)查看服务状态

[root@bigdata111 hadoop-2.8.4]# bin/yarn rmadmin -getServiceState rm1
验证yarn的自动故障迁移

​ (1)查看rm1和rm2的服务状态

[root@bigdata111 hadoop-2.8.4]# bin/yarn rmadmin -getServiceState rm1
active
[root@bigdata111 hadoop-2.8.4]# bin/yarn rmadmin -getServiceState rm2
standby

​ (2)将active状态的rm1的进程杀死

[root@bigdata111 hadoop-2.8.4]# jps
16977 DFSZKFailoverController
18257 ResourceManager
19265 NameNode
16482 JournalNode
16882 QuorumPeerMain
20531 Jps
18359 NodeManager
16767 DataNode
[root@bigdata111 hadoop-2.8.4]# kill -9 18257
[root@bigdata111 hadoop-2.8.4]# jps
16977 DFSZKFailoverController
19265 NameNode
16482 JournalNode
16882 QuorumPeerMain
18359 NodeManager
20541 Jps
16767 DataNode

​ (3)查看rm2的服务状态(注意:yarn的故障迁移有时间延迟,大概5秒左右再查看状态

​ 由下图可见,立即查看rm2时,并未及时更换rourcemanager节点;

​ 5秒后,再运行就可以看到状态发生了改变;

[root@bigdata111 hadoop-2.8.4]# bin/yarn rmadmin -getServiceState rm2
standby
[root@bigdata111 hadoop-2.8.4]# bin/yarn rmadmin -getServiceState rm2
active

​ 至此,YARN-HA 就搭建成功了。

【Zookeeper】利用zookeeper搭建Hdoop HA高可用的更多相关文章

  1. Zookeeper(四)Hadoop HA高可用集群搭建

    一.高可就集群搭建 1.集群规划 2.集群服务器准备 (1) 修改主机名(2) 修改 IP 地址(3) 添加主机名和 IP 映射(4) 同步服务器时间(5) 关闭防火墙(6) 配置免密登录(7) 安装 ...

  2. 七、Hadoop3.3.1 HA 高可用集群QJM (基于Zookeeper,NameNode高可用+Yarn高可用)

    目录 前文 Hadoop3.3.1 HA 高可用集群的搭建 QJM 的 NameNode HA Hadoop HA模式搭建(高可用) 1.集群规划 2.Zookeeper集群搭建: 3.修改Hadoo ...

  3. Hadoop HA高可用集群搭建(Hadoop+Zookeeper+HBase)

    声明:作者原创,转载注明出处. 作者:帅气陈吃苹果 一.服务器环境 主机名 IP 用户名 密码 安装目录 master188 192.168.29.188 hadoop hadoop /home/ha ...

  4. linux -- 基于zookeeper搭建yarn的HA高可用集群

    linux -- 基于zookeeper搭建yarn的HA高可用集群 实现方式:配置yarn-site.xml配置文件 <configuration> <property> & ...

  5. Hadoop 3.1.2(HA)+Zookeeper3.4.13+Hbase1.4.9(HA)+Hive2.3.4+Spark2.4.0(HA)高可用集群搭建

    目录 目录 1.前言 1.1.什么是 Hadoop? 1.1.1.什么是 YARN? 1.2.什么是 Zookeeper? 1.3.什么是 Hbase? 1.4.什么是 Hive 1.5.什么是 Sp ...

  6. hadoop 集群HA高可用搭建以及问题解决方案

    hadoop 集群HA高可用搭建 目录大纲 1. hadoop HA原理 2. hadoop HA特点 3. Zookeeper 配置 4. 安装Hadoop集群 5. Hadoop HA配置 搭建环 ...

  7. centos7搭建hadoop2.10高可用(HA)

    本篇介绍在centos7中搭建hadoop2.10高可用集群,首先准备6台机器:2台nn(namenode);4台dn(datanode):3台jns(journalnodes) IP hostnam ...

  8. Flink 集群搭建,Standalone,集群部署,HA高可用部署

    基础环境 准备3台虚拟机 配置无密码登录 配置方法:https://ipooli.com/2020/04/linux_host/ 并且做好主机映射. 下载Flink https://www.apach ...

  9. HA高可用的搭建

    HA 即 (high available)高可用,又被叫做双机热备,用于关键性业务. 简单理解就是,有两台机器A和B,正常是A提供服务,B待命闲置,当A宕机或服务宕掉,会切换至B机器继续提供服务.常用 ...

随机推荐

  1. barcode模块: plus.barcode.scan 进行扫描图片出现无法识别二维码,打印的错误信息是code:8,message:''

    原因之一:图片的像素太大了,无法识别. 解决方法: 压缩一下图片. 这里的 data 我放了一个  像素为 4040 × 4040 的 图片. 进行识别的时候会报, (无法识别的图片,都是返回这些值) ...

  2. Ubuntu14版桌面突然卡住怎么办

    参考:https://blog.csdn.net/hautxuhaihu/article/details/78924926 (1)ctrl+alt+f1...6进入命令行终端.用户名,密码登录. (2 ...

  3. Qt disconnect函数

    1. 介绍disconnect()用法 disconnect()有3种用法,其原型如下: bool QObject::disconnect(const QObject * sender, const ...

  4. EasyLogging++学习笔记(1)—— 简要介绍

    对于有开发经验的程序员来说,记录程序执行日志是一件必不可少的事情.通过查看和分析日志信息,不仅可以有效地帮助我们调试程序,而且当程序正式发布运行之后,更是可以帮助我们快速.准确地定位问题.在现在这个开 ...

  5. yii框架学习(获取插入后的id)

    插入单条数据, 获取插入数据的id. $model->attributes['id']; new  model 添加数据的时候, 需要注意, 如果是想要循环添加多条数据的情况, new mode ...

  6. nginx 端口转发 (proxy_pass反向代理)

    第一种(访问IP转发到IP+端口) server{ listen ; server_name 192.168.1.114; index index.php index.html index.htm; ...

  7. 【poj1733】Parity game--边带权并查集

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15776   Accepted: 5964 Description Now ...

  8. Digit Division(排列组合+思维)(Gym 101480D )

    题目链接:Central Europe Regional Contest 2015 Zagreb, November 13-15, 2015 D.Digit Division(排列组合+思维) 题解: ...

  9. P1359 租用游艇 && P3905 道路重建 ------Floyd算法

    P1359 租用游艇   原题链接https://www.luogu.org/problemnew/show/P1359 P3905 道路重建   原题链接https://www.luogu.org/ ...

  10. AcWing:178. 第K短路(A*)

    给定一张N个点(编号1,2…N),M条边的有向图,求从起点S到终点T的第K短路的长度,路径允许重复经过点或边. 注意: 每条最短路中至少要包含一条边. 输入格式 第一行包含两个整数N和M. 接下来M行 ...