对SolrCloud集群Collection进行手动二次Sharding

本文介绍了如何在SolrCloud环境中通过Collections API手动对现有Collection进行二次Sharding,以优化数据分布和提高检索性能。详细步骤参考Apache Solr官方文档及SearchHub的文章。
摘要由CSDN通过智能技术生成
我们已经基于SolrCloud 4.3.1+Tomcat 7搭建了搜索服务器集群,一个Collection对应3个节点上的3个分片(Shard),同时包含对应分片的副本(Replica),此时,该Collection一共有6000万左右Document,平均每个分片大约接近2000万。
SolrCloud集群节点的具体分布,如图所示:

只有shard1有一个副本,并且位于不同的节点上。
随着索引数据量的增长,如果我们的Collection的每个分片都不断的增大,最后导致单个分片在搜索的时候,相应速度成为瓶颈,那么,我们要考虑将每个分片再次进行分片。因为第一次系统规划时已经设置好分片数量,所以每个分片所包含的Document数量几乎是相同的,也就是说,再次分片后,重新得到的分片的数量是原来的二倍。
目前,SolrCloud不支持自动分片,但是支持手动分片,而且手动分片后得到的新的分片所包含的Document数量有一定的差异(还不清楚SolrCloud是否支持手动分片后大致均分一个分片)。下面,我们看一下,在进行手动分片过程中,需要执行哪些操作,应该如何重新规划整个SolrCloud集群。

首先,我增加了一个节点(slave6 10.95.3.67),把集群中原来的配置文件、solr-cloud.war及其Tomcat服务器都拷贝到这个新增的节点上,目的是将10.95.3.62上的shard1再次分片,然后将再次得到分片运行在新增的10.95.3.67节点上。启动新增节点的Tomcat服务器,它自动去连接ZooKeeper集群,此时ZooKeeper集群增加live_nodes数量,主要是通过在Tomcat的启动脚本中增加如下内容:
JAVA_OPTS="-server -Xmx4096m -Xms1024m -verbose:gc -Xloggc:solr_gc.log -Dsolr.solr.home=/home/hadoop/applications/solr/cloud/multicore -DzkHost=master:2188,slave1:2188,slave4:2188"
这样,就能告知ZooKeeper集群有新节点加入SolrCloud集群。
如上图所示,我们打算将shard1进行二次手动分片,执行如下命令即可:
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
ShardingJDBC 是一个基于 JDBC 的 Java 框架,它可以将 SQL 解析和路由到不同的数据库实例中,并且支持水平扩展。进行条件查询时,可以使用 ShardingJDBC 提供的 API 或配置文件的方式来指定表的分片策略和对应的数据库实例,从而实现对分片表的查询操作。 下面是一个使用 ShardingJDBC 进行条件查询的示例: 1. 配置数据源和分片规则 ```yaml spring: sharding: jdbc: datasource: names: ds0,ds1 ds0: driver-class-name: com.mysql.jdbc.Driver jdbcUrl: jdbc:mysql://localhost:3306/db0?useUnicode=true&characterEncoding=utf8&useSSL=false username: root password: root ds1: driver-class-name: com.mysql.jdbc.Driver jdbcUrl: jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=utf8&useSSL=false username: root password: root config: sharding: tables: user: actual-data-nodes: ds$->{0..1}.user_$->{0..2} table-strategy: inline: sharding-column: id algorithm-expression: user_$->{id % 3} key-generator: column: id type: SNOWFLAKE ``` 2. 进行条件查询 ```java @Autowired private DataSource dataSource; @Test public void testSelect() throws SQLException { String sql = "SELECT * FROM user WHERE id = ?"; try (Connection conn = dataSource.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { ps.setLong(1, 1); try (ResultSet rs = ps.executeQuery()) { while (rs.next()) { System.out.println(rs.getLong("id")); System.out.println(rs.getString("name")); } } } } ``` 在上述示例中,我们首先配置了两个数据源 ds0 和 ds1,然后指定了 user 表的分片策略和对应的数据库实例。最后,在进行条件查询时,我们使用了 ShardingJDBC 提供的 DataSource 来获取连接,并执行了相应的 SQL 语句。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值