2019年9月19日 星期四

在 Windows 10 Home 上安裝 mimikube


Minikube是一套可以在本機運行單節點Kubernetes集群的工具,作為想要嘗試熟悉Kubernetes運作是個很好的入門工具。
網路上有很多minikube的安裝教學,但大多是使用MacNB作為安裝示範,因為我的NB是使用Windows 10 Home,所以寫了這篇教學。
Minikube提供了下列Kubernetes的功能:
1. DNS
2. NodePorts
3. ConfigMaps and Secrets
4. Dashboards
5. Container Runtime: Docker, CRI-O, ande containerd
6. Enabling CNI(Container Network Interface)
7. Ingress


安裝Minikube
1. 安裝之前
在命令提示字元下執行"systeminfo",查看作業系統是否有支援虛擬化,如果作業系統有支援虛擬化,則會在"Hyper-V需求"顯示下列訊息    VM 監視器模式擴充:是
    韌體中以啟用虛擬化:是
    第二層位址轉譯:是
    具有資料執行防止:是

如上列訊息都顯示為"是",就能開始進行安裝Minikube

2. 安裝Minikube
      2.1 安裝kubectl 1.16.0
         下載
https://storage.googleapis.com/kubernetes-release/release/v1.16.0/bin/windows/amd64/kubectl.exe
     備註:最新版本可以開啟下列網址,接著只要修改上述下載網址中的版本即可
     https://storage.googleapis.com/kubernetes-release/release/stable.txt
     2.2 設定環境變數
         將環境變數設定在c:\minikube
     2.3 測試kubectl版本
         kubectl version
3. 安裝Hypervisor
      這裡使用VirtualBox,所以到VirtualBox官網下載安裝
4. 安裝Minikube
      到
https://github.com/kubernetes/minikube/releases/latest/download/minikube-installer.exe下載安裝檔
     接著執行安裝檔,選擇安裝路徑


開始學習
0. 打開命令提示字元
1. 啟動minikube以及建立一個集群
     執行
minikube start --vm-driver=virtualbox
2. 建立一個echoserver的簡單網頁伺服器,並使用port 8080
    kubectl run hello-minikube --image=k8s.gcr.io/echoserver:1.10 --port=8080
    上面的指令是依照kubernetes的網頁輸入的,但是會有下列錯誤訊息

    kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/hello-minikube created

    上面錯誤訊息表示,原本的方式已經被捨棄了,建議改用kubectl run --generator=run-pod/v1 或 kubectl create的方式執行
   




參考資料:Installing Kubernetes with Minikube

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



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]




2019年4月10日 星期三

在 CentOS 7 上禁用 SELinux


就安全性考量,SELinux是要開啟的,但在安裝一些軟體的過程中,軟體官方文件都建議將SELinux關閉,避免造成出乎意料的問題。


vi /etc/selinux/config

SELINUX=enforcing

改為

SELINUX=disabled

存檔後重新開機。

2019年3月22日 星期五

在 CentOS 7 上安裝 Grafana 6.0.2


新增Grafana Repository

vi /etc/yum.repos.d/grafana.repo

[grafana]
name = grafana
baseurl = https://packages.grafana.com/oss/rpm
repo_gpgcheck = 1
enabled = 1
gpgcheck = 1
gpgkey = http://packages.grafana.com/gpg.key
sslverify = 1
sslcacert = /etc/pki/tls/certs/ca-bundle.crt

安裝Grafana

yum install grafana

啟動grafana服務

systemctl daemon-reload

systemctl start grafana-server

查詢grafana服務狀態

systemctl status grafana-server

設定開機時自動啟動grafana服務

systemctl enable grafana-server.service

接著就能開啟瀏覽器輸入http://<IP_Address>:3000登入,預設的帳號密碼都是admin

在 CentOS 7 上安裝 Telegraf 1.10


新增Telegraf Repository

跟新增InfluxDB Repository一樣

安裝Telegraf 1.10

yum install telegraf

啟動telegraf服務

systemctl start telegraf

查詢telegraf服務狀態

systemctl status telegraf

設定開機時自動啟動telegraf服務

systemctl enable telegraf


使用默認的輸出入插件建立配置文件

telegraf config > telegraf.conf

建立具有特定輸入和輸入的配置文件

telegraf --input-filter <pluginname>[:<pluginname>] --output-filter <outputname>[:<outpurname>] config > telegraf.conf

舉例:

telegraf --input-filter cpu:mem:net:swap --output-filter influxdb:kafka config > telegraf.conf






在 CentOS 7 上安裝 InfluxDB 1.7


安裝InfluxDB需要使用root或其他有管理員權限的帳號


預設InfluxDB會使用到兩個網路Port

  • TCP Port 8086Client-Server透過InfluxDB HTTP API進行溝通
  • TCP Port 8088:透過RPC服務執行備份及還原的操作

除了上述兩個Port,有些Plugin會需要使用到自定義的端口,可以透過配置文件修改所有端口映射。配置文件位於/etc/influxdb/influxdb.conf


設定NTP服務,不管什麼在安裝什麼系統,這都是一定要的,避免各系統時間不同步時,會有些異常


新增InfluxDB Repository

vi /etc/yum.repos.d/influxdb.repo

[influxdb]
name = InfluxDB Repository - RHEL \$releasever
baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key

安裝InfluxDB 1.7

yum install influxdb -y

啟動influxdb服務

systemctl start influxdb

查詢influxdb服務狀態

systemctl status influxdb

設定開機時自動啟動influxdb服務

systemctl enable influxdb


建立資料庫

influx -precision rfc3339

CREATE DATABASE <DB_NAME>

顯示所有的資料庫

SHOW DATABASES

指定資料竹行InfluxQL語句

USE <DB_NAME>
接下來所有的SQL語句都會針對<DB_NAME>這個資料庫運行





在 CentOS 7 上安裝設定 NTP


在安裝伺服器時,尤其是分散式系統,非常需要使用NTP來校時,避免各伺服器上的時間不同步
設定NTP
yum install ntp
編輯/etc/ntp.conf

將原有的NTP伺服器註解,並加入下列伺服器
server      tock.stdtime.gov.tw
server      time.stdtime.gov.tw
server      tick.stdtime.gov.tw
server      watch.stdtime.gov.tw
server      clock.stdtime.gov.tw

如果要指向公司內部的Time Server(底下IP為舉例說明)
restrict    192.168.1.2
server      192.168.1.2

啟動ntpd服務

systemctl start ntpd
檢查ntpd服務的狀態
systemctl status ntpd
設定開機自動啟動ntpd服務
systemctl enable ntpd
更新校正時間後,可以透過下列指令將時間寫入BIOS
hwclock -w