12306网站服务器的运算能力,12306 高性能分布式缓存计算框架 Geode(下)

Geode 滚动升级

开源软件更新换代比较快,Geode 从去年到现在已经发布了五六个版本,因此想不停机获得更好的 Geode 体验,我们做了滚动升级的尝试。

备份

链接到主 Locatior 上进行导出操作:

gfsh>connect --jmx-manager=192.168.33.15Connecting to Manager at [host=192.168.33.15, port=1099] ..Successfully connected to: [host=192.168.33.15, port=1099]Cluster-254 gfsh>list members Name | Id------------- | ---------------------------------------------------------locator_33_15 | 192.168.33.15(locator_33_15:19946:locator):41000locator_33_20 | 192.168.33.20(locator_33_20:15112:locator):41000server_33_23 | 192.168.33.23(server_33_23:32677):41000server_33_29 | 192.168.33.29(server_33_29:14735):41000server_33_15 | 192.168.33.15(server_33_15:20234):41001server_33_20 | 192.168.33.20(server_33_20:15305):41001//查看server 状态Cluster-254 gfsh>status server --name=locator_33_15Server in /opt/geode_work18/locator_33_15 on 192.168.33.15[10334] as locator_33_15 is currently style="box-sizing: border-box; -webkit-font-smoothing: antialiased; color: rgb(136, 0, 0); outline: 0px !important;">19946Uptime: 151 days 2 hours 43 minutes 43 secondsGeode Version: 1.8.0Java Version: 1.8.0_102Log File: /opt/geode_work18/locator_33_15/locator_33_15.logJVM Arguments: -Dgemfire.locators=192.168.33.15[10334],192.168.33.20[10334] -Dgemfire.enable-cluster-configuration=true -Dgemfire.load-cluster-configuration-from-dir=false -Dgemfire.max-num-reconnect-tries=100 -Dgemfire.member-timeout=120000 -Dgemfire.distributed-system-id=254 -Xms512M -Xmx1G -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=60 -Dgemfire.launcher.registerSignalHandlers=true -Djava.awt.headless=true -Dsun.rmi.dgc.server.gcInterval=9223372036854775806Class-Path: /opt/apache-geode-1.8.0/lib/geode-core-1.8.0.jar:/opt/apache-geode-1.8.0/lib/geode-dependencies.jar//导出配置文件gfsh>export cluster-configuration --zip-file-name=./cluster-config-back.zipFile saved to /opt/./cluster-config-back.zip1. 查看 server 状态,实际上我们是想要备份下启动参数,但是我们前边对启动进行了脚本话,因此这里就没有必要在进行启动脚本备份了,如果你没有用脚本启动,最好还是备份下,另外一种查看方式就是:

ps -ef | grep geode //查看启动参数2. 第二个导出配置文件,是一些常规配置,以前修改过的,关于 region 等的一些配置。

6e25b6ba7101a8098a7bd714254de331.png

dd34ce8d9c1a3adb2242fe3d4827957a.png

拷贝新版本

准备好 1.9.2 版本并上传至服务器,拷贝至:

cp /tmp/upload_dir/ddh/apache-geode-1.9.2.tgz apache-geode-1.9.2.tgztar 解压:

tar xvf apache-geode-1.9.2.tgz删除包文件:

rm -rf apache-geode-1.9.2.tgz重启 locator

停止旧的主 locator

链接上管理器找到主 locator 的 name执行 stop locator --name=locator_33_15停止主 locator 要特别注意,经常停止不了,要用 ps 来查看 ps -ef | grep geode,如果不能正常停止就用 kill -9 ${locator的PID} 来强行停止。

gfsh>connect --jmx-manager=192.168.33.15 Connecting to Manager at [host=192.168.33.15, port=1099] .. Successfully connected to: [host=192.168.33.15, port=1099] Cluster-254 gfsh>list member Name | Id ------------- | --------------------------------------------------------- locator_33_15 | 192.168.33.15(locator_33_15:19946:locator):41000 locator_33_20 | 192.168.33.20(locator_33_20:15112:locator):41000 server_33_23 | 192.168.33.23(server_33_23:32677):41000 server_33_29 | 192.168.33.29(server_33_29:14735):41000 server_33_15 | 192.168.33.15(server_33_15:20234):41001 server_33_20 | 192.168.33.20(server_33_20:15305):41001 Cluster-254 gfsh>stop locator --name=locator_33_15 Stopping Locator running in /opt/geode_work18/locator_33_15 on 192.168.33.15[10334] as locator_33_15... Process ID: 19946 Log File: /opt/geode_work18/locator_33_15/locator_33_15.log ........... No longer connected to 192.168.33.15[1099]. gfsh> No longer connected to 192.168.33.15[1099]. gfsh>修改 /etc/profile 更改环境变量

