google-code-prettify

2019年11月25日 星期一

編譯 HAProxy for Windows

HAProxy 官網並沒有提供編譯好的 Windows 軟體,
使用者必須在官網下載 Source Code 後,自行編譯。

我使用 Cygwin 進行編譯,
下載 Cygwin 安裝檔安裝,
安裝過程中,會讓使用者選擇要安裝的額外編譯環境套件,
例如: cmake、gcc-core、cygwin32-gcc-core 等

安裝好之後,Cygwin 安裝檔先不要刪除,
因為後續編譯過程如有缺少編譯環境需要的工具套件,
還是會需要用到它把工具套件安裝進來。

我使用的是 HAProxy 2.0.8 版,
若要使用其他版本可至官網下載。
將下載來的 source code tar 解壓縮並放置在  Cygwin 安裝目錄下的 home 目錄內。
路徑如:
C:\cygwin64\home\haproxy-2.0.8
開啟 Cygwin64 Terminal,這是一個類 Linux 的環境,
可以使用一些 Linux 的指令,如: ls 。
切換目錄到 /home/haproxy-2.0.8
RYAN.CHEN@TWTY3NB ~
$ pwd
/home/RYAN.CHEN
RYAN.CHEN@TWTY3NB ~
$ cd ..
RYAN.CHEN@TWTY3NB /home
$ ls
haproxy-2.0.8  haproxy-2.0.8.tar.gz  RYAN.CHEN
RYAN.CHEN@TWTY3NB /home
$ cd haproxy-2.0.8

使用 make 指令開始編譯 HAProxy,我的電腦大概花了 十幾、二十分鐘才編譯好。

$ make TARGET=cygwin
$ make install

編譯完成後,到 haproxy-2.0.8 目錄將 產生出來的 haproxy.exe 及 在 C:\cygwin64\bin\cygwin1.dll  複製出來,
新開一個目錄置放這兩個檔案。
在執行 haproxy 時,需要先建立一個 haproxy.cfg 配置 haproxy 運行的設定。
以下是一個簡單範例:

global
 
defaults
    timeout connect 90s
    timeout client 90s
    timeout server 90s

frontend dashboard
    bind *:80 
    mode http
    default_backend dashboard_back
    
backend dashboard_back
    mode http
    server dashboard_node_1 10.13.15.10:18083 
    server dashboard_node_2 10.13.15.11:18083 

但是使用這樣的預設值編譯出來的結果,
在配置 SSL 時,
啟動 HAProxy 會發生問題,
才知道沒有含 SSL 的模組被編譯進去。

使用指令查看 HAProxy 在編譯時,有什麼選項可以使用將選擇的套件編譯進去

$ make help

從顯示的說明,有四個套件是建議啟用:
  USE_PCRE             : enable use of libpcre for regex. Recommended.
  USE_REGPARM          : enable regparm optimization. Recommended on x86.
  USE_STATIC_PCRE      : enable static libpcre. Recommended.
  USE_OPENSSL          : enable use of OpenSSL. Recommended, but see below.


所以在使用 make 指令時,需要給它啟用這四個模組的參數:
$ make TARGET=cygwin USE_PCRE=1 USE_REGPARM=1 USE_STATIC_PCRE=1 USE_OPENSSL=1
$ make install
然後,你會發現可能發生錯誤,大致是編譯環境缺少需要的工具套件,



所以這時候需要在使用 Cygwin 安裝軟體,將缺少的套件安裝進來。
我因為先前已經單獨安裝 Git 工具,而它內含了 openssl 工具,
所以我不需要在 Cygwin 在安裝 openssl,
過程中,一邊 try make 一邊補缺少的套件,
最後我安裝了如下的套件:



但仍無法安裝 USE_STATIC_PCRE ,
最後將其剔除,

$ make TARGET=cygwin USE_PCRE=1 USE_REGPARM=1 USE_OPENSSL=1
$ make install

