搜尋此網誌

顯示具有 MongoDB 標籤的文章。 顯示所有文章
顯示具有 MongoDB 標籤的文章。 顯示所有文章

2017年3月10日 星期五

Mongodb 建立有 security 機制的同步備份設定

第1步最重要, DNS 沒有設定合理, 同步備份就無法開始。Primary主機就找不到 Member

1. 每台電腦都必須 setup hostname and dns record
vi /etc/hosts
add IP and domain name

2. 每台電腦都必須
echo "syncme" > /etc/mongod.key
chown mongod:mongod /etc/mongod.key

3. 每台電腦都必須
vi /etc/mongod.conf

security:
  authorization: enabled
  keyFile: /etc/mongod.key

replication:
  oplogSizeMB: 10240
  replSetName: rs1

systemctl restart mongod


4. 回到 Primary 主機上
mongo --authenticationDatabase=admin -u root -p password --host 127.0.0.1

初使化 replSet
rs.initiate()

確認
rs.status()
會看到PRIMARY字眼,表示初始化完成

加入第2台DB
rs.add("192.168.1.2:27017")
加入第3台DB
rs.add("192.168.1.3:27017")
依此類推


- The End -

2017年3月3日 星期五

以 mongod --repair 修復DB資料

先停止 mongod 的服務,

語法: mongod --dbpath DB資料匣 --repair --repairpath 修復後的DB資料匣

範例: mongod --dbpath /data/db --repair --repairpath /data/db0


修復期間,會在 DB資料匣 建立一個 mongod.lock 以防止 MONGO 服務啟動
修復完畢,會自動被刪除掉。
要注意的是,修復好的DB 必須要注意其擁有者權限是否被更動為 root 了
不然 MONGO 服務就會啟動失敗,一旦啟動失敗 立刻查看 LOG 最後的紀錄原因。


參考資料

- THE END -


2017年1月5日 星期四

MongoDB 3.x 啟用連線認證

先參考
https://scalegrid.io/blog/configuring-mongodb-cr-authentication-as-default-on-mongodb-3-x/

以及這篇 另外 Bugj問題這篇(MongoDB - admin user not authorized)


先新增管理員

切換到admin資料庫
use admin

新增使用者
db.createUser(
   {
     user: "superuser",
     pwd: "xxxxxxxxxx",
     roles: [ { role: "root", db: "admin" } ]
   }
)

新增唯獨權限的使用者 將來管理方便
use admin
db.createUser(
   {
     user: "reader",
     pwd: "reader1234567",
     roles: [ { role: "readAnyDatabase", db: "admin" } ]
   }
)

啟用 MongoDB 的帳密連線
vi /etc/mongod.conf

security:
  authorization: enabled

然後重啟
systemctl restart mongod 


還沒結束!!!
因為Mongodb 啟用連線認證之後,所以備份的資料結構都改變了,
如果另一台MongoDB不調整認證方式,會導致資料恢復失敗,所以:

連線進去
mongo --authenticationDatabase=admin -u superuser -p xxxxxxxxxx 

執行以下指令:
db.adminCommand({authSchemaUpgrade: 1});

確認出現 OK 的提示之後,日後進行 Data Restore 才不會出現以下
the users and roles collections in the dump have an incompatible auth version with target server: cannot restore users of auth version 5 to a server of auth version 3

官方文件參考

- The End -

2016年12月13日 星期二

BananaPI M2Ultra 香蕉派跑 MongoDB

四年前好奇香蕉派與樹莓派有什麼差異,就買了一張來玩玩看。當時單核心CPU的樹莓已經很轟動了,就試試看標榜雙核CPU的香蕉吧。結果一次就喜歡上了,雖然經過幾年下來,也是有買 RASPBERRY PI 3 MODEL B 來用。

可是最近要測試 MongoDB , 就發現 RAM 不太夠用了。最近看到香蕉派M2Ultra這款有2GB的RAM,且還內建8GB 的 eMMC flash,就上掏寶下單了。後來測試MongoDB的心得,效能還真的很不錯。打算再買M64繼續試試看。

拆開前樣子


從紙盒拆開的樣子


拿出壓克力

拿出香蕉派 M2U

組合好的樣子

為了接上 SSD HD, 還跑了一趟光華去買了這個 DC 接頭。


最後,
MongoDB 運行時候資料讀寫過程中,CPU 的4個核心都同時運作,實在很滿意。希望開機 IMAGE 更新可以再更快一些。

一樣很好奇播放 MP4 影片的效能,當我接上了4年前買的 INTEL SSD 之後,看到以前第一代香蕉幫我傳回來的影片,立刻播放看看,果然很順暢。

