Giter Site home page Giter Site logo

ctripcorp / x-pipe Goto Github PK

View Code? Open in Web Editor NEW
1.9K 134.0 499.0 55.81 MB

X-Pipe是由携程框架部门研发的Redis多数据中心复制管理系统。基于Redis的Master-Slave复制协议,实现低延时、高可用的Redis多数据中心、跨公网数据复制,并且提供一键机房切换,复制监控、异常报警等功能。开源版本和携程内部生产环境版本一致。

License: Apache License 2.0

Java 94.86% Shell 0.71% HTML 1.86% JavaScript 0.02% CSS 0.02% TypeScript 2.43% Dockerfile 0.01% Python 0.10%
redis cross-datacenter psync2 replication long-distance-replication keeper-redis rdb keeper redis-xpipe replication-over-public-network

x-pipe's Introduction

x-pipe

Build Status Coverity Scan Build Status github CI codecov

XPipe 解决什么问题

Redis 在携程内部得到了广泛的使用,根据客户端数据统计,整个携程全部 Redis 的读写请求在每秒 2000W,其中写请求约 100W,很多业务甚至会将 Redis 当成持久化的内存数据库使用。这样,就对 Redis 多数据中心提出了很大的需求,一是为了提升可用性,解决数据中心 DR(Disaster Recovery) 问题,二是提升访问性能,每个数据中心可以读取当前数据中心的数据,无需跨机房读数据,在这样的需求下,XPipe 应运而生 。

为了方便描述,后面用 DC 代表数据中心 (Data Center)。

系统详述

整体架构

整体架构图如下所示:
design

  • Console 用来管理多机房的元信息数据,同时提供用户界面,供用户进行配置和 DR 切换等操作。
  • Keeper 负责缓存 Redis 操作日志,并对跨机房传输进行压缩、加密等处理。
  • Meta Server 管理单机房内的所有 keeper 状态,并对异常状态进行纠正。

Redis 数据复制问题

多数据中心首先要解决的是数据复制问题,即数据如何从一个 DC 传输到另外一个 DC。我们决定采用伪 slave 的方案,即实现 Redis 协议,伪装成为 Redis slave,让 Redis master 推送数据至伪 slave。这个伪 slave,我们把它称为 keeper,如下图所示:
keepers

使用 keeper 带来的优势

  • 减少 master 全量同步
    如果异地机房 slave 直接连向 master,多个 slave 会导致 master 多次全量同步,而 keeper 可以缓存 rdb 和 replication log,异地机房的 slave 直接从 keeper 获取数据,增强 master 的稳定性。
  • 减少多数据中心网络流量
    在两个数据中心之间,数据只需要通过 keeper 传输一次,且 keeper 之间传输协议可以自定义,方便支持压缩 (目前暂未支持)。
  • 网络异常时减少全量同步
    keeper 将 Redis 日志数据缓存到磁盘,这样,可以缓存大量的日志数据 (Redis 将数据缓存到内存 ring buffer,容量有限),当数据中心之间的网络出现较长时间异常时仍然可以续传日志数据。
  • 安全性提升
    多个机房之间的数据传输往往需要通过公网进行,这样数据的安全性变得极为重要,keeper 之间的数据传输也可以加密 (暂未实现),提升安全性。

机房切换

切换流程

  • 检查是否可以进行 DR 切换
    类似于 2PC 协议,首先进行 prepare,保证流程能顺利进行。
  • 原主机房 master 禁止写入
    此步骤,保证在迁移的过程中,只有一个 master,解决在迁移过程中可能存在的数据丢失情况。
  • 提升新主机房 master
  • 其它机房向新主机房同步

同时提供回滚和重试功能。回滚功能可以回滚到初始的状态,重试功能可以在 DBA 人工介入的前提下,修复异常条件,继续进行切换。

高可用

XPipe 系统高可用

如果 keeper 挂掉,多数据中心之间的数据传输可能会中断,为了解决这个问题,keeper 有主备两个节点,备节点实时从主节点复制数据,当主节点挂掉后,备节点会被提升为主节点,代替主节点进行服务。

提升的操作需要通过第三方节点进行,我们把它称之为 MetaServer,主要负责 keeper 状态的转化以及机房内部元信息的存储。同时 MetaServer 也要做到高可用:每个 MetaServer 负责特定的 Redis 集群,当有 MetaServer 节点挂掉时,其负责的 Redis 集群将由其它节点接替;如果整个集群中有新的节点接入,则会自动进行一次负载均衡,将部分集群移交到此新节点。

Redis 自身高可用

Redis 也可能会挂,Redis 本身提供哨兵 (Sentinel) 机制保证集群的高可用。但是在 Redis4.0 版本之前,提升新的 master 后,其它节点连到此节点后都会进行全量同步,全量同步时,slave 会处于不可用状态;master 将会导出 rdb,降低 master 的可用性;同时由于集群中有大量数据 (RDB) 传输,将会导致整体系统的不稳定。

截止当前文章书写之时,4.0 仍然没有发布 release 版本,而且携程内部使用的 Redis 版本为 2.8.19,如果升到 4.0,版本跨度太大,基于此,我们在 Redis3.0.7 的版本基础上进行优化,实现了 psync2.0 协议,实现了增量同步。下面是 Redis 作者对协议的介绍:psync2.0

携程内部 Redis 地址链接

测试数据

延时测试

测试方案

测试方式如下图所示。从 client 发送数据至 master,并且 slave 通过 keyspace notification 的方式通知到 client,整个测试延时时间为 t1+t2+t3。
test

测试数据

