posts - 110, comments - 101, trackbacks - 0, articles - 7
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

1、/etc/skel 目录;

/etc/skel目录一般是存放用户启动文件的目录,这个目录是由root权限控制,当我们添加用户时,这个目录下的文件自动复制到新添加的用户的家目录下;
/etc/skel 目录下的文件都是隐藏文件,也就是类似.file格式的;我们可通过修改、添加、删除/etc/skel目录下的文件,来为用户提供一个统一、标准的、默认的用户环境;

[root@localhost beinan]# ls -la /etc/skel/

 

[root@localhost beinan]# ls -la /etc/skel/
总用量 92
drwxr-xr-x    3 root root  4096  8月 11 23:32 .
drwxr-xr-x  115 root root 12288 10月 14 13:44 ..
-rw-r--r--    1 root root    24  5月 11 00:15 .bash_logout
-rw-r--r--    1 root root   191  5月 11 00:15 .bash_profile
-rw-r--r--    1 root root   124  5月 11 00:15 .bashrc
-rw-r--r--    1 root root  5619 2005-03-08  .canna
-rw-r--r--    1 root root   438  5月 18 15:23 .emacs
-rw-r--r--    1 root root   120  5月 23 05:18 .gtkrc
drwxr-xr-x    3 root root  4096  8月 11 23:16 .kde
-rw-r--r--    1 root root   658 2005-01-17  .zshrc

/etc/skel 目录下的文件,一般是我们用useradd 和adduser 命令添加用户(user)时,系统自动复制到新添加用户(user)的主目录下;如果我们通过修改 /etc/passwd 来添加用户时,我们可以自己创建用户的主目录,然后把/etc/skel 下的文件复制到用户的主目录下,然后要用chown 来改变新用户主目录的属主目录

 

Linux设置环境变量小结

上一篇 / 下一篇  2008-12-12 15:50:27 / 个人分类:Linux相关

1、总结背景

linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现“command not found”的提示内容。如果每次都到安装目标文件夹内,找到可执行文件来进行操作就太繁琐了。这涉及到环境变量PATH的设置问题,而PATH的设置也是在linux下定制环境变量的一个组成部分。本案例基于RedHat AS4讲解环境变量定制的问题。

2、变量简介

Linux是一个多用户的操作系统。每个用户登录系统后,都会有一个专用的运行环境。通常每个用户默认的环境都是相同的,这个默认环境实际上就是一组环境变量的定义。用户可以对自己的运行环境进行定制,其方法就是修改相应的系统环境变量。

3、定制环境变量

环境变量是和Shell紧密相关的,用户登录系统后就启动了一个Shell。对于Linux来说一般是bash,但也可以重新设定或切换到其它Shell(使用chsh命令)。

根据发行版本的情况,bash有两个基本的系统级配置文件:/etc/bashrc/etc/profile。这些配置文件包含两组不同的变量:shell变量和环境变量。前者只是在特定的shell中固定(如bash),后者在不同shell中固定。很明显,shell变量是局部的,而环境变量是全局的。环境变量是通过Shell命令来设置的,设置好的环境变量又可以被所有当前用户所运行的程序所使用。对于bash这个Shell程序来说,可以通过变量名来访问相应的环境变量,通过export来设置环境变量。

注:Linux的环境变量名称一般使用大写字母

4环境变量设置实例

1.使用命令echo显示环境变量

本例使用echo显示常见的变量HOME

$ echo $HOME  

/home/kevin

2.设置一个新的环境变量

$ export MYNAME=”my name is kevin”

$ echo $ MYNAME

my name is Kevin

3.修改已存在的环境变量

接上个示例

$ MYNAME=”change name to jack”

$ echo $MYNAME

change name to jack

4.使用env命令显示所有的环境变量

$ env

HOSTNAME=localhost.localdomain

SHELL=/bin/bash

TERM=xterm

HISTSIZE=1000

SSH_CLIENT=192.168.136.151 1740 22

QTDIR=/usr/lib/qt-3.1

SSH_TTY=/dev/pts/0

……

5.使用set命令显示所有本地定义的Shell变量

$ set

BASH=/bin/bash

BASH_ENV=/root/.bashrc

……

6.使用unset命令来清除环境变量

$ export TEMP_KEVIN=”kevin”     #增加一个环境变量TEMP_KEVIN

$ env | grep TEMP_KEVIN          #查看环境变量TEMP_KEVIN是否生效(存在即生效)

TEMP_KEVIN=kevin #证明环境变量TEMP_KEVIN已经存在