另外,需要從 Cygwin 目錄中,增加複製 dll 供 HAProxy 執行檔使用:
cygcrypto-1.1.dll
cygpcre-1.dll
cygssl-1.1.dll
cygwin1.dll
cygz.dll


2019年11月12日 星期二

MQTT Broker HA Cluster 使用 Proxy 做 Load Balancing 與 SSL

MQTT Broker : EMQX
Proxy: HAProxy
OS: Windows Server 2016



MQTT Broker 選擇


目前有幾款免費的 MQTT Broker,
但是免費且支援 Cluster 架構的很少。

最知名的 Broker - Mosquitto,
我個人沒有找到官方文件指出可以架設 Cluster HA 的機制,
之前聽也 Survey 過 MQTT Broker 的同事說過它不支援。

最後挑了三套作評估:VerneMQ、EMQX、HiveMQ。
這三套都支援 Cluster 架構。
HiveMQ 本來是個付費軟體,但在今年大約四五月的時候,推出了免費的 Community 版。
在細看 Community 版和付費版的差異後
發現 Community 版不支援 Cluster,
所以也就淘汰它了,
不然他是個純 Java 開發的軟體,這點倒對我個人有吸引力。


MQTT Broker 最後我選用了 EMQX 有幾個考量評估的點:

  1. 知名度和討論度:
    • Wiki 上的一篇文章 Comparison of MQTT implementations 所列的產品,它在表中呈現出來功能較為豐富。
    • 在 Google Trend 的比較中,它都算是比較高談論度。在中國最高,因為這套主要是中國人開發維護的。
    • 在GitHub 上(2019/10) Watch:321、Star:5078、Fork:964、Contributors:43,在競爭對手中,都是最高的
  2. 免費: Apache License 2.0
  3. 提供 Cluster HA架構: 它是極少數免費 Broker 有提供 Cluster
  4. 持續維護的狀況:Contributors:43,近一年主要有維護的人員數,也是比競爭對手高。GitHub上的 Issue,也持續有回覆和討論。
  5. 功能性:除了 MQTT 規格特性以外,也提供 Dashboard 可以觀看連線狀況,並提供 REST API 可以即時設定和取得連線狀態和Client 資訊,例如:使用者帳號
  6. 支援多種作業平台,包含   Windows ,這點剛好是對我們單位的加分條件


MQTT Client  Library 選擇 Eclipse Paho 有幾個考量點:
1.       在我們 Survey Broker 的過程,不同的 Broker 都提到測試、驗證、支援這一套
2.       他是很老牌的 Client Library
3.       多種程式語言版本: Java CC#JavaScript等等,這樣可以依照不同的情境需要選用對應的程式語言。
4.       Java等部份版本支援斷線自動重連
5.       大多數語言支援HA,除了C#PythonEmbedded C/C++


2019年9月25日 星期三

CentOS 安裝設定網路連線

這次實做的環境是在 VirtualBox 的 VM 裡。
先讓 VM 裡可以和本機 Host OS 可以連線,
依照下面圖片步驟將網卡本機(主機)和 VM 溝通的虛擬網卡設定為使用 DHCP


然後對該VM 進行「設定」,
到「網路> 介面卡1」開啟下面畫面,保持「附加到 NAT」


到「介面卡2>附加到」選擇「僅限主機介面卡」,
「名稱」選擇上面第二張圖裡面的網卡名稱。


啟動VM 後,
在 VM 檢查 ip ,可以會看到有張網卡被配置 192.168 的 IP,
[root@localhost ~]# ip addr
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:b1:a2:52 brd ff:ff:ff:ff:ff:ff
3: enp0s8:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:5b:6b:0e brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.101/24 brd 192.168.56.255 scope global noprefixroute dynamic enp0s8
       valid_lft 746sec preferred_lft 746sec
    inet6 fe80::b4a9:c80a:fc85:ed08/64 scope link noprefixroute
       valid_lft forever preferred_lft forever


