posts - 110, comments - 101, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          日歷

          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          搜索

          •  

          最新評論

          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 云云 閱讀(14508) | 評論 (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 云云 閱讀(127893) | 評論 (0)編輯 收藏

               摘要: ZooKeeper是一個分布式開源框架,提供了協調分布式應用的基本服務,它向外部應用暴露一組通用服務——分布式同步(Distributed Synchronization)、命名服務(Naming Service)、集群維護(Group Maintenance)等,簡化分布式應用協調及其管理的難度,提供高性能的分布式服務。ZooKeeper本身可以以Standalone模式...  閱讀全文

          posted @ 2012-05-03 10:28 云云 閱讀(79156) | 評論 (11)編輯 收藏

          1:有可能沒權限 chmod 777
          2:  在使用scp時加上-r 參數
          scp -r root@192.168.16.5:/usr/tools/xxxx ./xxx

          posted @ 2012-04-28 14:34 云云 閱讀(5164) | 評論 (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 云云 閱讀(17356) | 評論 (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 云云 閱讀(824) | 評論 (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 云云 閱讀(4968) | 評論 (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 云云 閱讀(1387) | 評論 (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 云云 閱讀(8792) | 評論 (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 云云 閱讀(1110) | 評論 (0)編輯 收藏

          僅列出標題
          共12頁: First 上一頁 2 3 4 5 6 7 8 9 10 下一頁 Last 
          主站蜘蛛池模板: 临泽县| 福海县| 桓台县| 丰都县| 隆安县| 石家庄市| 桐庐县| 富民县| 永宁县| 行唐县| 修水县| 滨州市| 彰武县| 明水县| 五峰| 康马县| 辉县市| 西藏| 湘阴县| 五常市| 广元市| 英德市| 托克托县| 大渡口区| 碌曲县| 故城县| 仙居县| 海口市| 娱乐| 盐城市| 禹州市| 万宁市| 廊坊市| 河曲县| 镇远县| 湘潭县| 星子县| 勃利县| 建阳市| 交口县| 库车县|