建立MongoDB的Repository
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 -n (Open File),ulimit -u (Max User Processes/Threads)設定要大於20,000,避免低的ulimit影響到MongoDB執行過程中連接失敗和服務丟失。官方建議值為64,000。
2. MongoDB啟動後有兩個資料夾要注意
儲存資料的資料夾
/var/lib/mongo儲存日誌(log)的資料夾
如果要使用非預設的資料夾做資料及日誌的儲存,可透過編輯mongod.conf修改
/var/log/mongodb
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%,前提是一台機器上只有一個mongod的instances,如果一台機器上包含多個mongod的instances,這樣就必須將設定值降低
假設主機上有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~100(0是低,100是調高頻率)
查看系統預設值
cat /proc/sys/vm/swappiness
MongoDB建議值是調成1
vi /etc/sysctl.conf
vm.swappiness = 1sysctl -p
9. 官方建議使用RAID-10,在儲存層方面才能提供最佳效能
RAID-10至少要有四顆硬碟,架構上先做RAID-1(Mirrored),然後再做RAID-0(Striped)
10. 如果遠端文件系統(remote filesystem)符合ISO/IEC 9945-1:1996(POSIX.1),則WiredTiger就能儲存在遠端文件系統上。由於遠端文件系統通常比本地文件系統慢,因此使用遠端文件系統進行儲存可能會降低效能。避免使用NFS。
11. 官方建議可根據應用程式的讀取和寫入模式,將資料庫資料及日誌分別儲存在不同的儲存裝置上,可以提高效能。也可以將WiredTiger儲存引擎的indexes儲存在不同的儲存裝置。
12. I/O調度模式要改為noop模式
查看目前系統支援的I/O調度器
dmesg | grep -i scheduler
但是發現只有mq-deadline、kyber、bfq三種模式,並沒有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. MongoDB在Linux系統上,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 Pages(THP),設定步驟請參考這裡
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 handles(fs.file-max)、限制kernel pid(kernel.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=120sysctl -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