搜尋此網誌

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

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年6月22日 星期三

Mongodb for Windows 參數設定格式跟 Linux 不太一樣

在 Linux 底下,config 檔內容必須使用單引號
在 Windows 底下,config 檔內容不能出現單引號,絕不能按下 TAB 鍵來編輯。

# mongo.conf
net:
 bindIp: 0.0.0.0
 port: 27017

systemLog:
 destination: file
 path: E:\MongoDB\data\log\mongod.log
 logAppend: true

storage:
 dbPath: E:\MongoDB\data\db\

replication:
 oplogSizeMB: 10240
 replSetName: rs1

==================================================
啟動方式:
mongod.exe -f E:\MongoDB\Server\3.2\bin\mongod.cfg

以 sc.exe 建立自動背景服務
sc.exe create MongoDB binPath= "\"E:\MongoDB\Server\3.2\bin\mongod.exe\" --service --config=\"E:\MongoDB\Server\3.2\bin\mongod.cfg\"" DisplayName= "MongoDB 3.2 Standard" start= "auto"

啟動成功,沒有任何 YAML 錯誤提示之後,透過 mongo.exe 下以下指令檢查
use admin
db.runCommand("getCmdLineOpts")

希望看到以下訊息
"replication" : {
                 "oplogSizeMB" : 10240,
                 "replSetName" : "rs1"
}

之後,就可以安排後續同步機制。
同步過程不是立刻,成為SECONDARY 大約至少等10秒以上比較保險。

參考原文:
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/#configure-a-windows-service-for-mongodb-community-edition


2016年5月30日 星期一

Linux MongoDB 徹底清除 replSet 狀態步驟

先關閉 replication 然後重啟 MongoDB 處於不具備replSet的執行狀態
接下來 輸入 mongo 以進入 MongoDB Console
進入後執行以下指令
use local;
db.dropDatabase();

下db.stats()確認結果看看
如果無誤離開 MongoDB Console

修改 replication 然後重啟 MongoDB 處於具備replSet的執行狀態
進入 MongoDB Console 檢查確認狀態。

Linux 查看程式佔用哪個port

例如:
查看 MongoDB 的 27017 被誰佔用著
lsof -i -P | grep -i "listen" | grep 27017

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

2014年12月27日 星期六

如何清除交易記錄

參考原文:http://vito-sql.blogspot.tw/2013/07/blog-post_9.html

SQL 資料庫系統的 Log記錄檔,會隨著系統的使用,不停的成長。

在 SQL 2005 前(含),使用 Backup log 來清除(Truncate)交易記錄。

--(1)truncate log in log file
BACKUP LOG [DBName] WITH TRUNCATE_ONLY
 
--(2)compress log file
DBCC SHRINKFILE([DBName_log],2


BACKUP LOG 指令原本是用來備份 log 用的,因為加上了 WITH TRUNCATE_ONLY 選項,
所以不會真正備份記錄檔,只會移除非使用的交易記錄。

DBCC SHRINKFILE 是把實體的Log檔案縮小,可是只要資料繼續異動,Log檔就又會繼續長大。
比較正確的作法,是執行 LOG 備份時,加上 WITH NO_LOG 選項以便同時清除Log內容。
這樣子,在清除Log後,雖然Log檔案大小不變,但內容是空的,可提供資料異動時的Log使用。
1
2
3
BACKUP LOG TestDB_Log WITH NO_LOG;

在 SQL 2008 環境下,上述用法已被停用,須改用「復原模式」為「簡單」來清空交易記錄。

--1) 將資料庫 Northwind 切換為「簡單復原模式」,便會自動截斷交易記錄。
ALTER DATABASE TestDB SET RECOVERY SIMPLE  
 
--2) 壓縮交易記錄檔
DBCC SHRINKFILE(TestDB_Log, 2)
 
--3) 若要使用備份交易記錄檔(*.ldf),再將資料庫 Northwind 切換回「完整復原模式」
ALTER DATABASE TestDB SET RECOVERY FULL  


搜尋此網誌