1. 执行 vi /ect/profile

2. 修改文件将原来 1.8 的版本改为 1.9.2

export PATH=$JAVA_HOME/bin:/opt/apache-geode-1.9.2/bin:$PATH3. 执行生效 source /etc/profile

4. 执行 gfsh version --fule 查看版本,确定是新版本生效

Build-Date: 2019-10-15 06:08:13 -0700Build-Id: jdeppe 0Build-Java-Version: 1.8.0_221Build-Platform: Mac OS X 10.14.6 x86_64Product-Name: Apache GeodeProduct-Version: 1.9.2Source-Date: 2019-10-14 15:59:02 -0700Source-Repository: release/1.9.2Source-Revision: 63c8058f036316618b6cd78e6727106b7ac0a888Native version: native code unavailableRunning on: /192.168.33.15, 4 cpu(s), amd64 Linux 2.6.32-696.23.1.el6.x86_64启动新 locator

1. 启动新的主 locator,执行启动脚本 start_locator_33_15.sh。

Locator in /opt/geode_work18/locator_33_15 on 192.168.33.15[10334] as locator_33_15 is currently online.Process ID: 30782Uptime: 10 secondsGeode Version: 1.9.2Java Version: 1.8.0_102Log File: /opt/geode_work18/locator_33_15/locator_33_15.logJVM Arguments: -Dgemfire.locators=192.168.33.15[10334],192.168.33.20[10334] -Dgemfire.enable-cluster-configuration=true -Dgemfire.load-cluster-configuration-from-dir=false -Dgemfire.max-num-reconnect-tries=100 -Dgemfire.member-timeout=120000 -Dgemfire.distributed-system-id=254 -Xms512M -Xmx1G -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=60 -Dgemfire.launcher.registerSignalHandlers=true -Djava.awt.headless=true -Dsun.rmi.dgc.server.gcInterval=9223372036854775806Class-Path: /opt/apache-geode-1.9.2/lib/geode-core-1.9.2.jar:/opt/apache-geode-1.9.2/lib/geode-dependencies.jarSuccessfully connected to: JMX Manager [host=192.168.33.15, port=1099]Cluster configuration service is up and running.2. 校验新的 locator 是否正常。

gfsh>connect --jmx-manager=192.168.33.15Connecting to Manager at [host=192.168.33.15, port=1099] ..Successfully connected to: [host=192.168.33.15, port=1099]Cluster-254 gfsh>3. 按照如上步骤依次重启其他机器上的 locator。

重启 server

重启旧版本的 server

1. 停止 server

注意:要在主 locator 节点上的 gfsh 里执行,现在我们的主是 33.20 因此我们上到这台机器并连接 JMX 进行管理。

stop server --name=server_33_152. 如果 server 没有与 locator 在一起的话, 需要按上边的步骤进行版本更新。

上传新版版解压更改 /etc/profile 配置3. 去 33.15 机器上执行启动 server 的脚本。

sh start_server_33_15.sh4. 其他 server 依次执行重启。

检查

检查 locator 和 server => list member检查 region ==> list region检查 {主locator的IP}:7070/pulse/升级客户端

升级完服务之后,我们可以进行客户端的升级,实践中如果不升级对现有执行也是没有影响。

关于客户端我们这有一个小插曲,忘记是升级 1.7 还是 1.8 的时候,我们的 Tomcat 7.0.57 的版本会报异常。

严重: Unable to process Jar entry [module-info.class] from Jar [jar:file:/data/xxx/jiekou/WEB-INF/lib/classgraph-4.0.6.jar!/] for annotations但是并不影响程序使用,可是每次启动都报个异常总是不开心的。

借着这个契机,我们升级了 Tomcat 8.5。

原因解读:

ac0852c93797376892c5eb3ea5ea631c.png

新的 1.8 的 client 包引入了新的类,这个新的类有 Java 9 的模块化信息,然后这个版本的 Tomcat 是无法扫描模块化 jar 包的。

3091335a718ae6b09ea506239121946a.png

看 Tomcat 官网发现,在 7.0.83 的时候才支持了这个问题。使用了 7.0.91 测试就不报哪个异常了。

因此我们选择了直接升级到 8.5。

滚动升级影响

从升级实践中来看,虽然做不到完全无感知,但是每秒近 5 万的 ops,在升级过程中报错的请求不超过 500 次。

Geode 数据计算初探

Geode 对外宣称自己是一个内存计算框架,我们一直都是使用的内存特性,KV 结构的特性,把他当成 Redis,Memcache 的替代品,那么我们本小节来尝试一下 Geode 的计算功能,所谓的计算就是 function 特性。

函数是驻留在服务器上的代码体,应用程序可以从客户机或另一台服务器调用它,而不需要发送函数代码本身。调用方可以指示依赖于数据的函数对特定数据集进行操作,也可以指示独立于数据的函数对特定服务器、成员或成员组进行操作。

我们可以这么简单来理解就是我将一部分代码处理逻辑上传到服务器上,然后我再服务器上执行相关代码,那么这有什么好处呢?快!比如批量处理某些 key 我不需要网络开销了直接在服务器上执行。

下边我们开发一个 region 函数,一次获取多个键值类似于 multiGet 命令。

1. 开发函数

