0%

背景

工作室也经历过好几个游戏了。服务端的架构跟实际业务需求出现过不少的冲突。导致后来花了挺多时间去擦屁股的。以最近的一个游戏举例,原本的世界观设想是一个大服的世界观。也就是只有一个服,撑下百万用户,数万同时在线的设计。而后随着业务变化和线上表现,原本大服的设计并不能满足,最终变成了滚服玩法。由于大服变滚服,在原来的服务器架构约束下,对于后续增加的跨服玩法和合服实现都带来了比较大的麻烦和不少的工作量。

物理分服和逻辑分服

物理分服

原来的架构是按照大服设计的,所以在数据库上面的设计一个服对应一个数据库。假设我们滚了500个服,就需要建500个数据库,部署500个游戏服。无论后续跨服、合服的业务扩展,还是运维的维护方面,都变得比较复杂和困难。特别是合服的需求上面,需要将两个数据库甚至多个数据库合并成一个数据库。在量上来的时候,这一切都变得无比繁琐和复杂。开发人员也需要花费较多的人力和时间去写相应的工具。而且操作相对复杂,也比较容易出bug。而且后续新增的业务如果出现了持久化数据就需要增加相应的合服处理。

逻辑分服

如果说我们一开始就已经将数据库合并了呢,是不是后续根本就不需要去合并数据库了。所以如果在当初框架设计的时候就已经按照逻辑来分服的话,后续的事情处理起来就简单多了。问过同行业的一些游戏架构,他们也是这么处理的。

对于合服

因为数据其实还是在同一个库里面,而且也是在同一个服务器里面。只要简单处理,或者甚至不需要任何处理,就可以将两个或多个服合并。只需要在后台设置一下入口配置、可见配置就可以解决合服的问题了。

对于跨服

跨服原本的问题就是需要从不同库读取数据和与不同服进行交互。如果本身就不存在多服的问题,也不存在跨服的问题。

虽然逻辑分服可以比较完美解决合服的问题,但是对于跨服还是需要单独处理。毕竟如果一个逻辑分服的服务器真的扛不住的时候,就会出现真的物理分服。对于跨服的需求来说,可能都是需要跨的。

维护成本

相对于物理分服,逻辑分服可以极大地降低运维成本。数据库数量级可以极大减少,服务器数量也可以减少。对于备份、更新等运维操作都相对变得简单。甚至可以不依赖于运维工具,就可以简单地维护机器了。一台机器部署一个服(多个逻辑服)对比一台机器部署多个游戏服(一个逻辑服),需要初始化的内存一般来说会变小(不排除不一样的情况),机器的资源占用一般来说会小很多。所以对物理机的利用效率可以提高很多。

用户数量级的问题

逻辑分服必然会出现性能瓶颈,不可避免地出现了物理分服、分库的情况。而对于合服来说,合服本身就是发生在用户数量或者同时在线数量不足的情况下出现的。如果用户数量过大,基本上不太可能出现合服的需求。如果前期量级大,已经物理分服了。后期量级小了,其实重新叠回去也不是什么大的问题。只需要跟运营沟通好了,还是可以使用逻辑分服的事情去解决合服的事情。当然如果运营需要真的在不同物理服上面进行合服,我也没有想到比较好的办法,只能又苦逼地去处理的样子。

开发成本

由于逻辑分服,的确是增加了一些内容,譬如玩家所在的服务器ID。但是这个处理起来并没有多大的难度,而且对key值也并没有多大的影响。

逻辑分服的架构对于大世界和滚服都是支持的,只是对于大世界的话,就浪费了一个存储空间和一点点内存。但是这样的框架可以自如应对大世界到滚服之间的变化。如果一开始就按照大世界来设计,万一某一天滚服了,就要麻烦地多。

所以逻辑分服并不会提升多大的开发成本。

前天随意点开博客园,看到了一篇关于tmux的文章 Tmux - Linux从业者必备利器,特意还点进去看了。毕竟Linux对于做游戏服务端开发的我来说,太熟悉不过了。不过我就粗略地看了一眼,就关掉了。直到第二天码农周刊就推荐了这篇文章,才引起我真正的关注。tmux真的那么好用吗?所以我自己也倒腾来一遍,的确在许多场景下还是非常有用的。如:

  • 做服务器的,肯定需要关注性能的,而tmux多个pane可以很方便同时关注多项性能指标;
  • 我们的游戏服刚好有多个服务存在,而联调多个服务的时候,可以同时看到多个控制台确实很方便。

以上并不是其它方式不可以,譬如我用xshell的,同时看多个xshell可以达到相同的效果。但切换的时候还是有些不方便。 因为环境不同,原作者用Mac,而我用CentOS,有些地方存在不一样,故记载方便自己以后查阅。

CentOS下安装

