Giter Site home page Giter Site logo

hydrogen-ssdb's People

Contributors

dependabot[bot] avatar yiding-he avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

hydrogen-ssdb's Issues

hlist接口问题

官方hlist接口文档写的好像不对,返回的应该是hash name的集合
官方hlist接口没有key这个参数,如果有了key参数,那和hscan是一样的了

public List hlist(String key, String startExclude, String endInclude, int limit) {
return sendRequest("hlist", key, startExclude, endInclude, limit).getKeyValues();
}

public List hrlist(String key, String startExclude, String endInclude, int limit) {
return sendRequest("hrlist", key, startExclude, endInclude, limit).getKeyValues();
}

zset和zrange中score数据类型不一致

导致过大的score出现解析异常:

java.lang.NumberFormatException: For input string: "6832770000"
    java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    java.lang.Integer.parseInt(Integer.java:495)
    java.lang.Integer.parseInt(Integer.java:527)
    com.hyd.ssdb.protocol.Response.getIdScores(Response.java:130)
    com.hyd.ssdb.SsdbClient.zrrange(SsdbClient.java:435)

zset接口定义

public void zset(String key, String id, long score) {
        sendWriteRequest("zset", key, id, score);
    }

IdScore定义

  private String id;

  private int score;

multi_get

没有 找到该方法
因为某种原因 ,没有实现 该方法吗?

间歇性错误

com.hyd.ssdb.SsdbNoClusterAvailableException: NO CLUSTER AVAILABLE
CAUSE:null
at com.hyd.ssdb.sharding.ConsistentHashSharding.getClusterByKey(ConsistentHashSharding.java:281)
at com.hyd.ssdb.conn.ConnectionPoolManager.getConnection(ConnectionPoolManager.java:77)
at com.hyd.ssdb.AbstractClient.sendRequest(AbstractClient.java:116)
at com.hyd.ssdb.AbstractClient.sendRequest(AbstractClient.java:94)
at com.hyd.ssdb.SsdbClient.multiGetBytes(SsdbClient.java:343)
at tools.Ssdb.multiGetBytes(Ssdb.java:174)
at runnable.SsdbQueue.run(SsdbQueue.java:105)
at java.lang.Thread.run(Thread.java:748)

请问这个错误是什么原因呀 目前是一主一从,但是从没有请求,内存是6G,连接主的偶尔会报这个错误

bug 提交

Response的getBytes方法实现不正确,不应该调用toBytes方法,盼修正

public byte[] getBytes() {
return this.body.isEmpty() ? new byte[0] : this.body.get(0).toBytes();
}

接口异常和返回值设计问题

第一:设计问题

public int getIntResult() {
        if (header.equals("not_found")) {
            return -1;
        } else {
            return Integer.parseInt(firstBlock());
        }
    }

返回 -1 ,在语义层面是有两个问题:

  1. 不能很明显的反应没有获取到数据
  2. 会混淆值为 -1 和 没有查询到数据的情况

第二:接口异常

接口 zget 在获取不存在数据的时候,会抛异常。其他类似接口应该也有同样问题。

最后: 修改建议

  1. 内部捕获转型失败的异常
  2. 修改返回值类型,将 int long 分别修改成 Integer Long。通过 null 表示查询的结果不存在。

zscan,zrscan,zkeys命令错误

正常ssdb命令参数应该是"name,key_start,score_start,score_end,limit",但ssdbclient里面的是"key,startExclude,endInclude,limit"参数错误,执行会报client_error.
实际上ssdb server返回的错误是
server.cpp(340): w:0.061,p:0.007, req: zscan key1 "" "" 10, resp: client_error wrong number of arguments
建议后续大家使用更改如下:
public List<IdScore> zscan(String name,String keyStart, Long scoreStart, Long scoreEnd, int limit)
{
return sendRequest("zscan", name, keyStart, scoreStart==null?"":scoreStart.longValue(), scoreEnd==null?"":scoreEnd.longValue(), limit).getIdScores();
}

hgtall->hgetall

public List<KeyValue> hgetall(String key) {
    return sendRequest("hgtall", key).getKeyValues();
}

public Map<String, String> hgetallmap(String key) {
    return sendRequest("hgtall", key).getBlocksAsMap();
}

Cluster 模式下,数据量较大时ssdb只读不能更新的问题

ssdb关键配置参数如下:
leveldb:
# in MB
cache_size: 500
# in MB
write_buffer_size: 64
# in MB/s
compaction_speed: 1000
# yes|no
compression: yes

m1、m2、m3是ssdb集群的三个replication,数据库文件大小如下:
[root@iZbp15qbhzylu7lbul26qqZ ~]# du -h --max-depth=1 /data/ssdb/bak/
1.7G /data/ssdb/bak/m2
1.7G /data/ssdb/bak/m3
584M /data/ssdb/bak/m1
3.9G /data/ssdb/bak/

