Date: 6 1 月, 2019
循序漸進:如何在沒有共享存儲的情況下在Google Cloud Platform(Google Compute Engine)上配置Linux故障轉移群集#google #gce #sanless #cluster
在本分步指南中,我將向您介紹在Google Cloud Platform(Google Compute Engine,又名GCE)中配置高可用性2節點MySQL群集(以及見證服務器)所需的所有步驟。 該指南包括適當的屏幕截圖,shell命令和代碼片段。 我假設您對Google Cloud Platform有點熟悉並且已經擁有一個帳戶。 如果沒有,您今天就可以報名參加免費試用。 我還將假設您具有基本的Linux系統管理技能,並了解基本的故障轉移群集概念,如虛擬IP,仲裁等。
免責聲明:雲是一個快速發展的目標。 因此,功能/屏幕/按鈕必然會隨著時間的推移而發生變化,因此您的體驗可能會與您在下面看到的略有不同。 雖然本指南將向您展示如何使MySQL數據庫具有高可用性,但您當然可以調整此信息和流程以保護其他應用程序或數據庫,如SAP,PostgreSQL,Oracle,WebSphere MQ,NFS文件服務器等。以下是在Google Compute Engine中創建高可用性MySQL數據庫的高級步驟:
- 創建一個項目
- 創建實例(虛擬機)
- 創建實例組
- 創建防火牆規則以允許VNC訪問
- Linux OS配置
- 安裝和配置MySQL
- 安裝和配置群集
- 創建內部負載均衡器
- 為內部負載均衡器創建防火牆規則
- 測試群集連接
概觀
本文將介紹如何在單個Google Cloud區域內創建群集。 群集節點(node1,node2和見證服務器)將全部駐留在“us-central1”區域(10.128.0.0/20網絡)中,但您可以相應地選擇您的區域。配置如下所示:將使用以下IP地址:
- node1:10.128.0.2
- node2:10.128.0.3
- 見證人:10.128.0.4
- 內部負載均衡器IP:10.128.0.99
- MySQL端口:3306
創建一個項目
首次登錄時,您將看到一個空的Home Dashboard,並將被要求創建一個Project。 我們將創建的所有Google Compute Engine資源都屬於此Google Cloud Platform項目。 在這裡,我們將調用我們新創建的項目“LinuxCluster”:
創建實例(虛擬機)
我們將在本指南中配置3台虛擬機。 前兩個VM(我稱之為“node1”和“node2”)將作為集群節點運行,能夠將MySQL數據庫及其相關資源聯機。 第三個VM將充當群集的見證服務器,以增強對裂腦的保護。為確保最大可用性,所有3個VM將駐留在該區域內的不同區域中(在此示例中:us-central1-a,us-central1-b,us-central1-c)。
創建“節點1”實例
創建第一個VM實例(“node1”)。 如果這是您第一次創建實例,則屏幕將如下圖所示。單擊屏幕中央的“創建實例”按鈕:如果您已在GCE中運行其他實例,則您的屏幕看起來會有所不同。 仍然,單擊“創建實例”繼續:默認情況下,默認情況下通常會選擇Debian linux。 我們*不要*因為我們將在本指南中使用CentOS 6.X。為實例命名(“node1”),選擇我們區域內的第一個區域(a)(us-central1),並確保單擊“更改”以選擇正確的引導映像。 您可以根據工作負載要求調整實例的大小,但出於本指南的目的,我們將使用默認大小來最小化成本,這是一個相當小的VM(1個vCPU,只有3.75GB RAM)在Boot disk pop中在屏幕上,選擇CentOS 6,在底部我們將使用SSD啟動盤。 對於本指南而言,10GB就足夠了。 您可以相應地調整系統大小:單擊“選擇”後,您將返回“創建實例”屏幕。 在底部,單擊“管理,磁盤,網絡,SSH密鑰”,因為我們將向VM添加第二個磁盤。 第二個磁盤將用於存儲我們的數據庫,它將在以後由集群軟件複製/同步。 選擇“Disks”選項卡,然後單擊“Add item”將第二個磁盤添加到此實例:單擊“Create disk”:為新磁盤命名,選擇所需類型,然後從空白磁盤開始。 在此示例配置中,10 GB應該足以滿足我們的需求。 注意:記住您在此處設置的值。 兩個群集節點(node1和node2)都需要是SAME SIZE:最後,單擊“Networking”選項卡,並為node1提供客戶內部IP。 單擊“創建”以啟動新實例:
創建“node2”
重複上述步驟兩次以創建第二個群集節點(“node2”)。 像創建node1一樣創建此實例,包括添加第二個磁盤。重要提示:確保它位於不同的區域(us-central1-b)並為其提供唯一的IP(10.128.0.3)
創建“見證”VM
創建第三個VM(“見證”)並確保它位於前兩個實例的不同區域(us-central1-c)中。注意:此實例不需要添加額外的磁盤。 您的3個VM實例可能需要一段時間才能進行配置。 完成後,您將在Google雲端控制台的VM Instances屏幕上看到您的VM。 驗證是否已將每個VM正確啟動到其他區域:
創建實例組
在本指南的後面部分,我們將創建一個內部負載均衡器,以將流量路由到活動群集節點。 Google Cloud Platform上可用的所有可能的負載均衡器配置都需要實例組來為負載均衡器發送的流量提供服務。將創建兩個實例組,每個實例組將包含一個群集節點。
創建實例組1
為您的第一個實例組命名(“instance-group-1a”),選擇“Single-zone”並確保正確選擇第一個VM實例所在的區域。 在這裡,我們選擇us-central-1a,因為那是部署“node1”的地方。 在下面,選擇“選擇現有實例”並從VM實例下拉列表中選擇“node1”:
創建實例組2
再次重複上一步,這次選擇第二個節點所在的區域。 us-central-1b和node2:
創建防火牆規則以允許VNC訪問
您可以通過導航到以下內容來查看所有現有防火牆規則:網絡 – >防火牆規則默認情況下,從外部世界打開到您的VM的“Google防火牆”中打開的唯一端口是ping,SSH(端口22)和RDP(港口3389)。 在本指南的後面,我們將使用VNC訪問“node1”的桌面並使用GUI配置集群。 創建防火牆規則以允許VNC訪問。 在該指南中使用端口5902。 根據您的VNC配置進行調整。
Linux OS配置
接下來,我們需要配置我們實例的Linux操作系統並在命令行上弄髒,作為Linux管理員,您現在應該習慣這樣做。有許多方法可以連接到Linux VM的控制台。 您可以直接從GCE Web界面啟動SSH連接,也可以在筆記本電腦/工作站上本地安裝Google Cloud SDK。要使用瀏覽器進行SSH,只需轉到計算 – > VM實例,然後轉到要連接的VM的右側,在“連接”下選擇“在瀏覽器窗口中打開”。 如果您希望在筆記本電腦/工作站上本機安裝Google Cloud命令行工具,請參閱此處的文檔:https://cloud.google.com/sdk/docs/quickstarts連接後,使用“sudo”命令獲得root權限:
$ sudo su -
編輯/ etc / hosts
除非您已經設置了DNS服務器,否則您需要在所有3台服務器上創建主機文件條目,以便它們可以通過名稱正確地相互解析。將以下行添加到/ etc / hosts文件的末尾:
10.128.0.2 node1 10.128.0.3 node2 10.128.0.4證人 10.128.0.99 mysql-vip
禁用SELinux
編輯/ etc / sysconfig / linux並設置“SELINUX = disabled”:
#vi / etc / sysconfig / selinux #此文件控制系統上SELinux的狀態。 #SELINUX =可以採用以下三個值中的一個: #enforcing - 強制執行SELinux安全策略。 #permissive - SELinux打印警告而不是強制執行。 #disabled - 未加載SELinux策略。 SELINUX =禁用 #SELINUXTYPE =可以採用以下兩個值之一: #targeted - 目標進程受到保護, #mls - 多級安全保護。 SELINUXTYPE =針對性
安裝各種RPM包
接下來,安裝一些rpm軟件包,稍後將需要這些軟件包作為我們的集群軟件的先決條件:
#yum install redhat-lsb補丁
安裝和配置VNC(及相關軟件包)
要訪問我們的Linux服務器的GUI,以便稍後配置我們的集群,請在您的集群節點上安裝VNC服務器。 在我的設置中,我只在“node1”上執行此操作
#yum install tigervnc-server xterm #vncpasswd #vi / etc / sysconfig / vncservers VNCSERVERS =“2:根” VNCSERVERARGS [2] =“ - 幾何1024x768” #service vncserver start #chkconfig vncserver on
通過在筆記本電腦/台式機上打開VNC客戶端並連接到群集節點的公共IP來測試連接性
重新啟動群集節點
重新啟動以禁用SELinux。需要重新啟動所有3個系統(node1,node2,見證)。
分區和格式化“數據”磁盤
在VM實例創建期間,為每個群集節點添加了一個額外的磁盤,以存儲我們將要保護的應用程序數據。 在這種情況下,它恰好是MySQL數據庫。我們的VM的磁盤配置如下:
- / dev / sda – 操作系統磁盤
- / dev / sdb – 數據磁盤
在實例創建/ dev / sdb期間添加了第二個磁盤。 您可以運行“fdisk -l”命令進行驗證。 您將看到/ dev / sda(OS)已經有一個磁盤分區並正在使用。
#fdisk -l 磁盤/ dev / sda:10.7 GB,10737418240字節 255個頭,63個扇區/軌道,1305個氣缸 單位= 16065 * 512 = 8225280字節的柱面 扇區大小(邏輯/物理):512字節/ 4096字節 I / O大小(最小/最佳):4096字節/ 4096字節 磁盤標識符:0x00035e98 設備啟動開始結束塊ID系統 / dev / sda1 * 1 1306 10484736 83 Linux 磁盤/ dev / sdb:10.7 GB,10737418240字節 64個頭,32個扇區/軌道,10240個氣缸 單位= 2048 * 512 = 1048576字節的柱面 扇區大小(邏輯/物理):512字節/ 4096字節 I / O大小(最小/最佳):4096字節/ 4096字節 磁盤標識符:0x762b810b
這裡我們將創建一個分區(/ dev / sdb1),對其進行格式化,並將其掛載到MySQL的默認位置,即/ var / lib / mysql。 在“node1”和“node2”上執行以下步驟:
#fdisk / dev / sdb 命令(m求助):n 命令行動 擴展 p主分區(1-4) p 分區號(1-4):1 第一個柱面(1-1305,默認值1):<enter> 使用默認值1 最後一個氣缸,氣缸或尺寸{K,M,G}(1-1305,默認1305):<enter> 使用默認值1305 命令(m求助):w 分區表已被更改! 調用ioctl()重新讀取分區表。 同步磁盤。 [root @ node1~]# #mkfs.ext4 / dev / sdb1 #mkdir / var / lib / mysql
在node1上,掛載文件系統:
#mount / dev / sdb1 / var / lib / mysql
安裝和配置MySQL
接下來,安裝安裝MySQL包,初始化示例數據庫,並為MySQL設置“root”密碼。
在“node1”上:
#yum -y install mysql mysql-server #/ usr / bin / mysql_install_db --datadir =“/ var / lib / mysql /” - user = mysql #mysqld_safe --user = root --socket = / var / lib / mysql / mysql.sock --port = 3306 --datadir = / var / lib / mysql --log& # ##注意:下一個命令允許來自任何主機的遠程連接。生產不是一個好主意! #echo“update user set Host ='%'where host ='node1'; flush privileges”| mysql mysql # ##將MySQL的root密碼設置為'SIOS' #echo“update user set Password = PASSWORD('SIOS')其中User ='root'; flush特權”| mysql mysql
創建MySQL配置文件。我們將它放在數據磁盤上(稍後將被複製 – /var/lib/mysql/my.cnf)。 例:
#vi /var/lib/mysql/my.cnf 的[mysqld] DATADIR =的/ var / lib中/ MySQL的 插座=的/ var / lib中/ MySQL的/的mysql.sock PID文件=的/ var / lib中/ MySQL的/ mysqld.pid 用戶=根 端口= 3306 #建議禁用符號鏈接以防止出現各種安全風險 符號鏈接= 0 [mysqld_safe的] 對數誤差=的/ var /數/ mysqld.log PID文件= / var / run中/ mysqld的/ mysqld.pid [客戶] 用戶=根 密碼= SIOS
刪除位於/ etc中的原始MySQL配置文件(如果存在):
#rm /etc/my.cnf
在“node2”上:
在“node2”上,您只需要安裝MySQL軟件包。 其他步驟不是必需的:
[root @ node2~] #yum -y install mysql mysql-server
安裝和配置群集
此時,我們已準備好安裝和配置我們的集群。 SIOS Protection Suite for Linux(又名SPS-Linux)將在本指南中用作群集技術。 它在單個集成解決方案中提供高可用性故障轉移群集功能(LifeKeeper)以及實時,塊級數據複製(DataKeeper)。 SPS-Linux使您能夠部署“SANLess”群集,即“無共享”群集,這意味著群集節點沒有任何共享存儲,就像Azure VM一樣。
安裝適用於Linux的SIOS Protection Suite
在所有3個VM(node1,node2,見證)上執行以下步驟:下載SPS-Linux安裝映像文件(sps.img),並獲取試用許可證或購買永久許可證。 有關更多信息,請聯繫SIOS。您將環回安裝它並以root身份運行“setup”腳本(或首先“sudo su – ”以獲取根shell)例如:
#mkdir / tmp / install #mount -o loop sps.img / tmp / install #cd / tmp / install # 。/建立
在安裝腳本期間,系統會提示您回答一些問題。 您將在幾乎每個屏幕上按Enter鍵以接受默認值。 請注意以下例外情況:
- 在標題為“High Availability NFS”的屏幕上,您可以選擇“n”,因為我們不會創建高可用性NFS服務器
- 在安裝腳本結束時,您可以選擇立即或稍後安裝試用許可證密鑰。我們稍後會安裝許可證密鑰,因此您可以安全地選擇“n”
- 在“設置”的最後一個屏幕中,從屏幕上顯示的列表中選擇要安裝的ARK(應用程序恢復工具包,即“群集代理”)。
- 僅在“node1”和“node2”上需要ARK。 你不需要在“見證”上安裝
- 使用向上/向下箭頭導航列表,然後按空格鍵選擇以下內容:
- lkDR – 適用於Linux的DataKeeper
- lkSQL – LifeKeeper MySQL RDBMS恢復工具包
- 這將導致在“node1”和“node2”上安裝以下附加RPM:
- SteelEye公司 – LKDR-9.0.2-6513.noarch.rpm
- SteelEye公司 – lkSQL-9.0.2-6513.noarch.rpm
安裝Witness / Quorum包
LifeKeeper(steeleye-lkQWK)的Quorum / Witness服務器支持包與LifeKeeper核心的現有故障轉移過程相結合,可以在總體網絡故障常見的情況下以更大的可信度進行系統故障轉移。這實際上意味著可以在大大降低“裂腦”情況的風險的同時進行故障轉移。在所有3個節點(node1,node2,見證)上安裝Witness / Quorum rpm:
#cd / tmp / install / quorum #rpm -Uvh steeleye-lkQWK-9.0.2-6513.noarch.rpm
在所有3個節點(node1,node2,見證)上,編輯/ etc / default / LifeKeeper,設置NOBCASTPING = 1僅打開見證服務器(“見證”),編輯/ etc / default / LifeKeeper,設置WITNESS_MODE = off / none
安裝許可證密鑰
在所有3個節點上,使用“lkkeyins”命令安裝從SIOS獲取的許可證文件:
#/ opt / LifeKeeper / bin / lkkeyins <path_to_file> / <filename> .lic
啟動LifeKeeper
在所有3個節點上,使用“lkstart”命令啟動集群軟件:
#/ opt / LifeKeeper / bin / lkstart
設置LifeKeeper GUI的用戶權限
在所有3個節點上,編輯/ etc / group並將“tony”用戶(或您登錄的任何用戶名)添加到“lkadmin”組以授予對LifeKeeper GUI的訪問權限。 默認情況下,只有“root”是該組的成員,並且我們沒有root密碼:
#vi / etc / group lkadmin:X:502:根,貝
打開LifeKeeper GUI
與node1的公共IP地址建立VNC連接。 根據上面的VNC和防火牆規則配置,您將使用之前指定的VNC密碼連接到<Public_IP>:2。 登錄後,打開終端窗口並使用以下命令運行LifeKeeper GUI:
#/ opt / LifeKeeper / bin / lkGUIapp&
系統將提示您連接到第一個群集節點(“node1”)。 輸入在VM創建期間指定的linux用戶標識和密碼:接下來,通過單擊以下屏幕截圖中突出顯示的“連接到服務器”按鈕連接到“node2”和“witness”:您現在應該看到GUI中的所有3個服務器,一個綠色的複選標記圖標,表明他們在線和健康:
創建溝通路徑
右鍵單擊“node1”並選擇Create Comm Path選擇BOTH“node2”和“witness”,然後按照嚮導進行操作。 這將創建以下之間的通信路徑:
- node1和node2
- node1&witness
仍然需要在node2和witness之間創建comm路徑。 右鍵單擊“node2”並選擇Create Comm Path。 按照嚮導選擇“見證”作為遠程服務器:此時已創建以下通信路徑:
- node1 < – > node2
- node1 < – >見證
- node2 < – >見證
服務器前面的圖標已從綠色“複選標記”更改為黃色“危險標記”。 這是因為我們在節點之間只有一條通信路徑。如果VM具有多個NIC(可以在此處找到有關創建具有多個NIC的Azure VM的信息,但本文不會介紹這些信息),則可以在每個服務器之間創建冗餘通信路徑。 要刪除警告圖標,請轉到“查看”菜單,然後取消選擇“Comm Path Redundancy Warning”:結果:
驗證通信路徑
使用“lcdstatus”命令查看群集資源的狀態。 運行以下命令以驗證您是否已在每個節點上正確創建了與其他兩個服務器相關的通信路徑:#/ opt / LifeKeeper / bin / lcdstatus -q -d node1 MACHINE NETWORK ADDRESSES / DEVICE STATE PRIO node2 TCP 10.128.0.2/ 10.128.0.3 ALIVE 1見證TCP 10.128.0.2/10.128.0.4 ALIVE 1#/ opt / LifeKeeper / bin / lcdstatus -q -d node2 MACHINE NETWORK ADDRESSES / DEVICE STATE PRIO node1 TCP 10.128.0.3/10.128.0.2 ALIVE 1見證TCP 10.128.0.3/10.128.0.4 ALIVE 1#/ opt / LifeKeeper / bin / lcdstatus -q -d witness MACHINE NETWORK ADDRESSES / DEVICE STATE PRIO node1 TCP 10.128.0.4/10.128.0.2 ALIVE 1 node2 TCP 10.128.0.4/10.128.0.3活著1
創建數據複製群集資源(即 鏡子)
接下來,創建數據複製資源以將/ var / lib / mysql分區從node1(source)複製到node2(target)。 單擊“綠色加號”圖標以創建新資源:按照嚮導進行以下選擇:
請選擇恢復工具包:數據複製 轉換類型:智能 服務器:node1 層次結構類型:複製退出文件系統 現有的掛載點:/ var / lib / mysql 數據複製資源標記:datarep-mysql 文件系統資源選項卡:/ var / lib / mysql 位圖文件:(默認值) 啟用異步複製:否
創建資源後,將出現“擴展”(即定義備份服務器)嚮導。 使用以下選項:
目標服務器:node2 轉換類型:智能 模板優先級:1 目標優先級:10 目標磁盤:/ dev / sdb1 數據複製資源標記:datarep-mysql 位圖文件:(默認值) 複製路徑:10.128.0.2/10.128.0.3 掛載點:/ var / lib / mysql 根標籤:/ var / lib / mysql
創建MySQL資源層次結構
接下來,創建一個MySQL集群資源。 MySQL資源負責停止/啟動/監視MySQL數據庫。 要創建,請單擊“綠色加號”圖標以創建新資源:按照嚮導使用以下選項創建IP資源:
選擇Recovery Kit:MySQL Database 轉換類型:智能 服務器:node1 my.cnf的位置:/ var / lib / mysql MySQL可執行文件的位置:/ usr / bin 數據庫標籤:mysql
使用以下選項擴展IP資源:
目標服務器:node2 轉換類型:智能 模板優先級:1 目標優先級:10
因此,您的群集將如下所示。 請注意,數據複製資源已自動移動到數據庫下(自動創建依賴關係),以確保它始終在數據庫之前聯機:
創建內部負載均衡器
如果這是使用物理或虛擬服務器的典型本地群集,那麼此時您就完成了。 客戶端和應用程序將連接到群集的虛擬IP(10.128.0.99)以到達活動節點。 在Google Cloud中,如果沒有其他一些配置,這將無效。要連接到群集,Google提供了一項功能,您可以設置內部負載均衡器(ILB)。 基本上,當您連接到ILB的IP地址(我們將設置為10.128.0.99)時,您將路由到當前活動的群集節點。創建TCP負載均衡器:這將是內部負載均衡器,因此選擇“僅在我的VM之間”:接下來,為負載均衡器命名(“internal-lb”),然後單擊後端配置:確保選擇正確的region(“us-central1”)並配置後端。 單擊“添加後端”並添加兩個實例組(instance-group-1a AND instance-group-1b):負載均衡器根據運行狀況檢查確定將流量路由到哪個節點。 在此示例中,將配置運行狀況檢查以查看MySQL是否正在運行(檢查默認端口3306)。 選擇“創建運行狀況檢查”:為新運行狀況檢查命名(“mysql-health-check”)並為TCP端口3306配置它:接下來,配置負載均衡器的前端。 選擇“前端配置”,在IP地址下,定義自定義靜態內部IP 10.128.0.99。 端口應為3306,這是MySQL的默認端口:最後,查看並最終確定負載均衡器。 單擊“創建”:結果。 您將看到負載均衡器處於聯機狀態,但是,它並未將實例組顯示為正常!(如0/0所示)。 我們將在下一節中解決這個問題:
為內部負載均衡器創建防火牆規則
根據Google文檔(請參閱“配置防火牆規則以允許內部負載平衡”部分),需要創建兩個防火牆規則。 第一個允許流量到負載均衡器,從負載均衡器到實例。第二個允許來自健康檢查器的健康檢查探針。創建新的防火牆規則:為新規則指定名稱(allow-internal-lb)並指定“10.128.0.0/20”作為源IP範圍。 允許的協議和端口應為“tcp:3306”:單擊“創建”後,您將返回到防火牆規則頁面,並可在列表中看到新創建的規則。 再次單擊“創建防火牆規則”,以便我們可以創建第二個必需規則:為第二個規則命名(“allow-health-check”)。 需要定義兩個不同的源IP範圍:
- 130.211.0.0/22
- 35.191.0.0/16
注意:最好仔細檢查google雲文檔,以確保這些IP範圍仍然有效。 您現在應該在列表中看到兩個新創建的防火牆規則:
測試群集連接
此時,我們所有的Google雲端和群集配置都已完成!群集資源當前在node1上處於活動狀態:您還會注意到內部負載均衡器正在顯示node1,它是instance-group-1a的成員“健康”,因此路由流量進入虛擬IP(10.128.0.99) )到node1:SSH進入見證服務器,“sudo su – ”獲得root訪問權限。 如果需要,安裝mysql客戶端:
[root @ witness~] #yum -y install mysql
測試MySQL與群集的連接:
[root @ witness~] #mysql --host = 10.128.0.99 mysql -u root -p
執行以下MySQL查詢以顯示活動集群節點的主機名:
mysql> select @@ hostname; ------------ | @@ hostname | ------------ | node1 | ------------ 1排(0.00秒) MySQL的>
使用LifeKeeper GUI,從Node1 – > Node2進行故障轉移。 右鍵單擊node2下面的mysql資源,然後選擇“In Service …”:故障轉移後,資源在node2上聯機:現在您將看到內部負載均衡器顯示實例組1b,其中包含node2,為健康狀態。 流量現在路由到node2:故障轉移完成後,重新運行MySQL查詢。 您會注意到MySQL客戶端已檢測到會話丟失(在故障轉移期間)並自動重新連接:執行以下MySQL查詢以顯示活動群集節點的主機名,驗證現在“node2”是否處於活動狀態:
mysql> select @@ hostname; ERROR 2006(HY000):MySQL服務器已經消失 沒聯繫。試圖重新連接...... 連接ID:48 當前數據庫:mysql ------------ | @@ hostname | ------------ | node2 | ------------ 1排(0.56秒) MySQL的>