在本機查詢 ip,
可以看到以下的區塊,
這就是 VM 對本機的 IP
C:\Users\ryan.pt.chen>ipconfig

Windows IP 設定

乙太網路卡 VirtualBox Host-Only Network:
   連線特定 DNS 尾碼 . . . . . . . . :    連結-本機 IPv6 位址 . . . . . . . : fe80::4548:49a2:946b:6b0b%16    IPv4 位址 . . . . . . . . . . . . : 192.168.56.1    子網路遮罩 . . . . . . . . . . . .: 255.255.255.0    預設閘道 . . . . . . . . . . . . .:

在 VM 裡 ping 本機(主機) 的 VirtualBox  ip 可以通,
[root@localhost ~]# ping 192.168.56.1
PING 192.168.56.1 (192.168.56.1) 56(84) bytes of data.
64 bytes from 192.168.56.1: icmp_seq=1 ttl=128 time=0.619 ms
64 bytes from 192.168.56.1: icmp_seq=2 ttl=128 time=1.16 ms

這樣就可以用 MobaXterm 這類軟體進行作業比較方便。


接下來設定連線網際網路使用的網卡,
我安裝的是 CentOS Minimal 版,
安裝好之後並無法連上Internet,
ping www.google.com 並無法得到回應

先確定自己的網卡的名稱是什麼,
因為並不是大家都會是一樣的,
也不是一定會有或會需要有eth0,
從前面使用「 ip addr 」指令可以看到列出的網卡有一張「enp0s3」還沒有網路設定,
所以就針對這張網卡進行設定。
以設定使用 DHCP 取得 IP 的方式進行,
檢查這張網卡目前的設定狀況:
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-enp0s3
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s3
UUID=b7d957bb-1d49-4b92-a88e-2ca7c7c55247
DEVICE=enp0s3
ONBOOT=no
可以看到 BOOTPROTO 原本就已經設定好使用DHCP,
但是 ONBOOT= no 並沒有開機時讓網卡生效,
所以修改設定使開機時讓網卡生效,
使用 vi 工具將 ONBOOT 改為 yes (ONBOOT=yes)。

重啟該張網卡
[root@localhost ~]# ifup enp0s3
再 ping Internet 主機就可以有回應了,
[root@localhost ~]# ping www.google.com
PING www.google.com (216.58.200.228) 56(84) bytes of data.
64 bytes from tsa03s01-in-f4.1e100.net (216.58.200.228): icmp_seq=1 ttl=51 time=15.9 ms
64 bytes from tsa03s01-in-f4.1e100.net (216.58.200.228): icmp_seq=2 ttl=51 time=13.3 ms

Internet 連通後,就可以開始下載軟體安裝,
例如:net-tools,這樣才開始有 ifconfig 等指令可以使用。
[root@localhost ~]# ifconfig
-bash: ifconfig: command not found
[root@localhost network-scripts]# yum install net-tools
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
.....
.....
.....
Installed:
  net-tools.x86_64 0:2.0-0.25.20131004git.el7

Complete!
[root@localhost ~]# ifconfig
enp0s3: flags=4163  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
        inet6 fe80::1ab1:b1d8:740b:fdf0  prefixlen 64  scopeid 0x20
        ether 08:00:27:b1:a2:52  txqueuelen 1000  (Ethernet)
        RX packets 6413  bytes 8537130 (8.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 934  bytes 59809 (58.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp0s8: flags=4163  mtu 1500
        inet 192.168.56.101  netmask 255.255.255.0  broadcast 192.168.56.255
        inet6 fe80::b4a9:c80a:fc85:ed08  prefixlen 64  scopeid 0x20
        ether 08:00:27:5b:6b:0e  txqueuelen 1000  (Ethernet)
        RX packets 1342  bytes 148934 (145.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 516  bytes 71056 (69.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 52  bytes 4464 (4.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 52  bytes 4464 (4.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0