linux配置部署elasticsearch集群(虚拟机、docker)_groupadd elastic && useradd elastic -g elastic -p -程序员宅基地

技术标签: elasticsearch  linux  系统架构  docker  

ES集群搭建

一、环境准备

  1. JDK 配置。

        略

    2. elasticsearch7.X开始需要java11,通常我们用jdk1.8作为共有环境变量,我们可以不安装 jdk11版本 。但启动会报错,因为与现有环境变量冲突。

敲黑板:

es安装包包含一个相匹配的 JAVA 版本,只需修改配置文件。修改启动脚本/bin/elasticsearch使用自带jdk。亲测不好使没找到原因,启动总是提示找不到JAVA_HOME。所以自己下了一个jdk11。修改/bin/elasticsearch-env文件,在判断JAVA_HOME那块逻辑前指定ES_JAVA_HOME=xxx/xxx/jdk11,可不用配置PATH。或者直接在启动脚本/bin/elasticsearch 增加export JAVA_HOME= xxx/xxx/jdk11

二、操作步骤

  1. 下载解压

tar zxvf elasticsearch-7.XX.X.tar.gz

curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.1.tar.gzwget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.15.0-linux-x86_64.tar.gz

rpm安装Install Elasticsearch with RPM | Elasticsearch Guide [5.0] | Elastic

下载后执行rpm -ivh elasticsearch-6.8.0.rpm(rpm的方式)

2.新建ES用户组(可选)、用户及密码(启动ES 不能是ROOT权限)

groupadd elastic useradd elasticuser -g elastic
  passwd elasticuser xxxxxxxx

为用户赋权限

chown -R elasticuser: elastic /usr/local/elasticsearch

切换用户su elasticuser,(不要root用户,注意logsdataconfig等文件夹的权限)

3.规划目录修改配置。(目录换到不属于root目录)详见配置。

启动ES ./bin/elasticsearch -d-d 后台启动),或nohup /opt/elastic/bin/elasticsearch > /var/elastic/es.log >&1 & 启动后访问https://ip:port正常。

4.集群启动验证

停掉进程,复制文件(集群),然后修改配置中对应端口、地址等信息(详见配置)。再逐个启动。启动后调用curl http://ip:port/_cat/nodes?v 查看集群状态

或直接http://ip:port网页访问,若访问不到可能是防火墙拦截。

踩坑:

集群启动异常,类似找不到主节点、脑裂等异常(类似master not discovered yet, this node has not previously joined a bootstrappe这种)可能是之前配置了不同nodes数据,后面再修改,但此时data目录缓存了数据,导致加载了旧的节点信息。所以需要把data目录es自动生成的node目录删除掉。(前提是你的host等配置没配错)

5.安全设置(可选)

创建keystore bin/elasticsearch-keystore create

添加keystore bin/elasticsearch-keystore add xxx

删除keystore bin/elasticsearch-keystore remove xxx

三、配置

1JVM配置config/jvm.options(高版本)

修改JVM内存,配置原则:

(1)Xmx和Xms大小设置成一样;(默认2g)
(2)不超过物理机内存的一半;
(3)最大不宜超过30G

敲黑板:

这里卡了很久,启动后无启动日志,开始还有进程存在,后来没了。研究好久发现自己虚拟机设置内存才2g,es默认2g,配置改成516m1g报内存溢出)启动成功。

垃圾收集器修改:

-XX:+UseConcMarkSweepGC 改为 -XX:+UseG1GC(限高版本,G1需要jdk10以上)

内存配置 bin/elasticsearch.in.sh(低版本才有)

ES_MIN_MEMES_MAX_MEM=2g参考数据量和当前机器内存,值相同。参考1

2.基本信息配置 config/elasticsearch.yml

http.port: 9001
transport.tcp.port: 9101
node.master: true
cluster.name: "es_cluster"
node.name: "es-01"
path.data: /home/elasticuser/cluster/elasticSearch-cluster/elasticsearch01/data
node.data: true
path.log: /home/elasticuser/cluster/elasticSearch-cluster/elasticsearch01/logs
network.host: xx.xx.xxx
discovery.seed_hosts: ["xx.xx.xx:9101","xx.xx.xx.128:9202","xx.xx.xx:9303"]
http.cors.enabled: true 
http.cors.allow-origin: "*"  
discovery.zen.minimum_master_nodes: 2
discovery.zen.fd.ping_interval: 1s
discovery.zen.fd.ping_timeout: 30s
discovery.zen.fd.ping_retries: 3
transport.tcp.compress: false                                                              
bootstrap.memory_lock: true     
cluster.initial_master_nodes: discovery.seed_hosts: ["es-01","es-02","es-03"]

