Songsong 发表于 2006-8-14 00:51:04

关于模拟迪酷排名系统的技术讨论(欢迎有能力的补充修正)

这个思路一直静静地躺在我服务器上,迪酷宣称花了巨资搞了那个平台,但是我在Linux下进行了模拟,经过实验,测试有效,而这个方案我仅仅报价为7500。与其浪费,不如我公开核心思路,把它给需要的人。
这个东西,我选择Linux平台主要考虑
第一:Linux的稳定
第二:强大的Shell功能便于实施集群管理
第三:数据的安全性有保障

首先是用户注册系统,这需要一个Web环境,考虑到后面要对数据库导出后进行操作,我选择了MySQL

通常意义,这个Web程序应该具备服务器管理及会员注册功能,其中会员密码为了方面后面操作可以采取明码方式进行储存

下面是我设计的数据库结构

CREATE TABLE `access` (
`webpage` varchar(50) NOT NULL default '',
`fromurl` varchar(100) NOT NULL default '',
`fromip` varchar(10) NOT NULL default '',
`fromarea` varchar(10) NOT NULL default '',
`accesstime` datetime NOT NULL default '0000-00-00 00:00:00'
) ENGINE=MyISAM DEFAULT CHARSET=gb2312;


CREATE TABLE `const` (
`id` tinyint(1) unsigned NOT NULL default '0',
`webname` varchar(50) NOT NULL default '',
`webtitle` varchar(50) NOT NULL default '',
`copyright` varchar(100) NOT NULL default '',
`shownumperpage` tinyint(4) NOT NULL default '0',
`tim` int(10) unsigned NOT NULL default '0',
PRIMARY KEY(`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gb2312;


INSERT INTO `const` (`id`, `webname`, `webtitle`, `copyright`, `shownumperpage`, `tim`) VALUES (1, 'HLServer.net用户注册系统', 'HLServer.net用户注册系统', 'yuan', 15, 4294967295);


CREATE TABLE `server` (
`id` int(10) unsigned NOT NULL auto_increment,
`area` varchar(10) NOT NULL default '',
`city` varchar(100) NOT NULL default '',
`serverurl` varchar(100) NOT NULL default '',
`usercount` int(10) unsigned default NULL,
PRIMARY KEY(`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gb2312 AUTO_INCREMENT=2 ;


CREATE TABLE `static` (
`statdate` date NOT NULL default '0000-00-00',
`totalip` int(10) unsigned NOT NULL default '0',
`pageviews` int(10) unsigned NOT NULL default '0',
`lasttime` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY(`statdate`)
) ENGINE=MyISAM DEFAULT CHARSET=gb2312;


CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL auto_increment,
`userno` varchar(20) NOT NULL default '',
`remark_0` varchar(20) NOT NULL default 'ss_qx_cjt_1',
`account` varchar(20) default NULL,
`password` varchar(16) NOT NULL default '',
`remark_1` varchar(20) NOT NULL default 'ss_qx_cjt_2',
`username` varchar(10) NOT NULL default '',
`level` tinyint(1) NOT NULL default '0',
`question` varchar(200) NOT NULL default '',
`answer` varchar(100) NOT NULL default '',
`addtime` date NOT NULL default '0000-00-00',
`logins` int(10) unsigned NOT NULL default '0',
`logintime` datetime NOT NULL default '0000-00-00 00:00:00',
`loginip` varchar(10) NOT NULL default '',
`iflock` tinyint(1) NOT NULL default '0',
`serverids` varchar(200) NOT NULL default '',
`remark_2` varchar(20) NOT NULL default 'ss_qx_cjt3',
PRIMARY KEY(`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gb2312 AUTO_INCREMENT=1 ;


AMX的用户权限系统,AMX提供了配置文件管理用户(admin)权限,一般意义上这个配置文件装载的用户是有限的(#define MAX_ADMINS64),但是它的源文件提供了MySQL形式的连接,只需要重新编译,源文件是如此描述:


// Uncomment the following line to load admins from a database
//#define USE_SQL

/* If you enable USE_SQL, you might create your MySQL admins table with this SQL query :

CREATE TABLE admins (
    `auth` varchar(32) NOT NULL default '',
    `password` varchar(32) NOT NULL default '',
    `access` varchar(32) NOT NULL default '',
    `flags` varchar(32) NOT NULL default '',
    PRIMARY KEY (`auth`)
) TYPE=MyISAM;

* IMPORTANT:
* Check $moddir/addons/amx/config/mysql.cfg for MySQL access configuration
*
*/

在我的测试服务器上,我的用户权限数据记录是这样的

CREATE TABLE `admins` (
`auth` varchar(32) NOT NULL default '',
`password` varchar(32) NOT NULL default '',
`access` varchar(32) NOT NULL default '',
`flags` varchar(32) NOT NULL default '',
PRIMARY KEY(`auth`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `admins` (`auth`, `password`, `access`, `flags`) VALUES ('ss', '123456', 'abcdefghijklmnopqrstu', 'a');


如何第一段数据库里的user信息插入进MySQL就是问题关键,这里采用了grep等程序过滤数据库文本,例如:
./usr/bin/mysqldump -uroot -ppassword -B amx_user --tables user --no-create-info >/usr/local/songsong/amx_user_shell/amx_user.sql

grep INSERT amx_user.sql |sed 's/ss_qx_cjt3/\n/g'|sed 's/\(.*\)*.ss_utf_7/\n/g'|sed 's/\(.*\)ss_utf_8.*/\1/g'|sed '/^ *$/d'|sed -e "s/');//g" -e "s/','/\"/g" -e "s/\"/\" \"/g" -e "s/^\" //g" -e "s/ \"$//g"|sed '/^ *$/d'|sed -e "s/$/ \"j\" \"a\"/g"


众所周知,MySQL提供了良好的远程通讯功能,这为注册用户在集群服务器之间的帐号通用提供老可能

至于备份远程服务器的日志,则可以通过SCP进行通讯,比如
#!/usr/bin/expect
spawn scp -P 27 root@123.456.78.90:/root/hlds/home/hlds_l/cstrike/logs/*.* /home/logs
expect "password:"
send "yourpassword\r"
expect >
interact

这段代码可能有安全隐患,建议以非root用户操作。另外传递是逆向的,稍微好一些。当被crond载入后可以实现定时传递远程备份的数据

监听远程服务器状态效率比较好的办法有2个
一个是采用官方提供的接口进行数据分析,这段代码我会在近期公布
一个是利用nmap功能,采用UDP协议,对27010-27030进行定时监听,形成缓存记录并在前台以Web方式显示

[Grief.QQ] 发表于 2006-8-14 01:27:46

回复: 关于模拟迪酷排名系统的技术讨论(欢迎有能力的补充修正)

个人觉得DCOO的排行并没有特别的地方,要说到数据统计,插件可以统计的项目实在数不过来,要说到注册用户,这早已不是新鲜的事情了,AMXX+MYSQL更是很简单,说到服务器状态,UA官方网站上有PHPUA,只是它是PHP而已,修改一下,完全能满足任何要求,要说到DCOO,我大概看了下,是ASP的,但是好象并不是即时更新的,也是缓存记录,要想使用ASP达到即时查看服务器状态的话(即每刷新一次,只要服务器数据有变化,那么ASP前台就会立即显示),并不是不可能的事情,很早的时候就有类似的控件实现了真正的即时查看信息,其实只要使用socket控件对服务器端口进行通讯,相信完全可以做到,只是没有人去做而已,一般都用来发EMAIL,聊天程序之类的!

楼主的意思我看明白了一些,但不是完全明白,不够确定你要表达的内容!
1。要求注册?
2。用户数据库共享?
3。服务器即时状态?

AE86 发表于 2006-8-14 01:41:15

回复: 关于模拟迪酷排名系统的技术讨论(欢迎有能力的补充修正)

songsong是个强人,顶。

小企鹅 发表于 2006-8-14 12:09:06

回复: 关于模拟迪酷排名系统的技术讨论(欢迎有能力的补充修正)

我来来顶,防Dcoo的排名系统,其实思路很简单的!!!
不过有些技术的工作有点难度!!

如有以下需求,即可完全做出来比Dcoo功能更强的排名系统来
一:amxx 插件,可即是用socket协议,或UDP通信,实时写玩家数据到mysql表中,即可!

二:只要mysql表里有即时数据,PHP读mysql大家都不难吧!

三:至于网吧分别排行,也很简单,只需,读网吧IP即可分类!

四:月份、周期排行,呵,读时间就行了!

五:收费吗,联系一下电信就OK了,搞个手机付费接口!!!



---------以上内容,主要还是amxx插件的写法,!

Songsong 发表于 2006-8-14 12:15:55

回复: 关于模拟迪酷排名系统的技术讨论(欢迎有能力的补充修正)

Post by '
']个人觉得DCOO的排行并没有特别的地方,要说到数据统计,插件可以统计的项目实在数不过来,要说到注册用户,这早已不是新鲜的事情了,AMXX+MYSQL更是很简单,说到服务器状态,UA官方网站上有PHPUA,只是它是PHP而已,修改一下,完全能满足任何要求,要说到DCOO,我大概看了下,是ASP的,但是好象并不是即时更新的,也是缓存记录,要想使用ASP达到即时查看服务器状态的话(即每刷新一次,只要服务器数据有变化,那么ASP前台就会立即显示),并不是不可能的事情,很早的时候就有类似的控件实现了真正的即时查看信息,其实只要使用socket控件对服务器端口进行通讯,相信完全可以做到,只是没有人去做而已...

:cool:
建议你按照你说的思路跑一遍你就会发现问题

[Grief.QQ] 发表于 2006-8-14 14:39:48

回复: 关于模拟迪酷排名系统的技术讨论(欢迎有能力的补充修正)

Post by Songsong
:cool:
建议你按照你说的思路跑一遍你就会发现问题

这么来说吧,就用插件,那么即时排行,没问题吧,统计项目暂不考虑,在数据库中,统计数据中增加一个字段PASSW,插件中这样,如果PASSW为空,则为未注册用户,且每次进入服务器提示未注册,请 say/密码 进行注册,这不难吧?如果PASSW有值,则为注册用户,那么,进入服务器就提示 say/密码 进行确认,这个也是可以的吧?如果密码错误,或者KICK,或者强制改名,至于服务器即时状态,以前就有过Q3PLUG,是完全即时状态的,只是它做成了DLL,在本地监听服务端得到信息的,实际上就是个微型的HLSW,如果稍加改进,做成控件,在ASP中或者HTML中调用,我觉得是可以达到效果的,这方面来说,PHP可能就相对简单的多。DCOO有它的特色,但是我觉得模仿就没必要了,毕竟,这些东西都已经实现了,如果真要在这方面做些研究的话,点通应该做出真正属于自己而且有特色的东西来!不过本人不才,ASP和程序都是一知半解!

PS:个人见解,仅做讨论!

另小企鹅所说,实时写数据库,不说一天,单说一幅地图内,就有多少玩家的数据是变动的?变动一次就读写一次,恐怕机器再好,也够受的了!

qing165 发表于 2006-8-14 18:32:50

回复: 关于模拟迪酷排名系统的技术讨论(欢迎有能力的补充修正)

脑袋都大了 只能来凑凑热闹 帮你顶:sexy_girl

yanexp 发表于 2006-8-14 23:12:24

回复: 关于模拟迪酷排名系统的技术讨论(欢迎有能力的补充修正)

Post by Songsong
我今年为贵阳的稻草人设计了一个方案,结果他数次失信,让我徒劳无益。

这个思路一直静静地躺在我服务器上,迪酷宣称花了巨资搞了那个平台...


这种东西没什么好说,想做就能做到。

feikeq 发表于 2006-8-15 01:15:54

回复: 关于模拟迪酷排名系统的技术讨论(欢迎有能力的补充修正)

不太明白楼主的意思,我与二楼站同一角度!

rachis 发表于 2006-8-15 11:13:53

回复: 关于模拟迪酷排名系统的技术讨论(欢迎有能力的补充修正)

songsong给出一个可以实看的页面?这样更直观
页: [1] 2
查看完整版本: 关于模拟迪酷排名系统的技术讨论(欢迎有能力的补充修正)