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







沒有留言:

張貼留言