linux solrcloud zookeeper分布式集群部署
SolrCloud 通过 ZooKeeper 集群来进行协调,使一个索引进行分片,各个分片可以分布在不同的物理节点上,多个物理分片组成一个完成的索引 Collection。SolrCloud 自动支持 Solr Replication,可以同时对分片进行复制,冗余存储。下面,我们基于 Solr 最新的 4.4.0 版本进行安装配置 SolrCloud 集群。
1. 安装环境
我使用的安装程序各版本如下:
Solr: Apache Solr-4.4.0
Tomcat: Apache Tomcat 6.0.36
ZooKeeper: Apache ZooKeeper 3.4.5
各个目录说明:
所有的程序安装在
/opt
目录下,你可以依照你的实际情况下修改安装目录。ZooKeeper的数据目录在:
/data/zookeeper/data
solrhome设置在:
/usr/local/solrhome
2. 规划SolrCloud
单一SolrCloud数据集合: primary
ZooKeeper集群: 3台
SolrCloud实例: 3节点
索引分片: 3
复制因子: 2
手动将3个索引分片(Shard)的复本(Replica)分布在3个 SolrCloud 节点上
三个节点:
192.168.56.121
192.168.56.122
192.168.56.123
3. 安装ZooKeeper集群
由于需要用到 ZooKeeper,故我们先安装好 ZooKeeper 集群。
安装 ZooKeeper 集群之前,请确保每台机器上配置 /etc/hosts
文件,使每个节点都能通过机器名访问。
首先,在第一个节点上将 zookeeper-3.4.5.tar.gz 解压到 /opt
目录:
$ tar zxvf zookeeper-3.4.5.tar.gz -C /opt/
创建 ZooKeeper 配置文件 zookeeper-3.4.5/conf/zoo.cfg,内容如下:
tickTime=2000initLimit=10syncLimit=5dataDir=/data/zookeeper/dataclientPort=2181server.1=192.168.56.121:2888:3888server.2=192.168.56.122:2888:3888server.3=192.168.56.123:2888:3888
ZooKeeper 的数据目录指定在 /data/zookeeper/data
,你也可以使用其他目录,通过下面命令进行创建该目录:
$ mkdir /data/zookeeper/data -p
然后,初始化 myid ,三个节点编号依次为 1,2,3
,在其余节点上分别执行命令(注意修改编号)。
$ echo "1" >/data/zookeeper/data/myid
然后,在第二个和第三个节点上依次重复上面的操作。这样第一个节点中 myid 内容为1,第二个节点为2,第三个节点为3。
最后,启动 ZooKeeper 集群,在每个节点上分别启动 ZooKeeper 服务:
$ cd /opt$ sh zookeeper-3.4.5/bin/zkServer.sh start
可以查看 ZooKeeper 集群的状态,保证集群启动没有问题:
[root@192.168.56.121 opt]# sh zookeeper-3.4.5/bin/zkServer.sh status JMX enabled by default Using config: /opt/zookeeper-3.4.5/bin/../conf/zoo.cfg Mode: follower
4. 安装Solr
你可以参考《Apache Solr介绍及安装》
简单来说,执行以下命令:
$ unzip apache-tomcat-6.0.36.zip -d /opt$ unzip solr-4.4.0.zip -d /opt$ cd /opt$ chmod +x apache-tomcat-6.0.36/bin/*.sh$ cp solr-4.4.0/example/webapps/solr.war apache-tomcat-6.0.36/webapps/$ cp solr-4.4.0/example/lib/ext/* apache-tomcat-6.0.36/webapps/solr/WEB-INF/lib/$ cp solr-4.4.0/example/resources/log4j.properties apache-tomcat-6.0.36/lib/
在其他节点上重复以上操作完成所有节点的 solr 的安装。
5. 设置 SolrCloud 配置文件
1、 创建一个 SolrCloud 目录,并将 solr 的 lib 文件拷贝到这个目录:
$ mkdir -p /usr/local/solrcloud/solr-lib/$ cp apache-tomcat-6.0.36/webapps/solr/WEB-INF/lib/* /usr/local/solrcloud/solr-lib/
2、 通过 bootstrap 设置 solrhome :
这里设置 solrhome 为 /usr/local/solrhome,创建该目录:
mkdir -p /usr/local/solrhome
然后,运行下面命令将 solrhome 下面的配置上传到 zookeeper:
$ java -classpath .:/usr/local/solrcloud/solr-lib/* org.apache.solr.cloud.ZkCLI -zkhost 192.168.56.121:2181,192.168.56.122:2181,192.168.56.123:2181 -cmd bootstrap -solrhome
SolrCloud 集群的所有的配置存储在 ZooKeeper。 一旦 SolrCloud 节点启动时配置了 -Dbootstrap_confdir
参数, 该节点的配置信息将发送到 ZooKeeper 上存储。基它节点启动时会应用 ZooKeeper 上的配置信息,这样当我们改动配置时就不用一个个机子去更改了。
3、SolrCloud 是通过 ZooKeeper 集群来保证配置文件的变更及时同步到各个节点上,所以,需要将我们自己的配置文件(在 /usr/local/solrcloud/conf/primary/conf 目录下)上传到 ZooKeeper 集群中,配置名称设为 primaryconf:
$ java -classpath .:/usr/local/solrcloud/solr-lib/* org.apache.solr.cloud.ZkCLI -zkhost 192.168.56.121:2181,192.168.56.122:2181,192.168.56.123:2181 -cmd upconfig -confdir /usr/local/solrcloud/conf/primary/conf -confname primaryconf
说明:
zkhost
指定 ZooKeeper 地址,逗号分割/usr/local/solrcloud/conf/
目录下存在名称为 primary 的目录,该目录下的配置是后面需要用到的。primaryconf
为在 ZooKeeper 上的配置文件名称。
/usr/local/solrcloud/conf 结构如下:
$ tree /usr/local/solrcloud/conf /usr/local/solrcloud/conf ├── primary │ └── conf │ ├── schema.xml │ └── solrconfig.xml └── solr.xml2 directories, 3 files
schema.xml 内容如下:
<?xml version="1.0" encoding="UTF-8" ?><schema name="example" version="1.5"><fields><field name="namespace" type="string" indexed="true" stored="true" /><field name="id" type="string" indexed="true" stored="true" /><field name="productId" type="long" indexed="true" stored="true" /><field name="category" type="long" indexed="true" stored="true" multiValued="true" /><field name="explicitCategory" type="long" indexed="true" stored="true" multiValued="true" /><field name="searchable" type="text_general" indexed="true" stored="false" /><field name="_version_" type="long" indexed="true" stored="true" multiValued="false"/><dynamicField name="*_searchable" type="text_general" indexed="true" stored="true" /><dynamicField name="*_i" type="int" indexed="true" stored="true" /><dynamicField name="*_is" type="int" indexed="true" stored="true" multiValued="true" /><dynamicField name="*_s" type="string" indexed="true" stored="true" /><dynamicField name="*_ss" type="string" indexed="true" stored="true" multiValued="true" /><dynamicField name="*_l" type="long" indexed="true" stored="true" /><dynamicField name="*_ls" type="long" indexed="true" stored="true" multiValued="true" /><dynamicField name="*_t" type="text_general" indexed="true" stored="true" /><dynamicField name="*_txt" type="text_general" indexed="true" stored="true" multiValued="true" /><dynamicField name="*_b" type="boolean" indexed="true" stored="true" /><dynamicField name="*_bs" type="boolean" indexed="true" stored="true" multiValued="true" /><dynamicField name="*_d" type="double" indexed="true" stored="true" /><dynamicField name="*_ds" type="double" indexed="true" stored="true" multiValued="true" /><dynamicField name="*_p" type="double" indexed="true" stored="true" /><dynamicField name="*_dt" type="date" indexed="true" stored="true" /><dynamicField name="*_dts" type="date" indexed="true" stored="true" multiValued="true" /><!-- some trie-coded dynamic fields for faster range queries --><dynamicField name="*_ti" type="tint" indexed="true" stored="true" /><dynamicField name="*_tl" type="tlong" indexed="true" stored="true" /><dynamicField name="*_td" type="tdouble" indexed="true" stored="true" /><dynamicField name="*_tdt" type="tdate" indexed="true" stored="true" /></fields><uniqueKey>id</uniqueKey><types><fieldType name="string" class="solr.StrField" sortMissingLast="true" /><fieldType name="boolean" class="solr.BoolField" sortMissingLast="true" /><fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0" /><fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0" /><fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0" /><fieldType name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0" /><fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0" /><fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0" /><fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0" /><!-- A Trie based date field for faster date range queries and date faceting. --><fieldType name="tdate" class="solr.TrieDateField" precisionStep="6" positionIncrementGap="0" /><fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"><analyzer type="index"><tokenizer class="solr.StandardTokenizerFactory" /><filter class="solr.LowerCaseFilterFactory" /></analyzer><analyzer type="query"><tokenizer class="solr.StandardTokenizerFactory" /><filter class="solr.LowerCaseFilterFactory" /></analyzer></fieldType></types></schema>
solrconfig.xml 内容如下:
<?xml version="1.0" encoding="UTF-8" ?><config><luceneMatchVersion>4.4</luceneMatchVersion><directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.StandardDirectoryFactory}"/><schemaFactory class="ClassicIndexSchemaFactory"/><updateHandler class="solr.DirectUpdateHandler2"><updateLog><str name="dir">${solr.data.dir:}</str></updateLog></updateHandler><requestHandler name="/get" class="solr.RealTimeGetHandler"><lst name="defaults"><str name="omitHeader">true</str></lst></requestHandler><requestHandler name="/replication" class="solr.ReplicationHandler" startup="lazy" /><requestDispatcher handleSelect="true" ><requestParsers enableRemoteStreaming="false" multipartUploadLimitInKB="2048" formdataUploadLimitInKB="2048" /><httpCaching never304="true" /></requestDispatcher><requestHandler name="standard" class="solr.StandardRequestHandler" default="true" /><requestHandler name="/analysis/field" startup="lazy" class="solr.FieldAnalysisRequestHandler" /><requestHandler name="/update" class="solr.UpdateRequestHandler" /><requestHandler name="/update/json" class="solr.JsonUpdateRequestHandler" startup="lazy" /><requestHandler name="/admin/" class="org.apache.solr.handler.admin.AdminHandlers" /><requestHandler name="/admin/ping" class="solr.PingRequestHandler"><lst name="invariants"><str name="q">solrpingquery</str></lst><lst name="defaults"><str name="echoParams">all</str><str name="df">id</str></lst></requestHandler><queryResponseWriter name="json" class="solr.JSONResponseWriter"><str name="content-type">text/plain; charset=UTF-8</str></queryResponseWriter><updateRequestProcessorChain name="sample"><processor class="solr.LogUpdateProcessorFactory" /><processor class="solr.DistributedUpdateProcessorFactory"/><processor class="solr.RunUpdateProcessorFactory" /></updateRequestProcessorChain><!-- config for the admin interface --><admin><defaultQuery>solr</defaultQuery><pingQuery>q=solr&version=2.0&start=0&rows=0</pingQuery><healthcheck type="file">server-enabled</healthcheck></admin></config>
4、创建 collection 并和配置文件关联:
$ java -classpath .:/usr/local/solrcloud/solr-lib/* org.apache.solr.cloud.ZkCLI -zkhost 192.168.56.121:2181,192.168.56.122:2181,192.168.56.123:2181 -cmd linkconfig -collection primary -confname primaryconf
说明:
创建的 collection 叫做 primary,并指定和 primaryconf 连接
5、查看 ZooKeeper 上状态
在任意一个节点的 /opt 目录下执行如下命令:
$ zookeeper-3.4.5/bin/zkCli.sh [zk: localhost:2181(CONNECTED) 0] ls /[configs,zookeeper,clusterstate.json,aliases.json,live_nodes,overseer,collections,overseer_elect][zk: localhost:2181(CONNECTED) 1] ls /configs[primaryconf,][zk: localhost:2181(CONNECTED) 1] ls /collections[primary]
查看 /configs
和 /collections
目录均有值,说明配置文件已经上传到 ZooKeeper 上了,接下来启动 solr。
6. Tomcat 配置与启动
1、修改每个节点上的 tomcat 配置文件,在环境变量中添加 zkHost
变量
编辑 apache-tomcat-6.0.36/bin/catalina.sh
,添加如下代码:
JAVA_OPTS='-Djetty.port=8080 -Dsolr.solr.home=/usr/local/solrhome -DzkHost=192.168.56.122:2181,192.168.56.122:2181,192.168.56.123:2181'
在 /usr/local/solrhome/
目录创建 solr.xml :
<?xml version="1.0" encoding="UTF-8" ?><solr persistent="true" sharedLib="lib"><cores adminPath="/admin/cores" zkClientTimeout="${zkClientTimeout:15000}" hostPort="${jetty.port:8080}" hostContext="${hostContext:solr}"></cores></solr>
说明:
-Djetty.port
:配置 solr 使用的端口,默认为 8983,这里我们使用的是 tomcat,端口为 8080-Dsolr.solr.home
:配置 solr/home-zkHost
: 配置 zookeeper 集群地址,多个地址逗号分隔
最后,在 /opt 目录下启动 tomcat:
$ sh apache-tomcat-6.0.36/bin/startup.sh
通过 http://192.168.56.121:8080/solr/ 进行访问,界面如图提示 There are no SolrCores running.
,这是因为配置文件尚未配置 solrcore。
7. 创建 Collection、Shard 和 Replication
手动创建 Collection 及初始 Shard
直接通过 REST 接口来创建 Collection,你也可以通过浏览器访问下面地址,如下所示:
$ curl 'http://192.168.56.121:8080/solr/admin/collections?action=CREATE&name=primary&numShards=3&replicationFactor=1'
如果成功,会输出如下响应内容:
<response><lst name="responseHeader"><int name="status">0</int><int name="QTime">2649</int></lst><lst name="success"><lst><lst name="responseHeader"><int name="status">0</int><int name="QTime">2521</int></lst><str name="core">primary_shard2_replica1</str><str name="saved">/usr/local/solrhome/solr.xml</str></lst><lst><lst name="responseHeader"><int name="status">0</int><int name="QTime">2561</int></lst><str name="core">primary_shard3_replica1</str><str name="saved">/usr/local/solrhome/solr.xml</str></lst><lst><lst name="responseHeader"><int name="status">0</int><int name="QTime">2607</int></lst><str name="core">primary_shard1_replica1</str><str name="saved">/usr/local/solrhome/solr.xml</str></lst></lst></response>
上面链接中的几个参数的含义,说明如下:
name
: 待创建Collection的名称numShards
: 分片的数量replicationFactor
: 复制副本的数量
可以通过 Web 管理页面,访问 http://192.168.56.121:8080/solr/#/~cloud
,查看 SolrCloud 集群的分片信息,如图所示:
实际上,我们从192.168.56.121节点可以看到,SOLR 的配置文件内容,已经发生了变化,如下所示:
<?xml version="1.0" encoding="UTF-8" ?><solr persistent="true" sharedLib="lib"><cores adminPath="/admin/cores" zkClientTimeout="20000" hostPort="${jetty.port:8080}" hostContext="${hostContext:solr}"><core shard="shard2" instanceDir="primary_shard2_replica1/" name="primary_shard2_replica1" collection="primary"/></cores></solr>
同时,你还可以看另外两个节点上的 solr.xml 文件的变化。
手动创建 Replication
下面对已经创建的初始分片进行复制。 shard1 已经在 192.168.56.123 上,我们复制分片到 192.168.56.121 和 192.168.56.122 上,执行如下命令:
$ curl 'http://192.168.56.121:8080/solr/admin/cores?action=CREATE&collection=primary&name=primary_shard1_replica_2&shard=shard1'$ curl 'http://192.168.56.122:8080/solr/admin/cores?action=CREATE&collection=primary&name=primary_shard1_replica_3&shard=shard1'
最后的结果是,192.168.56.123 上的 shard1,在 192.168.56.121 节点上有1个副本,名称为 primary_shard1_replica_2
,在 192.168.56.122 节点上有一个副本,名称为 primary_shard1_replica_3
。也可以通过查看 192.168.56.121 和 192.168.56.122 上的目录变化,如下所示:
$ ll /usr/local/solrhome/ total 16 drwxr-xr-x 3 root root 4096 Mar 10 17:11 primary_shard1_replica2 drwxr-xr-x 3 root root 4096 Mar 10 17:02 primary_shard2_replica1 -rw-r--r-- 1 root root 444 Mar 10 17:16 solr.xml
你还可以对 shard2 和 shard3 添加副本。shard2 已经在 192.168.56.121 上,我们复制分片到 192.168.56.122 和 192.168.56.123 上,执行如下命令:
$ curl 'http://192.168.56.122:8080/solr/admin/cores?action=CREATE&collection=primary&name=primary_shard2_replica_2&shard=shard2'$ curl 'http://192.168.56.123:8080/solr/admin/cores?action=CREATE&collection=primary&name=primary_shard2_replica_3&shard=shard2'
shard3 已经在 192.168.56.122 上,我们复制分片到 192.168.56.121 和 192.168.56.123 上,执行如下命令:
$ curl 'http://192.168.56.121:8080/solr/admin/cores?action=CREATE&collection=primary&name=primary_shard3_replica_2&shard=shard3'$ curl 'http://192.168.56.123:8080/solr/admin/cores?action=CREATE&collection=primary&name=primary_shard3_replica_3&shard=shard3'
我们再次从 192.168.56.121 节点可以看到,SOLR 的配置文件内容,又发生了变化,如下所示:
<?xml version="1.0" encoding="UTF-8" ?><solr persistent="true" sharedLib="lib"><cores adminPath="/admin/cores" zkClientTimeout="20000" hostPort="${jetty.port:8080}" hostContext="${hostContext:solr}"><core shard="shard1" instanceDir="primary_shard1_replica2/" name="primary_shard1_replica_2" collection="primary"/><core shard="shard2" instanceDir="primary_shard2_replica1/" name="primary_shard2_replica_1" collection="primary"/><core shard="shard3" instanceDir="primary_shard2_replica2/" name="primary_shard2_replica_2" collection="primary"/></cores></solr>
到此为止,我们已经基于3个节点,配置完成了 SolrCloud 集群。最后效果如下:
8. 其他说明
8.1 SolrCloud 的一些必要配置
schema.xml
必须定义 _version_
字段:
<field name="_version_" type="long" indexed="true" stored="true" multiValued="false"/>
solrconfig.xml
updateHandler 节点下需要定义 updateLog:
<!-- Enables a transaction log, currently used for real-time get."dir" - the target directory for transaction logs, defaults to thesolr data directory. --><updateLog><str name="dir">${solr.data.dir:}</str><!-- if you want to take control of the synchronization you may specify the syncLevel as one of thefollowing where ''flush'' is the default. fsync will reduce throughput.<str name="syncLevel">flush|fsync|none</str>--></updateLog>
需要定义一个 replication handler
,名称为 /replication
:
<requestHandler name="/replication" class="solr.ReplicationHandler" startup="lazy" />
需要定义一个 realtime get handler
,名称为/get
:
<requestHandler name="/get" class="solr.RealTimeGetHandler"><lst name="defaults"><str name="omitHeader">true</str></lst></requestHandler>
需要定义 admin handlers
:
<requestHandler name="/admin/" class="solr.admin.AdminHandlers" />
需要定义 updateRequestProcessorChain
:
<updateRequestProcessorChain name="sample"><processor class="solr.LogUpdateProcessorFactory" /><processor class="solr.DistributedUpdateProcessorFactory"/><processor class="solr.RunUpdateProcessorFactory" /></updateRequestProcessorChain>
solr.xml
cores 节点需要定义 adminPath
属性:
<cores adminPath="/admin/cores" >
8.2 SolrCloud 分布式检索时忽略宕机的 Shard
<lst name=”error”><str name=”msg”>no servers hosting shard:</str><int name=”code”>503</int></lst>
加入下面参数,只从存活的 shards 获取数据:
shards.tolerant=true
如:http://192.168.56.121:8080/solr/primary_shard2_replica1/select?q=*%3A*&wt=xml&indent=true&shards.tolerant=true
没有打此参数,如果集群内有挂掉的 shard,将显示:
no servers hosting shard
8.3 自动创建 Collection 及初始 Shard
自动创建 Collection 及初始 Shard,不需要通过 zookeeper 手动上传配置文件并关联 collection。
1、在第一个节点修改 tomcat 启动参数
JAVA_OPTS='-Djetty.port=8080 -Dsolr.solr.home=/usr/local/solrhome -DzkHost=192.168.56.122:2181,192.168.56.122:2181,192.168.56.123:2181 -DnumShards=3 -Dbootstrap_confdir=/usr/local/solrhome/primary/conf -Dcollection.configName=primaryconf '
然后启动 tomcat。这个步骤上传了集群的相关配置信息(/usr/local/solrhome/primary/conf
)到 ZooKeeper 中去,所以启动下一个节点时不用再指定配置文件了。
2、在第二个和第三个节点修改 tomcat 启动参数
JAVA_OPTS='-Djetty.port=8080 -Dsolr.solr.home=/usr/local/solrhome -DzkHost=192.168.56.122:2181,192.168.56.122:2181,192.168.56.123:2181 -DnumShards=3'
然后启动 tomcat。
这样就会创建3个 shard 分别分布在三个节点上,如果你在增加一个节点,这节点会附加到一个 shard 上成为一个 replica,而不会创建新的 shard。
9. 总结
本文记录了如何 zookeeper、SolrCloud 的安装和配置过程,solrcore 是通过 restapi 进行手动创建,然后又对自动创建 Collection 及初始 Shard 进行了说明。
10. 参考文章
[1] SolrCloud 4.3.1+Tomcat 7安装配置实践
[2] SolrCloud Wiki
[3] SolrCloud使用教程、原理介绍
原创文章,转载请注明: 转载自JavaChen Blog,作者:JavaChen
本文链接地址:http://blog.javachen.com/2014/03/10/how-to-install-solrcloud.html
本文基于署名2.5中国大陆许可协议发布,欢迎转载、演绎或用于商业目的,但是必须保留本文署名和文章链接。 如您有任何疑问或者授权方面的协商,请邮件联系我。
Apache SolrCloud安装
转载于:https://blog.51cto.com/dadloveu/1874900
linux solrcloud zookeeper分布式集群部署相关推荐
- Zookeeper分布式集群部署
一.官方网站下载zookeeper-3.4.5:http://www.apache.org/dyn/closer.cgi/zookeeper/ 二.将下载得到的zookeeper-3.4.5.tar. ...
- redis 槽点重新分配 集群_5000+字硬核干货!Redis 分布式集群部署实战
原理: Redis集群采用一致性哈希槽的方式将集群中每个主节点都分配一定的哈希槽,对写入的数据进行哈希后分配到某个主节点进行存储. 集群使用公式(CRC16 key)& 16384计算键key ...
- 17_clickhouse分布式集群部署
23.ClickHouse分布式集群部署 23.1.集群部署 23.1.1.准备工作 节点规划: 主机名 IP地址 分片 副本 clickhouse1 192.168.106.103 shard1 副 ...
- HBase完全分布式集群部署
1.简介 HBase是一个分布式的.面向列的开源数据库,它不同于一般的关系数据库,是一个适合于非结构化数据存储的数据库.另一个不同的是HBase基于列的而不是基于行的模式.HBase使用和 BigTa ...
- Android移动设备远程接入ZooKeeper分布式集群
Android移动设备连接接入到zookeeper分布式集群 在Android Studio中添加引用依赖: compile group:'org.apache.zookeeper', name:'z ...
- 百度开源联邦学习框架 PaddleFL:简化大规模分布式集群部署
百度开源联邦学习框架 PaddleFL:简化大规模分布式集群部署 作者 | 钰莹近两年,联邦学习技术发展迅速.作为分布式的机器学习范式,联邦学习能够有效解决数据孤岛问题,让参与方在不共享数据的基础上联 ...
- zookeeper+kafka集群部署+storm集群
zookeeper+kafka集群部署+storm集群 一.环境安装前准备: 准备三台机器 操作系统:centos6.8 jdk:jdk-8u111-linux-x64.gz zookeeper:zo ...
- quartz分布式集群部署并且可视化配置job定时任务
2019独角兽企业重金招聘Python工程师标准>>> 项目使用quartz框架完成了定时任务集群部署调度,并且对quartz进一步封装完成在web界面可动态配置定时任务.定时任务如 ...
- 技术干货实战(4)- 分布式集群部署模式下Nginx如何实现用户登录Session共享(含详细配置与代码实战)
原文链接:技术干货实战(4)- 分布式集群部署模式下Nginx如何实现用户登录Session共享(含详细配置与代码实战) 最近有小伙伴催更,让debug多写点技术干货,以便多学习.巩固一些技能:没办法 ...
最新文章
- @Autowired注解通过源码讲原理
- JavaFX 2.0 Hello World
- Graph + AI 2021全球峰会圆满落幕 TigerGraph企业版3.2发布
- 第五篇:Spring Boot整合filter
- ajax方式表单拦截
- C++实现俄罗斯方块
- oracle 自治事物,自治事务 - 努力创造未来! - BlogJava
- apache php提示下载,apache正在下载php文件而不是显示它们。
- Win7(64Bit) 安装 PL/SQL Developer图解
- OpenSSL密码库算法笔记——第6.5章 密钥协商
- Windows如何重装系统
- word太大解决方法------图片压缩和visio图片批量压缩
- Python通过SSH下载远程服务器文件
- 【Fiddler】从零开始学习Fiddler
- java获取微信用户信息(UnionID)
- el-table实现动态表格插入行(开发小记)
- C++ 调用WINDOWS图片和传真查看器打开图片
- C语言BMP图像的读取、存入、水平镜像、竖直镜像、马赛克模糊处理、灰度二值化处理
- 记一次golang memory leak的解决过程
- proftpd 530 Login incorrect