首先我们测试 Redis master 直接复制到 slave 的延时,为 0.2ms。然后在 master 和 slave 之间增加一层 keeper,整体延时增加 0.1ms,到 0.3ms。

在携程生产环境进行了测试,生产环境两个机房之间的 ping RTT 约为 0.61ms,经过跨数据中心的两层 keeper 后,测试得到的平均延时约为 0.8ms,延时 99.9 线为 2ms。

跨公网部署及架构

详情参考 -- 跨公网部署及架构

docker快速启动

详情参考 -- docker quick start

深入了解

技术交流

tech-support-qq

License

The project is licensed under the Apache 2 license.

x-pipe's People

Contributors

aiyueqi avatar clanmaps avatar funkydream avatar gitsrc avatar lanternlee avatar leoliang avatar lepdou avatar lilongjiao avatar liuyi007 avatar lmdyyh avatar marsqing avatar mrtutao avatar ndi-trip avatar nicknyu avatar nobodyiam avatar passerbyzed avatar patpatbear avatar phyxdown avatar qiongtubao avatar qmwu2000 avatar songyuyuyu avatar tigerluhai avatar wenchaomeng avatar wuchengcheng2016 avatar wyattjia avatar yiiinsh avatar yyxjcc 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  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  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  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

x-pipe's Issues

工程依赖问题

导入eclipse发现有些组件依赖携程内部工程,比如parent依赖:

com.ctrip.framework
framework-parent
1.3.0

还有cat-client,foundation-service等,这些依赖问题怎么解决?

parent依赖

com.ctrip.framework framework-parent 1.5.0

这个parent依赖都没有...

请教个问题

两个机房的keeper数量是对等的么?
x-pipe 支持 两个机房都是redis cluster?

期待你的回复.

keeperecontainer启动时"java.io.IOException: Broken pipe,/error org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe"

版本: github 1.0.0
问题: 在部署了metaserver的主机能正常运行keepercontainer,另一台主机A1运行 keepcontainer失败;两台主机可以互相访问,并且A1能telnet 172.17.5.162的9747端口

metaserver 部署在172.17.5.162上,端口为9747,配置如下:
#use local config mode
datacenter=jq
metaserver.id=1
zk.address = 172.17.5.162:2181
zk.namespace = jq
console.address = http://172.17.5.162:8080
dcinfos = {"jq":{"metaServerAddress":"http://172.17.5.162:9747"},"oy":{"metaServerAddress":"http://172.17.5.162:9748"}}

运行失败主机上keepercontainer配置

#use local config mode
datacenter=jq
meta.server.url = http://172.17.5.162:9747
zk.address = 172.17.5.162:2181
zk.namespace = jq
replication.store.dir = /opt/data/100004376/rsd
replicationstore.max.commands.to.transfer = 524288000
replicationstore.commandfile.num.keep = 10
replicationstore.mintime.gc.aftercreate = 60000
replicationstore.commandfile.size = 104857600
monitor.traffic.report.interval = 5000
rdbdump.min.interval = 900000

错误日志:
[17:20:56:026][INFO][main][DefaultLifecycleState][setPhaseName]SpringComponentRegistry, phase:starting(SpringComponentRegistry) --> started
[17:20:56:026][INFO][main][DefaultLifecycleState][setPhaseName]DefaultRegistry, phase:starting(DefaultRegistry) --> started
[17:21:00:365][INFO][http-nio-7083-exec-1][[/]]Initializing Spring FrameworkServlet 'dispatcherServlet'
[17:21:00:365][INFO][http-nio-7083-exec-1][DispatcherServlet]FrameworkServlet 'dispatcherServlet': initialization started
[17:21:00:402][INFO][http-nio-7083-exec-1][DispatcherServlet]FrameworkServlet 'dispatcherServlet': initialization completed in 37 ms
[17:21:00:435][DEBUG][http-nio-7083-exec-1][OrderedRequestContextFilter]Bound request context to thread: org.apache.catalina.connector.RequestFacade@6a1a1844
[17:21:00:479][DEBUG][http-nio-7083-exec-1][OrderedRequestContextFilter]Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@6a1a1844
[17:21:00:575][ERROR][http-nio-7083-exec-1][KeeperExceptionHandler]java.io.IOException: Broken pipe,/error org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:393) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:426) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:342) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:317) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:110) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at com.fasterxml.jackson.core.json.UTF8JsonGenerator.flush(UTF8JsonGenerator.java:1048) ~[jackson-core-2.8.5.jar!/:2.8.5]
at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:953) ~[jackson-databind-2.8.5.jar!/:2.8.5]
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:267) ~[spring-web-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:100) ~[spring-web-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:232) ~[spring-webmvc-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:203) ~[spring-webmvc-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:81) ~[spring-web-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:132) ~[spring-webmvc-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) ~[spring-webmvc-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) ~[spring-webmvc-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) ~[spring-webmvc-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) ~[spring-webmvc-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) ~[spring-webmvc-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) ~[spring-webmvc-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:132) ~[spring-webmvc-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) ~[spring-webmvc-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) ~[spring-webmvc-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) ~[spring-webmvc-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) ~[spring-webmvc-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) ~[spring-webmvc-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) ~[spring-webmvc-4.3.4.RELEASE.jar!/:4.3.4.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:720) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:468) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:391) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:318) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:445) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:304) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:181) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1502) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1458) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_144]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_144]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_144]
Caused by: java.io.IOException: Broken pipe
at sun.nio.ch.FileDispatcherImpl.write0(Native Method) ~[?:1.8.0_144]
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47) ~[?:1.8.0_144]
at sun.nio.ch.IOUtil.write(IOUtil.java:65) ~[?:1.8.0_144]
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471) ~[?:1.8.0_144]
at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:124) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:101) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:172) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.coyote.http11.InternalNioOutputBuffer.writeToSocket(InternalNioOutputBuffer.java:139) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.coyote.http11.InternalNioOutputBuffer.addToBB(InternalNioOutputBuffer.java:197) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.coyote.http11.InternalNioOutputBuffer.access$000(InternalNioOutputBuffer.java:41) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.coyote.http11.InternalNioOutputBuffer$SocketOutputBuffer.doWrite(InternalNioOutputBuffer.java:320) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:118) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.coyote.http11.AbstractOutputBuffer.doWrite(AbstractOutputBuffer.java:256) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.coyote.Response.doWrite(Response.java:501) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:388) ~[tomcat-embed-core-8.0.33.jar!/:8.0.33]
... 42 more