$ unset TEMP_KEVIN            #删除环境变量TEMP_KEVIN

$ env | grep TEMP_KEVIN       #查看环境变量TEMP_KEVIN是否被删除,没有输出显示,证明TEMP_KEVIN被清除了。

7.使用readonly命令设置只读变量

注:如果使用了readonly命令的话,变量就不可以被修改或清除了。

$ export TEMP_KEVIN ="kevin"      #增加一个环境变量TEMP_KEVIN

$ readonly TEMP_KEVIN                  #将环境变量TEMP_KEVIN设为只读

$ env | grep TEMP_KEVIN          #查看环境变量TEMP_KEVIN是否生效

TEMP_KEVIN=kevin        #证明环境变量TEMP_KEVIN已经存在

$ unset TEMP_KEVIN          #会提示此变量只读不能被删除

-bash: unset: TEMP_KEVIN: cannot unset: readonly variable

$ TEMP_KEVIN ="tom"        #修改变量值为tom会提示此变量只读不能被修改

-bash: TEMP_KEVIN: readonly variable

8.通过修改环境变量定义文件来修改环境变量。

需要注意的是,一般情况下,仅修改普通用户环境变量配置文件,避免修改根用户的环境定义文件,因为那样可能会造成潜在的危险。

$ cd ~                                  #到用户根目录下

$ ls -a                                 #查看所有文件,包含隐藏的文件

$ vi .bash_profile                #修改用户环境变量文件

例如:

编辑你的PATH声明,其格式为:

PATH=$PATH:<PATH 1>:<PATH 2>:<PATH 3>:------:<PATH N>

你可以自己加上指定的路径,中间用冒号隔开。

环境变量更改后,在用户下次登陆时生效。

如果想立刻生效,则可执行下面的语句:$source .bash_profile

需要注意的是,最好不要把当前路径”./”放到PATH里,这样可能会受到意想不到的攻击。

完成后,可以通过$ echo $PATH查看当前的搜索路径。这样定制后,就可以避免频繁的启动位于shell搜索的路径之外的程序了。

5学习总结

1.Linux的变量种类

按变量的生存周期来划分,Linux变量可分为两类:

1.     永久的:需要修改配置文件,变量永久生效。

2.     临时的:使用export命令行声明即可,变量在关闭shell时失效。

2.设置变量的三种方法

1.     /etc/profile文件中添加变量【对所有用户生效(永久的)】

VI在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”。

例如:编辑/etc/profile文件,添加CLASSPATH变量

# vi /etc/profile

export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib

注:修改文件后要想马上生效还要运行# source /etc/profile不然只能在下次重进此用户时生效。

2.     用户目录下的.bash_profile文件中增加变量【对单一用户生效(永久的)】

VI在用户目录下的.bash_profile文件中增加变量,改变量仅会对当前用户有效,并且是“永久的”。

例如:编辑guok用户目录(/home/guok)下的.bash_profile

$ vi /home/guok/.bash.profile

添加如下内容:

export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib

注:修改文件后要想马上生效还要运行$ source /home/guok/.bash_profile不然只能在下次重进此用户时生效。

3.     直接运行export命令定义变量【只对当前shellBASH)有效(临时的)】

shell的命令行下直接使用[export变量名=变量值]定义变量,该变量只在当前的shellBASH)或其子shellBASH)下是有效的,shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。




 

posted @ 2012-05-16 13:47 云云 阅读(14495) | 评论 (0)编辑 收藏

最近项目中使用hadoop  一开始在linux下的root用户上做试验
现在转到hadoop用户下
所以要新建hadoop用户了
直接入主题:


Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。每个用户账号都拥有一个惟一的用户名和各自的口令。用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。

实现用户账号的管理,要完成的工作主要有如下几个方面:
· 用户账号的添加、删除与修改。
· 用户口令的管理。
· 用户组的管理。

一、Linux系统用户账号的管理

用户账号的管理工作主要涉及到用户账号的添加、修改和删除。
添加用户账号就是在系统中创建一个新账号,然后为新账号分配用户号、用户组、主目录和登录Shell等资源。刚添加的账号是被锁定的,无法使用。

1、添加新的用户账号使用 useradd命令,其语法如下:

代码:
useradd 选项 用户名
其中各选项含义如下:

代码:
-c comment 指定一段注释性描述。
-d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
-g 用户组 指定用户所属的用户组。
-G 用户组,用户组 指定用户所属的附加组。
-s Shell文件 指定用户的登录Shell。
-u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。