另外,因為板子上內建了8GB 的 eMMC flash,所以可以透過 dd 指令,將 image 拷入當做硬碟開機的概念。整個過程大約要17分鐘,我是將 image 先放進USB裡, 然後再從 USB 拷進 eMMC flash 的。現在不用插記憶卡也能開機,簡直跟一般電腦沒什麼兩樣了。

例如:
先用 sudo fdisk -l 找到 emmc 的裝置名稱,通常是 /dev/mmcblk1
接下來將 image 燒錄至 emmc 裡面:

sudo dd if=ubuntu-mate-15.10-desktop-armhf-raspberry-pi-2-bpi-m3-sd-emmc-20151203.img of=/dev/mmcblk1 bs=10MB
(參考這裡 http://droidspa.blogspot.tw/search/label/Banana%20PI

至於一開始的記憶卡,我推薦購買 U3 規格的 16GB 卡片來用,價格帶已經讓一般人容易入手了,image 的寫入速度快了一倍以上,開機速度也加快許多。


2016年12月9日 星期五

BananaPI UBUNTU 16.04 安裝 MongoDB

先註記一下, MongoDB 最好是跑在 32bits 上
但是我還沒購買 64bits 的Banana PI,所以就先強制安裝 32bits 吧。
因此命令模式執行 mongo client 就會看到溫馨提示32bits有記憶體的限制等等。

開始:
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

注意
Ubuntu 16.04 版本的方式
echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

Ubuntu 14.04 版本的方式
echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

然後務必
apt-get update

接下來,安裝
apt-get install -y mongodb mongodb-clients mongodb-server

完成之後,確認服務狀態
service mongodb status

設定開機服務自動啟動
systemctl enable mongodb
systemctl status mongodb

- The End -

2016年11月15日 星期二

創建 mongodb 的 pid

在 centos 底下,創建 mongodb 的 pid
不然每次要找 mongo 都很不好找到。

ln -s /var/lib/mongo/mongod.lock /var/run/mongodb.pid


- END -

2016年8月30日 星期二

查出 MongoDB 各個 DB 或 collection 的 size

查出 MongoDB 各個 DB 的 size
在 shell 底下,執行以下
db.adminCommand( { listDatabases: 1 } )


查出 MongoDB 各個 collection 的 size
在 shell 底下,執行以下

var collectionNames = db.getCollectionNames(), stats = [];
collectionNames.forEach(function (n) { stats.push(db[n].stats()); });
stats = stats.sort(function(a, b) { return b['size'] - a['size']; });
for (var c in stats) { print(stats[c]['ns'] + ": " + stats[c]['size'] + " (" + stats[c]['storageSize'] + ")"); }

Example output (first metric is size, second is storageSize)

2016年8月6日 星期六

mongodb backup and restore


全部DataBase
(有規劃 replication) 在 linux 底下範例:
mongodump --host 127.0.0.1 --port 27017 --oplog --out /var2/db_backup/

(無規劃 replication) 在 linux 底下範例:
mongodump --host 127.0.0.1 --port 27017 --out /var2/db_backup/


在 linux 底下範例:
(有規劃 replication) 在 linux 底下範例:
mongorestore  --oplogReplay -h 127.0.0.1 /var2/db_backup

(無規劃 replication) 在 linux 底下範例:
mongorestore --drop -h 127.0.0.1 /tmp/db_backup




特定 Database
mongodb 在 linux 底下 backup 範例:
mongodump  -h 127.0.0.1 -d Octavius -o ./Octavius-backup


mongodb 在 linux 底下 restore 範例:
mongorestore --drop -h 127.0.0.1 -d Octavius  /tmp/db/Octavius



Windows版的 MongoDB
mongodb 在 dos 底下 backup 範例:
mongodump --drop /h 127.0.0.1 /d Octavius --out E:\TEMP\db\Octavius


mongodb 在 dos 底下 restore 範例:
mongorestore --drop /h 127.0.0.1:27017 /d Octavius --out E:\TEMP\db\Octavius



有設定帳密審核的 linux 底下
先去官網下載整套mongo,不要使用 yum 下載的版本,因為帳密永遠核不通過
假設帳密已經存在 admin 這個database裡面

mongodump --host 127.0.0.1 --port 27017 --authenticationDatabase=admin -u username -p userpassword --oplog --out /var2/db_backup/

mongorestore --drop -h 127.0.0.1 --port 27017 --authenticationDatabase=admin -u username -p userpassword  /var2/db_backup/



2016年8月1日 星期一

MongoDB Log Rotation

參考 https://docs.mongodb.com/manual/tutorial/rotate-log-files/

由於 LOG SIZE 愈來愈大,導致讀取LOG緩慢
透過 Log Rotation,可以立刻以新的檔案名稱繼續寫LOG
舊的Log 檔名自動會被備標註 日期期間

登入 mongo  之後

use admin
db.runCommand( { logRotate : 1 } )

即可



2016年7月30日 星期六

改變 MongoDB 的 ReplicaSet heartbeat timeout


由於兩岸網路不穩定,影響 MongoDB  的 replica set 效能

heartbeatIntervalMillis 預設是 2000 微秒,我將它放大3倍
heartbeat timeout 預設是 10 秒,我將它放大3倍


先用 rs.conf(); 看一下內容,在最尾巴的 settings 裡面會呈現出來

config = rs.conf()
config.settings.heartbeatIntervalMillis=6000
config.settings.heartbeatTimeoutSecs=30
rs.reconfig(config, {force : true})




2016年7月18日 星期一

MongoDB 強制設定為 PRIMARY

MongoDB 的 Replica sets 很厲害。但是要控制它還要花點功夫。大家都會用到當發生狀況,從 Primary 轉變為 Secondary 之後,怎麼再轉回 Primary 問題。

priority 值愈大,就是 primary
輸入 rs.config() 可以看到參數狀態

例如要對第2台主機改變成為 primary 的話,可以採用以下

config = rs.conf()
config.members[3].priority = 0.5
rs.reconfig(config, {force : true})


還有一種情況,當 primary 主機停機超過 10秒
也會降格成為 secondary


官網提到以下兩個指令,可以令SERVER不關機情況下,改以手動控制SERVER

凍結 Replica sets 幾秒 :

rs.freeze(120)

暫停掉 Replica sets 幾秒 :
rs.stepDown(120)


2016年5月26日 星期四

Linux MongoDB Replication

寫在前面,避免踩到地雷。因為架設了環境,省略了DNS SERVER存在,所以就在各DB主機上,直接修改  hosts 圖方便,讓各DB主機可以相互用 hostname 找到對方,而不是用 IP 位置來找彼此。但是要注意:

不可以在扮演仲裁角色(arbiters)的主機上,hosts寫成這樣
127.0.0.1    mongodb4 mongodb4.hgdata.com.tw
正確應該是
192.168.1.xx    mongodb4 mongodb4.hgdata.com.tw

否則仲裁角色主機會一直呈現 OTHER> 的提示,
從  telnet localhost 27017 失敗時候發現的
telnet localhost 27017 會失敗,但是
telnet 127.0.0.1 27017 卻成功。

=======================================
製作KEY ( 如不製作KEY 本節可以先忽略)
openssl rand -base64 741 > /var/lib/mongo/mongo-keyfile
chmod 600 mongo-keyfile
chown mongod.mongod /var/lib/mongo/mongo-keyfile
改 600 屬性,一定要作,不然無法啟動 MongoDB
把這 Key 放到每一台機器的 /var/lib/mongo/mongo-keyfile 檔案中。
接下來就要啟用 Replica Set 與認證模式。

vi /etc/mongod.conf

改以下

security:
  keyFile: /var/lib/mongo/mongo-keyfile

重啟 MongoDB 服務
systemctl restart mongod

=======================================
架構上,分別有4台  MongoDB Server
192.168.1.51 Mondb1
192.168.1.52 Mondb2
192.168.1.53 Mondb3
192.168.1.54 Mondb4  規劃轉成仲裁角色,用來分配其他三台成員的角色

開始:
vi /etc/mongod.conf

改以下
replication:
    oplogSizeMB: 10240
    replSetName: "rs1"

重啟 MongoDB 服務
systemctl restart mongod

=======================================
從 192.168.1.21 輸入 mongo 進去 concole
確認
rs.status()

初使化 replSet
rs.initiate()

再確認
rs.status()
會看到PRIMARY字眼,表示初始化完成

加入第二台DB
rs.add("192.168.1.22:27017")
rs.add("192.168.1.23:27017")
加入仲裁主機
rs.addArb("192.168.1.24:27017")

從 192.168.1.21 再確認
rs.status()

看到 192.168.1.22 是
"health" : 1,
"state" : 0,
"stateStr" : "STARTUP"

state的意義
0 Phase 1, starting up
1 Primary member
2 Secondary member

然後發現 192.168.1.21 變成了 rs1:SECONDARY> 提示
意思各主機之間選舉完成,該主機已經轉型成 SECONDARY 角色

*** 到 192.168.1.22 主機上
初使化 replSet
rs.initiate()

確認
rs.status()
然後發現 192.168.1.22 變成了 rs1:PRIMARY> 提示


*** 到 192.168.1.23 主機上
初使化 replSet
rs.initiate()
注意:如果 /etc/mongod.conf 裡面的設定是 bindIp: 127.0.0.1 就會失敗


確認
rs.status()
然後發現 192.168.1.23 變成了 rs1:PRIMARY> 提示

確認本機DB 角色是否為 Master, 指令: 
rs.isMaster()

-----------------------------------------------
END
-----------------------------------------------

查看複制集狀態
rs.status()
rs.isMaster();
以rs.help() 顯示更多 rs指令


以db.help() 顯示更多 db指令

db.oplog.rs.find();

db.printReplicationInfo();

db.printSlaveReplicationInfo();

db.system.replset.find();

db.getMongo().setSlaveOk();

增加節點

rs.add("localhost:28013")
rs.status();

減少節點
rs.remove("localhost:28014")


2016年5月25日 星期三

Centos7 安裝 MongoDB

由於 selinux 會影響 mongodb 的啟動,所以
vi /etc/selinux/config
SELINUX=disabled

然後重啟 OS

1. 加入 MongoDB Repository
vi /etc/yum.repos.d/mongodb.repo

參考 https://www.mongodb.com/download-center?jmp=nav#community

OS 是 64-Bit 的話

[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc


2. 安裝 3.4.x:

yum install -y mongodb-org

(會自動安裝五個套件:
mongodb-org-3.4.x
mongodb-org-server
mongodb-org-shell
mongodb-org-tools
mongodb-org-mongos
)


3. 修改
vi /etc/mongod.conf
先將預設的 bind IP 127.0.0.1 修改為 0.0.0.0

vi /etc/security/limits.d/20-nproc.conf
尾巴加一行後存檔
mongod     soft    nproc     500000



4. 防火牆設定
systemctl stop firewalld
systemctl disable firewalld
或者是
firewall-cmd --permanent --zone=public --add-port=27017/tcp
firewall-cmd --reload
systemctl restart mongod


5. 啟動與查服務的狀態
systemctl enable mongod
systemctl start mongod
ps auxw | grep mongod
systemctl status mongod


如果無法執行,可以考慮兩個方向:
1. SELINUX=disabled
vi /etc/selinux/config
SELINUX=disabled

2. 如果 SELinux 是enforcing 模式,則
yum -y install policycoreutils-python
semanage port -a -t mongod_port_t -p tcp 27017

查 LOG
/var/log/mongodb/mongod.log


6. 最後參照官網教學 Disable Transparent Huge Pages   ( Link )
vi /etc/init.d/disable-transparent-hugepages

填入以下腳本檔內容
#!/bin/bash
### BEGIN INIT INFO
# Provides:          disable-transparent-hugepages
# Required-Start:    $local_fs
# Required-Stop:
# X-Start-Before:    mongod mongodb-mms-automation-agent
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Disable Linux transparent huge pages
# Description:       Disable Linux transparent huge pages, to improve
#                    database performance.
### END INIT INFO

case $1 in
  start)
    if [ -d /sys/kernel/mm/transparent_hugepage ]; then
      thp_path=/sys/kernel/mm/transparent_hugepage
    elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then
      thp_path=/sys/kernel/mm/redhat_transparent_hugepage
    else
      return 0
    fi

    echo 'never' > ${thp_path}/enabled
    echo 'never' > ${thp_path}/defrag

    re='^[0-1]+$'
    if [[ $(cat ${thp_path}/khugepaged/defrag) =~ $re ]]
    then
      # RHEL 7
      echo 0  > ${thp_path}/khugepaged/defrag
    else
      # RHEL 6
      echo 'no' > ${thp_path}/khugepaged/defrag
    fi

    unset re
    unset thp_path
    ;;
esac
設定可執行權限
chmod 755 /etc/init.d/disable-transparent-hugepages

根據 OS 的不同,參考以下指令:
DistributionCommand
Ubuntu and Debian
sudo update-rc.d disable-transparent-hugepages defaults
SUSE
sudo insserv /etc/init.d/disable-transparent-hugepages
Red Hat, CentOS, Amazon Linux, and derivatives
sudo chkconfig --add disable-transparent-hugepages
將作業系統重新開機,登入之後 啟動 mongo 確認是否還有警告提示


2015年4月27日 星期一

Install MongoDB on Red Hat Enterprise, CentOS, or Fedora

Source:http://docs.mongodb.org/v2.2/tutorial/install-mongodb-on-red-hat-centos-or-fedora-linux/

vi /etc/yum.repos.d/mongodb.repo
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1

yum -y install mongo-10gen mongo-10gen-server

chkconfig mongod on

service mongod start
#systemctl start mongod.service

搜尋此網誌