SlorCloud关于关于ClusterState says we are the leader 问题

这几天检查solrCloud集群发现有些集群有问题,索引没有在建,我的集群有些core中leader选举错了,主要集中问题描述的的三个问题上。

问题描述

集群环境介绍:
4个core,每个core4个shard,每个shard有三个节点,其中一个是leader,两外两个是备份节点。

1、org.apache.solr.common.SolrException: ClusterState says we are the leader (http://59.77.244.196:8983/solr/weibo),​ but locally we  don't think so. Request came from http://59.77.244.192:8985/solr/weibo/
2、Error registering SolrCore:org.apache.solr.common.SolrException: Error getting leader from zk for shard shard1
3、There was a problem finding the leader in zk:org.apache.solr.common.SolrException: Could not get leader props

这个问题很棘手啊,我开始根据关键词去百度谷歌找些资料来查看什么原因,不过答案还是太杂了,不太懂,后来在一个讨论群里群主告诉我要修改集群的配置文件,我就尝试一下,后来发现两个办法可以解决,于是做个笔记,下次碰到了也好解决。

问题解决(一)

环境:solr4.4 + jetty + zookeeper(外搭) + ubantu 系统

简单粗暴的做法就是重启所有zookeeper服务和solr服务,但是我有3个zookeeper服务,12个solr节点,全部重启真是太蛋疼了,建议还是用第二种办法,不过第二种办法要求你最好是懂一些zookeeper编程的操作,否则也是很蛋疼,我会贴出代码,不过一些jar包就靠你们摸索了。

问题解决(二)

环境:solr4.4 + jetty + zookeeper(外搭) + ubantu 系统

步骤一:拷贝自己solr集群中的clusterstate.json文件内容

你可以通过zookeeper的zkCli.sh来得到,需要你懂一些相关命令,或者你直接在如图下的路径就可以找到该文件,还可以在界面看到配置信息,将配置信息拷贝出来放进本机的一个文件中。
集群配置信息

步骤二:修改配置信息

这里修改配置信息是因为leader的节点弄错了,所以要修改步骤一得到的clusterstate.json信息,接下来我会贴出部分信息给大家看:
假设core1是正常没有出现leader选举出错的core信息,core2是有问题的。

core1中的配置信息:
"shard1":{
    "range":"80000000-bfffffff",
    "state":"active",
    "replicas":{
      "core_node1":{
        "state":"active",
        "core":"forum",
        "node_name":"59.77.244.196:8983_solr",
        "base_url":"http://59.77.244.196:8983/solr"},
      "core_node5":{
        "state":"active",
        "core":"forum",
        "node_name":"59.77.244.196:8984_solr",
        "base_url":"http://59.77.244.196:8984/solr",
        "leader":"true"},      #------------------------------注意看这里-----------------#
      "core_node9":{
        "state":"active",
        "core":"forum",
        "node_name":"59.77.244.199:8984_solr",
        "base_url":"http://59.77.244.199:8984/solr"}}},
        信息中我们看到  shard1的leader节点是59.77.244.196:8984,因为他有一个字段是  "leader":"true"。

        core2中的配置信息:
        "shard1":{
    "range":"80000000-bfffffff",
    "state":"active",
    "replicas":{
      "core_node1":{
        "state":"active",
        "core":"forum",
        "node_name":"59.77.244.196:8983_solr",
        "base_url":"http://59.77.244.196:8983/solr",
        "leader":"true"},     #------------------------------注意看这里-----------------#
      "core_node5":{
        "state":"active",
        "core":"forum",
        "node_name":"59.77.244.196:8984_solr",
        "base_url":"http://59.77.244.196:8984/solr"},
      "core_node9":{
        "state":"active",
        "core":"forum",
        "node_name":"59.77.244.199:8984_solr",
        "base_url":"http://59.77.244.199:8984/solr"}}},
        core2信息中leader是59.77.244.196:8983,所以要修改成core1中信息,把字段修改到59.77.244.196:8984中。

 假设你已经修改好了,已经把错误的信息修改过来了,那么接下来你应该是把配置信息上传到zookeeper集群中,代码如下:

    private static final int TIMEOUT = 3000;
    static final String urlport = "59.77.244.199:2181";
    public static void main(String[] args) throws KeeperException, InterruptedException{
    ZooKeeper zkp;
    try {
        zkp = new ZooKeeper(urlport, TIMEOUT, null);
        Stat stat = zkp.exists("/clusterstate.json",true);
        zkp.setData("/clusterstate.json",readfile("D:\\ceshi\\clusterstate.json").getBytes(),-1);
        byte[] bytes=zkp.getData("/clusterstate.json",null,stat);
        System.out.println("得到的节点信息:"+new String(bytes));
    } catch (IOException e) {
        System.out.println( "连接创建失败,发生 IOException" );   
        e.printStackTrace();            
    }
}
readfile("D:\\ceshi\\clusterstate.json") 就是读取本地的一个文件内容,这个不难,自己写一个函数就行
当然各位根据自己的集群环境作进一步的修改。

经过上述两步,你的集群leader节点已经转移到你修改的ip:端口上去了,过几秒钟,你会看到solrcloud集群界面。

这个时候你出问题的shard上的其他两个节点可能还是有问题的,节点状态是:Down,当然没有问题最好,如果有问题,你这个时候去Linux服务器里kill掉这两个节点服务,然后重启这两个服务,过几秒种,节点状态就是:Active,这样你就可以开始建索引。

结束语

solr服务总是会出现各种各样的问题,后来我想了一下,可能是服务器资源被占用了,然后solr服务被挤掉了,一直没有连接上去,导致solr集群选举机制的通讯出现了延迟,结果就是不知道谁是leader,哎,java一个程序启动就要吃掉2、3G的内存,真是蛋疼,没办法,服务器不够,一个服务器上最好不要有太多的程序在跑,不然那你会发现各种各样的问题的。

SlorCloud关于二次分片的研究以及增加shard和服务器实现动态扩容

大家好,这几天一直在学习solr,目前也已经搭建好了solrcloud,但是学长又逼着
我开始研究solr的相关问题,就比如说今天我们要面临的一个问题。

问题描述

学习solr的知道搭建集群的时候要指定shard的数目,这就会造成一个问题:我们怎
么清楚几个shard数目是合理的,或者说是满足我们的需求的。即使现在满足了需
求,但是将来需求还会变,真是蛋疼所以我们要想出一个策略来实现动态添加shard
,但是还有一个问题:索引文件会随着数据量的提升越来越大,以前的集群环境已经
容纳不了那么多的索引文件,如何实现动态添加新服务器到solr集群中,而不用重新启
动整个集群环境?所以今天实质要研究两个问题。

问题解决

实验环境:solr4.4 + jetty + zookeeper(外搭) + ubantu 系统

我们知道solr中有分裂功能,就是将一个shard分裂成两个shard,并且把该shard的
哈希值范围分成两个,这只针对路由方式是Composite的集群环境,因为只有Composite
路由方式才可以将哈希范围分成两份,这样solr主节点才可以将通过自己的负载均衡
将文档平均的分配到集群的各个节点上。但是其实你利用了分裂把一个哈希范围分成
了两个,其实这个时候就已经负载不均衡了,因为你的哈希范围比其他的shard的少一
半,好的接下里我们来实现分裂功能。

步骤一:搭建集群环境

首先我搭的集群是三个shard,除了shard1是有两个备份的,其他的两个shard是一个
备份,总共涉及到四台机器的solr服务,本来是有截图的,但是做完了实验又不爱重新
去搭建环境,毕竟很费时,所以这里跟大家交代一下就OK了。

步骤二:开始分裂

利用命令——–curl -i -v “http://xxx.xxx.xxx.190:8983/solr/admin/collections?action=
SPLITSHARD&collection=skycent&shard=shard1”
curl 是一个Linux工具,这条命令直接可以在Linux终端上使用,当然前提是安装了
此工具。
collection:是你的集合名称,我的是skycent。
shard:这个可以改成自己想分裂的shard,我这里是shard1。
可能会在执行后输出的字符中有出错的提示,但是可忽略不计,我们刷新solr
页面,看是否出现了新的两个shard,并且名称是:shard1_1和shard1_0。这表明
是从shard1分裂的两个新节点,然后记得把shard1节点的主节点和备份节点的skycent
都unload掉,这个unload操作可以在界面上的Core Admin上手动执行,也可以通过http
来实现,自己解决搞定,搞定后应该会出现如下的图片:
分裂后的集群Group

如果没有unload掉,可能会出现这种情况:当你新增加节点的时候可能会出现又多了
shard节点。如果看zookeeper集群信息/clusterstate.json,会发现新增加的shard没有哈希
范围,也就是说分配文档给节点的时候不会分配给这个节点,也就是说这个shard没有用。

步骤三:扩容新的服务器

我们本来的shard是3个,服务器是4个,分裂一个shard1后我们的shard是4个,也就是说这个
时候可以一台机器一个shard,但是我们经过步骤二之后发现,分裂的两个shard1-x都是在一个
机器上,也就是说一个机器有两个shard,我们观察步骤二之后的集群状态可以知道,这个时候
有一个新机器192:8984是备份节点,所以我们可以通过kill 190:8983这个solr服务,这样备份节
点就会成为主节点,也就是192:8984会成为主节点,这个时候四个主节点就是:
shard2:189:8983
shard3:191:8983
shard1_1:190:8984
shard1_0:192:8984
solr集群Group
这样就相当于动态的添加了新的服务器到solr集群上去了,并且一个shard有一个服务器,再继
续将刚刚kill掉的190:8983 solr服务开启,这样就作为了备份节点,并测试去添加一个新的solr
服务到集群环境中,观察发现添加的189:8984 solr 服务作为了备份节点,而没有去成为shard
节点,说明集群没有问题,搭建后的shard数目保持在4个,没有被分裂影响到数目。
solr集群Group

结束语

其实花的时间挺多的,因为网上这方面的资料很少,很多都要自己去弄,一个一个去测试,还有,
如果你一个步骤错了就要启动zookeeper,并且清空掉zookeeper中的solr集群内容,这个操作可以
用zk客户端的删除操作来执行,很浪费时间,所以写一个笔记在这,让更多人可以一起研究,如果
大家有问题可以在下方评论,我看到后会去解答,很多事情迈出第一步就好了,希望大家学习快乐。

利用Hexo搭建github个人博客

摘要

一直想搞个人博客,一直也没时间,等到了暑假,老师的新项目还没有开启就想起来搭建个人博客,中间碰到了挺多问题,这里也会跟大家讲一下,希望大家迅速的搭建个人博客,同时感谢帮助我的大神,他们的博客地址我会在底部给出链接,大家也可以去浏览、参考,现在开启我的搭建之旅。
首先给出Github网址:GitHub

准备

  • 注册github账号以及github本地电脑安装客户端
    当然你也要回一些github的基本操作,否则后面的代码也是看不懂。
    附上一个学习github的地址: github
    网址上有非常详细的讲解,希望对大家有帮助,建议大家安装完检查下安装是否成功。
  • 安装Node.js
    给出官网地址 Node
    具体安装步骤,百度就可以,建议大家安装完检查下安装是否成功。
  • Hexo
    介绍我就不说了,给出官网地址 HEXO,大家要注意,这个网站的右上角是可以选择语言的,方便大家浏览官网,谅解相关的基础知识。

    HEXO安装

1 . 首先点击git shell来启动或者使用cmd命令输入一下命令(两种方式都行):

1
2
npm install hexo-cli -g --这也是官方的安装命令,可参考官网
npm install hexo --save

2 . Hexo初始化配置
上面一步安装成功后,开始创建hexo文件夹: 自己随意在 D盘、F 盘选择一个英文路径的文件夹,我们假设是F:Hexo/,首先 cd 到文件夹Hexo中,使用以下命令:

1
2
hexo init --初始化这个文件夹
npm install --安装配置信息

安装 Hexo 完成后,Hexo 将会在指定文件夹中新建所需要的文件。Hexo文件夹下的目录如下:
Hexo文件内容

3 . 安装相关的Hexo插件
这些插件其实也可以当你要用的时候再来安装,不过为了不出错误,我们还是提前安装吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
npm install hexo-generator-index --save
npm install hexo-generator-archive --save
npm install hexo-generator-category --save
npm install hexo-generator-tag --save
npm install hexo-server --save
npm install hexo-deployer-git --save
npm install hexo-deployer-heroku --save
npm install hexo-deployer-rsync --save
npm install hexo-deployer-openshift --save
npm install hexo-renderer-marked@0.2 --save
npm install hexo-renderer-stylus@0.2 --save
npm install hexo-generator-feed@1 --save
npm install hexo-generator-sitemap@1 --save

4 . 查看本地Hexo服务效果
以上插件安装成功后,我们来测试本地的服务,看本地环境是否搭建成功。执行以下命令:

1
2
hexo g --有的博客上是用 hexo generate,其实这两条命令是等价的,不影响
hexo s --有的博客是利用 hexo server,这两条命令是等价的

接下来登录到我们的本地测试 ,就可以看到如下界面:
hexo测试主页
如果长时间没有出现,首先你就要去查看你的4000端口号是不是被占用了,最可能的结果
就是安装了福昕阅读器,因为这个软件会占用你的4000端口,导致hexo server命令行显示服务器启动成功但实际上无法正常访问,这个时候你就要更改下端口号,
利用命令:hexo s -p 4001 ,来启动localhost:4001,你就可以发现问题解决了,即可看到本地的效果如下:
(注意看图中的端口号)
hexo测试主页

Github Pages设置以及将博客部署到Github Pages

以上的操作只能让我们在本地看到我们的博客,现在我们要来设置Github Pages,让别人通过地址
联网来查看博客。

1 . 注册Github后新建一个Github项目,点击 New repository,如图来设置:
hexo测试主页

注意:这里添写的项目名称一定要记得必须是严格按照一下格式来的:
(你的github用户名).github.io
这样名字就只有二级,否则会很长。
2 . 创建Github Pages
点击刚刚创建的(你的github用户名).github.io里面去,在右侧我可以看到一个Setting,
hexo测试主页
然后在跳转的页面上找到 Github Pages,然后点击”Launch automatic page generator”,如图:
hexo测试主页
3 . 配置SSH秘钥
这个方面教程因为我个人的github安装路径问题,所以这里不介绍,网上有很多教程,大家配置秘钥的时候一定要找到自己github安装的路径最后一定要验证下自己是否设置成功。
将本地的Hexo文件更新到github库中
这里要讲下Hexo文件可以不再github目录下,这个没有必要要求。
(1)、点击刚才的创建好的Github Pages,找到”Clone or download”,选择”Clone with HTTPS”下的 URL,如图:
hexo测试主页
(2)、打开你在电脑上创建的Hexo文件夹,用记事本或者 sublime txt打开_config.yml文件
hexo测试主页

(3)、在配置文件下做如下修改,保存
hexo测试主页

(4)、在Hexo文件夹下执行命令

1
2
3
hexo clean
hexo generator
hexo d

执行完,有的会让你输入github的账号和密码,我在执行操作的时候没有要求输入账号和密码,就等了一会,执行完毕,这个时候访问之前创建的:(你的github用户名).github.io就可以访问了。

结束语

感谢几位大神的博客指导,我在他们的肩膀上成功了搭建了自己的博客,当然也出现了一些问题,
这些问题希望对其他人有帮助。
网址一:大神博客地址
网址二:大神博客地址

到目前为止只是搭建了这么一个博客,还有很多要学习的,建议大家去官网了解下hexo,这对你后续的给博客添加一些功能有帮助。

,