用户名 指定新账号的登录名。

例1:
代码:
# useradd –d /usr/sam -m sam
此命令创建了一个用户sam,
其中-d和-m选项用来为登录名sam产生一个主目录/usr/sam(/usr为默认的用户主目录所在的父目录)。

例2:
代码:
# useradd -s /bin/sh -g group –G adm,root gem
此命令新建了一个用户gem,该用户的登录Shell是/bin/sh,它属于group用户组,同时又属于adm和root用户组,其中group用户组是其主组。

这里可能新建组:#groupadd group及groupadd adm 
增加用户账号就是在/etc/passwd文件中为新用户增加一条记录,同时更新其他系统文件如/etc/shadow, /etc/group等。
Linux提供了集成的系统管理工具userconf,它可以用来对用户账号进行统一管理。

2、删除帐号

如果一个用户的账号不再使用,可以从系统中删除。删除用户账号就是要将/etc/passwd等系统文件中的该用户记录删除,必要时还删除用户的主目录。删除一个已有的用户账号使用userdel命令,其格式如下:

代码:
userdel 选项 用户名

常用的选项是-r,它的作用是把用户的主目录一起删除。
例如:

代码:
# userdel sam

此命令删除用户sam在系统文件中(主要是/etc/passwd, /etc/shadow, /etc/group等)的记录,同时删除用户的主目录。

3、修改帐号

修改用户账号就是根据实际情况更改用户的有关属性,如用户号、主目录、用户组、登录Shell等。
修改已有用户的信息使用usermod命令,其格式如下:

代码:
usermod 选项 用户名

常用的选项包括-c, -d, -m, -g, -G, -s, -u以及-o等,这些选项的意义与useradd命令中的选项一样,可以为用户指定新的资源值。另外,有些系统可以使用如下选项:

代码:
-l 新用户名

这个选项指定一个新的账号,即将原来的用户名改为新的用户名。
例如:
代码:
# usermod -s /bin/ksh -d /home/z –g developer sam
此命令将用户sam的登录Shell修改为ksh,主目录改为/home/z,用户组改为developer。

4、用户口令的管理

用户管理的一项重要内容是用户口令的管理。用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令。
指定和修改用户口令的Shell命令是passwd。超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。命令的格式为:
代码:

passwd 选项 用户名
可使用的选项:

代码:
-l 锁定口令,即禁用账号。
-u 口令解锁。
-d 使账号无口令。
-f 强迫用户下次登录时修改口令。
如果默认用户名,则修改当前用户的口令。

例如,假设当前用户是sam,则下面的命令修改该用户自己的口令:

代码:
$ passwd
Old password:******
New password:*******
Re-enter new password:*******

如果是超级用户,可以用下列形式指定任何用户的口令:

代码:
# passwd sam
New password:*******
Re-enter new password:*******

普通用户修改自己的口令时,passwd命令会先询问原口令,验证后再要求用户输入两遍新口令,如果两次输入的口令一致,则将这个口令指定给用户;而超级用户为用户指定口令时,就不需要知道原口令。

为了系统安全起见,用户应该选择比较复杂的口令,例如最好使用8位长的口令,口令中包含有大写、小写字母和数字,并且应该与姓名、生日等不相同。

为用户指定空口令时,执行下列形式的命令:

代码:
# passwd -d sam


此命令将用户sam的口令删除,这样用户sam下一次登录时,系统就不再询问口令。

passwd命令还可以用-l(lock)选项锁定某一用户,使其不能登录,例如:

代码:
# passwd -l sam
  新建用户异常:
useradd -d /usr/hadoop -u 586 -m hadoop -g hadoop
 1  Creating mailbox file: 文件已存在  
    删除即可 rm -rf /var/spool/mail/用户名
2 useradd: invalid numeric argument 'hadoop'
   这是由于hadoop组不存在 请先建hadoop组
通过cat /etc/passwd 可以查看用户的pass
cat /etc/shadow 可以查看用户名
cat /etc/group  可以查看 组


linux下创建用户(二)
二、Linux系统用户组的管理

每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。
用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。

1、增加一个新的用户组使用groupadd命令。 其格式如下:

代码:
groupadd 选项 用户组

可以使用的选项有:
代码:
-g GID 指定新用户组的组标识号(GID)。
-o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。

例1:

代码:
# groupadd group1

此命令向系统中增加了一个新组group1,新组的组标识号是在当前已有的最大组标识号的基础上加1。