predis 与x-pipe的兼容使用

我们现在业务都是使用predis连接redis,predis自实现了读写分离功能,默认把读请求发给所有slave。那么通过keeper做跨机房主从复制,线上客户端的请求会打到容灾机房吗?,因为一般线下环境的机房和容灾机房在物理距离上比较远,网络延迟自然比较大(我们线上到容灾的网络延迟是25ms左右),如果线上客户端的读请求打到容灾,会把整个缓存数据读取拖垮。

如何添加redis密码配置

使用redis-3.2.1,该redis服务是设置了密码的,现启动metaserver的时候提示com.ctrip.xpipe.redis.core.protocal.error.RedisError: NOAUTH Authentication required,找不到哪里可以添加redis密码的

[Bugfix] Keeper - Redis loop replicating

Background

Backup Site
Active Keeper as a master of downstream Redis

Steps

  1. Keeper is syncing data to Redis while Redis delays
  2. Keeper is set(by MetaServer) to be as slave of the Redis
  3. Redis replies a full sync as keeper's offset is larger than itself
  4. Keeper is set(by MetaServer) to be as slave of upstream active keeper, meanwhile, the Redis RDB file is not completely received.
  5. Keeper asks psync to upstream keeper using incorrect offset received from Redis' full sync
  6. Upstream keeper will consider downstream keeper(the issue one) as a valid partial sync, because offset is partial syncable.
  7. Backup site Redis will never be able to get synced data, because keeper lack the command files between upstream keeper's RDB file's offset and the offset it sends to upstream asking for a partial sync

Double-Checked Locking

private ConsoleService getServiceByDc(String activeIdc) {
String dcId = activeIdc.toUpperCase();
ConsoleService service = services.get(dcId);
if (service == null) {
synchronized (this) {
service = services.get(dcId);
if (service == null) {
service = new DefaultConsoleService(consoleConfig.getConsoleDomains().get(dcId));
services.put(activeIdc, service);
}
}
}
return service;
}

Double-Checked Locking is widely cited and used as an efficient method for implementing lazy initialization in a multithreaded environment.
Unfortunately, it will not work reliably in a platform independent way when implemented in Java, without additional synchronization.
Declare a volatile local variable service offers a much more elegant solution

xpipe 1.10版本自动将哨兵的quorum设置为3,并且将宕机master删除,导致重启后无法跟新master建立主从关系

使用官网上的1.00二进制文件测试,在一台主机上模拟两个机房,并且每个机房部署了3个哨兵,手工将主机房的哨兵的quorum设置为2,过一会儿发现配置文件重新设置为3;将master redis杀死后,slave 能提升为master,但哨兵配置文件和新master中都将宕机master给删除了;宕机master重新启动后,无法与新master建立主从关系. 已知config_tbl中sentinel.auto.process 为true.

当其它一个哨兵宕机后,无法进行故障转移。

redis-console启动出现错误

hello,你好,在使用的时候出现一些问题。按教程打包完成之后,运行redis-console-package中的startup.sh时候出现异常,错误信息如下,我们debug之后发现是Plexus加载配置文件有问题,请教一下你们有没有遇到过这个问题?

[main][AnnotationConfigEmbeddedWebApplicationContext]Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scheduledOrganizationService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.ctrip.xpipe.redis.console.service.OrganizationService com.ctrip.xpipe.redis.console.schedule.ScheduledOrganizationService.organizationService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'organizationServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.ctrip.xpipe.redis.console.dao.OrganizationDao com.ctrip.xpipe.redis.console.service.impl.OrganizationServiceImpl.organizationDao; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'organizationDao': Invocation of init method failed; nested exception is java.lang.RuntimeException: Unable to create Plexus container!

A----->B----->A 环形复制支持吗

A ------->B------->A 这种环形,或双向复制支持吗
双向复制,会不会导致 数据循环执行。
比如 incr key 1
会A,B,A 循环执行,最终 key 无限大 然后溢出

主备机房切换后,console模块 health-check.log中一直报"java.lang.NullPointerException"

在同一台主机上模拟两个机房jq和oy,每个机房部署一个哨兵,端口分别为5000,5001,当从jq切换到oy时,redis master成功切换到oy机房的redis,但console模块中一直打印如下错误信息:

且哨兵5001中配置 sentinel monitor cluster1s1 172.17.5.162 6579 3, 实质上每个机房只有一个哨兵,这儿的3是如何来的。
在单机房中模拟master宕机,也会出现option_value设置为3,并且在宕机master重启后,无法自动成为新master的second

进程使用的是github上的二进制包.

