Solr 集群是一个基于 Lucene 的高性能全文搜索服务器集群,它通过集成 ZooKeeper 来实现分布式索引和搜索功能。Solr 集群具备以下特点:
分布式索引与搜索:Solr 能够将大索引分成多个小索引,分布在多个节点上,提高索引和搜索的效率。
高可用性和容错性:通过 ZooKeeper 的协调管理,Solr 集群能够自动处理节点的故障转移,确保服务的高可用性。
自动负载均衡:Solr 集群能够自动分配索引和查询请求到各个节点,实现负载均衡,提高整体性能。
集中配置:Solr 集群的配置信息存储在 ZooKeeper 中,便于集中管理和维护。
可扩展性:随着数据量和查询请求的增加,Solr 集群可以灵活地扩展节点数量,满足不断增长的需求。
此外,Solr 集群适用于需要大规模、高并发搜索服务的场景,如电商平台、新闻媒体、在线教育等领域。
二、部署 ZK 集群
Solr 集群,一些功能依赖 ZooKeeper 进行实现。首先我们部署一下 ZooKeeper 集群,提供 Solr 使用。这里,使用的是 3.8.4 版本的 ZooKeeper 镜像。
首先,使用下面一行命令,在 docker 中 创建一个名为 solr-zookeeper-net 的网络。这会提供给 ZooKeeper 集群和 Solr 集群通讯使用,即:可以使用容器名,代替 IP 地址。
1 | docker network create solr-zookeeper-net
|
2.1 ZK Node1
如果是第二次部署,配置已存在物理机,可以忽略第一 和 第二两步。第一步,使用下面命令启动一个 没有配置映射的 ZooKeeper1 容器。
1 2 3 4 5 6 7 8 9 10 | docker run -d `
-p 2181:2181 -p 2888:2888 -p 3888:3888 `
--restart always `
--name zookeeper1-3.8.4 `
--network=solr-zookeeper-net `
-e ZOO_MY_ID= "1" `
-e ZOO_SERVERS= "server.1=zookeeper1-3.8.4:2888:3888;2181 server.2=zookeeper2-3.8.4:2889:3889;2182 server.3=zookeeper3-3.8.4:2890:3890;2183" `
- v C:\ProgramDatas\Docker\Containers\zookeeper1-3.8.4\data: /data `
- v C:\ProgramDatas\Docker\Containers\zookeeper1-3.8.4\datalog: /datalog `
zookeeper:3.8.4
|
第二步,执行下面三条命令,把容器内的配置拷贝到物理机,然后停止并删除 ZooKeeper1 容器。
1 2 3 | docker cp zookeeper1-3.8.4: /conf C:\ProgramDatas\Docker\Containers\zookeeper1-3.8.4\conf
docker stop zookeeper1-3.8.4
docker rm zookeeper1-3.8.4
|
第三步,执行下面命令,启动一个具有配置映射的 ZooKeeper1 容器。
1 2 3 4 5 6 7 8 9 10 11 | docker run -d `
-p 2181:2181 -p 2888:2888 -p 3888:3888 `
--restart always `
--name zookeeper1-3.8.4 `
--network=solr-zookeeper-net `
-e ZOO_MY_ID= "1" `
-e ZOO_SERVERS= "server.1=zookeeper1-3.8.4:2888:3888;2181 server.2=zookeeper2-3.8.4:2889:3889;2182 server.3=zookeeper3-3.8.4:2890:3890;2183" `
- v C:\ProgramDatas\Docker\Containers\zookeeper1-3.8.4\data: /data `
- v C:\ProgramDatas\Docker\Containers\zookeeper1-3.8.4\datalog: /datalog `
- v C:\ProgramDatas\Docker\Containers\zookeeper1-3.8.4\conf: /conf `
zookeeper:3.8.4
|
2.2 ZK Node2
如果是第二次部署,配置已存在物理机,可以忽略第一 和 第二两步。第一步,使用下面命令启动一个 没有配置映射的 ZooKeeper2 容器。
1 2 3 4 5 6 7 8 | docker run -d -p 2182:2181 -p 2889:2888 -p 3889:3888 `
--restart always `
--name zookeeper2-3.8.4 `
--network=solr-zookeeper-net `
-e ZOO_MY_ID= "2" -e ZOO_SERVERS= "server.1=zookeeper1-3.8.4:2888:3888;2181 server.2=zookeeper2-3.8.4:2889:3889;2182 server.3=zookeeper3-3.8.4:2890:3890;2183" `
- v C:\ProgramDatas\Docker\Containers\zookeeper2-3.8.4\data: /data `
- v C:\ProgramDatas\Docker\Containers\zookeeper2-3.8.4\datalog: /datalog `
zookeeper:3.8.4
|
第二步,执行下面三条命令,把容器内的配置拷贝到物理机,然后停止并删除 ZooKeeper2 容器。
1 2 3 | docker cp zookeeper2-3.8.4: /conf C:\ProgramDatas\Docker\Containers\zookeeper2-3.8.4\conf
docker stop zookeeper2-3.8.4
docker rm zookeeper2-3.8.4
|
第三步,执行下面命令,启动一个具有配置映射的 ZooKeeper2 容器。
1 2 3 4 5 6 7 8 9 | docker run -d -p 2182:2181 -p 2889:2888 -p 3889:3888 `
--restart always `
--name zookeeper2-3.8.4 `
--network=solr-zookeeper-net `
-e ZOO_MY_ID= "2" -e ZOO_SERVERS= "server.1=zookeeper1-3.8.4:2888:3888;2181 server.2=zookeeper2-3.8.4:2889:3889;2182 server.3=zookeeper3-3.8.4:2890:3890;2183" `
- v C:\ProgramDatas\Docker\Containers\zookeeper2-3.8.4\data: /data `
- v C:\ProgramDatas\Docker\Containers\zookeeper2-3.8.4\datalog: /datalog `
- v C:\ProgramDatas\Docker\Containers\zookeeper2-3.8.4\conf: /conf `
zookeeper:3.8.4
|
2.3 ZK Node3
如果是第二次部署,配置已存在物理机,可以忽略第一 和 第二两步。第一步,使用下面命令启动一个 没有配置映射的 ZooKeeper3 容器。
1 2 3 4 5 6 7 8 9 10 | docker run -d `
-p 2813:2181 -p 2890:2888 -p 3890:3888 `
--restart always `
--network=solr-zookeeper-net `
-e ZOO_MY_ID= "3" `
-e ZOO_SERVERS= "server.1=zookeeper1-3.8.4:2888:3888;2181 server.2=zookeeper2-3.8.4:2889:3889;2182 server.3=zookeeper3-3.8.4:2890:3890;2183" `
- v C:\ProgramDatas\Docker\Containers\zookeeper3-3.8.4\data: /data `
- v C:\ProgramDatas\Docker\Containers\zookeeper3-3.8.4\datalog: /datalog `
--name zookeeper3-3.8.4 `
zookeeper:3.8.4
|
第二步,执行下面三条命令,把容器内的配置拷贝到物理机,然后停止并删除 ZooKeeper3 容器。
1 2 3 | docker cp zookeeper3-3.8.4: /conf C:\ProgramDatas\Docker\Containers\zookeeper3-3.8.4\conf
docker stop zookeeper3-3.8.4
docker rm zookeeper3-3.8.4
|
第三步,执行下面命令,启动一个具有配置映射的 ZooKeeper3 容器。
1 2 3 4 5 6 7 8 9 10 11 | docker run -d `
-p 2813:2181 -p 2890:2888 -p 3890:3888 `
--restart always `
--network=solr-zookeeper-net `
-e ZOO_MY_ID= "3" `
-e ZOO_SERVERS= "server.1=zookeeper1-3.8.4:2888:3888;2181 server.2=zookeeper2-3.8.4:2889:3889;2182 server.3=zookeeper3-3.8.4:2890:3890;2183" `
- v C:\ProgramDatas\Docker\Containers\zookeeper3-3.8.4\data: /data `
- v C:\ProgramDatas\Docker\Containers\zookeeper3-3.8.4\datalog: /datalog `
- v C:\ProgramDatas\Docker\Containers\zookeeper3-3.8.4\conf: /conf `
--name zookeeper3-3.8.4 `
zookeeper:3.8.4
|
三、Solr 集群
ZooKeeper 集群部署完成后,就可以部署 Solr 集群了。这里,使用的是 8.11.3 版本的 Solr 镜像。
3.1 准备目录映射
启动一个 solr 容器,这个容器仅供拷贝 solr 映射文件目录使用。
1 | docker run -d -p 8983:8983 --name solr-8.11.3 -t solr:8.11.3
|
执行下面命令,使用 docker cp 命令将 solr 容器内的程序目录(/opt/solr/)和数据目录(/var/solr/)拷贝到 solr1、solr2、solr3 对应将要映射的物理机目录下。然后停止并删除临时的 solr 容器。
1 2 3 4 5 6 7 8 | docker cp solr-8.11.3: /opt/solr/ C:\ProgramDatas\Docker\Containers\solr1-8.11.3\solr
docker cp solr-8.11.3: /var/solr/ C:\ProgramDatas\Docker\Containers\solr1-8.11.3\data
docker cp solr-8.11.3: /opt/solr/ C:\ProgramDatas\Docker\Containers\solr2-8.11.3\solr
docker cp solr-8.11.3: /var/solr/ C:\ProgramDatas\Docker\Containers\solr2-8.11.3\data
docker cp solr-8.11.3: /opt/solr/ C:\ProgramDatas\Docker\Containers\solr3-8.11.3\solr
docker cp solr-8.11.3: /var/solr/ C:\ProgramDatas\Docker\Containers\solr3-8.11.3\data
docker stop solr-8.11.3
docker rm solr-8.11.3
|
3.2 Solr 1
执行项目命令,即可启动一个 solr1 容器。
1 2 3 4 5 6 7 8 | docker run -d -t -p 8983:8983 `
--network=solr-zookeeper-net `
--restart=always `
--name solr1-8.11.3 `
--privileged= true `
- v C:\ProgramDatas\Docker\Containers\solr1-8.11.3\solr: /opt/solr `
- v C:\ProgramDatas\Docker\Containers\solr1-8.11.3\data: /var/solr `
solr:8.11.3 bash -c '/opt/solr/bin/solr start -f -z zookeeper1-3.8.4:2181,zookeeper2-3.8.4:2182,zookeeper3-3.8.4:2183'
|
3.3 Solr 2
执行项目命令,即可启动一个 solr2 容器。
1 2 3 4 5 6 7 8 | docker run -d -t -p 8984:8983 `
--network=solr-zookeeper-net `
--restart=always `
--name solr2-8.11.3 `
--privileged= true `
- v C:\ProgramDatas\Docker\Containers\solr2-8.11.3\solr: /opt/solr `
- v C:\ProgramDatas\Docker\Containers\solr2-8.11.3\data: /var/solr `
solr:8.11.3 bash -c '/opt/solr/bin/solr start -f -z zookeeper1-3.8.4:2181,zookeeper2-3.8.4:2182,zookeeper3-3.8.4:2183'
|
3.4 Solr 3
执行项目命令,即可启动一个 solr3 容器。
1 2 3 4 5 6 7 8 | docker run -d -t -p 8985:8983 `
--network=solr-zookeeper-net `
--restart=always `
--name solr3-8.11.3 `
--privileged= true `
- v C:\ProgramDatas\Docker\Containers\solr3-8.11.3\solr: /opt/solr `
- v C:\ProgramDatas\Docker\Containers\solr3-8.11.3\data: /var/solr `
solr:8.11.3 bash -c '/opt/solr/bin/solr start -f -z zookeeper1-3.8.4:2181,zookeeper2-3.8.4:2182,zookeeper3-3.8.4:2183'
|
四、Solr ZK 容器状态
ZooKeeper 集群和 Solr 集群部署完成后,可以通过 Docker Desktop 查看容器状态。如下图
4.1 验证 Solr 集群
如下所示,在某个节点中,可以看到 solr 集群中的全部 solr 节点,即代表集群部署成功。
http://localhost:8983/solr/#/~cloud
http://localhost:8984/solr/#/~cloud
http://localhost:8985/solr/#/~cloud
五、SolrZK 状态
随便找一个节点查看 ZK Status(我这里查看的 solr3:http://localhost:8985/solr/#/~cloud?view=zkstatus),可以看到提示需要向 zk 加一行配置。
找到 zk1、zk2、zk3 的 zoo.cfg 文件,分别加入下面一行配置。然后重启 zk1、zk2、zk3 的容器即可生效。
1 | 4lw.commands.whitelist=mntr,conf,ruok
|
重启完成后,打开 solr admin 面板,可以看到此时 zk 集群的状态可以在 solr 控制台中正常展示。
六、LB SolrCloud
这里通过 Nginx 对 Solr 集群进行负载均衡,部署起来也相对较为简单。
6.1 准备 nginx.conf
执行下面命令,启动一个临时的 Nginx 容器。然后在执行 docker cp 将容器内的配置文件拷贝到物理机 。最后执行docker rm 删除临时的 Nginx 容器。
1 2 3 4 | docker run -d `
-p 8080:80 `
--name nginx-1.25.4 `
nginx:1.25.4
|
1 2 | docker cp nginx-1.25.4: /etc/nginx/nginx .conf C:\ProgramDatas\Docker\Containers\nginx-1.25.4\nginx.conf
docker rm -f nginx-1.25.4
|
6.2 部署 Nginx
执行下面命令,即可启动一个 Nginx 容器。
1 2 3 4 5 6 7 8 9 10 11 | docker run -d `
-p 8080:80 `
-p 8982:8982 `
--network=solr-zookeeper-net `
--restart always `
--name nginx-1.25.4 `
- v C:\ProgramDatas\Docker\Containers\nginx-1.25.4\html: /usr/share/nginx/html `
- v C:\ProgramDatas\Docker\Containers\nginx-1.25.4\nginx.conf: /etc/nginx/nginx .conf `
- v C:\ProgramDatas\Docker\Containers\nginx-1.25.4\cache: /var/cache/nginx `
- v C:\ProgramDatas\Docker\Containers\nginx-1.25.4\pid: /var/run `
nginx:1.25.4
|
-参数 --restart always 在容器退出时总是重启容器。
-参数 -v C:\ProgramDatas\Docker\Containers\nginx-1.25.4\html:/usr/share/nginx/html 映射 Nginx 默认路径到物理机。
-参数 -v C:\ProgramDatas\Docker\Containers\nginx-1.25.4\nginx.conf:/etc/nginx/nginx.conf 映射 Nginx 容器内配置文件。
-参数 -v C:\ProgramDatas\Docker\Containers\nginx-1.25.4\cache:/var/cache/nginx 映射 Nginx 缓存目录到物理机。
-参数 -v C:\ProgramDatas\Docker\Containers\nginx-1.25.4\pid:/var/run 映射 Nginx 的 PID 文件到物理机。
6.3 配置 LB
打开物理机的 nginx.conf 配置文件,添加 upstream 和 server 模块,然后重启 nginx 容器即可生效。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | http {
upstream solrcloud {
server solr1-8.11.3:8983;
server solr2-8.11.3:8984;
server solr3-8.11.3:8985;
}
server {
listen 8982;
location / {
proxy_pass http: //solrcloud ;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
|
6.4 LB 端点
可看到,我们配置的 LB 是 8982 端口。
打开浏览器,使用 8982 端口进行访问 http://localhost:8982/solr/#/,可以正常看到 solr 集群的控制台。