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

2019年5月29日 星期三

在 CentOS 7 上安裝 MongoDB 4.x


建立MongoDBRepository

vi /etc/yum.repos.d/mongodb-org-4.0.repo

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

安裝MongoDB套件

sudo yum install -y mongodb-org


在啟動之前,還是有些設定需要調整及一些注意事項

1. ulimit,參考這裡

ulimit -nOpen File),ulimit -u Max User Processes/Threads)設定要大於20,000,避免低的ulimit影響到MongoDB執行過程中連接失敗和服務丟失。官方建議值為64,000

2. MongoDB啟動後有兩個資料夾要注意

儲存資料的資料夾
/var/lib/mongo

儲存日誌(log)的資料夾
/var/log/mongodb

如果要使用非預設的資料夾做資料及日誌的儲存,可透過編輯mongod.conf修改
vi /etc/mongod.conf
storage.dbPath 可編輯儲存資料的資料夾位置
systemLog.path 可編輯儲存日誌的資料夾位置

記得變更資料夾的擁有者及群組,假設資料夾擁有者及群組為mongod
chown -R mongod:mongod /var/lib/mongo
chown -R mongod:mongod /var/log/mongodb

3. 雖然官網沒說要關閉SELinux,但是蠻多Hadoop Eco System都建議關閉Selinux,所以這裡還是關閉Selinux,避免有其他未知的情況發生

vi /etc/selinux/config
SELINUX=disabled

重新開機後驗證設定狀態

shutdown -r now

sestatus

4. 設定WiredTiger儲存引擎的內部緩衝大小(Internal Cache Size

計算方式為記憶體減去1GB後的50%,前提是一台機器上只有一個mongodinstances,如果一台機器上包含多個mongodinstances,這樣就必須將設定值降低

假設主機上有32GB的記憶體,WiredTiger的緩衝大小是

0.5 * (32GB - 1GB) = 15.5GB

設定方式為

vi /etc/mongod.conf
storage:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 15.5

5. 官方建議使用SSD或是增加記憶體,可以提高I/O的存取

6. 停用NUMA

sysctl -w vm.zone_reclaim_mode=0

BIOS中停用NUMA

Advanced --> ACPI Configuration (or Advanced ACPI Configuration) --> NUMA Support

7. 官方建議使用numactl指令啟動mongod instances、config servers及mongos instances

因為CentOS 7 mini版本預設並未安裝numactl,所以需要另外安裝

yum install -y numactl

透過numactl啟動mogod

numactl --interleve=all <path> <options>

numactl --interleve=all mongod -f /etc/mongod.conf

透過下列指令查詢狀態

numastat -p $(pidof mongod)

numactl啟動mongod指令變成服務

vi /usr/lib/systemd/system/mongod.service
ExecStart=/usr/bin/numactl --interleave=all /usr/bin/mongod -f /etc/mongod.conf

8. 設定SWAP,避免記憶體爭奪問題,並且防止Linux上的OOM Killer殺死mongod

swappiness是調整系統進行SWAP的頻率,建議值是0~1000是低,100是調高頻率)

查看系統預設值

cat /proc/sys/vm/swappiness

MongoDB建議值是調成1

vi /etc/sysctl.conf
vm.swappiness = 1

sysctl -p

9. 官方建議使用RAID-10,在儲存層方面才能提供最佳效能

RAID-10至少要有四顆硬碟,架構上先做RAID-1Mirrored),然後再做RAID-0Striped

10. 如果遠端文件系統(remote filesystem)符合ISO/IEC 9945-1:1996POSIX.1),則WiredTiger就能儲存在遠端文件系統上。由於遠端文件系統通常比本地文件系統慢,因此使用遠端文件系統進行儲存可能會降低效能。避免使用NFS

11. 官方建議可根據應用程式的讀取和寫入模式,將資料庫資料及日誌分別儲存在不同的儲存裝置上,可以提高效能。也可以將WiredTiger儲存引擎的indexes儲存在不同的儲存裝置。

12. I/O調度模式要改為noop模式

查看目前系統支援的I/O調度器

dmesg | grep -i scheduler

但是發現只有mq-deadlinekyberbfq三種模式,並沒有noop模式,猜測應該是Kernel 5.1.2已經不支援的關係,所以這裡就不再調整,使用預設值mq-deadline模式。如果要一定使用noop模式,一開始就不要將Kernel升級至5

查看目前系統是用的I/O調度模式

cat /sys/block/sda/queue/scheduler

預設是mq-deadline,如果要調整成bfq模式,可使用下列指令

grubby --grub --update-kernel=ALL --args="elevator=bfq"

13. 使用NTP同步時間,,安裝設定說明請參考這裡

14. MongoDB至少需要glibc-2.12-1.2el6版本,才能避免早期版本的已知錯誤,為獲得最佳效能,至少使用2.13

查詢glibc版本

ldd --version

15. MongoDBLinux系統上,Kernel至少需要2.6.36的版本以上(Kernel更新方式請參考這裡)。文件系統應該要使用XFS