例2:

代码:
#groupadd -g 101 group2

此命令向系统中增加了一个新组group2,同时指定新组的组标识号是101。

2、如果要删除一个已有的用户组,使用groupdel命令, 其格式如下:

代码:
groupdel 用户组

例如:

代码:
#groupdel group1

此命令从系统中删除组group1。

3、修改用户组的属性使用groupmod命令。 其语法如下:

代码:
groupmod 选项 用户组

常用的选项有:
代码:
-g GID 为用户组指定新的组标识号。
-o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。
-n新用户组 将用户组的名字改为新名字

例1:

代码:
# groupmod -g 102 group2

此命令将组group2的组标识号修改为102。

例2:

代码:
# groupmod –g 10000 -n group3 group2

此命令将组group2的标识号改为10000,组名修改为group3。

4、如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。用户可以在登录后,使用命令newgrp切换到其他用户组,这个命令的参数就是目的用户组。 例如:

代码:
$ newgrp root

这条命令将当前用户切换到root用户组,前提条件是root用户组确实是该用户的主组或附加组。类似于用户账号的管理,用户组的管理也可以通过集成的系统管理工具来完成。


权限分配
分配权限
chown -R hadoop:hadoop /usr/hadoop/

让普通用户拥有root的权限
1.root登录

2.adduser 用户名

3.passwd 用户名

  定密码

4.修改/etc/passwd即可,把用户名的ID和ID组修改成0。



posted @ 2012-05-16 13:39 云云 阅读(127851) | 评论 (0)编辑 收藏

     摘要: ZooKeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization)、命名服务(Naming Service)、集群维护(Group Maintenance)等,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。ZooKeeper本身可以以Standalone模式...  阅读全文

posted @ 2012-05-03 10:28 云云 阅读(79132) | 评论 (11)编辑 收藏

1:有可能没权限 chmod 777
2:  在使用scp时加上-r 参数
scp -r root@192.168.16.5:/usr/tools/xxxx ./xxx

posted @ 2012-04-28 14:34 云云 阅读(5157) | 评论 (0)编辑 收藏

在足球比赛里,一个球员在一场比赛中进三个球,称之为帽子戏法(Hat-trick)。在分布式数据系统中,也有一个帽子原理(CAP Theorem),不过此帽子非彼帽子。CAP原理中,有三个要素:

  • 一致性(Consistency)
  • 可用性(Availability)
  • 分区容忍性(Partition tolerance)

CAP原理指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。因此在进行分布式架构设计时,必须做出取舍。而对于分布式数据系统,分区容忍性是基本要求,否则就失去了价值。因此设计分布式数据系统,就是在一致性和可用性之间取一个平衡。对于大多数web应用,其实并不需要强一致性,因此牺牲一致性而换取高可用性,是目前多数分布式数据库产品的方向。

当然,牺牲一致性,并不是完全不管数据的一致性,否则数据是混乱的,那么系统可用性再高分布式再好也没有了价值。牺牲一致性,只是不再要求关系型数据库中的强一致性,而是只要系统能达到最终一致性即可,考虑到客户体验,这个最终一致的时间窗口,要尽可能的对用户透明,也就是需要保障“用户感知到的一致性”。通常是通过数据的多份异步复制来实现系统的高可用和数据的最终一致性的,“用户感知到的一致性”的时间窗口则取决于数据复制到一致状态的时间。

最终一致性(eventually consistent)

对于一致性,可以分为从客户端和服务端两个不同的视角。从客户端来看,一致性主要指的是多并发访问时更新过的数据如何获取的问题。从服务端来看,则是更新如何复制分布到整个系统,以保证数据最终一致。一致性是因为有并发读写才有的问题,因此在理解一致性的问题时,一定要注意结合考虑并发读写的场景。

从客户端角度,多进程并发访问时,更新过的数据在不同进程如何获取的不同策略,决定了不同的一致性。对于关系型数据库,要求更新过的数据能被后续的访问都能看到,这是强一致性。如果能容忍后续的部分或者全部访问不到,则是弱一致性。如果经过一段时间后要求能访问到更新后的数据,则是最终一致性。

