游戏服务器 mongovue 合适吗

收藏,351 浏览
Replica Sets搭建
服务器采用Replica Sets搭建,可参考
Mongod的读模式共有五种:
primary. 在主节点上进行所有的读操作
primaryPreferred. 优先在主节点上进行读操作,如果主节点不可用,再从从节点操作。
secondary.所有的读操作在从节点上进行。
secondaryPreferred.优先在从节点进行读操作,如果所有从节点都不可用,再从主节点操作。
nearest. 根据网络延迟时间 ,就近进行读操作,不考虑节点类型。
配置节点Tags Sets
Tag sets 允许指定一个replica set进行读操作,其中Mongod的读模式必须是以下四种之一:primaryPreferred、secondary、secondaryPreferred、nearest
Tags Sets配置参考:
主要操作如下:
conf = rs.conf()
conf.members[0].tags = { "dc": "east", "use": "production"
conf.members[1].tags = { "dc": "east", "use": "reporting"
conf.members[2].tags = { "use": "production"
rs.reconfig(conf)
mgo代码示例
根据以上的配置,如果需要指定从members 1中进行数据库读操作,可采取以下代码:
session, err := mgo.Dial("localhost")
if err != nil {
log.Fatalln(err)
defer session.Close()
session.SetMode(mgo.Eventual, true) //需要指定为Eventual
session.SelectServers(bson.D{{"dc", "east"}, {"use", "reporting"}}) // 指定从1中读取
db := session.DB("test")
col := db.C("tbl")
data := make([]interface{}, 10)
col.Find(nil).Limit(10).All(&data)
log.Println(data)
举报理由:
带有人身攻击、辱骂、仇恨等违反条款的内容
与已有问题重复
内容质量差,或不适合在本网站出现
答非所问,不符合答题要求
其他原因(请补充说明)
补充说明:前言 &&&& 在开始正文之前,感谢博客园的Nosql爱好者对于MongoCola工具的试用(使用)。特别感谢 呆呆 这位朋友的Bug报告,让我纠正了一个很严重的Bug。同时也感谢以前的多个网友在博客留言中给我的意见,建议,以及BUG的修正方案。这个工具的进步离不开你们的贡献。最新版的MongoCola为1.13.主要改进了一些视觉效果上的东西,毕竟这个工具不是个人的工具了,在保证品质的前提下,也要考虑到美观和易用性了。如何得到MongoDB & & MongoDB是一个开源的项目,你可以从GitHub上获取MongoDB的源代码,当然对于大部分用户来说,我们并不需要源代码,直接下载可执行的文件即可。最新版的MongoDB是2.0.4.& & 你可以从MongoDB的官方网站下载。 官方网站下载地址:& & 温馨提示:各种平台的版本很多,请选择正确的版本下载。& & 下载后的文件是一个压缩包,直接解压就可以了。解压后,你会看到若干个 EXE 可执行文件,其中 mongod.exe 是重点文件(Mongo device)启动新的Mongo服务器必须要用到这个。&如何启动一个MongoDB服务器 & && 启动一个MongoDB服务器的实例,有很多方法,这里将一个最简单的方法(注意,不是最合适的方法)。这个方法非常适合我们学习者使用。& && 首先,请准备好一个目录,用于存放MongoDB的数据库文件。例如 C:\mongodb\master 这样的目录。MongoDB的数据库文件和日志文件等等都会生成在这个目录下面。& && 确保了目录已经存在后,我们可以在DosCommand里面启动一个MongodB服务器了。(我想大部分在这里的人是知道如何启动DosCommand命令行的)& && 然后依次输入以下两条命令:(我们假设你的mongod.exe放在C:\runmongo\bin 文件夹里面了)&& &&&&&cd&C:\runmongo\bin&&&&&mongod&--port&&28018&--dbpath&C:\mongodb\master&--master&--rest&--journal&&& 第一条指令是将工作目录切换到Mongo的Bin下面,第二条命令是启动一个Mongodb的服务器。 启动命令的详细细节,暂时不介绍,请大家试试看能不能启动。(这里我选择了28018这个端口作为Mongodb的TCP/IP端口,一般建议使用10000以上的端口)。&&& 一般,我会将这两条命令放在一个扩展名为 .bat 的批处理文件里面,以后只需要执行这个批处理文件就可以了。例如 你可以新建一个名为master.bat的文件,然后将这两句指令保存到这个文件中,以后通过双击master.bat就可以进行服务器的启动了。& && &&& && 正常启动的Dos界面&&使用工具监视操作MongoDB& & 你可以使用Mongo原生的命令行工具来监视和操作MongoDB,也可以使用各种MongoDB的工具来操作MongoDB。这里我使用自己开发的工具来监视和操作MongoDB。& & 1.启动MongoCola:如果你是第一次使用MongoCola,先选择界面语言。由于工具是面向全球的,所以使用英语为默认语言。当然,你可以选择 中文 为界面语言,& & & & & &&&&& 然后,请设定一下你的Mongo的可执行文件的路径,软件的一些功能需要使用一些原生的可执行文件& & & & & &&&&& 例如我的路径是C:\runmongo\bin& 当然,你也可以在以后进行设置。不过强烈建议一开始就设置。不然影响部分功能的使用。&&& 2.接下来,我们新建一个数据库连接。& & & & & &&&&&&&&& 由于第一次使用,所以没有任何登录过的连接。首先,我们新建一个新的连接。& & & & & && & && 一个最最基本的链接,只需要Host名称和Port就可以了。我将这个链接的名字定为 Master,然后由于是本地的服务器,所以Host就填为localhost,端口是28018.& & && 设定好了以后,可以按下Test来测试一下是否设置正确,或者直接按下 Add 来登录一个新的连接。& & && OK,登录好了之后,在连接管理面板里面双击这个链接,就可以打开主界面了。(你也可以选中一个链接,然后按下OK按钮)。&&&&&& 【注意:密码将以明文形式放入Config.xml文件中】&界面基本介绍 & & & &&&&&&& 界面分为左右两个区域,左边的是连接列表(通常1个连接代表一个服务器,但是连接的概念和服务器的概念并不是等价的)。你可以在这个区域里面看到服务器的大致结构,例如数据库和数据集的整体状况。右边是各种数据库对象的详细信息表示区域,这里可能显示一个数据集的记录,或者显示文件系统和用户系统。在初始化的状态下,这里显示当前连接的状态。& & & 这里我们看到服务器下面有一个local的数据库,现在他是我们唯一拥有的数据库。local数据库下面没有 User,没有GFS(文件系统),没有Javascript文档,没有系统和普通的数据集。说到底,什么都没有。。。& &&& 由于local是系统数据库,软件认为不能由用户来操作,所以,我们先要新建一个数据库。我们选中服务器的图标,然后从右键菜单中选择 新建数据库(createNewDatabase),输入数据库名称之后,一个新的数据库就建成了。(由于已经知道的Mongodb的Bug,请使用英文作为数据库名称)。作为例子,我新建了一个Cnblogs的数据库。然后选中这个数据库,右键菜单里面有新建数据集的菜单项(Create New Collection)。& & &&&&&&&&&& 这里的数据集名称,也暂时不要使用中文。关于使用中文数据集名称的Bug,我已经报告Mongo官方了,但是现在还没有修正好。Bug票:&&&&&&&& 一般用户,直接填写数据集名称就可以了,一些高级选项,请在知道确切含义后选择。特别是Iscapped属性,用这个属性后,数据集里面的文档(数据)可能无法修改。好了,我们新建一个NoSql的数据集。&&&&&& 如果没有问题,左边的数据库一览的Cnblogs下面将会有一个Nosql数据集挂在一般数据集下面。由于使用了索引,系统数据集里面也会有一个System.index数据集。双击一下这个数据集看看。右边的数据视图将会展示数据集内容,当然现在什么都没有。 &&&尝试加入第一个文档& & OK,接下来我们加入一条数据到数据集中,Mongo里面将数据记录叫做 文档。按下工具栏的第一个图标,添加一个文档吧。&&&& 这里我们使用Json作为描述文档的语言,它看起来像这样{&&&&"Name":"MongoDB","Type":"Nosql"}&&&&注意:一般我们不用(不能输入)_id这个索引字段,这个是Mongo自动维护的字段。这里我们添加两个字段,一个是Name,值是MongoDB,一个是Type,值是Nosql。&&&&&&& 插入成功后,你可以看到第一条记录了。由于时间问题,TreeListView还比较粗糙,有时间再改了。。。。&&& (不知道有没有朋友 对于 绘制自定义TreeView 有经验吗,能不能帮忙绘制一下Node的连线和前面的加减号,我画得不是很好)&&&& 这里_id是系统自动生成的主键。(一般情况下,这个id不会重复,不过,通过一些方法,是可以让这个id重复的。。。。O(∩_∩)O~)& && 软件为你准备了3种视图来查看数据:树形视图,列表视图,和Json文本视图。&聚合功能& && 介绍这个功能前,我们现在数据库里面追加一些数据吧。& && &&&& 我们一共有4条数据,2条Nosql的,2条Sql的数据。&&& 数据统计:Count& & 这个功能很简单,就是看看数据集里面的文档(数据)件数。& & 从左边的服务器视图中,选中数据集,在右键菜单中选中聚合(aggregation)菜单项里面的Count功能,记录条数就会以弹出框的形式告诉用户。&&& 数据统计:Distinct&&& 启动Distinct的方法和Count一样,在右键菜单中选中聚合(aggregation)菜单项里面的Distinct功能。这个时候,你需要在弹出窗体里面选择你需要做Distinct的字段名称了。& & 如果我们以Name做Distinct,结果是4件记录,如果我们以Type做Distinct,结果是2件记录。看了下面的图,我想各位都知道这个结果是怎么得出来的了。&&&&&&& 数据统计:Group和MapReduce& && 暂时不做说明。&简单的查询功能& && Nosql的查询功能一直是一个软肋,这里我开发了一个简单的查询器。& && 例如,我想查找所有的Nosql的数据。那么我们可以使用查询功能,你可以在视图的工具栏里面按下那个双筒望远镜的图标。& && 然后进行如下设置即可。字段是下拉表里面选中的Type,EQ表示“等于”的意思,然后类型是BsonString,需要等于的值是 “Nosql”& && 执行这个过滤器后数据就只有2条被表示到数据视图中了。(这个时候如果再使用聚合的话,结果将默认建立在这个过滤器的基础上,这个时候做Count,结果是2) & && & &&&& 你可以使用工具栏上的 过滤器图标来切换 数据过滤的启停状态。注意:id字段比较特殊,不能屏蔽。如何得到Mongocola1.13& && 你可以从Github下载本软件: & && 本软件是开源软件,所以没有任何功能限制。&&&& MongoCola 最新版本:1.13& Mongodb 最新版本 2.0.4 C# Driver 最新版本& 1.3.1&未完待续&3月31日,MongoDB在上海召开技术者大会,有人去吗?详细情况:
阅读(...) 评论()& & & & 昨天,我“收到”了一个定时炸弹,当然也是爆炸了我才知道,原来我也有定时炸弹,说起来很杯具,是这我下半年“收到”的第二个定时炸弹;好了,下面我就介绍下我这定时炸弹,希望大家能减少定时炸弹
& & & & 第一定时炸弹:炸弹的具体时间忘记了,大概是7月26号左右,记得爆炸的前一天晚上8点多,游戏实时在线人数一下子跌了200人,然后又好了;这时我也收到了电话,第一时间就怀疑是不是重启了,查了,结果不是,这时感觉会有问题,但又不知道问题出现在哪,所以心里也有些担忧,第二天下午3点多,终于爆炸了,游戏挂了,最后在同事的帮忙下手动启动游戏才发现数据库挂了(岩机),最后查到了,是数据库没有索引造成的,所以长时间造成CPU100%而导致的岩机,然后重起数据库机器,第一时间将索引加上就可以了,同时也去检查了其他机器索引是否存在。这个炸弹是我没有严格按照装游戏程序(少了加索引该步骤)造成的,真是杯具啊;从埋下定时炸弹到炸弹大概有一个星期的时间,从此,我也要严格要求自己之后不能再犯同样的错误了。
& & & & 第二定时炸弹:爆炸时间,昨天下午3点多,又是下午3点多,我觉得这不是巧合,可能是那时候玩家多点,也就是说,它可能前几天就差一点点快爆炸了,只是差了点点,爆炸的第一时间,我想很大可能是数据库,所以就直接锁定在数据库机器,发现是数据库机器岩机了,所以马上重起,之后就检查索引,晕啊,配置表的索引不见了,但数据表和日志表索引依然存在,一时间想不明白,但时间紧迫,先能让游戏能玩是当前最重要的问题,所以就加索引,启动游戏程序,恢复正常了;之后问了同事,才知道,索引是导入没有索引的配置造成的,那为什么会没有了呢?现在是知道了,首先,这配置是从内网传出去,传到测试服,所以测试服也是没有,测试服再到正式服,所以第一步错了,所以到最后也是没有了,再说一下,因为游戏的配置表是经常要更新的,所以每次更新都必须要检查索引(没有索引往往是新建了库,却没有加造成的,而内网是共用的,不一定能保证每次都是有索引),这个定时炸弹过了两个多月(快三个月)才发生爆炸,所以还是自己没有检查清楚造成的,自己也很伤心,还犯了这样的错误!
& & & &经过上面两个定时炸弹,我想,管理是一门艺术,我可能不太合适做管理,做技术还可以,好了,不扯了,下面直接进入我们讨论的话题。
& & & 游戏服务器有哪些服务嗯 ,先看下代码就知道有哪些常用服务了,之后再一个个地讲解 &(注:这里讲的是小型网页游戏)
ChatSocket.cpp 启动文件(不要受这个Chat命名影响)
//============================================================================
: ChatSocket.cpp
// Version
// Copyright
: Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include &iostream&
#include &string&
#include &ServerSocket.h&
#include &../base/Exception.h&
#include &Clients.h&
#include &../util/JSONObject.h&
#include &ServerHandler.h&
#include &../util/StringFormat.h&
#include &../config/ServerConfig.h&
#include &mongo/client/dbclient.h&
#include &../util/Config.h&
#include &../consts/Mongodb.h&
#ifndef assert
#define assert(x) MMONGO_assert(x)
// 初始化配置
void InitConfig();
// 初始化Action
void InitAction();
// 连接数据库
void InitMongoDB();
// 启动定时器
void TimerStart();
// 启动队列
void QueueStart();
// 启动Http服务
void HttpStart();
// 启动Socket服务
void ServerStart();
int main(int argc, char* argv[]) {
//运行需要的参数,参数为配置文件位置]
for (int i = 0; i & i++) {
// 暂时不做处理
InitConfig();
InitAction();
InitMongoDB();
TimerStart();
QueueStart();
HttpStart();
ServerStart();
}catch(Exception e){
cout && e.DisplayMsg() &&
cout && &Server is end!& &&
void InitConfig() {
ServerConfig::Init(&configs/server.cfg&);
cout && &InitConfig success......ok!& &&
void InitAction() {
ServerHandler::initClassHandlerMap();
cout && &InitAction success......ok!& &&
void InitMongoDB() {
Mongodb::Init();
cout && &ConnectDB success......ok!& &&
void ServerStart() {
cout && &ServerStart Running......ok!& &&
ServerSocket server(ServerConfig::GetServerPort());
server.Accept();
void TimerStart() {
cout && &TimerStart success......ok!& &&
void QueueStart() {
cout && &QueueStart success......ok!& &&
void HttpStart() {
& & 这个程序我是还没有写完的,我想如果等我全部写完了,再写博客来介绍来大家,不但看起来累,而且我也没有太多激情来写了,其实写程序重要的是思想,代码不重要,
& & &这里可以看到有数据库(同步)、定时器、队列、Http和Socket服务,当然还有其他服务,目前我就先介绍这几个
& & & 数据库同步服务:定时检查内存中的数据,判断数据是否需要同步到数据库,为什么要定时同步呢?呵呵,在游戏里,数据库你可以把它看作是一个游戏数据的一个备份,游戏数据的获取和修改是直接操作内存的,速度很快,所以定时同步是做备份用,同时也减与数据的IO问题,因为直接操作内存,所以会存在数据安全问题,这个问题我留到《内存&线程安全》文章再讨论了,内存中的数据是从数据库加载下来,过程大概是这样 :访问内存,内存中存在就直接返回 ,不存在,到数据库上加载下来,并放入内存中去,然后返回数据,关于从数据库加载数据到内存方面的知识点也留到《内存&线程安全》文章再讲解了。所以数据库同步服务是同步内存数据到数据库的服务
& & & 定时器服务:这个在游戏中用得很多,主要分为两种,1、到某个时间点,如是 23:23:03秒执行,像游戏中开启某日某时活动;2、从某个时间开始,每隔x分钟执行一次,比如每5分钟给不满血的玩家加血;像JAVA它本身就提供有定时器的类(TimeTask),非常好用,直接拿来用即可。如果要自己写怎么办呢?好,首先我们要理解它是怎么做到定时执行的,呵呵,很容易想到,不停地在判断时间是不是指定的时间,是就执行,不错,定时器就是这样做的,所以要开发
一个定时器,就是必须创建一个新的线程,然后再不停地判断时间对不对,当然设计这个东西,一定要考虑到性能问题,还有sleep时间也要根据参数做最优的设计,实现定时器这代码怎么写我就不说,想知道的,google一下会有很多答案的,呵呵,我也没有写过。
& & & 队列服务:为什么叫队列服务呢,我叫某某服务不行吗?之所以用到队列二字,那是因为它就是以队列形式去执行的,队列是先进先出的,所以叫队列服务再合适不过了,好了,这个一般应用在有CD需求的功能上,比如:升级操作后,会有一个CD,说在20秒内不能再次,还有是触发某件事后,每隔一段时间执行一次,比如采矿,拿 下矿后,每分钟获得x个矿产,关于队列的实现,我简单说一下,队列它包括几个属性:创建时间,结束时间,执行时间,每隔多少时间再执行一次,要执行的方法,额外参数,关于队列的代码实现我留到《队列讲解与实现》文章中介绍了
& & & Http服务:这个服务在游戏中也很重要,是通过http方式进行与游戏通信或管理的,比如:后台(网页版)管理游戏,重起,禁止玩家聊天等一系统的操作都是要通过http服务进行,这也通常称为游戏的API,在这里比较重点的是安全问题,因为开通了http服务,这代表任何人都可以通过http方式给游戏发信息,所以这里一定要认证是不是合法的管理信息,否则都拒绝
& & & Socket服务:简单点就是游戏服务,是服务于前端请求,这里不必要做什么安全认证,只要请求的uid能在内存(或数据库中找到数据,那它就是合法用户),所以这个就介绍到这里了
& & & 在这篇文章里, 主要说我经过的定时炸弹和游戏有哪些服务,如果大家还有哪一点不明白的,可以发邮件给我:
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:13272次
排名:千里之外
原创:27篇
(1)(5)(1)(1)(11)(5)(1)(9)}

我要回帖

更多关于 robomongo 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信