首先我是用yum install tmux尝试安装的。估计没有源,没有找到tmux。所以习惯性直接找源代码安装。
但是其中有依赖,需要先安装libevent

wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
tar xzvf libevent-2.0.21-stable.tar.gz
cd libevent-2.0.21-stable
./configure && make
make install

然后再下载源码安装tmux

git clone git://git.code.sf.net/p/tmux/tmux-code tmux
cd tmux
sh autogen.sh
./configure && make
make install

过程中遇到了两个报错,解决都比较简单,当然是查阅资料后。

问题1:

期间我遇到了执行autogen.sh 报错,原因是我没有安装automake。这个直接yum install automake就简单解决了。

问题2:

执行的时候遇到

libevent-2.0.so.5: cannot open shared object file: No such file or directory

的报错,解决办法也比较简单,既然找不到,那就换个找得到的地方呗。

ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.5     # 32位系统
ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5   # 64位系统

使用和快捷键

直接在命令行输入tmux即可进入tmux的模式。

tmux主要有windows窗体操作和Pane操作,个人觉得windows对于我来说,意义不大(并不是说windows模式没适用场景),所以这里主要讲下Pane的相关操作。

快捷键

tmux的快捷键都要先按C-b(Ctrl-b)。然后再按下面表格内容,才能达到相应的效果。

session和其他相关快捷键

快捷键 功能
C-z 关闭tmux.
: 进入tmux命令行模式.
? 列出所有快捷键.
t 显示时间.
d 退出当前tmux客户端,tmux后台运行.
   | 

$ | 重命名当前session.
s | 切换session 显示所有session并切换到某一个session.
( | 切换session 切换到上一个session.
) | 切换session 切换到下一个session.
L | 切换session 到前一个活跃的session.

window相关快捷键

快捷键 功能
c 新增一个window.
& 退出当前window.
, 重命名当前window.
l 跳转到上一个所在window.
    | 

i | 显示当前window的信息.
w | 切换window 显示所有window并切换window.
0 to 9 | 切换window 到相应编号的window.
p | 切换window 上一个window.
n | 切换window 下一个window.
’ | 切换window 到输入编号的window.
f | 切换window 到搜索到的window.
Space | 改变当前window下的pane布局.

pane相关快捷键

快捷键 功能
! 从window移除当前pane.
将当前pane变成上下两个pane.
% 将当前pane变成左右两个pane.
x 关闭当前pane.
q 显示pane的索引.
z 最大化或者恢复当前pane.
{ 跟前一个pane交换位置.
} 跟后一个pane交换位置.
o 切换Pane 到下一个pane.
; 切换Pane 进入到前一个操作过的pane.
Up, Down Left, Right 切换Pane 使用方向键切换到相应方向的pane.

可能有些快捷键有些出入,可以的话提醒下。另外有些快捷键没有搞懂,而且快捷键比较多,个人觉得记得主要的几个切换快捷键就足够用来。比较tmux只是一个协助工具,没有必要在其上面那么用心。加粗的是个人觉得比较实用的。

tmux不中断session的模式确实很666666,每次连回去就可以快速接上上次结束的环境。而且多个pane也非常适合要开启并监控多个服务的情况。

多个pane例子

参考资料

  1. http://cenalulu.github.io/linux/tmux/
  2. http://elroyjetson.org/dev-notes/centos/installing-tmux-on-centos-6-2
  3. http://www.nigeldunn.com/2011/12/11/libevent-2-0-so-5-cannot-open-shared-object-file-no-such-file-or-directory/

背景

在某一天重启了虚拟机的 linux 之后,我的 windows 在连接上 samba 之后,点击某些文件夹的时候,会出现没有权限打开的情况。这问题折腾了我一度重新配置了好几次 samba 的配置,然而无果。

解决

经过搜索,发现有两个办法可以解决samba的某些文件夹无法访问的问题。

  • 方法一 修改文件和文件夹的安全策略;
  • 方法二 关闭 selinux

第一种方法并不合适,只是临时解决的一种方案。因为在 windows 下新建了一个 linux 文件夹之后,下一次重启了 linux ,新的文件夹又无法访问了。麻烦。第二种方法就简单了,一劳永逸。

虽然网上又说关闭 selinux 会有安全问题。然而只是我虚拟机的 linux 开发机而已,并不是生产环境,没有太高的安全问题。

方法一 修改安全策略

 chcon -t samba_share_t share

chcon 可以修改文件的安全上下文。重置windows建立的文件、文件夹的安全信息。也可以解决,但是比较麻烦,不方便。

方法二 关闭 selinux

永久关闭

修改 /etc/selinux/config 文件,设置

SELINUX=disabled

然后重启linux。

临时关闭

使用 setenforce 命令可以修改 selinux 模式。

  • setenforce 1 设置 selinuxenforcing 模式;
  • setenforce 0 设置 selinuxpermissive 模式。

其它方案

