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 上使用 tar 方式安裝 Elasticsearch 7.x


Elasticsearch 7支援Oracle JAVA / OpenJDK 1.8.0u111+Oracle JAVA / OpenJDK 11以及Oracle JAVA / OpenJDK 12,但是因為使用Oracle JAVA有踩紅線侵權的機會,所以還是使用OpenJDK

JAVA 91012是屬於Short term release,所以這裡決定用OpenJDK 11Elasticsearch的支援。

OpenJDK 11 安裝步驟請參考這裡


Elasticsearchtar安裝包裡頭已經包含OpenJDK 12.0.1,建議改用OpenJDK 11,原因已在上面敘述,如果要用OpenJDK 12,只要設定環境變數就行了。

設定JAVA環境變數

cat <<EOF | sudo tee /etc/profile.d/jdk12.sh

    export JAVA_HOME=/opt/elasticsearch-7.0.1/jdk
    export PATH=\$PATH:\$JAVA_HOME/bin

EOF

測試環境變數是否生效

echo $JAVA_HOME

查看JAVA版本

java -version


開始安裝前要先建立Linux的使用者帳號,否則用root執行Elasticsearch時會出現"can not run elasticsearch as root"訊息。

建立使用者群組elastic

groupadd elastic

建立使用者帳號elastic

useradd elastic -g elastic

為使用者帳號elastic建立密碼

passwd elastic

變更elasticsearch文件夾及內部文件給elastic的群組及帳號

chown -R elastic:elastic /opt/elasticsearch-7.0.1

切換到elastic帳號後啟動elasticsearch

su elastic

cd /opt/elasticsearch-7.0.1/bin

./elasticsearch -d


Elasticsearch透過Linux tar方式安裝:

切換到/opt下,下載Elasticsearch 7.0.1(版本會隨著時間變更,請隨時注意Elastic官方的更新消息)
cd /opt

curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.0.1-linux-x86_64.tar.gz

解壓縮
tar -xvf elasticsearch-7.0.1-linux-x86_64.tar.gz

切換到Elasticsearch目錄
cd elasticsearch-7.0.1/bin

啟動Elasticsearch
./elasticsearche




在 CentOS 7 上使用 yum Repository 方式安裝 Elasticsearch 7.x


匯入ElasticsearchPGP Key

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
設定ElasticsearchRepository
vi /etc/yum.repos.d/elasticsearch.repo

    [elasticsearch-7.x]
    name=Elasticsearch repository for 7.x packages
    baseurl=
https://artifacts.elastic.co/packages/7.x/yum
    gpgcheck=1
    gpgkey=
https://artifacts.elastic.co/GPG-KEY-elasticsearch
    enabled=1
    autorefresh=1
    type=rpm-md

備註:上述的設定是基於Elastic授權模式,如果要使用Apache 2.0授權模式的Elasticsearchbaseurl要改為baseurl=https://artifacts.elastic.co/packages/oss-7.x/yum

安裝Elasticsearch

sudo yum install elasticsearch

重新載入systemd的配置文件

sudo systemctl daemon-reload

設定開機時自動啟動Elasticsearch

sudo systemctl enable elasticsearch

啟動Elasticsearch

sudo systemctl start elasticsearch

查看Elasticsearch啟動狀態

sudo systemctl status elasticsearch 

透過journalctl指令查看日誌

sudo journalctl --unit elasticsearch

送出HTTP Request測試Elasticsearch運行

curl -X GET "localhost:9200"


備註:Elasticsearch下載後自帶OpenJDK 12.0.1,所以安裝Elasticsearch前不需要再另外安裝JAVA。JAVA路徑為/etc/share/elasticsearch/jdk/binJAVA環境變數可根據需求再做設定。



在 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年5月9日 星期四

在 CentOS 7 上安裝 OpenJDK 11


安裝指令

yum install -y java-11-openjdk-devel

查看JAVA版本

java -version

查看JAVA檔案放置位置

which java



2019年5月5日 星期日

在 CentOS 7 上安裝 OpenJDK 12


切換到/opt資料夾下

cd /opt

下載OpenJDK 12

curl -O https://download.java.net/java/GA/jdk12.0.1/69cfe15208a647278a19ef0990eea691/12/GPL/openjdk-12.0.1_linux-x64_bin.tar.gz

解壓縮OpenJDK 12

tar xvf openjdk-12.0.1_linux-x64_bin.tar.gz

設定JAVA_HOME環境變數

cat <<EOF | sudo tee /etc/profile.d/jdk12.sh

export JAVA_HOME=/opt/jdk-12.0.1
export PATH=\$PATH:\$JAVA_HOME/bin

EOF

執行下列指令讓環境變數設定生效

source /etc/profile.d/jdk12.sh

可以用下列三種方式檢查JAVA設定是否正確

echo $JAVA_HOME

java --version

which java