[15:26:01:715][INFO][globalExecutor-1131101][DefaultSentinelHelloCollector][doAction][already exist]172.111.5.111:6579, 127.0.0.1:5001
[15:28:31:178][INFO][globalExecutor-1131351][DefaultSentinelHelloCollector][doAction][add][[stl: 127.0.0.1:5001, master: 172.111.5.111:6579, name:cluster1s1]]
[15:28:31:178][INFO][globalExecutor-1131351][DefaultSentinelHelloCollector][doAction][del][[stl: 172.111.5.111:5001, master: 172.111.5.111:6579, name:cluster1s1], [stl: 172.111.5.111:5000, master: 172.111.5.111:6379, name:cluster1s1]]
[15:28:31:179][ERROR][globalExecutor-1131350][SentinelCollector4Keeper][doAction] java.lang.NullPointerException
at com.ctrip.xpipe.redis.console.healthcheck.actions.sentinel.SentinelCollector4Keeper$SentinelCollectorAction$3.doAction(SentinelCollector4Keeper.java:123) ~[redis-console-1.0.0.jar!/:?]
at com.ctrip.xpipe.redis.console.healthcheck.actions.sentinel.SentinelCollector4Keeper.doCollect(SentinelCollector4Keeper.java:51) ~[redis-console-1.0.0.jar!/:?]
at com.ctrip.xpipe.redis.console.healthcheck.actions.sentinel.SentinelCollector4Keeper.onAction(SentinelCollector4Keeper.java:64) ~[redis-console-1.0.0.jar!/:?]
at com.ctrip.xpipe.redis.console.healthcheck.actions.sentinel.SentinelCollector4Keeper.onAction(SentinelCollector4Keeper.java:25) ~[redis-console-1.0.0.jar!/:?]
at com.ctrip.xpipe.redis.console.healthcheck.AbstractHealthCheckAction$1.doRun(AbstractHealthCheckAction.java:89) ~[redis-console-1.0.0.jar!/:?]
at com.ctrip.xpipe.concurrent.AbstractExceptionLogTask.run(AbstractExceptionLogTask.java:20) ~[core-1.0.0.jar!/:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_144]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_144]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_144]

[15:28:31:185][INFO][globalExecutor-1131351][DefaultSentinelHelloCollector][doAction][already exist]172.111.5.111:6579, 127.0.0.1:5001
[15:29:41:930][INFO][globalExecutor-1131462][ClientConfigMonitor][doCheck]
[15:29:41:934][WARN][globalExecutor-1131462][ClientConfigMonitor][checkCluster] com.ctrip.xpipe.redis.console.healthcheck.nonredis.clientconfig.EqualsException: obj not shard:null
at com.ctrip.xpipe.redis.console.healthcheck.nonredis.clientconfig.EqualsException.createShardException(EqualsException.java:36) ~[redis-console-1.0.0.jar!/:?]
at com.ctrip.xpipe.redis.console.healthcheck.nonredis.clientconfig.CheckShard.equals(CheckShard.java:53) ~[redis-console-1.0.0.jar!/:?]
at java.util.AbstractMap.equals(AbstractMap.java:495) ~[?:1.8.0_144]
at com.ctrip.xpipe.utils.ObjectUtils.equals(ObjectUtils.java:28) ~[core-1.0.0.jar!/:?]
at com.ctrip.xpipe.redis.console.healthcheck.nonredis.clientconfig.CheckCluster.equals(CheckCluster.java:59) ~[redis-console-1.0.0.jar!/:?]
at com.ctrip.xpipe.redis.console.healthcheck.nonredis.clientconfig.ClientConfigMonitor.checkCluster(ClientConfigMonitor.java:79) ~[redis-console-1.0.0.jar!/:?]
at com.ctrip.xpipe.redis.console.healthcheck.nonredis.clientconfig.ClientConfigMonitor.doCheck(ClientConfigMonitor.java:54) ~[redis-console-1.0.0.jar!/:?]
at com.ctrip.xpipe.redis.console.healthcheck.nonredis.AbstractIntervalCheck$2.doRun(AbstractIntervalCheck.java:82) ~[redis-console-1.0.0.jar!/:?]
at com.ctrip.xpipe.concurrent.AbstractExceptionLogTask.run(AbstractExceptionLogTask.java:20) ~[core-1.0.0.jar!/:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_144]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_144]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_144]

同步进度查询

在网络带宽较低,数据量较大的情况下,如何检查数据同步进度情况?

xpipe数据双向同步以及proxy问题

请教两个问题,
1、目前版本的xpipe是不是只是单向节点同步,也就是说只有一个master节点可以写入,另外一个节点只能读?
2、假设我们公司节点之间内网是可以通信的,是否不需要配置proxy,直接使用console、meta、keeper3个组件就行了?

centos7上编译x-pipe失败

编译步骤: 1.下载源码 2.git checkout mvn_repo 3. sh install.sh 4. git checkout master 5. mvn install -DskipTests