最终一致性根据更新数据后各进程访问到数据的时间和方式的不同,又可以区分为:

  • 因果一致性。如果进程A通知进程B它已更新了一个数据项,那么进程B的后续访问将返回更新后的值,且一次写入将保证取代前一次写入。与进程A无因果关系的进程C的访问遵守一般的最终一致性规则。
  • “读己之所写(read-your-writes)”一致性。当进程A自己更新一个数据项之后,它总是访问到更新过的值,绝不会看到旧值。这是因果一致性模型的一个特例。
  • 会话(Session)一致性。这是上一个模型的实用版本,它把访问存储系统的进程放到会话的上下文中。只要会话还存在,系统就保证“读己之所写”一致性。如果由于某些失败情形令会话终止,就要建立新的会话,而且系统的保证不会延续到新的会话。
  • 单调(Monotonic)读一致性。如果进程已经看到过数据对象的某个值,那么任何后续访问都不会返回在那个值之前的值。
  • 单调写一致性。系统保证来自同一个进程的写操作顺序执行。要是系统不能保证这种程度的一致性,就非常难以编程了。

上述最终一致性的不同方式可以进行组合,例如单调读一致性和读己之所写一致性就可以组合实现。并且从实践的角度来看,这两者的组合,读取自己更新的数据,和一旦读取到最新的版本不会再读取旧版本,对于此架构上的程序开发来说,会少很多额外的烦恼。

从服务端角度,如何尽快将更新后的数据分布到整个系统,降低达到最终一致性的时间窗口,是提高系统的可用度和用户体验非常重要的方面。对于分布式数据系统:

  • N — 数据复制的份数
  • W — 更新数据是需要保证写完成的节点数
  • R — 读取数据的时候需要读取的节点数

如果W+R>N,写的节点和读的节点重叠,则是强一致性。例如对于典型的一主一备同步复制的关系型数据库,N=2,W=2,R=1,则不管读的是主库还是备库的数据,都是一致的。

如果W+R<=N,则是弱一致性。例如对于一主一备异步复制的关系型数据库,N=2,W=1,R=1,则如果读的是备库,就可能无法读取主库已经更新过的数据,所以是弱一致性。

对于分布式系统,为了保证高可用性,一般设置N>=3。不同的N,W,R组合,是在可用性和一致性之间取一个平衡,以适应不同的应用场景。

  • 如果N=W,R=1,任何一个写节点失效,都会导致写失败,因此可用性会降低,但是由于数据分布的N个节点是同步写入的,因此可以保证强一致性。
  • 如果N=R,W=1,只需要一个节点写入成功即可,写性能和可用性都比较高。但是读取其他节点的进程可能不能获取更新后的数据,因此是弱一致性。这种情况下,如果W<(N+1)/2,并且写入的节点不重叠的话,则会存在写冲突  

posted @ 2012-04-27 10:23 云云 阅读(17328) | 评论 (2)编辑 收藏

MongoDB Linux下的安装和启动

2. 解压文件到某目录下,然后重命名:

 

1.[root@localhost src]# tar -xzvf mongodb-linux-i686-1.8.1.tgz.tar   

2.[root@localhost src]# mv mongodb-linux-i686-1.8.1 /usr/local/mongodb/ 

 

 

3. 查看安装后的文件情况:

 

1.[root@localhost src]# cd /usr/local/mongodb/  

2.[root@localhost mongodb]# ls  

3.bin  GNU-AGPL-3.0  README  THIRD-PARTY-NOTICES  

4.[root@localhost mongodb]# cd bin/  

5.[root@localhost bin]# ls  

6.bsondump  dbbak  mongo  mongod  mongodump  mongoexport  mongofiles  mongoimport  mongorestore  mongos  mongosniff  mongostat 

 

 

   bin下的mongod就是MongoDB的服务端进程,mongo就是其客户端,其它的命令用于MongoDB的其它用途如MongoDB文件导出等。

 

4. 启动MongoDB.

 

    要先建立好MongoDB 存放数据文件和日志文件的目录,此处建立在/data下:

 

1.[root@localhost etc]# cd /data/  

2.[root@localhost data]# ls  

3.mongodb_data  mongodb_log 

 

 

   MongoDB安装目录下的bin下使用mongod启动MongoDB

 

1../mongod --dbpath=/data/mongodb_data/ --logpath=/data/mongodb_log/mongodb.log --logappend& 

 

 

  等待启动成功后,可查看是否启动成功了,默认端口号是27017,当然在启动时也可以指定未使用的其它端口。

 

  先通过查看端口号看MongoDB是否启动了。

 

1.[root@localhost data]# netstat -lanp | grep "27017" 

2.tcp        0      0 0.0.0.0:27017               0.0.0.0:*                   LISTEN      1573/mongod           

