學習筆記
2019年9月19日 星期四
在 Windows 10 Home 上安裝 mimikube
Minikube是一套可以在本機運行單節點Kubernetes集群的工具,作為想要嘗試熟悉Kubernetes運作是個很好的入門工具。
網路上有很多minikube的安裝教學,但大多是使用Mac的NB作為安裝示範,因為我的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
建立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
在 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 9、10、12是屬於Short term release,所以這裡決定用OpenJDK 11做Elasticsearch的支援。
OpenJDK 11 安裝步驟請參考這裡。
Elasticsearch的tar安裝包裡頭已經包含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 /optcurl -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
匯入Elasticsearch的PGP Key
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
設定Elasticsearch的Repository
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授權模式的Elasticsearch,baseurl要改為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/bin。JAVA環境變數可根據需求再做設定。
在 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
找出MongoDB的Main 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 = infinitysystemctl 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
使用tuned及ktune
建立新的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 8086:Client-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