错误信息如下:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:1.3.1:enforce (framework-parent-check) on project xpipe-parent: Execution framework-parent-check of goal org.apache.maven.plugins:maven-enforcer-plugin:1.3.1:enforce failed: org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException: Could not resolve dependencies for project com.ctrip.framework.xpipe:xpipe-parent:pom:1.1.0-SNAPSHOT: Failed to collect dependencies at com.dianping.cat:cat-client:jar:2.21.4: Failed to read artifact descriptor for com.dianping.cat:cat-client:jar:2.21.4: Could not find artifact com.ctrip.framework:framework-bom:pom:2.25.0 in central (http://repo1.maven.org/maven2) -> [Help 1]

org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:1.3.1:enforce (framework-parent-check) on project xpipe-parent: Execution framework-parent-check of goal org.apache.maven.plugins:maven-enforcer-plugin:1.3.1:enforce failed: org.apache.maven.shared.dependency.graph.DependencyGraphBuilderException: Could not resolve dependencies for project com.ctrip.framework.xpipe:xpipe-parent:pom:1.1.0-SNAPSHOT: Failed to collect dependencies at com.dianping.cat:cat-client:jar:2.21.4

cat ~/.m2/repository/com/ctrip/framework/framework-bom/2.25.0/framework-bom-2.25.0.pom.lastUpdated
#NOTE: This is an Aether internal implementation file, its format can be changed without prior notice.
#Tue May 28 10:43:19 CST 2019
http://repo1.maven.org/maven2/.error=
http://repo1.maven.org/maven2/.lastUpdated=1559011399847

xpipe创建集群是管理员邮箱必须是Ctrip.com结尾的

创建集群或者更新集群的管理员邮箱时,使用163或者其它结尾的报错,后台日志“[14:50:07:436][ERROR][http-nio-8080-exec-13][ConsoleDefaultExceptionHandler]Emails should be ctrip emails and separated by comma or semicolon,” 貌似代码中强制使用Ctrip.com.

xpipe的告警机制是怎样的,如何使用外部的邮箱/微信来接收告警

failed to build from source code

[INFO] xpipe-parent ....................................... SUCCESS [ 0.885 s]
[INFO] core ............................................... FAILURE [ 3.909 s]
[INFO] redis-parent ....................................... SKIPPED
[INFO] redis-core ......................................... SKIPPED
[INFO] redis-keeper ....................................... SKIPPED
[INFO] redis-meta ......................................... SKIPPED
[INFO] redis-console ...................................... SKIPPED
[INFO] redis-integration-test ............................. SKIPPED
[INFO] redis-proxy ........................................ SKIPPED
[INFO] services ........................................... SKIPPED
[INFO] local-service ...................................... SKIPPED
[INFO] package ............................................ SKIPPED
[INFO] redis-meta-package ................................. SKIPPED
[INFO] redis-keeper-package ............................... SKIPPED
[INFO] redis-console-package .............................. SKIPPED
[INFO] redis-proxy-package ................................ SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.001 s
[INFO] Finished at: 2020-05-11T17:41:13+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.6.0:testCompile (default-testCompile) on project core: Compilation failure
[ERROR] /Users/johnny/x-pipe/core/src/test/java/com/ctrip/xpipe/testutils/SpringApplicationStarter.java:[4,34] package com.sun.javafx.collections does not exist

redis-keeper-package-1.0.0.jar启动时出现"chown: cannot access ‘’: No such file or directory"

jar是git上的二进制文件,启动命令scripts/start.sh, 控制台出现"chown: cannot access ‘’: No such file or directory"。 使用的是local模式. 使用的是root执行。
执行脚本时的输出
++ getCurrentRealPath
++ source=scripts/startup.sh
++ '[' -h scripts/startup.sh ']'
++++ dirname scripts/startup.sh
+++ cd -P scripts
+++ pwd
++ dir=/home/abc/keepercontainer_7082/scripts
++ echo /home/abc/keepercontainer_7082/scripts

  • FULL_DIR=/home/abc/keepercontainer_7082/scripts
  • SERVICE_NAME=redis-keeper
    ++ getPortFromPathOrDefault /home/abc/keepercontainer_7082/scripts 8080
    ++ path=/home/abc/keepercontainer_7082/scripts
    ++ def=8080
    +++ getPortFromPath /home/abc/keepercontainer_7082/scripts
    +++ path=/home/abc/keepercontainer_7082/scripts
    ++++ echo /home/abc/keepercontainer_7082/scripts
    ++++ perl -ne '/_[0-9]{3,5}/ and print "ok"'
    +++ match=ok
    +++ '[' ok == ok ']'
    ++++ echo /home/abc/keepercontainer_7082/scripts
    ++++ perl -pe 's/.?([0-9]{3,5})./\1/'
    +++ port=7082
    +++ echo 7082
    ++ result=7082
    ++ '[' -z 7082 ']'
    ++ echo 7082
  • SERVER_PORT=7082
    ++ expr 7082 + 10000
  • JMX_PORT=17082
    ++ ifconfig
    ++ grep inet.10
    ++ awk '{print $2}; NR == 1 {exit}'
  • IP=
  • LOG_DIR=/opt/logs/100004376
  • '[' '!' 7082 -eq 8080 ']'
  • LOG_DIR=/opt/logs/100004376_7082
  • echo port:7082, jmx_port:17082, local ip:
    port:7082, jmx_port:17082, local ip:
  • echo log:/opt/logs/100004376_7082
    log:/opt/logs/100004376_7082
  • changeAndMakeLogDir /home/abc/keepercontainer_7082/scripts /opt/logs/100004376_7082
  • current=/home/abc/keepercontainer_7082/scripts
  • logdir=/opt/logs/100004376_7082
  • makedir /opt/logs/100004376_7082
  • '[' '!' -d /opt/logs/100004376_7082 ']'
  • sed -i 's#LOG_FOLDER=(.*)#LOG_FOLDER=/opt/logs/100004376_7082#' /home/abc/keepercontainer_7082/scripts/../redis-keeper.conf
  • sed -i 's#name="baseDir">.*#name="baseDir">/opt/logs/100004376_7082#' /home/abc/keepercontainer_7082/scripts/../config/log4j2.xml
  • changePort /home/abc/keepercontainer_7082/scripts/../redis-keeper.conf 7082
  • conf=/home/abc/keepercontainer_7082/scripts/../redis-keeper.conf
  • port=7082
  • grep server.port /home/abc/keepercontainer_7082/scripts/../redis-keeper.conf
    JAVA_OPTS="-Dserver.port=7082 $JAVA_OPTS -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -Dlogging.config=config/log4j2.xml -Dlog4j.configurationFile=config/log4j2.xml -Dlocalpath=config"
  • sed -i 's/server.port=[0-9]+/server.port=7082/' /home/abc/keepercontainer_7082/scripts/../redis-keeper.conf
    ++ getEnv
    ++ ENV=local
    ++ '[' -f /opt/settings/server.properties ']'
    +++ toUpper local
    ++++ echo local
    ++++ tr '[a-z]' '[A-Z]'
    +++ echo LOCAL
    ++ echo LOCAL
  • ENV=LOCAL
  • echo 'current env:LOCAL'
    current env:LOCAL
  • '[' LOCAL = PRO ']'
  • '[' LOCAL = FWS ']'
  • '[' LOCAL = FAT ']'
  • USED_MEM=1600
  • XMN=600
  • MAX_DIRECT=100
  • JAVA_OPTS=' -Xms1600m -Xmx1600m -Xmn600m -XX:+AlwaysPreTouch -XX:MaxDirectMemorySize=100m'
  • export 'JAVA_OPTS= -Xms1600m -Xmx1600m -Xmn600m -XX:+AlwaysPreTouch -XX:MaxDirectMemorySize=100m -Dcat.client.enabled=false -Dio.netty.maxDirectMemory=0 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -XX:+UseParNewGC -XX:MaxTenuringThreshold=2 -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:+ScavengeBeforeFullGC -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=9 -XX:CMSInitiatingOccupancyFraction=60 -XX:-CMSClassUnloadingEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:-ReduceInitialCardMarks -XX:+CMSPermGenSweepingEnabled -XX:CMSInitiatingPermOccupancyFraction=70 -XX:+ExplicitGCInvokesConcurrent -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Duser.timezone=Asia/Shanghai -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Xloggc:/opt/logs/100004376_7082/heap_trace.txt -XX:HeapDumpPath=/opt/logs/100004376_7082/HeapDumpOnOutOfMemoryError/ -Dcom.sun.management.jmxremote.port=17082 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname= -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -Djava.security.egd=file:/dev/./urandom'
  • JAVA_OPTS=' -Xms1600m -Xmx1600m -Xmn600m -XX:+AlwaysPreTouch -XX:MaxDirectMemorySize=100m -Dcat.client.enabled=false -Dio.netty.maxDirectMemory=0 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -XX:+UseParNewGC -XX:MaxTenuringThreshold=2 -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:+ScavengeBeforeFullGC -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=9 -XX:CMSInitiatingOccupancyFraction=60 -XX:-CMSClassUnloadingEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:-ReduceInitialCardMarks -XX:+CMSPermGenSweepingEnabled -XX:CMSInitiatingPermOccupancyFraction=70 -XX:+ExplicitGCInvokesConcurrent -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Duser.timezone=Asia/Shanghai -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Xloggc:/opt/logs/100004376_7082/heap_trace.txt -XX:HeapDumpPath=/opt/logs/100004376_7082/HeapDumpOnOutOfMemoryError/ -Dcom.sun.management.jmxremote.port=17082 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname= -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -Djava.security.egd=file:/dev/./urandom'
  • echo -Xms1600m -Xmx1600m -Xmn600m -XX:+AlwaysPreTouch -XX:MaxDirectMemorySize=100m -Dcat.client.enabled=false -Dio.netty.maxDirectMemory=0 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -XX:+UseParNewGC -XX:MaxTenuringThreshold=2 -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:+ScavengeBeforeFullGC -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=9 -XX:CMSInitiatingOccupancyFraction=60 -XX:-CMSClassUnloadingEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:-ReduceInitialCardMarks -XX:+CMSPermGenSweepingEnabled -XX:CMSInitiatingPermOccupancyFraction=70 -XX:+ExplicitGCInvokesConcurrent -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Duser.timezone=Asia/Shanghai -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Xloggc:/opt/logs/100004376_7082/heap_trace.txt -XX:HeapDumpPath=/opt/logs/100004376_7082/HeapDumpOnOutOfMemoryError/ -Dcom.sun.management.jmxremote.port=17082 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname= -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -Djava.security.egd=file:/dev/./urandom
    -Xms1600m -Xmx1600m -Xmn600m -XX:+AlwaysPreTouch -XX:MaxDirectMemorySize=100m -Dcat.client.enabled=false -Dio.netty.maxDirectMemory=0 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -XX:+UseParNewGC -XX:MaxTenuringThreshold=2 -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:+ScavengeBeforeFullGC -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=9 -XX:CMSInitiatingOccupancyFraction=60 -XX:-CMSClassUnloadingEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:-ReduceInitialCardMarks -XX:+CMSPermGenSweepingEnabled -XX:CMSInitiatingPermOccupancyFraction=70 -XX:+ExplicitGCInvokesConcurrent -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Duser.timezone=Asia/Shanghai -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -Xloggc:/opt/logs/100004376_7082/heap_trace.txt -XX:HeapDumpPath=/opt/logs/100004376_7082/HeapDumpOnOutOfMemoryError/ -Dcom.sun.management.jmxremote.port=17082 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname= -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -Djava.security.egd=file:/dev/./urandom
  • PATH_TO_JAR=redis-keeper.jar
  • SERVER_URL=http://localhost:7082/health
  • STARTUP_LOG=/opt/logs/100004376_7082/startup.logger
  • [[ -z '' ]]
  • [[ -d /usr/java/latest/ ]]
  • export JAVA_HOME=/usr/java/latest/
  • JAVA_HOME=/usr/java/latest/
    ++ dirname scripts/startup.sh
  • cd scripts/..
    ++ ls redis-keeper-package-1.0.0.jar
  • for i in 'ls $SERVICE_NAME-*.jar 2>/dev/null'
  • [[ ! redis-keeper-package-1.0.0.jar == *-\s\o\u\r\c\e\s.\j\a\r ]]
  • PATH_TO_JAR=redis-keeper-package-1.0.0.jar
  • break
  • [[ ! -f PATH_TO_JAR ]]
  • [[ -d current ]]
  • [[ -f redis-keeper.jar ]]
  • rm -rf redis-keeper.jar
    ++ date
  • printf 'Mon Jun 10 17:02:32 CST 2019 ==== Starting ==== \n'
  • ln redis-keeper-package-1.0.0.jar redis-keeper.jar
  • chmod a+x redis-keeper.jar
  • ./redis-keeper.jar start
    chown: cannot access ‘’: No such file or directory
    �[0;32mStarted [6750]�[0m
  • rc=0
  • [[ 0 != 0 ]]
  • declare -i counter=0
  • declare -i max_counter=16
  • declare -i total_time=0
  • printf 'Waiting for server startup'
  • [[ counter -ge max_counter ]]
    ++ curl -X GET --silent --connect-timeout 1 --head http://localhost:7082/health
    ++ grep Coyote
  • [[ '' != '' ]]
  • printf .
  • counter+=1
  • sleep 5
  • [[ counter -ge max_counter ]]
    ++ curl -X GET --silent --connect-timeout 1 --head http://localhost:7082/health
    ++ grep Coyote
  • [[ '' != '' ]]
  • printf .
  • counter+=1
  • sleep 5
  • [[ counter -ge max_counter ]]
    ++ curl -X GET --silent --connect-timeout 1 --head http://localhost:7082/health
    ++ grep Coyote
  • [[ Server: Apache-Coyote/1.1
    != '' ]]
  • total_time='counter*5'
  • [[ counter -ge max_counter ]]
    ++ date
  • printf '\nMon Jun 10 17:02:43 CST 2019 Server started in 10 seconds!\n'
  • exit 0

java.lang.IllegalStateException: ConfigGetDisklessSync result length not right:0

环境信息:
xpipe version: 1.0
操作系统: centos7.5
redis version:2.8.15
console日志目录 health-check.log出现大量如下日志
[11:14:34:108][ERROR][NettyKeyedPoolClientFactory-7][DiskLessReplCheckAction][DiskLessReplCheckAction]{} java.lang.IllegalStateException: ConfigGetDisklessSync result length not right:0
at com.ctrip.xpipe.redis.core.protocal.cmd.ConfigGetCommand$ConfigGetDisklessSync.doFormat(ConfigGetCommand.java:83) ~[redis-core-1.0.0.jar!/:?]
at com.ctrip.xpipe.redis.core.protocal.cmd.ConfigGetCommand$ConfigGetDisklessSync.doFormat(ConfigGetCommand.java:68) ~[redis-core-1.0.0.jar!/:?]
at com.ctrip.xpipe.redis.core.protocal.cmd.ConfigGetCommand.format(ConfigGetCommand.java:33) ~[redis-core-1.0.0.jar!/:?]
at com.ctrip.xpipe.redis.core.protocal.cmd.AbstractRedisCommand.doReceiveResponse(AbstractRedisCommand.java:129) ~[redis-core-1.0.0.jar!/:?]
at com.ctrip.xpipe.netty.commands.AbstractNettyRequestResponseCommand.receive(AbstractNettyRequestResponseCommand.java:105) ~[core-1.0.0.jar!/:?]
at com.ctrip.xpipe.netty.commands.DefaultNettyClient.handleResponse(DefaultNettyClient.java:79) ~[core-1.0.0.jar!/:?]
at com.ctrip.xpipe.netty.commands.NettyClientHandler$1.read(NettyClientHandler.java:49) ~[core-1.0.0.jar!/:?]
at com.ctrip.xpipe.netty.RetryByteBufReadPolicy.read(RetryByteBufReadPolicy.java:33) ~[core-1.0.0.jar!/:?]
at com.ctrip.xpipe.netty.commands.NettyClientHandler.channelRead(NettyClientHandler.java:45) ~[core-1.0.0.jar!/:?]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) ~[netty-all-4.1.28.Final.jar!/:4.1.28.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) ~[netty-all-4.1.28.Final.jar!/:4.1.28.Final]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) ~[netty-all-4.1.28.Final.jar!/:4.1.28.Final]
at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86) ~[netty-all-4.1.28.Final.jar!/:4.1.28.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) ~[netty-all-4.1.28.Final.jar!/:4.1.28.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) ~[netty-all-4.1.28.Final.jar!/:4.1.28.Final]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) ~[netty-all-4.1.28.Final.jar!/:4.1.28.Final]
at io.netty.handler.logging.LoggingHandler.channelRead(LoggingHandler.java:241) ~[netty-all-4.1.28.Final.jar!/:4.1.28.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) ~[netty-all-4.1.28.Final.jar!/:4.1.28.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) ~[netty-all-4.1.28.Final.jar!/:4.1.28.Final]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) ~[netty-all-4.1.28.Final.jar!/:4.1.28.Final]
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434) ~[netty-all-4.1.28.Final.jar!/:4.1.28.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) ~[netty-all-4.1.28.Final.jar!/:4.1.28.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) ~[netty-all-4.1.28.Final.jar!/:4.1.28.Final]
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965) ~[netty-all-4.1.28.Final.jar!/:4.1.28.Final]
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163) ~[netty-all-4.1.28.Final.jar!/:4.1.28.Final]
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:646) ~[netty-all-4.1.28.Final.jar!/:4.1.28.Final]
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:581) ~[netty-all-4.1.28.Final.jar!/:4.1.28.Final]
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:498) ~[netty-all-4.1.28.Final.jar!/:4.1.28.Final]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:460) ~[netty-all-4.1.28.Final.jar!/:4.1.28.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) ~[netty-all-4.1.28.Final.jar!/:4.1.28.Final]

