图数据库nebula——搭建docker完全分布式集群

2023-12-27 05:20

本文主要是介绍图数据库nebula——搭建docker完全分布式集群,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1、集群架构:

2、服务器:

3、修改主机名称:

4、搭建docker环境:

5、搭建docker私有镜像仓库:

6、搭建docker的overlay网络:

7、创建overlay网络:

8、准备meta服务配置文件:

(1)获取meta默认配置文件:

(2)配置文件使用方式:

(3)修改meta配置文件参数:

① 增加参数local_config:

② 修改参数meta_server_addrs:

③ 修改参数local_ip:

④ 修改参数data_path:

⑤ 修改参数log_dir:

⑥ 默认参数ws_ip:

⑦ 默认参数port:

⑧ 默认参数ws_http_port:

⑨ 默认参数v:

⑩ 默认参数minloglevel:

9、准备graph服务配置文件:

(1)获取graph默认配置文件:

(2)配置文件使用方式:

(3)修改graph配置文件参数:

① 增加参数增加参数local_config:

② 修改参数meta_server_addrs:

③ 修改参数local_ip:

④ 修改参数log_dir:

⑤ 默认参数ws_ip:

⑥ 默认参数port:

⑦ 默认参数ws_http_port:

⑧ 默认参数v:

⑨ 默认参数minloglevel:

10、准备storage服务配置文件:

(1)获取storage默认配置文件:

(2)配置文件使用方式:

(3)修改storage配置文件参数:

① 增加参数local_config:

② 修改参数meta_server_addrs:

③ 修改参数local_ip:

④ 修改参数data_path:

⑤ 默认参数ws_ip:

⑥ 默认参数port:

⑦ 默认参数ws_http_port:

⑧ 默认参数log_dir:

⑨ 默认参数v:

⑩ 默认参数minloglevel:

11、构建nebula容器:

(1)下载nebula镜像:

① 下载meta镜像:

② 下载graph镜像:

③ 下载storage镜像:

(2)创建nebula持久化目录:

① 创建meta持久化目录:

② 创建graph持久化目录:

③ 创建storage持久化目录:

(3)上传各服务配置文件:

① 上传meta配置文件:

② 上传graph配置文件:

③ 上传storage配置文件:

(4)编写nebula容器构建命令:

① 编写meta容器构建命令:

② 编写graph容器构建命令:

③ 编写storage容器构建命令:

(5)构建nebula容器:

① 构建meta容器:

② 构建graph容器:

③ 构建storage容器:

12、操作集群:

(1)启动集群:

① 启动meta服务:

② 启动graph服务:

③ 启动storage服务:

(2)停止集群:

① 停止meta服务:

② 停止graph服务:

③ 停止storage服务:

(3)重启集群:

① 重启meta服务:

② 重启graph服务:

③ 重启storage服务:

13、检查集群:

14、监控指标:

(1)监控指标说明:

(2)监控指标查询:

(3)监控指标示例:

① 查询meta指标:

② 查询graph指标:

③ 查询storage指标:

15、发现bug:


1、集群架构:

Nebula集群分为测试集群、生产集群,不同环境的集群对应的服务数量不同,大致如下:

集群类别

Meta服务

Graph服务

Storage服务

测试集群

1

>=1

>=1

生产集群

3

>=3

>=3

测试环境一般是3台服务器,可以按照如下配置搭建:

服务器

Meta服务

Graph服务

Storage服务

服务器A

1

1

1

服务器B

1

1

服务器C

1

1

生产环境一般是5台服务器,可以按照如下配置搭建:

服务器

Meta服务

Graph服务

Storage服务

服务器A

1

1

1

服务器B

1

1

1

服务器C

1

1

1

服务器D

1

1

服务器E

1

1

2、服务器:

本地虚拟机采用4台服务器,由于使用docker,所以服务器内核要求在3.8以上,建议3.10及以上,搭建测试集群:

服务器IP

Etcd端口号

Nebula集群节点

Meta端口号

Graph端口号

Storage端口号

192.168.137.111

2379

192.168.137.112

9559

9669

9779

192.168.137.113

9669

9779

192.168.137.114

9669

9779

3、修改主机名称:

在集群所有节点上,进行如下操作:

修改/etc/hostname文件,修改对应的名称为主机名称,主机名称不能重复。

然后重新启动服务器。

4、搭建docker环境:

在集群所有节点上,进行如下操作:

安装docker环境,操作步骤可见:

通过yum安装docker操作步骤:https://blog.csdn.net/LSY_CSDN_/article/details/116889227

无网环境安装docker操作步骤:https://blog.csdn.net/LSY_CSDN_/article/details/116889325

5、搭建docker私有镜像仓库:

生产环境建议搭建docker私有镜像仓库,可以使用docker通过registry镜像搭建私有仓库或者使用harbor搭建私有仓库。

本地测试就不搭建私有镜像仓库了。

搭建registry私有镜像仓库操作步骤https://blog.csdn.net/LSY_CSDN_/article/details/118597226

搭建harbor私有镜像仓库操作步骤:https://blog.csdn.net/LSY_CSDN_/article/details/118814588

6、搭建docker的overlay网络:

在etcd服务器上进行如下操作:

搭建docker的overlay网络操作步骤:https://blog.csdn.net/LSY_CSDN_/article/details/120065860

7、创建overlay网络:

在集群任意一个节点上,创建容器overlay网络即可:

执行命令:

docker network create -d overlay net-docker-nebula

8、准备meta服务配置文件:

配置文件下载地址:https://download.csdn.net/download/LSY_CSDN_/21887583

(1)获取meta默认配置文件:

可以通过获取自备的meta默认配置文件,如果没有自备的默认配置文件,可以通过rpm安装一个nebula然后在/usr/local/nebula/etc中找到nebula-metad.conf默认配置文件,或者可以利用docker启动一个meta容器,然后进入容器在/etc文件夹中找到nebula-metad.conf默认配置文件。

(2)配置文件使用方式:

首次启动时,Meta服务会从配置文件nebula-metad.conf中读取配置信息。您需要把初始配置文件的后缀.default或.production删除,Meta服务才能将其识别为配置文件。

如果修改了配置文件,希望新配置生效,请在配置文件开头添加--local_config=true再重启服务,否则会从缓存中读取过期配置。

(3)修改meta配置文件参数:

① 增加参数local_config:

在配置文件第一行,增加参数:--local_config=true。

② 修改参数meta_server_addrs:

全部Meta服务的IP地址和端口。多个Meta服务用英文逗号(,)分隔。预设值:127.0.0.1:9559。

③ 修改参数local_ip:

Meta服务的本地IP地址。本地IP地址用于识别nebula-metad进程,如果是分布式集群或需要远程访问,请修改为对应地址。预设值:127.0.0.1。建议修改为容器名称,而不写具体的IP地址。

例如:--local_ip=nebula-meta-01

④ 修改参数data_path:

meta数据存储路径。预设值:data/meta。

⑤ 修改参数log_dir:

存放Meta服务日志的目录,建议和数据保存在不同硬盘。预设值:logs。

⑥ 默认参数ws_ip:

HTTP服务的IP地址。预设值:0.0.0.0。因为在容器中,外部访问,建议使用默认值即可。

⑦ 默认参数port:

Meta服务的RPC守护进程监听端口。Meta服务对外端口为9559,对内端口为对外端口+1,即9560,Nebula Graph使用内部端口进行多副本间的交互。预设值:9559。

⑧ 默认参数ws_http_port:

HTTP服务的端口。预设值:19559。

⑨ 默认参数v:

日志详细级别,值越大,日志记录越详细。可选值为0、1、2、3。预设值:0。

⑩ 默认参数minloglevel:

最小日志级别,即不会记录低于这个级别的日志。可选值为0(INFO)、1(WARNING)、2(ERROR)、3(FATAL)。建议您在调试时设置为0,生产环境中设置为1。如果设置为4,Nebula Graph不会记录任何日志。预设值:0。

9、准备graph服务配置文件:

配置文件下载地址:https://download.csdn.net/download/LSY_CSDN_/21887583

(1)获取graph默认配置文件:

可以通过获取自备的graph默认配置文件,如果没有自备的默认配置文件,可以通过rpm安装一个nebula然后在/usr/local/nebula/etc中找到nebula-graphd.conf默认配置文件,或者可以利用docker启动一个graph容器,然后进入容器在/etc文件夹中找到nebula-graphd.conf默认配置文件。

(2)配置文件使用方式:

首次启动时,Graph服务会从配置文件nebula-graphd.conf中读取配置信息。您需要把初始配置文件的后缀.default或.production删除,Graph服务才能将其识别为配置文件。

如果修改了配置文件,希望新配置生效,请在配置文件开头添加--local_config=true再重启服务,否则会从缓存中读取过期配置。

(3)修改graph配置文件参数:

① 增加参数增加参数local_config:

在配置文件第一行,增加参数:--local_config=true。

② 修改参数meta_server_addrs:

全部Meta服务的IP地址和端口。多个Meta服务用英文逗号(,)分隔。预设值:127.0.0.1:9559。

③ 修改参数local_ip:

Graph服务的本地IP地址。本地IP地址用于识别nebula-graphd进程,如果是分布式集群或需要远程访问,请修改为对应地址。预设值:127.0.0.1。建议修改为容器名称,而不写具体的IP地址。

例如:--local_ip=nebula-graph-01

④ 修改参数log_dir:

存放Graph服务日志的目录,建议和数据保存在不同硬盘。预设值:logs。

⑤ 默认参数ws_ip:

HTTP服务的IP地址。预设值:0.0.0.0。因为在容器中,外部访问,建议使用默认值即可。

⑥ 默认参数port:

Graph服务的RPC守护进程监听端口。预设值:9669。

⑦ 默认参数ws_http_port:

HTTP服务的端口。预设值:19669。

⑧ 默认参数v:

日志详细级别,值越大,日志记录越详细。可选值为0、1、2、3。预设值:0。

⑨ 默认参数minloglevel:

最小日志级别,即不会记录低于这个级别的日志。可选值为0(INFO)、1(WARNING)、2(ERROR)、3(FATAL)。建议您在调试时设置为0,生产环境中设置为1。如果设置为4,Nebula Graph不会记录任何日志。预设值:0。

10、准备storage服务配置文件:

配置文件下载地址:https://download.csdn.net/download/LSY_CSDN_/21887583

(1)获取storage默认配置文件:

可以通过获取自备的storage默认配置文件,如果没有自备的默认配置文件,可以通过rpm安装一个nebula然后在/usr/local/nebula/etc中找到nebula-storaged.conf默认配置文件,或者可以利用docker启动一个storage容器,然后进入容器在/etc文件夹中找到nebula-storaged.conf默认配置文件。

(2)配置文件使用方式:

首次启动时,Storage服务会从配置文件nebula-storaged.conf中读取配置信息。您需要把初始配置文件的后缀.default或.production删除,Storage服务才能将其识别为配置文件。

如果修改了配置文件,希望新配置生效,请在配置文件开头添加--local_config=true再重启服务,否则会从缓存中读取过期配置。

(3)修改storage配置文件参数:

① 增加参数local_config:

在配置文件第一行,增加参数:--local_config=true。

② 修改参数meta_server_addrs:

全部Meta服务的IP地址和端口。多个Meta服务用英文逗号(,)分隔。预设值:127.0.0.1:9559。

③ 修改参数local_ip:

Storage服务的本地IP地址。本地IP地址用于识别nebula-storaged进程,如果是分布式集群或需要远程访问,请修改为对应地址。预设值:127.0.0.1。建议修改为容器名称,而不写具体的IP地址。

例如:--local_ip=nebula-storage-01

④ 修改参数data_path:

数据存储路径,多个路径用英文逗号(,)分隔。一个RocksDB实例对应一个路径。预设值:data/storage

⑤ 默认参数ws_ip:

HTTP服务的IP地址。预设值:0.0.0.0。因为在容器中,外部访问,建议使用默认值即可。

⑥ 默认参数port:

Storage服务的RPC守护进程监听端口。Storage服务对外端口为9779,对内端口为9777、9778和9780,Nebula Graph使用内部端口进行多副本间的交互。预设值:9779。

⑦ 默认参数ws_http_port:

HTTP服务的端口。预设值:19779。

⑧ 默认参数log_dir:

存放Storage服务日志的目录,建议和数据保存在不同硬盘。预设值:logs。

⑨ 默认参数v:

日志详细级别,值越大,日志记录越详细。可选值为0、1、2、3。预设值:0。

⑩ 默认参数minloglevel:

最小日志级别,即不会记录低于这个级别的日志。可选值为0(INFO)、1(WARNING)、2(ERROR)、3(FATAL)。建议您在调试时设置为0,生产环境中设置为1。如果设置为4,Nebula Graph不会记录任何日志。预设值:0。

11、构建nebula容器:

(1)下载nebula镜像:

在集群所有节点上,根据服务的需要,下载对应服务的镜像包。

① 下载meta镜像:

执行命令:

docker pull vesoft/nebula-metad:v2.0.0

② 下载graph镜像:

执行命令:

docker pull vesoft/nebula-graphd:v2.0.0

③ 下载storage镜像:

执行命令:

docker pull vesoft/nebula-storaged:v2.0.0

(2)创建nebula持久化目录:

在集群所有节点上,根据服务的需要,创建持久化目录。

① 创建meta持久化目录:

创建数据持久化目录:

执行命令:

mkdir -p /wocloud/soft/nebula/meta/data

创建日志持久化目录:

执行命令:

mkdir -p /wocloud/soft/nebula/meta/logs

创建配置文件持久化目录:

执行命令:

mkdir -p /wocloud/soft/nebula/meta/conf

② 创建graph持久化目录:

创建日志持久化目录:

执行命令:

mkdir -p /wocloud/soft/nebula/graph/logs

创建配置文件持久化目录:

执行命令:

mkdir -p /wocloud/soft/nebula/graph/conf

③ 创建storage持久化目录:

创建数据持久化目录:

执行命令:

mkdir -p /wocloud/soft/nebula/storage/data

创建日志持久化目录:

执行命令:

mkdir -p /wocloud/soft/nebula/storage/logs

创建配置文件持久化目录:

执行命令:

mkdir -p /wocloud/soft/nebula/storage/conf

(3)上传各服务配置文件:

在集群所有节点上,根据服务的需要,上传对应服务配置文件。

① 上传meta配置文件:

将meta配置文件上传到对应服务器的配置文件持久化目录中。

② 上传graph配置文件:

将graph配置文件上传到对应服务器的配置文件持久化目录中。

③ 上传storage配置文件:

将storage配置文件上传到对应服务器的配置文件持久化目录中。

(4)编写nebula容器构建命令:

① 编写meta容器构建命令:

docker run -d --name nebula-meta-01 \-p 9559:9559 -p 19559:19559 \--restart=always \-v /wocloud/soft/nebula/meta/data:/usr/local/nebula/data/meta \-v /wocloud/soft/nebula/meta/logs:/usr/local/nebula/logs \-v /wocloud/soft/nebula/meta/conf/nebula-metad.conf:/usr/local/nebula/etc/nebula-metad.conf \--network net-docker-nebula \vesoft/nebula-metad:v2.0.0

说明:不同服务器上构建meta容器命令不一样,将容器名称修改一下。

② 编写graph容器构建命令:

docker run -d --name nebula-graph-01 \-p 9669:9669 -p 19669:19669 \--restart=always \-v /wocloud/soft/nebula/graph/data:/usr/local/nebula/data/meta \-v /wocloud/soft/nebula/graph/logs:/usr/local/nebula/logs \-v /wocloud/soft/nebula/graph/conf/nebula-graphd.conf:/usr/local/nebula/etc/nebula-graphd.conf \--network net-docker-nebula \vesoft/nebula-graphd:v2.0.0

说明:不同服务器上构建graph容器命令不一样,将容器名称修改一下。

③ 编写storage容器构建命令:

docker run -d --name nebula-storage-01 \-p 9779:9779 -p 19779:19779 \--restart=always \-v /wocloud/soft/nebula/storage/data:/usr/local/nebula/data/meta \-v /wocloud/soft/nebula/storage/logs:/usr/local/nebula/logs \-v /wocloud/soft/nebula/storage/conf/nebula-storaged.conf:/usr/local/nebula/etc/nebula-storaged.conf \--network net-docker-nebula \vesoft/nebula-storaged:v2.0.0

说明:不同服务器上构建storage容器命令不一样,将容器名称修改一下。

(5)构建nebula容器:

在集群所有节点上,根据服务的需要,构建对应服务容器。

① 构建meta容器:

执行构建meta容器的命令。

② 构建graph容器:

执行构建graph容器的命令。

③ 构建storage容器:

执行构建storage容器的命令。

12、操作集群:

(1)启动集群:

在集群的各个节点上启动对应的服务即可。

① 启动meta服务:

找到meta服务的容器ID,然后进行操作:

执行命令:docker start 容器ID

② 启动graph服务:

找到graph服务的容器ID,然后进行操作:

执行命令:docker start 容器ID

③ 启动storage服务:

找到storage服务的容器ID,然后进行操作:

执行命令:docker start 容器ID

(2)停止集群:

在集群的各个节点上停止对应的服务即可。

① 停止meta服务:

找到meta服务的容器ID,然后进行操作:

执行命令:docker stop 容器ID

② 停止graph服务:

找到graph服务的容器ID,然后进行操作:

执行命令:docker stop 容器ID

③ 停止storage服务:

找到storage服务的容器ID,然后进行操作:

执行命令:docker stop 容器ID

(3)重启集群:

在集群的各个节点上重启对应的服务即可。

① 重启meta服务:

找到meta服务的容器ID,然后进行操作:

执行命令:docker restart 容器ID

② 重启graph服务:

找到graph服务的容器ID,然后进行操作:

执行命令:docker restart 容器ID

③ 重启storage服务:

找到storage服务的容器ID,然后进行操作:

执行命令:docker restart 容器ID

13、检查集群:

连接到集群的任意一个Graph服务,查看集群状态。

执行命令nGql命令:SHOW HOSTS。

14、监控指标:

(1)监控指标说明:

Nebula Graph的每个监控指标都由三个部分组成,中间用英文句号(.)隔开,例如num_queries.sum.600。不同的Nebula Graph服务支持查询的监控指标也不同。示例指标结构的说明如下:

类别

示例

说明

指标名称

num_queries

简单描述指标的含义。

统计类型

sum

指标统计的方法。当前支持SUM、COUNT、AVG、RATE和P分位数(P75、P95、P99、P99.9)。

统计时间

600

指标统计的时间范围,当前支持5秒、60秒、600秒和3600秒,分别表示最近5秒、最近1分钟、最近10分钟和最近1小时。

(2)监控指标查询:

通过HTTP端口查询监控指标语法如下:

curl -G "http://<ip>:<port>/stats?stats=<metric_name_list> [&format=json]"

参数含义:

选项

说明

ip

服务器的IP地址,可以在安装目录内查看配置文件获取。

port

服务器的HTTP端口,可以在安装目录内查看配置文件获取。默认情况下,Meta服务端口为19559,Graph服务端口为19669,Storage服务端口为19779。

metric_name_list

监控指标名称,多个监控指标用英文逗号(,)隔开。

&format=json

将结果以JSON格式返回。

(3)监控指标示例:

① 查询meta指标:

不指定查询某个监控指标时,会返回该服务器上所有的监控指标。查询请求示例:

curl -G "http://192.168.137.112:19559/stats"

结果示例:

value=231name=heartbeat_latency_us.avg.5value=143name=heartbeat_latency_us.avg.60value=165name=heartbeat_latency_us.avg.600value=173name=heartbeat_latency_us.avg.3600

② 查询graph指标:

不指定查询某个监控指标时,会返回该服务器上所有的监控指标。查询请求示例:

curl -G "http://192.168.137.112:19669/stats"

结果示例:

value=0name=slow_query_latency_us.avg.5value=0name=slow_query_latency_us.avg.60value=0name=slow_query_latency_us.avg.600value=0name=slow_query_latency_us.avg.3600value=0name=slow_query_latency_us.p75.5value=0name=slow_query_latency_us.p75.60value=0name=slow_query_latency_us.p75.600value=0name=slow_query_latency_us.p75.3600value=0name=slow_query_latency_us.p95.5value=0name=slow_query_latency_us.p95.60value=0name=slow_query_latency_us.p95.600value=0name=slow_query_latency_us.p95.3600

③ 查询storage指标:

不指定查询某个监控指标时,会返回该服务器上所有的监控指标。查询请求示例:

curl -G "http://192.168.137.112:19779/stats"

结果示例:

value=0name=num_lookup_errors.rate.5value=0name=num_lookup_errors.rate.60value=0name=num_lookup_errors.rate.600value=0name=num_lookup_errors.rate.3600value=0name=num_lookup_errors.sum.5value=0name=num_lookup_errors.sum.60value=0name=num_lookup_errors.sum.600value=0name=num_lookup_errors.sum.3600

15、发现bug:

发现一个bug,etcd和docker所在服务器同时重新启动,启动后docker上连接overlay的容器启动不了了,需要将原有的docker中的overlay网络删除后,重新创建一个overlay网络,然后通过命令修改容器使用最新创建的overlay网络,才可以正常启动。暂时不知道什么原因,待以后再处理。

这篇关于图数据库nebula——搭建docker完全分布式集群的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/542000

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

HDFS—集群扩容及缩容

白名单:表示在白名单的主机IP地址可以,用来存储数据。 配置白名单步骤如下: 1)在NameNode节点的/opt/module/hadoop-3.1.4/etc/hadoop目录下分别创建whitelist 和blacklist文件 (1)创建白名单 [lytfly@hadoop102 hadoop]$ vim whitelist 在whitelist中添加如下主机名称,假如集群正常工作的节

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;