本练习介绍SolrCloud的高级操作,包括向集群添加节点、配置管理和生产环境准备。
什么是SolrCloud?
SolrCloud是Solr的分布式架构模式,提供:
- 高可用性:自动故障转移和恢复
- 水平扩展:轻松添加节点扩容
- 分布式索引:数据自动分片
- 负载均衡:查询自动分发
- 集中配置:通过ZooKeeper管理
核心概念
集群组件
- 节点(Node):运行Solr实例的服务器
- 集合(Collection):逻辑上的完整索引
- 分片(Shard):集合的水平分区
- 副本(Replica):分片的复制
- ZooKeeper:协调服务,管理配置和状态
副本类型
- NRT(Near Real Time):可以成为主副本,处理更新
- TLOG(Transaction Log):维护事务日志,可以成为主副本
- PULL:只能从主副本拉取数据,不能成为主副本
向集群添加节点
步骤1:创建新的Solr主目录
1 2
| mkdir -p example/cloud/node3/solr
|
步骤2:启动新节点并加入集群
1 2 3 4
| bin/solr start --cloud \ --solr-home example/cloud/node3/solr \ -p 8987 \ -z localhost:9983
|
参数说明:
--cloud
:以云模式启动
--solr-home
:指定Solr主目录
-p
:指定端口(8987)
-z
:ZooKeeper连接字符串
步骤3:验证节点加入
1 2 3 4 5
| bin/solr status
curl "http://localhost:8983/solr/admin/collections?action=CLUSTERSTATUS"
|
集合管理操作
创建集合
创建带有自定义分片和副本的集合:
1
| curl "http://localhost:8983/solr/admin/collections?action=CREATE&name=products&numShards=3&replicationFactor=2&maxShardsPerNode=2"
|
参数说明:
numShards
:分片数量
replicationFactor
:每个分片的副本数
maxShardsPerNode
:每个节点的最大分片数
添加副本
为现有集合添加副本:
1
| curl "http://localhost:8983/solr/admin/collections?action=ADDREPLICA&collection=products&shard=shard1&node=localhost:8987_solr"
|
分片拆分
当分片变得过大时,可以拆分:
1
| curl "http://localhost:8983/solr/admin/collections?action=SPLITSHARD&collection=products&shard=shard1"
|
集合别名
创建集合别名便于管理:
1 2 3 4 5
| curl "http://localhost:8983/solr/admin/collections?action=CREATEALIAS&name=current_products&collections=products_v2"
curl "http://localhost:8983/solr/admin/collections?action=CREATEALIAS&name=current_products&collections=products_v3"
|
禁用无模式功能
生产环境中,建议禁用自动字段创建:
使用V1 API
1 2 3 4 5
| curl http://localhost:8983/solr/mycollection/config -d '{ "set-user-property": { "update.autoCreateFields": "false" } }'
|
使用V2 API
1 2 3 4 5
| curl http://localhost:8983/api/collections/mycollection/config -d '{ "set-user-property": { "update.autoCreateFields": "false" } }'
|
高级配置管理
上传配置集
1 2 3 4 5
| bin/solr zk upconfig -n myconfig -d /path/to/config/dir -z localhost:9983
curl "http://localhost:8983/solr/admin/collections?action=CREATE&name=newcollection&numShards=2&configName=myconfig"
|
更新配置
1 2 3 4 5 6 7 8 9 10 11
| bin/solr zk downconfig -n myconfig -d /tmp/config -z localhost:9983
vim /tmp/config/solrconfig.xml
bin/solr zk upconfig -n myconfig -d /tmp/config -z localhost:9983
curl "http://localhost:8983/solr/admin/collections?action=RELOAD&name=mycollection"
|
监控和健康检查
集群状态监控
1 2 3 4 5 6 7 8
| curl "http://localhost:8983/solr/admin/collections?action=CLUSTERSTATUS"
bin/solr healthcheck -c products
curl "http://localhost:8983/solr/admin/info/system"
|
设置监控告警
监控关键指标:
- 节点可用性
- 副本同步状态
- 查询响应时间
- 索引大小和增长
- JVM内存使用
故障处理
节点故障恢复
当节点故障时,SolrCloud自动:
- 检测节点下线
- 选举新的主副本
- 继续提供服务
手动干预:
1 2
| curl "http://localhost:8983/solr/admin/collections?action=FORCELEADER&collection=products&shard=shard1"
|
副本恢复
1 2
| curl "http://localhost:8983/solr/admin/cores?action=REQUESTRECOVERY&core=products_shard1_replica_n1"
|
数据修复
1 2
| curl "http://localhost:8983/solr/products/update?optimize=true&maxSegments=1"
|
性能优化
1. 分片策略
1 2 3 4 5
|
curl "http://localhost:8983/solr/admin/collections?action=CREATE&name=logs&numShards=12&replicationFactor=2"
|
2. 副本放置策略
1 2 3 4 5
| <replicaPlacementFactory class="org.apache.solr.cluster.placement.plugins.AffinityPlacementFactory"> <str name="minimalFreeDiskGB">10</str> <str name="prioritizedFreeDiskGB">50</str> </replicaPlacementFactory>
|
3. 负载均衡
1 2 3 4 5 6
| backend solr_cluster balance roundrobin server solr1 localhost:8983 check server solr2 localhost:7574 check server solr3 localhost:8987 check
|
生产环境最佳实践
1. ZooKeeper集群
生产环境应使用独立的ZooKeeper集群:
1 2 3 4 5
|
server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
|
2. JVM调优
1 2 3
| SOLR_JAVA_MEM="-Xms8g -Xmx8g" GC_TUNE="-XX:+UseG1GC -XX:MaxGCPauseMillis=250"
|
3. 安全配置
1 2 3 4 5
| bin/solr auth enable -prompt true -z localhost:9983
bin/solr create_collection -c secure -s 2 -rf 2 -p 8984
|
4. 备份策略
1 2 3 4 5
| curl "http://localhost:8983/solr/admin/collections?action=BACKUP&name=products&collection=products&location=/backup/solr"
curl "http://localhost:8983/solr/admin/collections?action=RESTORE&name=products&collection=products_restored&location=/backup/solr"
|
容量规划
硬件建议
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 小型集群(<100GB数据): 节点数: 3 CPU: 4核 内存: 16GB 磁盘: SSD 200GB
中型集群(100GB-1TB): 节点数: 5-10 CPU: 8核 内存: 32GB 磁盘: SSD 500GB
大型集群(>1TB): 节点数: 10+ CPU: 16核 内存: 64GB+ 磁盘: SSD 1TB+
|
分片数量计算
1 2 3 4 5 6
| 分片数 = 总数据量 / 单分片目标大小
示例: - 总数据:500GB - 目标分片大小:50GB - 推荐分片数:10
|
迁移到SolrCloud
从单机迁移步骤
- 评估数据量和查询负载
- 设计集群架构
- 准备硬件和网络
- 安装和配置ZooKeeper
- 启动SolrCloud节点
- 创建集合和配置
- 迁移数据
- 验证和切换
数据迁移策略
1 2 3 4 5 6 7 8 9
| bin/solr create_backup -c old_core -d /backup bin/solr restore_backup -c new_collection -location /backup
curl "http://localhost:8983/solr/new_collection/dataimport?command=full-import"
curl "http://localhost:8983/solr/new_collection/update?commit=true" --data-binary @data.json
|
故障排除清单
常见问题
节点无法加入集群
- 检查ZooKeeper连接
- 验证网络连通性
- 查看防火墙设置
副本不同步
查询性能下降
有用的管理命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| curl "http://localhost:8983/solr/admin/collections?action=LIST"
curl "http://localhost:8983/solr/products/config"
curl "http://localhost:8983/solr/admin/collections?action=CLUSTERSTATUS" | jq '.cluster.live_nodes'
curl "http://localhost:8983/solr/admin/collections?action=CLUSTERSTATUS&collection=products" | jq '.cluster.collections.products.shards'
bin/solr stop --all
|
总结
SolrCloud提供了企业级的分布式搜索能力:
- 高可用性:自动故障转移确保服务连续性
- 可扩展性:轻松扩展以处理更多数据和请求
- 灵活性:动态管理集合和配置
- 可靠性:数据复制和恢复机制
关键要点:
- 合理规划分片和副本策略
- 使用独立的ZooKeeper集群
- 实施完善的监控和备份
- 定期测试故障恢复流程
下一步
- 深入学习ZooKeeper管理
- 探索更多集群优化技术
- 实施自动化运维
- 构建多数据中心部署
相关资源