maven依赖问题

从mvn_repo分支下载了必要的jar包,编译打包仍然报错。

编译x-pipe时,提示缺少包:
Failure to find org.unidal.framework:foundation-service:jar:3.1.2

下载了org.unidal.framework编译,又提示:
Failure to find org.unidal.maven.plugins:codegen-maven-plugin:jar:3.0.2

可否对依赖作一下整理?谢谢

最终一致性问题

client-A在** set key1 value1
client-B在美国 set key1 value2
现在的一致性方案是所有写请求都切到国内keeper,keeper再把op同步到**和美国的redis-server,这样?

是否支持集群模式的同步

在主备/哨兵模式下,keeper伪装slave同步;集群模式下多master并且故障时选举迁移伪装slave是否还可行。

表名大小写不统一,还是要严谨一点

[15:54:47:386][ERROR][main][DefaultDcMetaCache][loadMetaManager][consoleService]
[response body:{
"exception" : "com.ctrip.xpipe.redis.console.exception.ServerException",
"message" : "Load data failed.Error when executing query(SELECT zonetbl.id,zonetbl.zone_name,zonetbl.DataChange_LastTime,zonetbl.deleted FROM zone_tbl zonetbl WHERE zonetbl.id = ?) failed, proto: ZoneTbl[data-change-last-time: null, deleted: false, id: 0, key-id: 1, zone-name: null], message: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'fxxpipe.zone_tbl' doesn't exist."
}] org.springframework.web.client.HttpServerErrorException: 500 Internal Server Error
image