我通过hydrogen-ssdb连接ssdb时,发现只能读取数据,无法set和del,然后连接大约600秒钟后,出现SocketTimeout错误。

请问一下这个可能是什么问题引发的?

使用密码连接时返回noauth错误

尝试连接发送数据时,返回“noauth”异常。
初始化Client时已经设置pass参数,且对应参数本地terminal多次尝试均没有问题。

SsdbClient client = new SsdbClient('127.0.0.1', 18888,"pass");
client.set("key", "value");//noauth error

仔细阅读源码后发现并没有在send数据前进行auth操作,不知是否是此处有问题。
如果是我的问题希望可以在README中加入关于校验密码的Demo,感谢!

发现长时间运行有时会报一个token的错误

报错信息如下

[2020-02-28 03:01:40]java.lang.NullPointerException
CAUSE:null
        at com.hyd.ssdb.protocol.Request.readTokens(Request.java:71)
        at com.hyd.ssdb.protocol.Request.<init>(Request.java:37)
        at com.hyd.ssdb.AbstractClient.sendRequest(AbstractClient.java:94)
        at com.hyd.ssdb.SsdbClient.getBytes(SsdbClient.java:110)
        at tools.Ssdb.get(Ssdb.java:81)
        at tools.ssdb.SsdbReportLog.arrToLog(SsdbReportLog.java:28)
        at tools.ssdb.SsdbReportLog.reportToLog(SsdbReportLog.java:180)
        at tools.SsdbReports.main(SsdbReports.java:254)

服务器故障恢复不了的问题

升级了最新的jar包,但是测试时,仍不能解决服务器故障,恢复不了的问题,请问下,还需要什么配置的吗

间歇性出现 NO CLUSTER AVAILABLE 问题 请问应该如何处理比较好?

长时间运行,有时会出现下面的报错(有可能几天出现一次)。ssdb 监测并没发现问题。
建立方式 client = new SsdbClient(host,port,timeout, auth);
使用版本1.2.2

[2020-07-29 11:00:11]com.hyd.ssdb.SsdbNoClusterAvailableException: NO CLUSTER AVAILABLE
CAUSE:null
at com.hyd.ssdb.sharding.ConsistentHashSharding.getClusterByKey(ConsistentHashSharding.java:281)
at com.hyd.ssdb.conn.ConnectionPoolManager.getConnection(ConnectionPoolManager.java:77)
at com.hyd.ssdb.AbstractClient.sendRequest(AbstractClient.java:116)
at com.hyd.ssdb.AbstractClient.sendRequest(AbstractClient.java:94)
at com.hyd.ssdb.SsdbClient.getBytes(SsdbClient.java:110)

Sharding类里没有找到fromServerList方法

你好, 我今天把代码down下来看了下. 在测试的时候发现报错.
SsdbClient client = new SsdbClient(Sharding.fromServerList(servers));
client.set("name", "hydrogen-ssdb"); // 写入请求一定会发送给主服务器
System.out.println(client.get("name")); // 读取请求会随机发送给任意一台服务器
案例中的 Sharding.fromServerList(servers)方法报错.
我看了下源代码, Sharding类里边没有找到这个方法.
这个方法是不用了没有更新使用demo吗? 还是其他原因?

当故障 Cluster 恢复可用时如何自动检查并处理

现在的实现,一旦网络出现异常,就会把对应的服务器下线。这个策略对于生产环境是不可以接受的,所以我就修改了实现——删除 Cluster.markInvalid 的实现。

网络波动的问题,也是这个修改出现的。具体是出现在了连接池的使用上面。链接失败的时候,会对 available 赋值成 false。预期是告诉连接池,后面不要再用这个连接。 但是在使用连接池的时候,没有设置 testOnBorrow。borrowObject 时看到 ideal 的资源就会返回调用者。

  if (p != null && (getTestOnBorrow() || create && getTestOnCreate())) {
                    boolean validate = false;
                    Throwable validationThrowable = null;
                    try {
                        validate = factory.validateObject(p);
                    } catch (Throwable t) {
                        PoolUtils.checkRethrow(t);
                        validationThrowable = t;
                    }
                    if (!validate) {
                        try {
                            destroy(p);
                            destroyedByBorrowValidationCount.incrementAndGet();
                        } catch (Exception e) {
                            // Ignore - validation failure is more important
                        }
                        p = null;
                        if (create) {
                            NoSuchElementException nsee = new NoSuchElementException(
                                    "Unable to validate object");
                            nsee.initCause(validationThrowable);
                            throw nsee;
                        }
                    }
                }

目前,我的解决方案是创建连接池的时候,设置上 testOnBorrow.