3.unix  2      [ ACC ]     STREAM     LISTENING     5874   1573/mongod         /tmp/mongodb-27017.sock 

 

 

  可以看到,已启动成功,现在使用mongo客户端访问一下该数据库。

 

1.[root@localhost bin]# cd /usr/local/mongodb/bin/  

2.[root@localhost bin]# ./mongo  

3.MongoDB shell version: 1.8.1 

4.connecting to: test  

5.>  

 

 

  到这一步说明已经安装成功了。

 

5. 额外工作。

 

    注意,上述我们启动MongoDB都是手动使用mongod来启动,这样关闭计算机后,下次再进来它又没启动了,所以还得手动启动,因此,为避免这种繁琐的工作,可以把mongod放到服务自启动项中,这样计算机一开启mongod服务也就启动了。

 

    编辑/etc/rc.local,加入下述代码然后再保存即可。

 

 

1.#add mongonDB service  

2.rm -rf /data/mongodb_data/* && /usr/local/mongodb/bin/mongod --dbpath=/data/mongodb_data/ --logpath=/data/mongodb_log/mongodb.log --logappend& 

 

 

   我们重启计算机再看MongoDB是否启动,重启后可以直接使用 mongo命令登录,最终发现是可以成功的。

 

   另外,我们使用mongo命令登录 MongoDB还要转到mongo命令所在目录再执行./mongo,这样是不是有些麻烦?因此,我们可以简化这点,将该命令文件copy/usr/bin下,这样就可以在任何目录下使用mongo命令了。

 

1.[root@localhost bin]# ls   

2.bsondump  dbbak  mongo  mongod  mongodump  mongoexport  mongofiles  mongoimport  mongorestore  mongos  mongosniff  mongostat  

3.[root@localhost bin]# cp mongo /usr/bin/ 

 

 

     转到任一目录试下mongo命令:

 

1.[root@localhost bin]# cd /  

2.[root@localhost /]# mongo  

3.MongoDB shell version: 1.8.1 

4.connecting to: test  

5.>  

 

 

  可以看到登录成功了,说明我们可以像使用ls命令一样使用mongo命令了。

posted @ 2012-04-26 10:45 云云 阅读(817) | 评论 (0)编辑 收藏

      MongoDB 深入浅出

数据逻辑结构

 

1 mongoDB中的文档(document) 相当于 关系性数据库的一条一条的记录

2 collection 相当于关系性数据库中的表,所以一个collection中有多个document

3 多个集合在逻辑上组成一起 就是database

4 一个mongoDB 关系性数据库一样 可以有多个数据库(database)

 

与关系数据结构比较

MongoDB

关系性数据库

文档(document)

(row)

集合(collection)

(table)

Database

Database

 

 

数据存储结构

MongoDB 默认的数据目录是data/db,它负责存储所有mongodb的数据文件,在mongoDB中每个数据库都包含一个.ns和一些数据文件,而且这些数据文件会随着数据的增多越来越多,则: 如果系统中有一个叫foo的数据库,那么构成foo这个数据库的文件就会有foo.ns ,foo.0,foo1,foo.2等。

 

Mongodb内部有预分配空间的机制,每个预分配的文件都用0填充,由于有了这个机制,

mongoDB始终保存额外的空间和空闲的文件,这对系统数据突然暴增时减缓磁盘压力有很大好处.

 

由于数据量的不断增加,mongoDB每新分配一次,大小都会是上一个文件大小的2倍,最大2G.这种机制保证系统数据较小时 不会浪费太多空间,系统数据较多时 也有相应预留空间。

 

mongoDB命名空间

每张表都有命名空间,每个索引也有对应的命名空间,这些命令空间的元数据都存在.ns文件中

在下图中,foo数据库包含3个文件存储数据与索引,foo.2文件属于预分配文件,foo.0foo.1被分配到了相应的盘区对应不同的名字空间。

 

 

 

 

从上图可以看出,每个命名空间可以包含多个不同的盘区,这些盘区并不是连续的,与数据增长一样,每一个命名空间的盘区大小也随着分配的次数不断增长。在上图有个foo.$freelist命名空间,这个命名空间用于记录不再使用的盘区(如被删除的collection或索引),每当命名空间需要分配新的盘区时,就会检查.$freelist是否有合适大小的空间,这样就可以回收空闲的磁盘空间了。

 

 

 

 

posted @ 2012-04-25 15:56 云云 阅读(4935) | 评论 (0)编辑 收藏

okraformysql    目前已在google code上开源 可以下载使用
okraformysql 基于mina框架 实现mysql协议,在使用mysql jdbc客户端时 使用connector-5.0.8, server端可以使用最新的mysql5.5 . okraformysql 实现的目标就是 解决并发连接数。 可以直线倍增连接数,解决mysql连接性能。同时okraformysql采用长连接,提供连接池,当connection 使用完或空闲时 会返回给连接池 以方便 新的用户使用。 



PacketAuth.java : 在这个类中为对外提供mysql协议的用户名与密码。 jdbc.xml在这配置文件中设置你需要操作的数据库如:url,user,password,driver 以及连接池。 MySqlServerListener.java : 该类是入口,在这里可以指定服务ip与端口; 运行该类启动服务

测试连接:

其实你可以把okraformysql当成一个mysql服务,在业务层使用时需要访问数据库时,就可以直接访问okraformysql,它就成了一个代理帮你去操作数据。
TestJdbc.java:这是一个测试okraformysql的测试类,它指定的ip与端口就是在MySqlServerListener?.java中指定的。
效益:okraformysql带来的直接效益就是倍增数据库连接。


posted @ 2012-04-23 18:15 云云 阅读(1366) | 评论 (0)编辑 收藏

google-gson-2.1-release.zip

-----------------------------------------------------------------

扫盲:

Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率.

 

从结构上看,所有的数据(data)最终都可以分解成三种类型:

第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词。

第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组(array)或列表(List),比如"北京,上海"。

第三种类型是映射(mapping),也就是一个名/值对(Name/value),即数据有一个名称,还有一个与之相对应的值,这又称作散列(hash)或字典(dictionary),比如"首都:北京"。

 

Json的规格非常简单,只用一个页面几百个字就能说清楚,而且Douglas Crockford声称这个规格永远不必升级,因为该规定的都规定了。

1) 并列的数据之间用逗号(",")分隔。

2) 映射用冒号(":")表示。

3) 并列数据的集合(数组)用方括号("[]")表示。

4) 映射的集合(对象)用大括号("{}")表示。

-----------------------------------------------------------------

最快速入门贴:

1. 对象的序列化和反序列化

 

Type listType = new TypeToken<List<String>>() {}.getType();
List<String> target = new LinkedList<String>(); 

target.add("blah");

 Gson gson = new Gson(); 

String json = gson.toJson(target, listType); 

List<String> target2 = gson.fromJson(json, listType);

 OK,最简方案打完收工.
2.使用GsonBuilder.
GsonBuilder用来生成Gson对象. 规定Gson的序列化和返序列化时的格式等内容.
如:

Gson gson = new GsonBuilder()
.registerTypeAdapter(Id.class, new IdTypeAdapter())  

        .enableComplexMapKeySerialization() 

     .serializeNulls()  

         .setDateFormat(DateFormat.LONG)  

        .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//会把字段首字母大写

       .setPrettyPrinting() 

     .setVersion(1.0)  

         .create();

3. 使用注解,定制序列化字段.
默认情况下@Expose注解是不起作用的,除非你用GsonBuilder创建Gson的时候调用了GsonBuilder.excludeFieldsWithoutExposeAnnotation()方法

 

 

来个例子:

 

public class User { 

@Expose private String firstName; 

 @Expose(serialize = false) private String lastName;

 @Expose (serialize = false, deserialize = false) 

private String emailAddress; private String password;

 }

如果你创建Gson对象的时候使用的是new Gson(),toJson()和fromJson()方法将会对全部的字段生效.但是如果你使用的是GsonBuilder并且调用了excludeFieldsWithoutExposeAnnotation()方法.那么:toJson()和fromJson()将不会包括password.因为password没有包含@Expose注解.
序列化的时候将不包括 lastName和emailAddress,因为注解中标明不进行序列化.同样的道理,反序列化时将不包括emailAddress.
注:如果仅仅是想把某些特定的字段包含在外和话,可以使用transient 关键字声明字段.
4. 使用注解对序列化名称进行声明
这个简单,上例子都能懂,不解释:

public class SomeClassWithFields {

@SerializedName("name")
private final String someField;  

  private final String someOtherField;  

public SomeClassWithFields(String a, String b) {  

this.someField = a;
this.someOtherField = b; 

}

===== OUTPUT =====

{"name":"a","someOtherField":"b"}

5. 例用注解,根据版本进行序列化
有的字段不是一开始就有的,会随着版本的升级添加进来,那么在进行序列化和返序列化的时候就会根据版本号来选择是否要序列化.
@Since(版本号)能完美地实现这个功能.
当然,GsonBuilder.setVersion(double)方法需要调用.
例程如下:

public class User {  

private String firstName;  

private String lastName;  

@Since(1.0) private String emailAddress;  

@Since(1.0) private String password;

@Since(1.1) private Address address;

}

还的字段可能,随着版本的升级而删除,那么
@Until(版本号)也能实现这个功能,GsonBuilder.setVersion(double)方法需要调用.

public class User {  

    private String firstName;  

    private String lastName; 

@Until(1.1) private String emailAddress;  

@Until(1.1) private String password;

}


maven pom.xml 设置
  <dependency>
   <groupId>com.google.code.gson</groupId>
   <artifactId>gson</artifactId>
   <version>2.1</version>
  </dependency>








posted @ 2012-04-16 16:16 云云 阅读(8783) | 评论 (1)编辑 收藏

redis作为NoSQL数据库的一种应用,响应速度和命中率上还是比较高效的。项目中需要用集中式可横向扩展的缓存框架,做了一点调研,即便redis、memcached存在效率上的差异(具体比较参考http://timyang.net/data/mcdb-tt-redis/),但其实都能满足目前项目的需求;但是redis还是比较风骚的,支持链表和集合操作,支持正则表达式查找key,目前项目缓存的结果大多是链表,如果链表新增或者修改数据的话,redis就体现出了极大的优势(memcached只能重新加载链表,redis可以对链表新增或者修改)

1:下载redis
下载地址 http://code.google.com/p/redis/downloads/list
推荐下载redis-1.2.6.tar.gz,之前这个版本同事已经有成功安装运行的经验,redis-2.0.4.tar.gz 这个版本我安装后无法操作缓存数据,具体原因后续再说

2:安装redis
下载后解压 tar zxvf redis-1.2.6.tar.gz 到任意目录,例如/usr/local/redis-1.2.6

解压后,进入redis目录
    cd /usr/local/redis-1.2.6  
    make  

拷贝文件
cp redis.conf /etc/ 这个文件时redis启动的配置文件
cp redis-benchmark redis-cli redis-server /usr/bin/ #这个倒是很有用,这样就不用再执行时加上./了,而且可以在任何地方执行

设置内存分配策略(可选,根据服务器的实际情况进行设置)
/proc/sys/vm/overcommit_memory
可选值:0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存

值得注意的一点是,redis在dump数据的时候,会fork出一个子进程,理论上child进程所占用的内存和parent是一样的,比如parent占用的内存为8G,这个时候也要同样分配8G的内存给child,如果内存无法负担,往往会造成redis服务器的down机或者IO负载过高,效率下降。所以这里比较优化的内存分配策略应该设置为 1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)

开启redis端口,修改防火墙配置文件
    vi /etc/sysconfig/iptables  

加入端口配置
    -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 6379 -j ACCEPT  

重新加载规则
    service iptables restart   

3:启动redis服务
    [root@Architect redis-1.2.6]# pwd  
    /usr/local/redis-1.2.6  
    [root@Architect redis-1.2.6]# redis-server /etc/redis.conf  

查看进程,确认redis已经启动

    [root@Architect redis-1.2.6]# ps -ef | grep redis  
    root       401 29222  0 18:06 pts/3    00:00:00 grep redis  
    root     29258     1  0 16:23 ?        00:00:00 redis-server /etc/redis.conf  

如果这里启动redis服务失败,一般情况下是因为redis.conf文件有问题,建议检查或找个可用的配置文件进行覆盖,避免少走弯路,这里建议,修改redis.conf,设置redis进程为后台守护进程

    # By default Redis does not run as a daemon. Use 'yes' if you need it.  
    # Note that Redis will write a pid file in /var/run/redis.pid when daemonized.  
    daemonize yes  

4:测试redis
    [root@Architect redis-1.2.6]# redis-cli  
    redis> set name songbin  
    OK  
    redis> get name   
    "songbin"  

5:关闭redis服务
    redis-cli shutdown  

redis服务关闭后,缓存数据会自动dump到硬盘上,硬盘地址为redis.conf中的配置项dbfilename dump.rdb所设定
强制备份数据到磁盘,使用如下命令

    redis-cli save 或者 redis-cli -p 6380 save(指定端口)

posted @ 2012-04-01 15:05 云云 阅读(1104) | 评论 (0)编辑 收藏

仅列出标题
共12页: First 上一页 2 3 4 5 6 7 8 9 10 下一页 Last