缺少pom文件

缺少这个pom文件

com.ctrip.framework
framework-parent
1.5.0

redis状态问题

使用redis-4.0.11
安装包:redis-console-package-1.0.0.zip redis-keeper-package-1.0.0.zip 。。。
配置好redis信息后,界面上的状态一直是X,日志没发现在哪。。请问是哪里配置不对吗或者能否告诉下在哪可以看到错误信息。
ps.在机器上telnet redis端口那些 都是正常 ping也能正常返回pong
image

console的health-check.log重复出现"com.ctrip.xpipe.redis.console.healthcheck.nonredis.clientconfig.EqualsException: obj not shard:null"

使用github下载的1.0.0版本xpipe在单机上模拟两个机房,console中health-check.log频繁出现以下告警,在console告警中加入日志输出,发现告警产生的集群名为null。
private void checkCluster(String clusterName, XpipeMeta xpipeMeta) throws Exception {
OuterClientService.ClusterInfo clusterInfo = outerClientService.getClusterInfo(clusterName);
logger.info("[checkCluster],clusterName:",clusterName," info:",clusterInfo);
加入调试日志的输出:
[16:26:48:908][INFO][globalExecutor-482][ClientConfigMonitor][doCheck]
[16:26:48:908][INFO][globalExecutor-482][ClientConfigMonitor][doCheck]xpipeMeta:
[16:26:48:910][INFO][globalExecutor-482][ClientConfigMonitor][checkCluster],clusterName:
[16:26:48:939][INFO][globalExecutor-482][ClientConfigMonitor][checkCluster],checkClusterInfo:

原始日志输出:
[14:38:09:101][INFO][globalExecutor-692122][ClientConfigMonitor][doCheck]
[14:38:09:106][WARN][globalExecutor-692122][ClientConfigMonitor][checkCluster] com.ctrip.xpipe.redis.console.healthcheck.nonredis.clientconfig.EqualsException: obj not shard:null
at com.ctrip.xpipe.redis.console.healthcheck.nonredis.clientconfig.EqualsException.createShardException(EqualsException.java:36) ~[redis-console-1.0.0.jar!/:?]
at com.ctrip.xpipe.redis.console.healthcheck.nonredis.clientconfig.CheckShard.equals(CheckShard.java:53) ~[redis-console-1.0.0.jar!/:?]
at java.util.AbstractMap.equals(AbstractMap.java:495) ~[?:1.8.0_144]
at com.ctrip.xpipe.utils.ObjectUtils.equals(ObjectUtils.java:28) ~[core-1.0.0.jar!/:?]
at com.ctrip.xpipe.redis.console.healthcheck.nonredis.clientconfig.CheckCluster.equals(CheckCluster.java:59) ~[redis-console-1.0.0.jar!/:?]
at com.ctrip.xpipe.redis.console.healthcheck.nonredis.clientconfig.ClientConfigMonitor.checkCluster(ClientConfigMonitor.java:79) ~[redis-console-1.0.0.jar!/:?]
at com.ctrip.xpipe.redis.console.healthcheck.nonredis.clientconfig.ClientConfigMonitor.doCheck(ClientConfigMonitor.java:54) ~[redis-console-1.0.0.jar!/:?]
at com.ctrip.xpipe.redis.console.healthcheck.nonredis.AbstractIntervalCheck$2.doRun(AbstractIntervalCheck.java:82) ~[redis-console-1.0.0.jar!/:?]
at com.ctrip.xpipe.concurrent.AbstractExceptionLogTask.run(AbstractExceptionLogTask.java:20) ~[core-1.0.0.jar!/:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_144]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_144]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_144]

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.