gameserver 如何剔除某个无效的 tcaproxy(接入层)节点?

TcaplusDB API 在这里对 tcaproxy 异常做了容灾的处理,API 剔除无效的 tcaproxy 进程的方式主要有2个:

  1. API 物理上认为某个 tcaproxy 不可用,API 每隔1秒对起链接的所有的 tcaproxy 发送心跳检测包,如果某个 gameserver 在10s内没有从 tcaproxy 收到相应的心跳回包,则 API 会主动断开与 tcaproxy 的 TCP 链接, 在下个 onupdate 时主动去链接该 tcaproxy 。

  2. API 逻辑上认为 tcaproxy 不可用,是每隔10s去计算下某个 tcaproxy 的请求和响应比,作为判断依据,其中 API 为某个请求包超时的阈值是3s,大于3次则认为该 tcaproxy 不可用,请求不会再发给该 tcaproxy ,在60s后发送 getmetdata 请求,如果 tcaproxy 能够正确处理 getmetadata 的请求,则 API 再次认为该 tcaproxy 可用,请求会再次发送给该 tcaproxy。

从现象上看,gameserver 在10s内发现某个 tcaproxy 不可用,则不会再向该 tcaproxy 节点发送数据了。

gameserver 是怎么选择 tcaproxy(接入层)节点的?

gameserver 本地维护了一致性的 Hash 环,凡是某个 tcaproxy(接入层)节点认证通过后即增加到 Hash 环上,如果某个 tcaproxy(接入层)节点缩容后或者由于机器异常导致 gameserver 与 tcaproxy(接入层)之间的 TCP 链接断掉后,gameserver 会从 Hash 环上摘除该 tcaproxy(接入层)节点。gameserver 根据请求里的主键计算 hash 值(如果是 batchget 请求,会随机的选择单个 tcaproxy(接入层)节点),然后在一致性 Hash 环上选择单个 tcaproxy(接入层)节点发送出去。

TcaplusDB 有压缩功能吗?

TcaplusDB 有压缩功能,采用的压缩算法是 Google snappy 压缩算法,包括协议压缩,即 gameserver <--> tcaproxy(接入层)间的请求包/响应包的压缩功能;数据压缩,即 tcapsvr(存储层)在数据存储时会压缩需要存储的数据,如果您需要节省 gameserver <--> tcaproxy 间的网络流量,推荐开启协议压缩,调用 TcaplusDB API 的函数 SetCompressSwitch,推荐您开启 tcapsvr(存储层)压缩,节省磁盘空间、提高 IO 磁盘性能的同时压缩、解压缩耗费的 CPU 也是可控的问题。

TcaplusDB API 是线程安全的吗?

TcaplusDB API 是非线程安全的,主要是 tlog、tdr 等组件是非线程安全的,推荐单个线程采用单个 API 对象,单个游戏区采用单个 API 对象,如果需要跨游戏区交互,建议单个 gameserver 维护多个 API 对象。

tcaproxy(接入层)的容灾是怎么做的?

tcaproxy(接入层)采用对等设计方案,即单个游戏区下面的所有 tcaproxy(接入层)节点都包含了单个游戏区下所有表的路由信息,如果某个 tcaproxy(接入层)故障后,只要其余的 tcaproxy(接入层)节点不会过载,则 gameserver 会剔除异常的 tcaproxy(接入层)节点,不会影响 gameserver 的使用,tcaproxy(接入层)没有单点的风险。

tcapsvr(存储层)的容灾是怎么做的?

tcapsvr(存储层)采用一主(tcapsvr master)一从(tcapsvr slave)的模式运行,tcapsvr master/slave 实时的在同步数据,采用同城异 IDC 部署,确保主从同步时延小于10ms,如果 tcapsvr slave 异常,不会影响 gameserver 的使用(没有开启读分流, gameserver 的请求是 tcapsvr master 处理,如果开启读分流后,tcapsvr slave 会协助处理部分读请求),DBA 进行 tcapsvr slave 重建即可;如果 tcapsvr master 异常,则 tcapsvr slave 会进行故障恢复,DBA 再申请新的机器的 tcapsvr slave 重建即可,tcapsvr(存储层)没有单点的风险。

TcaplusDB 有过载保护吗?

接入层、存储层都有进程级的过载保护措施,保障业务高峰时服务不雪崩。

TcaplusDB 的冷热数据交换原理是什么?

TcaplusDB 采用内存 + SSD 盘存储,单个引擎文件,前1GB映射在内存,热数据尽量放在内存,冷数据放在磁盘,采用 LRU 算法进行冷热数据交换,gameserver 的 get 操作触发 LRU 换入操作,tcapsvr(存储层)的 LRU 线程负责 LRU 换出操作,尽量保证热数据存储在内存里,确保 cache 命中率高、单次读写延时低。

tcaproxy(接入层)是怎么选择 tcapsvr(存储层)的?

每个表定义的有分表因子,如果没有定义分表,分表因子则默认是主键,tcaproxy(接入层)根据 hash(分表因子)%1w,选择对应的 tcapsvr(存储层),故分表因子离散度要高。

TcaplusDB 锁的级别是什么?

TcaplusDB 锁的粒度是记录级别。

更多内容可访问TcaplusDB社区,扫码关注TcaplusDB公众号获取更多内容

 