(可选择修改配置目录,修改配置环境变量ES_PATH_CONF=/path/to/my/config ./bin/elasticsearch

必配:

http.port=8080

transport.tcp.port8081

Cluster.name=XXXX(各节点一致、唯一)

node.name: XXX(各节点不同,egnode-02

node.master: true (设置主节点,都为true都是master候选人,可选)

path.data=  /data/elasticsearch (索引位置,多个,分割)

node.data: true

Path.logs: xx/xx/log/

network.host: 127.0.0.1(自身IP

bootstrap.memory_lock: true(配置保护Elasticsearch使用的内存, 请求JVM在内存中锁定堆。可选,若选true需修改后续的系统配置/system.conf limits.conf

discovery.seed_hosts: [“IP:tcp端口”,” IP:tcp端口”] (集群中master节点的初始列表,“,”分割。自动发现机制,各节点都是。discovery.zen.ping.unicast.hosts是低版本用的)


cluster.initial_master_nodes: ["node-01","node-02","node-03"](设置全新群集中符合主机资格的节点的初始集合,首次启动集群时需要)

选配:

discovery.zen.minimum_master_nodes: 2(举Maste时需要的节点数,三节点时为2防止脑裂)

discovery.zen.fd.ping_interval: 1s(一个节点多久ping一次,默认)

discovery.zen.fd.ping_timeout: 30s(等待ping返回时间,默认)

discovery.zen.fd.ping_retries: 3ping超时重试次数,默认)

index.number_of_shards: 5(设置默认索引分片个数,默认)

index.number_of_replicas: 1(设置默认索引副本个数,默认)

#head插件用
http.cors.enabled: true (是否支持跨域)
http.cors.allow-origin: "*" 
(域名限制 *不限制)

敲黑板:

elasticsearch5.X以上不支持包含索引级别的设置,即index开头的配置去掉。配置后会启动报错。

transport.tcp.compress: false(是否压缩tcp传输时的数据,默认为false,不压缩)                                                              

bootstrap.memory_lock: true锁定物理内存地址,防止es内存被交换出去,调优用                 

3.日志配置 config/logging.ymllog4j2.properties(可选)

主要说明如下:(具体参考log4j配置)

${sys:es.logs.base_path} 解析为日志目录

${sys:es.logs.cluster_name} 解析为集群名称

${sys:es.logs.node_name} 解析为节点名称

${sys:file.separator} 将被解析为路径分隔符

appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.json.gz(文件压缩后名称)

appender.rolling.policies.time.type = TimeBasedTriggeringPolicy(时间滚动策略)

appender.rolling.policies.time.interval = 1(每天滚动)

appender.rolling.policies.time.modulate = true(以天为标准输出日志)

appender.rolling.policies.size.type = SizeBasedTriggeringPolicy(基于大小滚动策略)

appender.rolling.policies.size.size = 256MB(大小滚动的阈值)

appender.rolling.strategy.type = DefaultRolloverStrategy(滚动删除策略)

appender.rolling.strategy.action.type = Delete(处理类型,删除)

appender.rolling.strategy.action.condition.nested_condition.type = IfAccumulatedFileSize (删除条件)

appender.rolling.strategy.action.condition.nested_condition.exceeds = 2GB(删除条件)

5.系统配置

能打开的最大文件描述符个数配置。ulimit -a查看max_file_descriptors参数(32K~64K65535

vim /etc/security/limits.conf

用户名 -  nofile  65535(只es用户生效)

用户名 -  nproc  32000(只es用户生效)

内存配置。/etc/systemd/system.conf(可选)
DefaultLimitMEMLOCK=infinity(若bootstrap.memory_lock为true需添加此项)

6、手动安装非.deb或.rpm包安装需配置。
root身份执行sysctl vm.max_map_count=262144;
永久设置此值:修改文件vim /etc/sysctl.conf增加一行配置vm.max_map_count = 262144。
vm.swappiness = 1
最后执行sysctl -p使其生效。
sysctl vm.max_map_count查看结果。

四、ES插件安装(可选)

1elasticsearch-analysis-ik中分分词器安装

https://github.com/medcl/elasticsearch-analysis-ik

mavengit环境支持,yum install -y mavenyum install -y git

git clone https://github.com/medcl/elasticsearch-analysis-ik.git

cd elasticsearch-analysis-ik/

mvn package

CP分词器jar包至xxx/elasticsearch/plugins/ik/下并解压,重启ES

或直接执行./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.3.1/elasticsearch-analysis-ik-7.3.1.zip

2.elasticsearch-head插件安装(可选)

https://www.cnblogs.com/keystone/p/13266528.html

# yum install -y npm

# git clone git://github.com/mobz/elasticsearch-head.git

# cd elasticsearch-head

# npm install

# npm run start

直接http://ip:port访问es即可

五、KIBANA安装

1、下载解压,版本与ES对应。

Wget https://artifacts.elastic.co/downloads/kibana/kibana-7.15.0-x86_64.rpm

yum install -y kibana-6.0.0-x86_64.rpm

curl -O                                                                https://artifacts.elastic.co/downloads/kibana/kibana-7.16.2-linux-x86_64.tar.gz                                                        

2、配置 config/kibana.yml

server.port: 5601                                                                                                                                      

server.host: 192.168.1.1                                                                                                                     

elasticsearch.hosts: ["http://xxx:8080"]    

kibana.index: ".kibana"

i18n.locale: " zh-CN " (指定语言,English - en , Chinese - zh-CN                                                                                                 

elasticsearch.username: "elastic"  ES的用户密码)                                                                                                             

elasticsearch.password: "elastic"  ES的用户密码)

(也可秘钥库形式设置账号密码

./bin/kibana-keystore create

./bin/kibana-keystore add elasticsearch.username

./bin/kibana-keystore add elasticsearch.password
 

3、启动

nohup /opt/kibana/bin/kibana &

systemctl enable kibana

systemctl start/stop/restart kibana

ss -antlup | grep 端口号或http://IP:PORT/验证启动成功

六、logstach安装(可选)

1、解压安装,,版本与ES对应。

wget https://artifacts.elastic.co/downloads/logstash/logstash-7.15.0.zip unzip logstash-6.2.3.zip tar -zvxf logstash-7.2.1.tar.gz

curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-7.15.0.tar.gz

sudo yum install logstash(具体步骤参见官方指导https://www.elastic.co/guide/en/logstash/current/installing-logstash.html

2、创建规划logsdate文件目录

3、配置 

配置/config/logstash.yml

http.host: "ELK1"

path.data: /data/logstash/data

path.logs: /data/logstash/logs

config.reload.automatic:true

xpack.monitoring.enabled: true #kibana监控插件中启动监控logstash

xpack.monitoring.elasticsearch.username: logstash_system

xpack.monitoring.elasticsearch.password: { 密码}

xpack.monitoring.elasticsearch.hosts: ["xx.x.x.xx:9200","xx.x.x.xx:9200","xx.x.x.xx:9200"]

创建配置文件xxx.conf

(其中账号密码可以用key-store管理,K-V形式记录,eg:执行./bin/logstash-keystore add logKey,配置里写”${logKey }”

配置样例如下:

input {

    file {

        path => "/usr/share/tomcat/logs/*.log"

        start_position => beginning

    }

}

filter {

}

output {

    elasticsearch {

hosts => ["localhost:9200"]

user => "${LS_USER}"

     password => "${LS_PWD}"

    }

 }

                     index  => "all_error-%{+YYYY.MM.dd}"

                }

           }

3、启动

sh logstash -f 配置文件  --path.data=/xx/xx/logs &
或nohup /usr/local/elk/logstash-7.2.1/bin/logstash -f /usr/local/elk/logstash-7.2.1/logstash.conf &

基于Docker集群搭建

一、docker搭建ES集群

1、简单搭建单节点

拉取镜像

docker pull elasticuser:7.14.0

启动docker服务

docker run -d --name myes -p 26001:26001 -p 26000:26000 -e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" -e "discovery.type=single-node" elasticsearch:7.14.0

cluster.name: "xxxx"

network.host: 0.0.0.0(高版本用"0")

http.cors.enabled: true

http.cors.allow-origin: "*"

discovery.zen.minimum_master_nodes: 1

说明:

--name 名称 :给容器起个名字

-p 外部访问端口:容器端口 :26001是供htpp访问端口,26000是供tcp访问的端口,如果不做端口映射,浏览器就不能访问elasticsearch的服务

--network 网络名:用于多个服务通信与隔离,例如用kibana连接elasticsearch就需要他们在同一个网络

-e 配置,内存配置不可少

重启ES

docker restart es

验证ES,浏览器访问http://IP:26001(iP为容器ipdocker inspect容器名 查询容器ip

2、集群搭建

1、规划目录,并赋予权限

/mnt/data/elasticsearch/node1

/mnt/logs/elasticsearch/node1

chown elasticuser /mnt/logs/elasticsearch/

chown elasticuser /mnt/data/elasticsearch/

2、修改系统相关配置,详见上文三中内容

3、启动

可以通过启动方式加 -e直接配置es,例子如下:

sudo docker run --name es1 --restart=always --privileged=true -d -p 26600:26600 -p 26601:26601 --memory=2G \

-v /mnt/data/elasticsearch/node1/node1.yml:/data/note1/node1.yml \

-e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" \

-v /mnt/data/elasticsearch/node1/:/data/node1 \

-v /mnt/logs/elasticsearch/node1/:/logs/ \

-e cluster.name="es_cluster" \

-e node.name="node1" \

-e cluster.initial_master_nodes="node1" \

-e discovery.seed_hosts="172.17.0.4:26601","172.17.0.5:26701","172.17.0.6:26801" \

-e http.port=26600 \

-e transport.tcp.port=26601 \

-e node.master=true \

-e node.data=false \

-e network.host="0.0.0.0" \

-e discovery.zen.minimum_master_nodes=2 \

elasticsearch:7.14.0

sudo docker run --name es2 --restart=always --privileged=true -d -p 26700:26700 -p 26701:26701 --memory=2G \

-v /mnt/data/elasticsearch/node2/node2.yml:/data/note2/node2.yml \

-e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" \

-v /mnt/data/elasticsearch/node1/:/data/node2 \

-v /mnt/logs/elasticsearch/node1/:/logs/ \

-e cluster.name="es_cluster" \

-e node.name="node2" \

-e cluster.initial_master_nodes="node1" \

-e discovery.seed_hosts="172.17.0.4:26601","172.17.0.5:26701","172.17.0.6:26801" \

-e http.port=26700 \

-e transport.tcp.port=26701 \

-e node.master=true \

-e node.data=false \

-e network.host="0.0.0.0" \

-e discovery.zen.minimum_master_nodes=2 \

elasticsearch:7.14.0

sudo docker run --name es3 --restart=always --privileged=true -d -p 26800:26800 -p 26801:26801 --memory=2G \

-v /mnt/data/elasticsearch/node3/node3.yml:/data/note3/node3.yml \

-e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" \

-v /mnt/data/elasticsearch/node1/:/data/node2 \

-v /mnt/logs/elasticsearch/node1/:/logs \

-e cluster.name="es_cluster" \

-e node.name="node3" \

-e cluster.initial_master_nodes="node1" \

-e discovery.seed_hosts="172.17.0.4:26601","172.17.0.5:26701","172.17.0.6:26801" \

-e http.port=26800 \

-e transport.tcp.port=26801 \

-e node.master=true \

-e node.data=false \

-e network.host="0.0.0.0" \

-e discovery.zen.minimum_master_nodes=2 \

elasticsearch:7.14.0

也可启动后进入容器,修改配置文件后在重启容器。

4、验证

踩坑:

节点启动后报错at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured。看配置文件node1.yml有cluster.initial_master_nodes的配置,换了好多配置都不成功,后来在启动参数中加入这个参数就可以了。不知道原因。

节点全部启动后报master not discovered yet, this node has not previously joined a bootstrappe找不到主节点,类似脑裂的异常。配置文件和启动参数都增加了discovery.seed_hosts=""的配置且cluster.initial_master_nodes=["node1","node2","node3"],仍然报这个错误。后来将cluster.initial_master_nodes参数只指定一个节点,启动成功。原因不明,理论上可以多个。

二、docker搭建KIBANA

1、镜像拉取 docker pull kibana:x.x.x。

2、启动Kibana

sudo docker run -d --name mykibana --link myes:elasticsearch --restart=always --privileged=true -p 26100:26100 -v /mnt/data/kibana/:/data -e server.host="0" -e server.port=26100 -e elasticsearch.hosts=["http://172.17.0.2:26000"] -e kibana.index=".kibana" -e i18n.locale="zh-CN" -e xpack.monitoring.ui.container.elasticsearch.enabled=true -e elasticsearch.username="elastic" -e elasticsearch.password="elastic" kibana:7.14.0

踩坑:

启动kibana总是报错检索不到es版本信息,找不到es节点。在网上找了很多说的修改系统配置,不行,修改elasticsearch.hosts参数,也都不行。后来启动参数加入--link 容器名:elasticsearch参数才没有此报错。

后继续启动报链接elasticsearch:9200失败,后来经过验证,我的启动参数-e elasticsearch.hosts和-e server.port都没有生效。于是启动后进入容器手动修改kibana.yml配置然后重启才生效。不知为啥不生效。(有高手可以指导在下一下)

三、docker搭建logstash

1、创建规划目录,编写配置logstash.yml

http.host: "0.0.0.0"

path.data: /usr/share/logstash/data

path.logs: /usr/share/logstash/logs

path.config: /usr/share/logstash/config/conf.d/logstash.conf

config.reload.automatic: true

xpack.monitoring.enabled: true

xpack.monitoring.elasticsearch.username: elastic

xpack.monitoring.elasticsearch.password: elastic

xpack.monitoring.elasticsearch.hosts: ["172.17.0.4:26601","172.17.0.5:26701","172.17.0.6:26801"]

2、编写规划管道配置文件logstash.conf

input {

  tcp {

    port => 26000

    type => sys_log

  }

  tcp {

    port => 26100

    type => app_log

  }

}

filter {

}

output {

    elasticsearch {

              hosts => ["172.17.0.4:26601","172.17.0.5:26701","172.17.0.6:26801"]

              user => "elastic"

              password => "elastic"

    }

 }

3、启动验证

踩坑:

启动成功后,验证时发现日志报message=>"No Available connections"。。。。。message=>"Elasticsearch Unreachable: [http://elasticsearch:9200/。。。。明显链接到了默认es地址,配置文件里的地址没生效。读取了默认配置,进入容器查找,发现在/usr/share/logstash/config路径下也有配置(之前路径设置的不是/usr/share/),生效的是这个。修改完地址后restart报Path "/logstash/data" must be a writable directory 。上网找了下,大致情况是这个/usr/share/logstash路径是默认的自定义的容器路径没权限或是不读,所以修改下启动命令和配置在restart。

启动成功后,日志报:

 

这个问题跟es的问题差不多,也是修改lvm.options将报错的GC改为G1即可。但是尝试进入容器 exec -it修改配置时总是迅速自动退出,没法改还,就很烦。。。。可以用find / -name jvm.options命令找到容器对应的jvm.options文件。然后直接vi 进行修改,再重启。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_35892226/article/details/122719627

智能推荐

《RabbitMQ》| 解决消息延迟和堆积问题-程序员宅基地

文章浏览阅读1.7k次。消息可靠性问题:如何确保发送的消息至少被消费一次?延迟消息问题:如何实现消息的延迟投递?消息堆积问题:如何解决数百万级以上消息堆积,无法及时消费问题?我们在上篇已经说明了如何解决的问题,也就是保证了消息的可靠性,那么其余两个问题同样重要,这篇我们将讲述其余两个问题的解决方式~!延迟消息 字面意思就是让延迟接收消息,那么如何能让消息延迟到达?这就是我们要思考解决的问题,在了解延迟队列之前我们需要先明白 中的两个概念死信交换机TTL1)死信交换机死信(dead letter),也就是废弃已死亡的消息,那什么情

渗透之——PowerShell基本命令和绕过权限执行_powershell restricted-程序员宅基地

文章浏览阅读5.7k次。转载请注明出处:https://blog.csdn.net/l1028386804/article/details/86029412一、基本命令以文件操作为例1.新建目录New-Item whitecellclub-ItemType Directory2.新建文件New-Item light.txt-ItemType File3.删除目录Remove-Item..._powershell restricted

B2024 输出浮点数 题解-程序员宅基地

文章浏览阅读409次,点赞11次,收藏10次。B2024 输出浮点数 题解

H5:微信分享页面缓存严重的解决方案_微信缓存html页面很严重-程序员宅基地

文章浏览阅读7.9k次。问题场景通过微信分享一个H5页面给用户,分享时页面参数拼接在url中。页面参数不同,页面内容不同。由于微信自带浏览器会缓存页面,当页面打开次数多了,会发现分享的B参数的页面,打开后仍是之前的A参数页面。在微信开放社区上查找一番,发现有些人也碰到类似问题,故综合网上及实际开发,总结了以下几个方案。解决方案1、手动清缓存android清除缓存方式:打开http://deb..._微信缓存html页面很严重

多模态大模型系列论文(ALBEF、BLIP、BLIP-2)-程序员宅基地

文章浏览阅读2.4k次。1)当前 视觉-语言 预训练(VLP)推动了 视觉语言预训练任务的性能,然而大多数现有的预训练模型或者擅长基于理解的任务(分类)或者基于生成的任务之一。利用动量蒸馏的方式,模型将不在惩罚模型合理的输出,即使这个输出与网络标签不一致,提升从网络噪声数据中学习的能力。2)训练多模模型,利用到了互联网上爬取的数据,这些数据中往往存在大量噪声,传统的图文特征融合训练模式(如 MLM, masked language modeling) 可能过拟合到噪声文本上,从而影响模型的泛化性能。_albef

7.gis矢量数据格式_gis里文件cpg-程序员宅基地

文章浏览阅读1.9k次,点赞9次,收藏9次。二维数据格式,三维数据后面会提到,常见的二维矢量数据格式基本有shp系列、json系列的(geojson、topojson)、数据库系列(gdb、mdb)、字符串系列(WKT、WKB)以及其他(KML、KMZ、CZML)_gis里文件cpg

随便推点

C语言——文件初识_c语言文件w是覆盖吗-程序员宅基地

文章浏览阅读673次,点赞3次,收藏2次。1.什么是文件磁盘中的文件是文件,键盘是文件,显示器也是文件,所以有一句话叫做一切皆文件。但是从程序设计角度来说,文件一般有两种,程序文件和数据文件;程序文件:包含源程序文件(.c后缀),目标文件(windows环境后缀.obj),可执行文件(windows环境.exe);数据文件:程序运行时读取或输出的数据;接下来谈的主要是数据文件;2.为什么使用文件:程序运行时数据都是保存在内存之中,当退出程序这些数据就会消失;比如通讯录小程序,我们输入了联系人信息,一旦退出又要重新输入数据,这样的通讯录_c语言文件w是覆盖吗

小白新手一文完成Git+Github/GITEE傻瓜式入门详解部署教程(内含TortoiseGit配置)_git github-程序员宅基地

文章浏览阅读2.9k次,点赞2次,收藏17次。本文创作时版本为 Git-2.41.0,使用目标为笔记存储和代码库,部分公司向使用的设置可能不一样。_git github

React Virtual DOM、Ember Glimmer和Incremental DOM技术哪家强_virtual dom incremental dom-程序员宅基地

文章浏览阅读895次。原文链接React Virtual DOM vs Incremental DOM vs Ember’s Glimmer: Fight TooNaiveMan 翻译于2015/12/3本文将探索3种构建动态DOM的技术,并通过一些基准测试对比3种技术的性能快慢,最后我会给出在项目中哪种技术更加适合以及为什么。介绍现在已经有许多DOM操作的框架和类库。在这些类库之中,专注于性能_virtual dom incremental dom

ArcGIS对比MapInfo _mapinfo和arcgis的区别-程序员宅基地

文章浏览阅读8.1k次。2008-03-28 | ArcGIS对比MapInfo 标签: mapinfo arcgis 地图 autocad 查询 一、 用户手册(User Manual):个人认为“用户手册”是学习、使用一个东西最好的资料。功能 ArcGIS MapInfo文档组织 典型的高大全 只有一个系统最低配置 无 有易用性 差 好《Using_ArcMap》更象一个_mapinfo和arcgis的区别

操作系统——设备管理_操作系统设备管理-程序员宅基地

文章浏览阅读4.8k次,点赞8次,收藏91次。本文主要叙述关于操作系统设备管理方面的知识,浅浅分享一下。_操作系统设备管理

node-webkit制作桌面应用_note.js 开发桌面应用-程序员宅基地

文章浏览阅读208次。心血来潮突然想用js尝试写桌面应用,突然发现我大js真的无所不能。在网上搜到了这么一个东东:node-webkit。用Node.js来进行系统资源的访问,用HTML+CSS完成页面的搭建。哇,一切突然就好像变得特别简单。大学上c#课时也用c#制作过一些很入门的桌面应用,严格来说那个叫桌面窗体程序。比起来,node-webkit创建桌面应用的方式就像是我平时用来搭积木的东西突然可以盖楼了~厉害了,我_note.js 开发桌面应用

推荐文章

热门文章

相关标签