环境要求
- 系统环境:ubuntu18.04
- java jdk1.8以上:1.8.0_275
- solr版本:7.7.3
- zookeeper版本:3.6.2
SolrCloud 高可用集群
SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud的,当索引量很大,搜索请求并发很高,这时需要使用SolrCloud来满足这些需求。
SolrCloud是基于Solr和Zookeeper的分布式搜索方案,它的主要思想是使用Zookeeper作为集群的配置信息中心。
它有几个特色功能:
- 集中式的配置信息
- 自动容错
- 近实时搜索
- 查询时自动负载均衡
zookeeper是个什么东西
顾名思义zookeeper就是动物园管理员,他是用来管hadoop(大象)、Hive(蜜蜂)、pig(小猪)的管理员, Apache Hbase和 Apache Solr 的分布式集群都用到了zookeeper;Zookeeper:是一个分布式的、开源的程序协调服务,是hadoop项目下的一个子项目。
Zookeeper可以干哪些事情
- 配置集中管理
比如solr我们只用在一个节点上面配置了对应的配置,然后上传到zookeeper集中管理即可,所有solr节点共用zookeeper上面的唯一一份配置,这样就不用每个solr节点都配置一份配置文件了
- 名字服务
- 分布式锁
- 集群管理
solr-cloud相关概念
- Collection
Collection在solr集群中是一个逻辑上完整的索引结构,它常常被划分为一个或多个分片(Shard),他们使用相同的配置信息。例如对商品信息搜索,可以创建一个collection,collection=shard1+shard2+...+shardX
- Shard
每个Shard被划成一个或多个replication,通过选举确定那个是leader
- Core
Core是solr中一个独立的运行单位,提供索引,搜索服务。一个shard需要由一个Core或多个Core组成。
- Master-Slave
Master-Slave一个主从结构,master为主节点,salve是从节点,为了达到高可用,我们在同一个Shard下搭建一个master节点和salver节点,当master节点挂了,salver节点扶正。
集群规划
- 服务说明
这里我因为服务器资源紧缺,所以就采用伪集群的方式进行安装,如果是真正的生产环境,将伪集群的ip改下就可以了,步骤是一样的。
- solr以及zookeeper节点规划
需要三个zookeeper节点
需要三个以上solr节点,这里我就只用三个节点了
这里我就不使用tomcat安装solr服务了,直接使用原生的solr服务方式
- 服务器地址
外网地址:42.159.149.158
内网地址:10.1.0.38
Zookeeper集群的搭建
前提条件:三个zookeeper实例。Zookeeper也是java开发的所以需要安装jdk。
- 安装Jdk环境 jdk1.8版本以上
sudo apt-get update
sudo apt-get install openjdk-8-jre-headless
Zookeeper的安装步骤
- 下载地址
https://zookeeper.apache.org/releases.html
- 在/usr/local目录下下载zookeeper
sudo wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz
- 解压zookeeper压缩文件
sudo tar -zxvf apache-zookeeper-3.6.2-bin.tar.gz
- 在/usr/local/目录下创建一个solr-cloud目录。把zookeeper解压后的文件夹复制到此目录下三份。分别命名为zookeeper1、2、3
sudo mkdir /usr/local/solr-cloud
sudo cp -r apache-zookeeper-3.6.2-bin ./solr-cloud/zookeeper1
sudo cp -r apache-zookeeper-3.6.2-bin ./solr-cloud/zookeeper2
sudo cp -r apache-zookeeper-3.6.2-bin ./solr-cloud/zookeeper3
- 配置zookeeper
#1、在每个zookeeper文件夹下创建一个data目录
sudo mkdir /usr/local/solr-cloud/zookeeper1/data
sudo mkdir /usr/local/solr-cloud/zookeeper2/data
sudo mkdir /usr/local/solr-cloud/zookeeper3/data
#2、在data文件夹下创建一个文件名称为myid,文件的内容就是此zookeeper的编号1、2、3
sudo vim /usr/local/solr-cloud/zookeeper1/data/myid
sudo vim /usr/local/solr-cloud/zookeeper2/data/myid
sudo vim /usr/local/solr-cloud/zookeeper3/data/myid
#3、把各个zookeeper下conf目录下的zoo_sample.cfg文件复制一份改名为zoo.cfg
sudo cp /usr/local/solr-cloud/zookeeper1/conf/zoo_sample.cfg /usr/local/solr-cloud/zookeeper1/conf/zoo.cfg
sudo cp /usr/local/solr-cloud/zookeeper2/conf/zoo_sample.cfg /usr/local/solr-cloud/zookeeper2/conf/zoo.cfg
sudo cp /usr/local/solr-cloud/zookeeper3/conf/zoo_sample.cfg /usr/local/solr-cloud/zookeeper3/conf/zoo.cfg
#4、配置zoo.cfg
dataDir=/usr/local/solr-cloud/zookeeper1/data
clientPort=2181
server.1=10.1.0.38:2881:3881
server.2=10.1.0.38:2882:3882
server.3=10.1.0.38:2883:3883
dataDir=/usr/local/solr-cloud/zookeeper2/data
clientPort=2182
server.1=10.1.0.38:2881:3881
server.2=10.1.0.38:2882:3882
server.3=10.1.0.38:2883:3883
dataDir=/usr/local/solr-cloud/zookeeper3/data
clientPort=2183
server.1=10.1.0.38:2881:3881
server.2=10.1.0.38:2882:3882
server.3=10.1.0.38:2883:3883
- 启动zookeeper服务
sudo /usr/local/solr-cloud/zookeeper1/bin/zkServer.sh start
sudo /usr/local/solr-cloud/zookeeper2/bin/zkServer.sh start
sudo /usr/local/solr-cloud/zookeeper3/bin/zkServer.sh start
- 查看集群状态
sudo /usr/local/solr-cloud/zookeeper1/bin/zkServer.sh status
sudo /usr/local/solr-cloud/zookeeper2/bin/zkServer.sh status
sudo /usr/local/solr-cloud/zookeeper3/bin/zkServer.sh status
- 集群状态信息如以下就表示zookeeper集群搭建完毕
making@making-3:/usr/local/solr-cloud/zookeeper3/conf$ sudo /usr/local/solr-cloud/zookeeper1/bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/solr-cloud/zookeeper1/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
making@making-3:/usr/local/solr-cloud/zookeeper3/conf$ sudo /usr/local/solr-cloud/zookeeper2/bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/solr-cloud/zookeeper2/bin/../conf/zoo.cfg
Client port found: 2182. Client address: localhost. Client SSL: false.
Mode: leader
making@making-3:/usr/local/solr-cloud/zookeeper3/conf$ sudo /usr/local/solr-cloud/zookeeper3/bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /usr/local/solr-cloud/zookeeper3/bin/../conf/zoo.cfg
Client port found: 2183. Client address: localhost. Client SSL: false.
Mode: follower
Solr实例的搭建
- 安装目录地址
cd /usr/local
- 下载solr地址
https://lucene.apache.org/solr/downloads.html
- 选择Solr 7X版本下载
https://www.apache.org/dyn/closer.lua/lucene/solr/7.7.3/solr-7.7.3.tgz
sudo wget https://mirrors.bfsu.edu.cn/apache/lucene/solr/7.7.3/solr-7.7.3.tgz
- 解压solr-7.7.3.tgz
tar -zxvf solr-7.7.3.tgz
- 复制solr-7.7.3到solr-cloud目录下四份
sudo cp -r /usr/local/solr-7.7.3/ /usr/local/solr-cloud/solr1
sudo cp -r /usr/local/solr-7.7.3/ /usr/local/solr-cloud/solr2
sudo cp -r /usr/local/solr-7.7.3/ /usr/local/solr-cloud/solr3
Solr集群的搭建
- 配置solr.in.sh启动配置
sudo vim /usr/local/solr-cloud/solr1/bin/solr.in.sh
sudo vim /usr/local/solr-cloud/solr2/bin/solr.in.sh
sudo vim /usr/local/solr-cloud/solr3/bin/solr.in.sh
SOLR_HEAP="512m" #1g
SOLR_JAVA_MEM="-Xms512m -Xmx512m" #-Xms1g -Xmx1g
ZK_HOST="10.1.0.38:2181,10.1.0.38:2182,10.1.0.38:2183"
SOLR_HOST="10.1.0.38"
SOLR_TIMEZONE="Asia/Shanghai"
SOLR_PORT=8983
solr1、solr2、solr3中的solr.in.sh只有SOLR_PORT配置项是不一样的,其他的都是一样
SOLR_PORT配置端口需要不同端口,比如分别为8983、8984、8985
- 配置solr.xml文件、指定当前实例运行的ip地址及端口号
sudo vim /usr/local/solr-cloud/solr1/server/solr/solr.xml
sudo vim /usr/local/solr-cloud/solr2/server/solr/solr.xml
sudo vim /usr/local/solr-cloud/solr3/server/solr/solr.xml
修改host(不修改默认当前服务器IP)和prot从8983到8985
<str name="host">${host:}</str>
<int name="hostPort">${jetty.port:8983}</int>
<str name="host">${host:}</str>
<int name="hostPort">${jetty.port:8984}</int>
<str name="host">${host:}</str>
<int name="hostPort">${jetty.port:8985}</int>
- 发布solr配置信息到zookeeper集中管理
这里我们指定solr1服务配置所有的配置,以后修改配置都在这个服务配置,将这台服务的配置发布到zookeeper中心管理
cd /usr/local/solr-cloud/solr1/server/scripts/cloud-scripts
./zkcli.sh -zkhost 10.1.0.38:2181,10.1.0.38:2182,10.1.0.38:2183 -cmd upconfig -confdir /usr/local/solr-cloud/solr1/server/solr/configsets/yingerfashion/conf -confname yingerfashion
- 启动solr
#官方不建议使用root权限开启服务,如果要用root权限开启 后面需要增加参数-force
sudo /usr/local/solr-cloud/solr1/bin/solr start -force
sudo /usr/local/solr-cloud/solr2/bin/solr start -force
sudo /usr/local/solr-cloud/solr3/bin/solr start -force
- 启动服务报Your open file limit is currently 1024
往/etc/security/limits.conf末尾追加下面的内容
root soft nofile 1040000
root hard nofile 1040000
root soft nofile 1040000
root hard nproc 1040000
root soft core unlimited
root hard core unlimited
ubuntu soft nofile 1040000
ubuntu hard nofile 1040000
ubuntu soft nofile 1040000
ubuntu hard nproc 1040000
ubuntu soft core unlimited
ubuntu hard core unlimited
* soft nofile 1040000
* hard nofile 1040000
* soft nofile 1040000
* hard nproc 1040000
* soft core unlimited
* hard core unlimited
- 使用ROOT账户执行以下命令创建新用户以及用户组
# 创建用户组
sudo groupadd solr
# 创建用户并添加至用户组
sudo useradd solr -g solr
# 更改用户密码
sudo passwd solr solr@2021
# 修改solr目录权限
sudo chown -R solr:solr /usr/local/solr-cloud/solr
- 开启solr后台dataimport功能
注意每台solr服务器都需要安装mysql服务,不然即使solr相关mysql链接的配置都配置了也维护不到数据,因为服务器没有mysql服务的话就没办法链接远程mysql地址
编写一键脚本
- 启动脚本
sudo vim /usr/local/solr-cloud/startall.sh
sudo /usr/local/solr-cloud/zookeeper1/bin/zkServer.sh start
sudo /usr/local/solr-cloud/zookeeper2/bin/zkServer.sh start
sudo /usr/local/solr-cloud/zookeeper3/bin/zkServer.sh start
sudo /usr/local/solr-cloud/solr1/bin/solr start -force
sudo /usr/local/solr-cloud/solr2/bin/solr start -force
sudo /usr/local/solr-cloud/solr3/bin/solr start -force
加可执行权限
sudo chmod +x /usr/local/solr-cloud/startall.sh
- 停止脚本
sudo vim /usr/local/solr-cloud/stopall.sh
sudo /usr/local/solr-cloud/zookeeper1/bin/zkServer.sh stop
sudo /usr/local/solr-cloud/zookeeper2/bin/zkServer.sh stop
sudo /usr/local/solr-cloud/zookeeper3/bin/zkServer.sh stop
sudo /usr/local/solr-cloud/solr1/bin/solr stop -force
sudo /usr/local/solr-cloud/solr2/bin/solr stop -force
sudo /usr/local/solr-cloud/solr3/bin/solr stop -force
加可执行权限
sudo chmod +x /usr/local/solr-cloud/stopall.sh
- 重启脚本
sudo vim /usr/local/solr-cloud/restartall.sh
sudo /usr/local/solr-cloud/zookeeper1/bin/zkServer.sh restart
sudo /usr/local/solr-cloud/zookeeper2/bin/zkServer.sh restart
sudo /usr/local/solr-cloud/zookeeper3/bin/zkServer.sh restart
sudo /usr/local/solr-cloud/solr1/bin/solr restart -force
sudo /usr/local/solr-cloud/solr2/bin/solr restart -force
sudo /usr/local/solr-cloud/solr3/bin/solr restart -force
加可执行权限
sudo chmod +x /usr/local/solr-cloud/restartall.sh
Solr增加权限
- 权限说明
Solrcloud增加权限的话可以采用两种方式
方式一:使用solr自带的权限验证
方式二:使用nginx用户权限认证
这里我还是直接使用nginx的权限认证,因为本身就需要使用nginx做负载均衡并且视同nginx做权限认证会更简单(个人感觉),solr自带的那一套权限认证配置相对复杂
使用nginx做权限认证并且做负载均衡
- 安装nginx
sudo apt-get install nginx
- 配置nginx负载以及auth
#如果需要指定域名和配置ssl证书的话在server中增加相关参数即可
#这里我们就只是指定IP访问了
sudo /etc/nginx/sites-available/default
upstream solrcloud {
server 10.1.0.38:8983 weight=4;
server 10.1.0.38:8984 weight=4;
server 10.1.0.38:8985 weight=4;
}
server {
listen 80;
server_name 42.159.149.158;
location / {
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_hide_header X-Powered-By;
proxy_hide_header Vary;
proxy_pass http://solrcloud;
proxy_redirect off;
auth_basic "Restricted Access"; #添加Nginx的Basic Authentication 访问控制
auth_basic_user_file /etc/nginx/passwd/nginx-basic.passwd; #存放密码的文件地址
}
}
- 生成nginx权限认证账号密码文件
#在/etc/nginx目录下创建passwd目录
sudo mkdir passwd
#生成密码 可以使用htpasswd,或者使用openssl
cd /etc/nginx/passwd 在这个目录下执行以下命令生成密码
printf "jimmy:$(openssl passwd -crypt jimmy123@202101)\n"
#执行命令之后生成下面的账号和密码
jimmy:eWYTSAiRE8J82
#将上面的账号密码写入/etc/nginx/passwd/nginx-basic.passwd文件
sudo vim /etc/nginx/passwd/nginx-basic.passwd
#因此,权限账号是jimmy 密码是jimmy123@202101
- solr访问方式
#可以指定具体端口访问
http://42.159.149.158:8983/solr/#/
http://42.159.149.158:8984/solr/#/
http://42.159.149.158:8985/solr/#/
#也可以直接使用IP不用加端口访问,因为已经做了负载均衡
http://42.159.149.158/solr/#/
#注意:既然做了负载均衡处理,那对外开放的端口号请求尽量还是关闭了【防火墙关闭对应8983-8985端口】,后续访问后台包括项目中集成使用都统一使用负载均衡IP或者域名
solr7.7.3版本主要特性说明
看solr7.7.3版本管理后台你会发现,该版本相比较于solr7.X更早的一些版本针对cloud增加了更友好的监控与管理,比如
增加了Nodes管理
增加了ZK Status管理
有了这些功能我们能更方便的知道我们的solrcloud集群的健康状态
注意说明
解压.tar.gz出错gzip: stdin: not in gzip format tar: /Child returned status 1 tar: Error is not recoverable: exiting now
sudo tar -zxvf solr-7.7.3.tgz
报以下错误,百思不得其解,明明文件是tgz格式,却还是解压不了
bzip2: (stdin) is not a bzip2 file.
tar: Child returned status 2
tar: Error is not recoverable: exiting now
然后排查了下文件到底是什么类型
file solr-7.7.3.tgz
然后你惊奇的会发现,这个文件竟然是HTML类型,这次终于知道是什么原因导致的了
solr-7.7.3.tgz: HTML document, ASCII text, with very long lines
理由如下:
文件的下载链接不是直接指向文件,而是先指向一个页面,在这个页面里才是真的下载链接,所以在前一个页面上直接保存文件,实际上保存的是一个页面。
需要调整配置的问题
- 修改请求参数【报419状态码解决方案】
/usr/local/solr-cloud/solr/server/etc
sudo vim jetty.xml
#更改
<Set name="requestHeaderSize"><Property name="solr.jetty.request.header.size" default="81920" /></Set>
- 修改nginx参数【414 Request-URI Too Large】
client_max_body_size 1024M;
client_header_buffer_size 512k;
large_client_header_buffers 4 512k;
client_body_buffer_size 10m;