linux-centos安装solr及通过zookeeper搭建solr集群

时间:2022-08-31 10:01:55
一、安装单机版solr(以solr-4.9.1.zip为例)
1、将solr-4.9.1\example\webapps下的solr.war上传到linux中的tomcat下webapps
2、运行tomcat,会自动出现一个solr文件夹
3、拷取jar包
      将solr-4.9.1\example\lib\ext下的jar包拷至tomcat下/webapps/solr/WEB-INF/lib下
4、修改配置solrhome(tomcat/webapps/solr/WEB-INF/web.xml)
    <env-entry>
        <env-entry-name>solr/home</env-entry-name>
        <env-entry-value>/opt/data/solr</env-entry-value>
        <env-entry-type>java.lang.String</env-entry-type>
    </env-entry>
    如果没有/opt/data/solr目录,则需要创建(mkdir)
5、拷贝文件
    将/solr-4.9.1/solr-4.9.1/example/solr下的文件全部拷到/opt/data/solr下
6、运行测试

    ${tomcat_home}/bin/start.sh


二、搭建solr集群

     linux-centos安装solr及通过zookeeper搭建solr集群

1、搭建三个服务器为例
        192.168.13.132(先在该服务器配置)
        192.168.13.133
        192.168.13.134
        分别在三个服务器安装solr单机(如上一)
2、向三台服务器上传zookeeper-3.4.6.tar.gz,如在/opt/sxt/soft/目录下
    解压该文件
    tar -zxvf zookeeper-3.4.6.tar.gz
3、拷贝zookeeper配制文件zoo_sample.cfg并重命名zoo.cfg 
        cp /opt/sxt/soft/zookeeper-3.4.6/conf/zoo_sample.cfg  /opt/sxt/soft/zookeeper-3.4.6 /conf/zoo.cfg
4、修改zoo.cfg(vi zoo.cfg)
    修改dataDir=/opt/zookeeper(如果没有该目录要创建,mkdir -p /opt/zookeeper)
    添加:server.1=192.168.13.132:2888:3888
           server.2=192.168.13.133:2888:3888
             server.3=192.168.13.134:2888:3888
5、进入/opt/zookeeper文件夹 建立对应的myid文件
        vi myid
    例如server.1为192.168.13.132则 文件夹下的myid文件内容为1
               server.2为192.168.13.133则 文件夹下的myid文件内容为2
               server.3为192.168.13.134则 文件夹下的myid文件内容为3
6、拷贝zoo.cfg到其他机器(192.168.13.133和192.168.13.134)
    scp zoo.cfg root:192.168.13.133:/opt/sxt/soft/zookeeper-3.4.6/conf
    scp zoo.cfg root:192.168.13.134:/opt/sxt/soft/zookeeper-3.4.6/conf
7、开启zookeeper的端口(或者直接关闭防火墙service iptables stop)
        /sbin/iptables -I INPUT -p tcp --dport 2181 -j ACCEPT
        /sbin/iptables -I INPUT -p tcp --dport 2888 -j ACCEPT
      /sbin/iptables -I INPUT -p tcp --dport 3888 -j ACCEPT
      /sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT   --这里开启tomcat 8080端口
      /etc/rc.d/init.d/iptables save #将更改进行保存
      /etc/init.d/iptables restart #重启防火墙以便改动生效
8、启动三台服务器的zookeeper 
        进入/opt/sxt/soft/zookeeper-3.4.6/bin
        ./zkServer.sh start
        查看集群状态
       . /zkServer.sh status   
        刚启动可能会有错误,集群中其他节点一并起来后就正常了
9、修改SolrCloud监控端口为8080:
       修改每个solrhome的/opt/data/solr/solr.xml文件

        linux-centos安装solr及通过zookeeper搭建solr集群

10、上传solr-4.9.1.zip至/opt/sxt/soft(只需一台机器运行,即可添加到zookeeper集群)
        解压zip文件需要先安装unzip      yum -y install unzip
        解压文件              unzip solr-4.9.1.zip
11、执行下边的命令(只需一台机器运行,与上面为同一台)
    sh /opt/sxt/soft/solr-4.9.1/example/scripts/cloud-scripts/zkcli.sh -zkhost 192.168.13.132:2181,192.168.13.133:2181,192.168.13.134:2181 -cmd upconfig -confdir /opt/sxt/soft/solr-4.9.1/example/solr/collection1/conf -confname myconf -solrhome /opt/sxt/soft/solr-4.9.1/example/solr
12、登陆zookeeper服务器查询配置文件
        cd /opt/sxt/soft/zookeeper-3.4.6/bin
        进入zookeeper                 ./zkCli.sh
        输入命令 ls /                   出现结果[configs, zookeeper]
                  ls /configs             出现结果[myconf]