查看filesystem類型的指令

lsblk -f

16. 針對dbPath關閉noatime

vi /etc/fstab

/dev/mapper/centos-root   /         xfs     defaults,noatime    0 0

17. 停用Transparent Huge PagesTHP),設定步驟請參考這裡

18. 將readahead設定為0可以提供MongoDB最佳效能

對於WiredTiger儲存引擎,不論儲存的類型(例SSD或硬碟)都應該將readahead設定為0

查看現有系統的readahead

blockdev --report

針對儲存Mongodb的硬碟做暫時性更改readahead

blockdev --setra 0 /dev/sda

永久性更改(依照網路上的教學,重新開機後還是會恢復成原狀,在此先記錄,再找有沒有其他變更方式)

vi /etc/rc.local

blockdev --setra 0 /dev/sda

19. 設定足夠的file handlesfs.file-max)、限制kernel pidkernel.pid_max)、每個process的最大線程(kernel.threads-max)、每個process最大的映射區(vm.max_map_count)、TCP keepalive。以下為MongoDB官方建議值

vi /etc/sysctl.conf

fs.file-max=98000
kernel.pid_max=64000
kernel.threads-max=64000
vm.max_map_count=128000
net.ipv4.tcp_keepalive_time=120

sysctl -p

啟動MongoDB

systemctl start mongod

systemctl enable mongod

systemctl status mongod

開始使用MongoDB

執行mongo就能登入mogodb shell


當不想使用MongoDB時,可透過下列指令移除

關閉MongoDB

systemctl stop mongod

systemctl disable mongod

移除套件

yum erase $(rpm -qa | grep mongodb-org)

移除資料庫及日誌檔案

rm -r /var/log/mongodb

rm -r /var/lib/mongo







在 CentOS 7 上設定 ulimit 資源限制


在MongoDB上或是在安裝其他系統時,通常需要透過ulimit限制一些資源,尤其是針對openfile。

ulimit指令對照

ulimit -t    LimitCPU           (CPU Time)
ulimit -f    LimitFSIZE         (File Size)
ulimit -d    LimitDATA          (Data Seg Size)
ulimit -s    LimitSTACK         (Stack Size)
ulimit -c    LimitCORE          (Core File Size)
ulimit -m    LimitRSS           (Max Memory Size)
ulimit -n    LimitNOFILE        (Open File)
ulimit -v    LimitAS            (Virtual Memory Size)
ulimit -u    LimitNPROC         (Max User Processes/Threads)
ulimit -l    LimitMEMLOCK       (Max Locked-in-Memory Size)
ulimit -x    LimitLOCKS         (File Locks)
ulimit -i    LimitSIGPENDING    (Pending Singnals)
ulimit -q    LimitMSGQUEUE      (POSIX Message Queues)
ulimit -e    LimitNICE          (Scheduling Priority)
ulimit -r    LimitRTPRIO        (Real-Time Priority)
ulimit -p                       (Pipe Size)
ulimit -a    列出所有的限制條件

因為本篇主要是提供給MongoDB使用的,所以列出MongoDB的各項建議值

ulimit -f (File Size)                 :unlimited
ulimit -t (CPU Time)                  :unlimited
ulimit -v (Virtual Memory Size)       :unlimited
ulimit -l (Max Locked-in-Memory Size) :unlimited
ulimit -n (Open File)                 :64000
ulimit -m (Max Memory Size)           :unlimited
ulimit -u (Max User Processes/Threads):64000


找出MongoDB服務的資源限制

啟動mongod服務

systemctl start mongod

找出MongoDBMain PID

systemctl status mongod

找出Main PID: xxxx (mongod)

查看修改前及修改後;修改後開機前及修改後開機後,設定是否有變更

cat /proc/xxxx/limits


設定MongoDB的資源限制

vi /usr/lib/systemd/system/mongod.service
[Service]
LimitFSIZE = infinity
LimitCPU = infinity
LimitAS = infinity
LimitMEMLOCK = infinity
LimitNOFILE = 64000
LimitNPROC = 64000
LimitRSS = infinity

systemctl daemon-reload

systemctl restart mongod.service






2019年4月11日 星期四

在 CentOS 7 上禁用 Transparent Huge Pages(THP)


因為資料庫的工作負載通常在THP上表現不佳,所以應該禁用THP,確保MongoDB能獲得最佳的效能。

建立init.d script
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

script可執行
sudo chmod 755 /etc/init.d/disable-transparent-hugepages

 設置成作業系統啟動時能自動執行
sudo chkconfig --add disable-transparent-hugepages

使用tunedktune
建立新的profile
sudo mkdir /etc/tuned/no-thp
編輯tuned.conf
vi /etc/tuned/no-thp/tuned.conf
  [main]
  include=virtual-guest

  [vm]
  transparent_hugepages=never
啟動新的profile
sudo tuned-adm profile no-thp
測試變更後結果
重新開機後執行下列指令
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag
執行後的結果應該顯示為
always madvise [never]