https://wiki.centos.org/zh/HowTos/SetUpSamba 有相当详细的解释和解决办法。有时间折腾的可以看看。

以上。

管理属性变量的命令

svn客户端有个属性ignore 用于保存忽略的文件或者目录。除此之外,svn其实有好多属性变量用来自定义,如在windows下svn客户端里面属性截图:
windows svn

但是在linux 下,不可像windows那样有可视化界面进行管理。
执行svn help 命令可以知道有五个命令用于管理svn 属性变量。

propdel (pdel, pd)                # 删除属性
propedit (pedit, pe)              # 编辑属性
propget (pget, pg)                # 获取属性的值
proplist (plist, pl)              # 列出所有的属性
propset (pset, ps)                # 设置属性的值

那么有这几个命令,想要编辑svn:ignore 变量还不轻而易举。

方法1:

首先要给SVN指定默认的编辑器,如下。当然改成其它编辑器也可以。

  • export SVN_EDITOR=/usr/bin/vim 已经设置的话,可以忽略这一步
  • svn propedit svn:ignore [目录]

然后可以在vim编辑器中写上需要过滤的目录或者文件。换行隔开,据说空格也可以,但是我没有试过。

方法2:

除了propedit可以设置,当然propset 也可以设置。
svn propset
图片表示将pet目录下的xg_pet.erl文件加入到忽略列表。

属性变量文件

在当前目录,有一个.svn 目录。当有属性变量的时候,.svn目录会生成一个dir-props文件用来保存属性变量,如下:
svn properties file

查看状态

另外说一个linux下很常用的命令。相当于windows下commit的时候出现的文件列表。而linux下需要用svn status来查看。
svn status/svn st/svn stat

延伸一下,下面两个命令:

  • svn st | grep ^? | sed 's/? //' | xargs svn add 增加尚未增加到svn的文件
  • svn st | grep ^! | sed 's/! //' | xargs svn rm 删除svn里面已经不存在的文件(本地尚存)

当然避免误操作,我经常先执行svn st | grep ^? | sed 's/? //' 先确认下文件列表。
svn skill

一、添加RSS

博客来说,RSS的重要性可想而知。

1. 安装hexo rss插件

hexo提供了生成RSS xml的插件hexo-generator-feed,执行npm install hexo-generator-feed即可。

2. 配置

编辑blog/_config.yml文件。在里面添加查看配置,如下

plugins: 
  hexo-generator-feed

还要修改主题的配置文件blog/theme/_config.yml。在rss里面配置rss: /atom.xml。在菜单里面添加RSS菜单。

menu: 
  Home: / 
  Archives: /archives 
  Rss: /atom.xml

二、添加sitemap

当关注seo的时候,sitemap也同样重要。

1. 安装hexo sitemap插件

同样,执行命令npm install hexo-generator-sitemap即可完成插件的安装。

2. 配置

一样修改blog/_config.yml文件,添加上插件名称

plugins: 
  hexo-generator-feed
  hexo-generator-sitemap 
  

三、其它

其实两个插件是在hexo g的时候生成atom.xml 文件和sitemap.xml 文件。由于sitemap.xml 是对搜索引擎服务的,所以不需要显示在博客里面。而Rss是要给读者收藏的,需要在菜单里面添加显示。当然你不喜欢在菜单里面显示可以直接修改模板显示在你喜欢的地方。如编辑blog/theme/[light]/layout/_partial/header.ejs文件:

<ul>
<% for (var i in theme.menu){ %>
  <li><a href="<%- theme.menu[i] %>"><%= i %></a></li>
<% } %>
<li><a href="/atom.xml">RSS</a></li>
</ul>

可以不配置menu达到相同的效果。

一、安装 Node.js

在官网 http://nodejs.org/ 下载winwos版本,点击安装完成即可。

二、git环境安装

对于git的安装,网上已经大量资料,就不赘述了。

三、安装 hexo

启动cmd,输入命令npm install hexo-cli -g 即可完成hexo的安装。

四、初始化博客

随便找一个目录。在cmd里面执行命令hexo init blog (blog为文件夹名称,与github的项目名称一致)。
cd blog进入目录。执行hexo ghexo s就可以生成静态html文件和启动一个http服务器。
按照提示,访问 http://127.0.0.1:4000/ 就可以看到一个博客网站了。

hexo init blog
hexo generate     # hexo g
hexo server       # hexo s

五、配置和发布到github

编辑 _config.yml 文件。在deploy字段配置以下内容

deploy:
  type: git
  repo: git@github.com:rondsny/rondsny.github.com.git

git@github.com:rondsny/blog.git 是在github上面托管博客的项目地址。譬如我的github 是http://github.com/rondsny/ 然后我建立用于托管的项目是rondsny.github.com

执行命令 hexo deployhexo d 就可以将博客发布到github上面。

访问 http://rondsny.github.io/ 就可以看到效果了。