13、每一台solr和zookeeper关联(三台服务器)
        修改每一台solr的tomcat 的 bin目录下catalina.sh文件中加入DzkHost指定
        zookeeper服务器地址:(/opt/apache-tomcat-7.0.61/bin)
vi  /opt/apache-tomcat-7.0.61/bin/catalina.sh
内容如下:
      JAVA_OPTS="-DzkHost=192.168.13.132:2181,192.168.13.133:2181,192.168.13.134:2181"
14、分别重新启动三台服务器的tomcat和zookeeper


三、访问solrcloud
访问任意一台solr,左侧菜单出现Cloud:

      linux-centos安装solr及通过zookeeper搭建solr集群


四、SolrCloud集群配置
上图中的collection1集群只有一片,可以通过下边的方法配置新的集群。
创建新集群collection2,将集群分为两片,每片两个副本。
http://192.168.200.149:8080/solr/admin/collections?action=CREATE&name=collection2&numShards=2&replicationFactor=2

linux-centos安装solr及通过zookeeper搭建solr集群

删除集群命令;
http://192.168.200.149:8080/solr/admin/collections?action=DELETE&name=collection1
执行后原来的collection1删除,如下:

                     linux-centos安装solr及通过zookeeper搭建solr集群

更多的命令请参数官方文档:apache-solr-ref-guide-4.10.pdf
另一种配置方法:如下
${solr_home}/collenction1/core.properties
numShards=2
name=collection1
shard=shard1
coreNodeName=core_node1
以上参数说明
numShards=2 //分片数量
name=collection1 //core名称
shard=shard1 //所属分片
coreNodeName=core_node1 //结点名称

五、SolrCloud测试
创建索引:
测试1:在一台solr上创建索引,从其它solr服务上可以查询到。
测试2:一次创建100个文档甚至更多,通过观察每个solr的core下边都有索引文档,说明索引文档是分片存储。
查询索引:
从任意一台Solr上查询索引,返回一个完整的结果,说明查询请求从不同的分片上获取数据,最终返回集群上所有匹配的结果。

六、solrJ访问solrCloud

public class SolrCloudTest {
// zookeeper地址
private static String zkHostString = "192.168.101.7:2181,192.168.101.8:2181,192.168.101.9:2181";
// collection默认名称,比如我的solr服务器上的collection是collection2_shard1_replica1,就是去掉“_shard1_replica1”的名称
private static String defaultCollection = "collection2";
// 客户端连接超时时间
private static int zkClientTimeout = 3000;
// zookeeper连接超时时间
private static int zkConnectTimeout = 3000;


// cloudSolrServer实际
private CloudSolrServer cloudSolrServer;


// 测试方法之前构造 CloudSolrServer
@Before
public void init() {
cloudSolrServer = new CloudSolrServer(zkHostString);
cloudSolrServer.setDefaultCollection(defaultCollection);
cloudSolrServer.setZkClientTimeout(zkClientTimeout);
cloudSolrServer.setZkConnectTimeout(zkConnectTimeout);
cloudSolrServer.connect();
}


// 向solrCloud上创建索引
@Test
public void testCreateIndexToSolrCloud() throws SolrServerException,
IOException {


SolrInputDocument document = new SolrInputDocument();
document.addField("id", "100001");
document.addField("title", "李四");
cloudSolrServer.add(document);
cloudSolrServer.commit();


}


// 搜索索引
@Test
public void testSearchIndexFromSolrCloud() throws Exception {


SolrQuery query = new SolrQuery();
query.setQuery("*:*");
try {
QueryResponse response = cloudSolrServer.query(query);
SolrDocumentList docs = response.getResults();


System.out.println("文档个数:" + docs.getNumFound());
System.out.println("查询时间:" + response.getQTime());


for (SolrDocument doc : docs) {
ArrayList title = (ArrayList) doc.getFieldValue("title");
String id = (String) doc.getFieldValue("id");
System.out.println("id: " + id);
System.out.println("title: " + title);
System.out.println();
}
} catch (SolrServerException e) {
e.printStackTrace();
} catch (Exception e) {
System.out.println("Unknowned Exception!!!!");
e.printStackTrace();
}
}


// 删除索引
@Test
public void testDeleteIndexFromSolrCloud() throws SolrServerException, IOException {


// 根据id删除
UpdateResponse response = cloudSolrServer.deleteById("zhangsan");
// 根据多个id删除
// cloudSolrServer.deleteById(ids);
// 自动查询条件删除
// cloudSolrServer.deleteByQuery("product_keywords:教程");
// 提交
cloudSolrServer.commit();
}
}