public class MultiGetFunction implements Function { /** * Cluster-254 gfsh>execute function --id=func-a --region=test99 --filter=KEY_4,KEY_7 * @param context */ @Override public void execute(FunctionContext context) { System.out.println("执行function"); if(! (context instanceof RegionFunctionContext)){ throw new FunctionException("This is a data aware function, and has to be called using FunctionService.onRegion."); } //进行强制转换 RegionFunctionContext regionFunctionContext = (RegionFunctionContext)context; //从filter 中获取set,这个在调用的时候传递 Set keys = regionFunctionContext.getFilter(); Set keysTillSecondLast = new HashSet(); int setSize = keys.size(); Iterator keysIterator = keys.iterator(); for(int i = 0; i < (setSize -1); i++) { keysTillSecondLast.add(keysIterator.next()); } for (Object k : keysTillSecondLast) { context.getResultSender().sendResult( (Serializable) PartitionRegionHelper.getLocalDataForContext(regionFunctionContext) .get(k)); } Object lastResult = keysIterator.next(); //必须发送lastresult //不然报错server_33_15 | ERROR | Exception: The function, func-a, did not send last result context.getResultSender().lastResult( (Serializable)PartitionRegionHelper.getLocalDataForContext(regionFunctionContext) .get(lastResult)); } // 每个函数都应该给一个id ,后续调用会使用到 public String getId() { return "func-a"; }}2. deploy 到服务器

我们写好后打成 jar 包上传到服务器,gfsh 执行 deploy 命令:

deploy --jar=/tmp/upload_dir/ddh/geode-study.jar Member | Deployed JAR | Deployed JAR Location------------ | --------------- | -----------------------------------------------server_33_15 | geode-study.jar | /opt/geode_work/server_33_15/geode-study.v5.jarserver_33_20 | geode-study.jar | /opt/geode_work/server_33_20/geode-study.v5.jarserver_33_23 | geode-study.jar | /opt/geode_work/server_33_23/geode-study.v5.jarserver_33_29 | geode-study.jar | /opt/geode_work/server_33_29/geode-study.v5.jar我们在做 deploy 的时候,Geode 会自动将实现了 function 接口的类型进行函数注册。

3. 执行函数

方式一:

Cluster-254 gfsh>execute function --id=func-a --region=test99 --filter=KEY_4,KEY_7 Member | Status | Message------------ | ------ | -------server_33_15 | OK | [7, 5]方式二:

@Test public void testFunction() { GeodeService geodeService = new GeodeService(str); geodeService.init(); ClientCache clientCache = geodeService.geodeClient(); MultiGetFunction multiGetFunction = new MultiGetFunction(); //要获取key 的集合 Set keysForGet = new HashSet(); keysForGet.add("KEY_4"); keysForGet.add("KEY_9"); keysForGet.add("KEY_7"); Execution execution = FunctionService.onRegion(geodeService.getRegion(GeodeRegion.test99)) .withFilter(keysForGet) .setArguments(Boolean.TRUE) //这里可以定义自己的 收集器 //.withCollector(new MyArrayListResultCollector()) ; ResultCollector rc = execution.execute(multiGetFunction); //拿到返回结果 List result = (List)rc.getResult(); System.out.println("result = >>" + JSONObject.toJSONString(result)); }Geode 图形化与监控

图形化

图形化我们通过 Geode 自带的 pulse 后台功能来访问,能看到实时的状态访问地址:

http://192.168.33.15:7070/pulse在 locator 变为 leader 之后会自动启用 pulse,用户名密码为 admin/admin。

pulse 中可以在不同维护查看数据。

1. 总览

内存,成员数,服务数,region 数量,集群读写等等。

a0b332f8ec5ab7242b414de79d9e437c.png

2. ip 维度

这里多了一个机器的链接详情:

e469b8d256a9965eca6de29233148c91.png

3. region 维度

region 维度主要对 region 进行描述:

359a10898ef6266063fdd42bfc139a39.png

监控

监控有两种方式。

gfsh 脚本进行监控

这种监控一些数量大小之类的还可以,目前还没发现对读、写等详细的指标命令。

JMX 获取数据进行监控

JMXConnector conn = null; String host = "192.168.33.15"; int port = 1099; JMXServiceURL address = new JMXServiceURL("service:jmx:rmi://" + host + "/jndi/rmi://" + host + ":" + port + "/jmxrmi"); Map env = new HashMap(); //创建连接 conn = JMXConnectorFactory.connect(address, env); MBeanServerConnection mbs = conn.getMBeanServerConnection();Set mbeanNames = mbs.queryNames(new ObjectName(PulseConstants.OBJECT_NAME_SYSTEM_DISTRIBUTED), null);//这是监控系统需要的数据模型MetricBuiler builer = MetricBuiler.newBuilder() .name("geode.cluster.sys").comeFrom(MetricSourceCode.COMP_SOURCE) .ip("cluster").domain(domainEntity.getDomainCode()).port(80) .value(1);//从 mbean 中取出对应监控数据for (ObjectName mbeanName : mbeanNames) { AttributeList attributeList = mbs.getAttributes(mbeanName, PulseConstants.CLUSTER_MBEAN_ATTRIBUTES); attributeList.forEach(o -> { Attribute attribute = (Attribute) o; builer.addData(attribute.getName(), Double.valueOf(attribute.getValue().toString())); }); Long attribute = (Long) mbs.getAttribute(mbeanName, "JVMPauses"); builer.addData("JVMPauses", attribute);}Metric build = builer.build();MetricGuageUtil.guage(build, "JVMPauses");metricList.add(build);关于 JMX 的数据结构大家可以使用 jvisualvm 连接查看:

52a22e1e041bb0ee2153b24d15a8a0ff.png

看它的目录结构,我们可以发现其实它就是按照集群、ip、region 进行区分的,与它的 pulse 中所能显示的保持一致性。

我们通过 job 采集的数据最终入到 ES 中,并在这期间判定是否需要报警,如果需要的话会发送邮件、短信、企业微信机器人。

进入 ES 后我们再通过 Grafana 进行展示,这样就可以看见历史指标的波动情况,为分析问题提供依据。

6df998b32ce0e6894776fb6dbed1241a.png

4a134e5cf5c0147a724ca5cbfb2c5468.png

如上图所示是我们的一些重点指标。

但是 Geode 的统计也不是那么的准的,主要有以下问题:

jvmPauses 算出来时间段内是负数的同样垃圾收集时间和次数也都不对同一时刻,集群的总 ops 和各个 region 的 ops 总合是不相等的另外 pulse 上显示的 ops 是 15 分钟平均的值Geode 常见故障与恢复

从机器崩溃中恢复

当计算机因关闭、断电、硬件故障或操作系统故障而崩溃时,其所有应用程序和缓存服务器及 其本地缓存都将丢失。其他计算机上的系统成员会收到通知,说明此计算机的成员已意外离开集群。

要从机器崩溃中恢复:

确定在此计算机上运行的进程。重新启动机器。如果 Geode 定位器在此处运行,请先启动它。注意:在启动任何应用程序或缓存服务器之前,必须至少运行一个定位器。按常规顺序启动应用程序和缓存服务器。防止和恢复磁盘完全错误

监视 Geode 成员的磁盘使用情况非常重要。 如果成员缺少足够的磁盘空间用于磁盘存储,则该成员会尝试关闭磁盘存储及其关联的缓存,并记录错误消息。由于成员磁盘空间不足而导致的关闭可能导致数据丢失,数据文件损坏,日志文件损坏以及可能对您的应用程序产生负面影响 的其他错误情况。为成员提供足够的磁盘空间后,可以重新启动该成员。

换言之,一定要做磁盘容量监控!

java.lang.OutOfMemoryError

如果应用程序经常内存不足,您可能需要对其进行分析以确定原因,可以尝试 -Xmx 重置最大堆大小来增加直接内存。

如果出现这样的错误,可以尝试更改 -Xss 参数:

OutOfMemoryError: unable to create new native thread网络分区

Membership coordinator id has declared that a network partition has occurred.发生网络分区时会发出此警报,然后在单个成员上发出此警报:

Exiting due to possible network partition event due to loss of {0} cache processes: {1}此时需要检查列出的缓存进程的网络连接和运行状况。

成员太长时间没有回应

15 sec have elapsed while waiting for replies: on ent(27134):60330/45855 whose currentmembershiplist is: [[ent(27134):60330/45855, ent(27130):60333/36743]]描述:成员(27130)60333/36743 由于可疑验证失败而面临被迫退出集群的危险。在达到 ack-wait-threshold 之后,将在警告级别发出此警报。

操作员应检查过程以确定其是否健康。 在名为 ent 的机器上,慢响应器的进程 ID 是 27130。慢响应者的端口是 60333/36743。 查找字符串,Starting distribution manager ent:60333/36743,并检查拥有包含此字符串的日志文件的进程。

如上只是摘抄了几个官方常见异常,具体请查看这里。

实际在近一年多的使用中,并未发现不可思议的异常与灾难。

目前我司使用情况

我司从 2018 年 7 月开始引入 Geode,当时版本是 1.5。目前已经接入近 10 个功能点,读调用量高峰时期在 50000 ops 左右。8 台 机器,8 个 server 3 个 locator。通过 wan 有一组备份机器,有一些非实时性业务访问备份机器其他业务线也正在尝试上 Geode。稳定性 ok,目前线上没出过问题。滚动升级很方便,升级对程序影响可忽略。我们预备上更多的业务线,替下 Couchbase 大部分业务。目前只用了 KV 的功能,后续尝试使用对象存储和 query 查询。其他

代码地址:

https://gitee.com/gavinage/geode_study

Geode 扩展功能

memCache 适配器

gfsh>start server --name= --server-port= --memcached-port= --memcached-protocol=BINARY|ASCIIHTTP 分布式 session

之前接触的分布式 session 方案是 Redis-cluster + Tomcat 来做的, 其实道理是一样的, Geode 替换了 Redis 就成功 geode-session-Tomcat 了。

Geode 使用了不小的篇幅来描述该扩展功能,详见。

Redis 适配器

gfsh> start server --name=server1 --redis-bind-address=localhost \ --redis-port=11211 --J=-Dgemfireredis.regiontype=PARTITION_PERSISTENT来自官方的夸奖:

Geode 相比较 Redis 具有多线程、高并发、扩展性强、结果报告, 并且 Geode wan 复制模式能够水平扩展,跨数据中心还能维护数据一致性。

虽然这么厉害,但是经过简单测试,还是不要冒险改用 Redis,老老实实用 Redis。

Lucene 支持

Geode 底层引入了 Lucene 的包并支持创建 index、查询 index,换句话说 Geode 引入了 Lucene 的一些特性在它的内部,依然持有和 Redis 一样的观点,改用 ES 还是老老实实去用 ES 吧。

总结

Geode 值得一试,铁总那么大的访问量,那么高的实时性要求,使用 Geode 都能扛得住,这是最成功的案例,我们也正在实践,也期望 Geode 能像描述的一样,不负众望。

举报/反馈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值