TcaplusDB常见问题-数据库原理类的更多相关文章

  1. 【知识必备】ezSQL,最好用的数据库操作类,让php操作sql更简单~

    最近用php做了点小东东,用上了ezSQL,感觉真的很ez,所以拿来跟大家分享一下~ ezSQL是一个非常好用的PHP数据库操作类.著名的开源博客WordPress的数据库操作就使用了ezSQL的My ...

  2. DataAccess通用数据库访问类,简单易用,功能强悍

    以下是我编写的DataAccess通用数据库访问类,简单易用,支持:内联式创建多个参数.支持多事务提交.支持参数复用.支持更换数据库类型,希望能帮到大家,若需支持查出来后转换成实体,可以自行扩展dat ...

  3. Android打造属于自己的数据库操作类。

    1.概述 开发Android的同学都知道sdk已经为我们提供了一个SQLiteOpenHelper类来创建和管理SQLite数据库,通过写一个子类去继承它,就可以方便的创建.管理数据库.但是当我们需要 ...

  4. 我也来写:数据库访问类DBHelper

    一.前言 相信许多人都百度过:“.net 数据库访问类”.然后就出来一大堆SqlHelper.我也用过这些SqlHelper,也自己写过,一堆静态方法,开始使用起来感觉很不错,它们也确实在很多时候可以 ...

  5. PHP 数据库操作类:ezSQL

    EZSQL类介绍: 下载地址:http://www.jb51.net/codes/26393.htmlezsql是一个小型的快速的数据库操作类,可以让你很容易地用PHP操作各种数据库( MySQL.o ...

  6. 通用数据库操作类,前端easyui-datagrid,form

    实现功能:     左端datagrid显示简略信息,右侧显示选中行详细信息,数据库增删改 (1)点击选中行,右侧显示详细信息,其中[新增].[修改].[删除]按钮可用,[保存]按钮禁用 (2)点击[ ...

  7. MySQL数据库工具类之——DataTable批量加入MySQL数据库(Net版)

    MySQL数据库工具类之——DataTable批量加入数据库(Net版),MySqlDbHelper通用类希望能对大家有用,代码如下: using MySql.Data.MySqlClient; us ...

  8. 我也来写:数据库访问类DBHelper(转)

    一.前言 相信许多人都百度过:“.net 数据库访问类”.然后就出来一大堆SqlHelper.我也用过这些SqlHelper,也自己写过,一堆静态方法,开始使用起来感觉很不错,它们也确实在很多时候可以 ...

  9. php : mysql数据库操作类演示

    设计目标: 1,该类一实例化,就可以自动连接上mysql数据库: 2,该类可以单独去设定要使用的连接编码(set names XXX) 3,该类可以单独去设定要使用的数据库(use XXX): 4,可 ...

随机推荐

  1. [ABP教程]第六章 作者:领域层

    Web开发教程6 作者:领域层 关于此教程 在这个教程系列中,你将要构建一个基于ABP框架的应用程序 Acme.BookStore.这个应用程序被用于甘丽图书页面机器作者.它将用以下开发技术: Ent ...

  2. 小米11和iphone12参数对比哪个好

    小米11:搭载最新一代三星的AMOLED屏幕,120Hz屏幕刷新,iPhone12使用全新一代的视网膜屏,6.1英寸屏幕,支持60Hz屏幕刷新,支持HDR显示,P3广色域小米手机爆降800 优惠力度空 ...

  3. 项目实战--解决运行sql文件错误

    说明: 新项目启动,通过公司运维同学给的数据库脚本在Navicat中建项目的数据库,运行脚本时报错 Error Code: 1227. Access denied; you need (at leas ...

  4. Vue基础语法与指令

    项目初始化 用vscode打开终端,输入npm init -y生成package.json 然后安装vue npm install vue 需要注意的是,我遇到了这个问题 出现原因:文件夹名和生成的p ...

  5. 【Linux】shell脚本实现多并发

    情景 shell脚本的执行效率虽高,但当任务量巨大时仍然需要较长的时间,尤其是需要执行一大批的命令时.因为默认情况下,shell脚本中的命令是串行执行的.如果这些命令相互之间是独立的,则可以使用&qu ...

  6. 【Oracle】重命名表空间

    将表空间重新命名 SQL>   alter tablespace 原名 rename to 新名; 在查看下是否命名成功 SQL> select tablespace_name from ...

  7. 【Linux】实现端口转发的rinetd

    Linux下端口转发一般都使用iptables来实现,使用iptables可以很容易将TCP和UDP端口从防火墙转发到内部主机上.但是如果需要将流量从专用地址转发到不在您当前网络上的机器上,可尝试另一 ...

  8. Java调用Linux命令执行

    调用方式 Java调用linux命令执行的方式有两种,一种是直接调用linux命令,一种是将linux命令写到.sh脚本中,然后调用脚本执行. 详细说明 直接调用:使用java中lang包下面的Run ...

  9. HTML基础复习4

    CSS的应用 模块的边框 设置边框样式 border-style::如果是一个值那么表示四个边的样式都一样:如果是两个值那么第一个值代表上下,第二个值代表左右:如果是三个值,第一个值代表上,第二个值代 ...

  10. 如何在 crontab 中让 source ~/.bashrc 生效

    cron 是许多类 Unix 操作系统中都自带的用来调度定时任务的工具,定时任务的配置是写在 crontab 文件中的,但是 crontab 文件不允许直接编辑,一般都是通过命令 crontab -e ...