private ConnectionPool getConnectionPool(final Server server) {
        synchronized (server) {
            if (connectionPoolMap.containsKey(server)) {
                return connectionPoolMap.get(server);
            }

            ConnectionPool connectionPool = createConnectionPool(server);
            connectionPool.setTestOnBorrow(true);   // 新增代码
            connectionPoolMap.put(server, connectionPool);
            return connectionPool;
        }
    }

网络通信协议解析低效

Conection 类的 receivePacket 方法里,对字节流做了解析,但是输出的还是字节流。
真正使用的时候,需要在Response中再解析一次。这样会影响性能

返回结果有时为null

我测试了一下,ssdb数据库会将同一个socket连接在同时发生的操作的结果放在一个输出流中,导致了其他操作返回为null的情况,请问下除了对每个socket连接加个锁这种方式,还有其他什么好的办法

一个cluster中从节点挂掉重新恢复时, 会恢复成主节点.

public void reportInvalidConnection(String host, int port) {
    Server toInvalidate = new Server(host, port);
    for (Cluster cluster : sharding.getClusters()) {
        if (cluster.containsServer(toInvalidate)) {
            cluster.markInvalid(toInvalidate);
        }
    }
}

这段代码, 标记不可用的时候,new了一个server. 默认是master.
从节点也会被当成master标记为不可用,恢复从节点时, 从节点会恢复成主节点.

一致性hash

话说你这个
`
protected List clusters = new ArrayList();
Cluster cluster = clusters.get(i);
int min, max;

        if (i == clusters.size() - 1) {
            min = ((int) (pointer + Integer.MIN_VALUE) + 1);
            max = (Integer.MAX_VALUE);
            setClusterRange(cluster, min, max);

        } else {
            min = i == 0 ? Integer.MIN_VALUE : (int) (pointer + Integer.MIN_VALUE) + 1;

            weightcounter += cluster.getWeight();
            pointer = maxrange * weightcounter / maxWeight;
            max = ((int) (pointer + Integer.MIN_VALUE));

            setClusterRange(cluster, min, max);
        }`

这个应该和你放入的顺序有关了吧,假设你的顺序更换了,我所有的分片都会乱掉了。
最好支持可以带名称的集群

这个应该怎么编译呀

你好,我编译的时候报了缺少文件的错误,能帮忙看看吗,正确的编译方式,编译命令是什么呀
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/ClusterConf.java:[3,14] package lombok does not exist
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/ClusterConf.java:[8,2] cannot find symbol
symbol: class Data
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/ServerConf.java:[5,14] package lombok does not exist
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/ServerConf.java:[7,51] package org.springframework.boot.context.properties does not exist
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/ServerConf.java:[9,2] cannot find symbol
symbol: class Data
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConf.java:[3,14] package lombok does not exist
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConf.java:[4,51] package org.springframework.boot.context.properties does not exist
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConf.java:[9,2] cannot find symbol
symbol: class ConfigurationProperties
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConf.java:[10,2] cannot find symbol
symbol: class Data
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[7,56] package org.springframework.boot.autoconfigure.condition does not exist
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[8,51] package org.springframework.boot.context.properties does not exist
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[15,2] cannot find symbol
symbol: class EnableConfigurationProperties
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/ServerConf.java:[20,6] cannot find symbol
symbol: class NestedConfigurationProperty
location: class com.hyd.ssdb.springboot.ServerConf
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/ServerConf.java:[23,6] cannot find symbol
symbol: class NestedConfigurationProperty
location: class com.hyd.ssdb.springboot.ServerConf
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[21,6] cannot find symbol

symbol: class ConditionalOnMissingBean
location: class com.hyd.ssdb.springboot.HydrogenSsdbConfigurator
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/ServerConf.java:[21,50] createDefaultPoolConfig() has private access in com.hyd.ssdb.conf.Server
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[24,23] cannot find symbol
symbol: method getClusters()
location: variable config of type com.hyd.ssdb.springboot.HydrogenSsdbConf
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[30,39] cannot find symbol
symbol: method getServers()
location: variable clusterConf of type com.hyd.ssdb.springboot.ClusterConf
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[36,40] cannot find symbol
symbol: method getPool()
location: variable serverConf of type com.hyd.ssdb.springboot.ServerConf
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[37,42] cannot find symbol
symbol: method getSocket()
location: variable serverConf of type com.hyd.ssdb.springboot.ServerConf
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[38,36] cannot find symbol
symbol: method isMaster()
location: variable serverConf of type com.hyd.ssdb.springboot.ServerConf
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[39,34] cannot find symbol
symbol: method getHost()
location: variable serverConf of type com.hyd.ssdb.springboot.ServerConf
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[40,34] cannot find symbol
symbol: method getPort()
location: variable serverConf of type com.hyd.ssdb.springboot.ServerConf
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[41,34] cannot find symbol

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.