1. 程式人生 > 其它 >5分鐘搞定 MySQL 到 Greenplum / PostgreSQL 資料遷移同步

5分鐘搞定 MySQL 到 Greenplum / PostgreSQL 資料遷移同步

一、GlusterFS 概述

1.GlusterFS簡介

GlusterFS 是一個開源的分散式檔案系統。

由儲存伺服器、客戶端以及NFS/Samba 儲存閘道器(可選,根據需要選擇使用)組成。

沒有元資料伺服器元件,這有助於提升整個系統的效能、可靠性和穩定性。

傳統的分散式檔案系統大多通過元伺服器來儲存元資料,元資料包含儲存節點上的目錄資訊、目錄結構等。這樣的設計在瀏覽目錄時效率高,但是也存在一些缺陷,例如單點故障。一旦元資料伺服器出現故障,即使節點具備再高的冗餘性,整個儲存系統也將崩潰。而 GlusterFS 分散式檔案系統是基於無元伺服器的設計,資料橫向擴充套件能力強,具備較高的可靠性及儲存效率。

GlusterFS同時也是Scale-Out(橫向擴充套件)儲存解決方案Gluster的核心,在儲存資料方面具有強大的橫向擴充套件能力,通過擴充套件能夠支援數PB儲存容量和處理數千客戶端。

GlusterFS支援藉助TCP/IP或InfiniBandRDMA網路(一種支援多併發連結的技術,具有高頻寬、低時延、高擴充套件性的特點)將物理分散分佈的儲存資源匯聚在一起,統一提供儲存服務,並使用統一全域性名稱空間來管理資料。

2、GlusterFS特點

●擴充套件性和高效能

GlusterFS利用雙重特性來提供高容量儲存解決方案。

(1)Scale-Out架構允許通過簡單地增加儲存節點的方式來提高儲存容量和效能(磁碟、計算和I/O資源都可以獨立增加),支援10GbE和 InfiniBand等高速網路互聯。

(2)Gluster彈性雜湊(ElasticHash)解決了GlusterFS對元資料伺服器的依賴,改善了單點故障和效能瓶頸,真正實現了並行化資料訪問。GlusterFS採用彈性雜湊演算法在儲存池中可以智慧地定位任意資料分片(將資料分片儲存在不同節點上),不需要檢視索引或者向元資料伺服器查詢。

●高可用性

GlusterFS可以對檔案進行自動複製,如映象或多次複製,從而確保資料總是可以訪問,甚至是在硬體故障的情況下也能正常訪問。

當資料出現不一致時,自我修復功能能夠把資料恢復到正確的狀態,資料的修復是以增量的方式在後臺執行,幾乎不會產生效能負載。

GlusterFS可以支援所有的儲存,因為它沒有設計自己的私有資料檔案格式,而是採用作業系統中主流標準的磁碟檔案系統(如EXT3、XFS等)來儲存檔案,因此資料可以使用傳統訪問磁碟的方式被訪問。

●全域性統一名稱空間

分散式儲存中,將所有節點的名稱空間整合為統一名稱空間,將整個系統的所有節點的儲存容量組成一個大的虛擬儲存池,供前端主機訪問這些節點完成資料讀寫操作。

●彈性卷管理

GlusterFS通過將資料儲存在邏輯卷中,邏輯卷從邏輯儲存池進行獨立邏輯劃分而得到。

邏輯儲存池可以線上進行增加和移除,不會導致業務中斷。邏輯卷可以根據需求線上增長和縮減,並可以在多個節點中實現負載均衡。

檔案系統配置也可以實時線上進行更改並應用,從而可以適應工作負載條件變化或線上效能調優。

●基於標準協議

Gluster 儲存服務支援 NFS、CIFS、HTTP、FTP、SMB 及 Gluster原生協議,完全與 POSIX 標準(可移植作業系統介面)相容。

現有應用程式不需要做任何修改就可以對Gluster 中的資料進行訪問,也可以使用專用 API 進行訪問。

3.GlusterFS 術語

●Brick(儲存塊):

指可信主機池中由主機提供的用於物理儲存的專用分割槽,是GlusterFS中的基本儲存單元,同時也是可信儲存池中伺服器上對外提供的儲存目錄。

儲存目錄的格式由伺服器和目錄的絕對路徑構成,表示方法為 SERVER:EXPORT,如 192.168.80.10:/data/mydir/。

●Volume(邏輯卷):

一個邏輯卷是一組 Brick 的集合。卷是資料儲存的邏輯裝置,類似於 LVM 中的邏輯卷。大部分 Gluster 管理操作是在捲上進行的。

●FUSE:

是一個核心模組,允許使用者建立自己的檔案系統,無須修改核心程式碼。

●VFS:

核心空間對使用者空間提供的訪問磁碟的介面。

●Glusterd(後臺管理程序):

在儲存群集中的每個節點上都要執行。

4、模組化堆疊式架構

GlusterFS 採用模組化、堆疊式的架構。

通過對模組進行各種組合,即可實現複雜的功能。例如 Replicate 模組可實現 RAID1,Stripe 模組可實現 RAID0, 通過兩者的組合可實現 RAID10 和 RAID01,同時獲得更高的效能及可靠性。

5.GlusterFS 的工作流程

(1)客戶端或應用程式通過 GlusterFS 的掛載點訪問資料。

(2)linux系統核心通過 VFS API 收到請求並處理。

(3)VFS 將資料遞交給 FUSE 核心檔案系統,並向系統註冊一個實際的檔案系統 FUSE,而 FUSE 檔案系統則是將資料通過 /dev/fuse 裝置檔案遞交給了 GlusterFS client 端。可以將 FUSE 檔案系統理解為一個代理。

(4)GlusterFS client 收到資料後,client 根據配置檔案的配置對資料進行處理。

(5)經過 GlusterFS client 處理後,通過網路將資料傳遞至遠端的 GlusterFS Server,並且將資料寫入到伺服器儲存裝置上。

6.彈性 HASH 演算法

彈性 HASH 演算法是 Davies-Meyer 演算法的具體實現,通過 HASH 演算法可以得到一個 32 位的整數範圍的 hash 值,

假設邏輯卷中有 N 個儲存單位 Brick,則 32 位的整數範圍將被劃分為 N 個連續的子空間,每個空間對應一個 Brick。

當用戶或應用程式訪問某一個名稱空間時,通過對該名稱空間計算 HASH 值,根據該 HASH 值所對應的 32 位整數空間定位資料所在的 Brick。

彈性 HASH 演算法的優點:

保證資料平均分佈在每一個 Brick 中。

解決了對元資料伺服器的依賴,進而解決了單點故障以及訪問瓶頸。

二、GlusterFS的卷型別

GlusterFS 支援七種卷,即分散式卷、條帶卷、複製卷、分散式條帶卷、分散式複製卷、條帶複製卷和分散式條帶複製卷。

1、分散式卷(Distribute volume):

檔案通過 HASH 演算法分佈到所有 Brick Server 上,這種卷是 GlusterFS 的預設卷;以檔案為單位根據 HASH 演算法雜湊到不同的 Brick,其實只是擴大了磁碟空間,如果有一塊磁碟損壞,資料也將丟失,屬於檔案級的 RAID0, 不具有容錯能力。

在該模式下,並沒有對檔案進行分塊處理,檔案直接儲存在某個 Server 節點上。 由於直接使用本地檔案系統進行檔案儲存,所以存取效率並沒有提高,反而會因為網路通訊的原因而有所降低。

示例原理:

File1 和 File2 存放在 Server1,而 File3 存放在 Server2,檔案都是隨機儲存,一個檔案(如 File1)要麼在 Server1 上,要麼在 Server2 上,不能分塊同時存放在 Server1和 Server2 上。

分散式卷具有如下特點:

檔案分佈在不同的伺服器,不具備冗餘性。

更容易和廉價地擴展卷的大小。

單點故障會造成資料丟失。

依賴底層的資料保護。

#建立一個名為dis-volume的分散式卷,檔案將根據HASH分佈在server1:/dir1、server2:/dir2和server3:/dir3中

gluster volume create dis-volume server1:/dir1 server2:/dir2 server3:/dir3    

2、條帶卷(Stripe volume):

類似 RAID0,檔案被分成資料塊並以輪詢的方式分佈到多個 Brick Server 上,檔案儲存以資料塊為單位,支援大檔案儲存, 檔案越大,讀取效率越高,但是不具備冗餘性。

示例原理:

File 被分割為 6 段,1、3、5 放在 Server1,2、4、6 放在 Server2。

條帶卷特點:

資料被分割成更小塊分佈到塊伺服器群中的不同條帶區。

分佈減少了負載且更小的檔案加速了存取的速度。

沒有資料冗餘。

#建立了一個名為stripe-volume的條帶卷,檔案將被分塊輪詢的儲存在Server1:/dir1和Server2:/dir2兩個Brick中

gluster volume create stripe-volume stripe 2 transport tcp server1:/dir1 server2:/dir2    

3、複製卷(Replica volume):

將檔案同步到多個 Brick 上,使其具備多個檔案副本,屬於檔案級 RAID 1,具有容錯能力。因為資料分散在多個 Brick 中,所以讀效能得到很大提升,但寫效能下降。

複製卷具備冗餘性,即使一個節點損壞,也不影響資料的正常使用。但因為要儲存副本,所以磁碟利用率較低。

示例原理:

File1 同時存在 Server1 和 Server2,File2 也是如此,相當於 Server2 中的檔案是 Server1 中檔案的副本。

複製卷特點:

卷中所有的伺服器均儲存一個完整的副本。

卷的副本數量可由客戶建立的時候決定,但複製數必須等於卷中 Brick 所包含的儲存伺服器數。

至少由兩個塊伺服器或更多伺服器。

具備冗餘性。

#建立名為rep-volume的複製卷,檔案將同時儲存兩個副本,分別在Server1:/dir1和Server2:/dir2兩個Brick中

gluster volume create rep-volume replica 2 transport tcp server1:/dir1 server2:/dir2  

4、分散式條帶卷(Distribute Stripe volume):

Brick Server 數量是條帶數(資料塊分佈的 Brick 數量)的倍數,兼具分散式卷和條帶卷的特點。 主要用於大檔案訪問處理,建立一個分散式條帶卷最少需要 4 臺伺服器。

示例原理:

File1 和 File2 通過分散式卷的功能分別定位到Server1和 Server2。

在 Server1 中,File1 被分割成 4 段,其中 1、3 在 Server1 中的 exp1 目錄中,2、4 在 Server1 中的 exp2 目錄中。

在 Server2 中,File2 也被分割成 4 段,其中 1、3 在 Server2 中的 exp3 目錄中,2、4 在 Server2 中的 exp4 目錄中。

建立一個名為dis-stripe的分散式條帶卷

配置分散式的條帶卷時,卷中Brick所包含的儲存伺服器數必須是條帶數的倍數(>=2倍)。Brick 的數量是 4(Server1:/dir1、Server2:/dir2、Server3:/dir3 和 Server4:/dir4),條帶數為 2(stripe 2)

gluster volume create dis-stripe stripe 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4  

5、分散式複製卷(Distribute Replica volume):

Brick Server 數量是映象數(資料副本數量)的倍數,兼具分散式卷和複製卷的特點。主要用於需要冗餘的情況下。

示例原理:

File1 和 File2 通過分散式卷的功能分別定位到 Server1 和 Server2。

在存放 File1 時,File1 根據複製卷的特性,將存在兩個相同的副本,分別是 Server1 中的exp1 目錄和 Server2 中的 exp2 目錄。

在存放 File2 時,File2 根據複製卷的特性,也將存在兩個相同的副本,分別是 Server3 中的 exp3 目錄和 Server4 中的 exp4 目錄。

建立一個名為dis-rep的分散式複製卷

配置分散式的複製卷時,卷中Brick所包含的儲存伺服器數必須是複製數的倍數(>=2倍)。Brick 的數量是 4(Server1:/dir1、Server2:/dir2、Server3:/dir3 和 Server4:/dir4),複製數為 2(replica 2)

gluster volume create dis-rep replica 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4  

6、條帶複製卷(Stripe Replica volume):

類似 RAID 10,同時具有條帶卷和複製卷的特點。

7、分散式條帶複製卷(Distribute Stripe Replicavolume):

三種基本卷的複合卷,通常用於類 Map Reduce 應用。

三、部署GlusterFs 群集

環境準備:

Node1 節點 :192.168.2.99

Node2 節點 :192.168.2.22

Node3 節點 :192.168.2.33

Node4 節點 :192.168.2.200

客戶端節點 :192.168.2.66

分別新增四塊硬碟(關機狀態下,若不顯示可重啟)

1、關閉防火牆

systemctl stop firewalld
setenforce 0 

2、磁碟分割槽,並掛載

vim /opt/fdisk.sh
#!/bin/bash
NEWDEV=`ls /dev/sd* | grep -o 'sd[b-z]' | uniq`
for VAR in $NEWDEV
do
   echo -e "n\np\n\n\n\nw\n" | fdisk /dev/$VAR &> /dev/null
   mkfs.xfs /dev/${VAR}"1" &> /dev/null
   mkdir -p /data/${VAR}"1" &> /dev/null
   echo "/dev/${VAR}"1" /data/${VAR}"1" xfs defaults 0 0" >> /etc/fstab
done
mount -a &> /dev/null
 
chmod +x /opt/fdisk.sh
cd /opt/
./fdisk.sh

3、修改主機名,配置/etc/hosts檔案

以Node1節點為例:

hostnamectl set-hostname node1
su
echo "192.168.2.99 node1" >> /etc/hosts
echo "192.168.2.22 node2" >> /etc/hosts
echo "192.168.2.33 node3" >> /etc/hosts
echo "192.168.2.200 node4" >> /etc/hosts

4、安裝、啟動GlusterFS(所有node節點上操作)

將gfsrepo 軟體上傳到/opt目錄下

cd /etc/yum.repos.d/
mkdir repo.bak
mv *.repo repo.bak
 
vim glfs.repo
[glfs]
name=glfs
baseurl=file:///opt/gfsrepo
gpgcheck=0
enabled=1
 
yum clean all && yum makecache
 
#yum -y install centos-release-gluster          #如採用官方 YUM 源安裝,可以直接指向網際網路倉庫
yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
 
systemctl start glusterd.service
systemctl enable glusterd.service
systemctl status glusterd.service

5、新增節點到儲存信任池中(在 node1 節點上操作)

只要在一臺Node節點上新增其它節點即可

gluster peer probe node1
gluster peer probe node2
gluster peer probe node3
gluster peer probe node4


 

在每個Node節點上檢視群集狀態  

gluster peer status

6、建立卷(在node3節點操作)

根據規劃建立如下卷(可在叢集中的任意節點操作)

卷名稱 卷型別 Brick
dis-volume 分散式卷 node1(/data/sdb1)、node2(/data/sdb1)
stripe-volume 條帶卷 node1(/data/sdc1)、node2(/data/sdc1)
rep-volume 複製卷 node3(/data/sdb1)、node4(/data/sdb1)
dis-stripe 分散式條帶卷 node1(/data/sdd1)、node2(/data/sdd1)node3(/data/sdd1)、node4(/data/sdd1)
dis-rep 分散式複製卷 node1(/data/sde1)、node2(/data/sde1)node3(/data/sde1)、node4(/data/sde1)

6.1 建立分散式卷

建立分散式卷,沒有指定型別,預設建立的是分散式卷

gluster volume create dis-volume node1:/data/sdb1 node2:/data/sdb1 force  

檢視卷列表

gluster volume list  

啟動新建分散式卷

gluster volume start dis-volume  

檢視建立分散式卷資訊

gluster volume info dis-volume  

6.2 建立條帶卷

指定型別為 stripe,數值為 2,且後面跟了 2 個 Brick Server,所以建立的是條帶卷

gluster volume create stripe-volume stripe 2 node1:/data/sdc1 node2:/data/sdc1 force
gluster volume start stripe-volume
gluster volume info stripe-volume  

6.3 建立複製卷

指定型別為 replica,數值為 2,且後面跟了 2 個 Brick Server,所以建立的是複製卷

gluster volume create rep-volume replica 2 node3:/data/sdb1 node4:/data/sdb1 force
gluster volume start rep-volume
gluster volume info rep-volume 

6.4 建立分散式條帶卷

指定型別為 stripe,數值為 2,而且後面跟了 4 個 Brick Server,是 2 的兩倍,所以建立的是分散式條帶卷

gluster volume create dis-stripe stripe 2 node1:/data/sdd1 node2:/data/sdd1 node3:/data/sdd1 node4:/data/sdd1 force
gluster volume start dis-stripe
gluster volume info dis-stripe 

6.5 建立分散式複製卷

指定型別為 replica,數值為 2,而且後面跟了 4 個 Brick Server,是 2 的兩倍,所以建立的是分散式複製卷

gluster volume create dis-rep replica 2 node1:/data/sde1 node2:/data/sde1 node3:/data/sde1 node4:/data/sde1 force
gluster volume start dis-rep
gluster volume info dis-rep 

檢視當前所有卷的列表

gluster volume list

四、部署 Gluster 客戶端

7、安裝客戶端軟體

將gfsrepo 軟體上傳到/opt目下

cd /etc/yum.repos.d/
mkdir repo.bak
mv *.repo repo.bak
 
vim glfs.repo
[glfs]
name=glfs
baseurl=file:///opt/gfsrepo
gpgcheck=0
enabled=1
 
yum clean all && yum makecache
 
yum -y install glusterfs glusterfs-fuse

8、建立掛載目錄

mkdir -p /test/{dis,stripe,rep,dis_stripe,dis_rep}
ls /test 

9、配置 /etc/hosts 檔案

echo "192.168.2.99 node1" >> /etc/hosts
echo "192.168.2.22 node2" >> /etc/hosts
echo "192.168.2.33 node3" >> /etc/hosts
echo "192.168.2.200 node4" >> /etc/hosts 

10、掛載 Gluster 檔案系統

臨時掛載

mount.glusterfs node1:dis-volume /test/dis
mount.glusterfs node1:stripe-volume /test/stripe
mount.glusterfs node1:rep-volume /test/rep
mount.glusterfs node1:dis-stripe /test/dis_stripe
mount.glusterfs node1:dis-rep /test/dis_rep
 
df -Th  

永久掛載

vim /etc/fstab
node1:dis-volume    /test/dis   glusterfs   defaults,_netdev    0 0
node1:stripe-volume /test/stripe    glusterfs   defaults,_netdev    0 0
node1:rep-volume    /test/rep   glusterfs   defaults,_netdev    0 0
node1:dis-stripe    /test/dis_stripeglusterfs   defaults,_netdev    0 0
node1:dis-rep           /test/dis_rep   glusterfs   defaults,_netdev    0 0

五、測試 Gluster 檔案系統

1、卷中寫入檔案,客戶端操作

使用dd命令從/dev/zero檔案中複製40M的資料到測試檔案中

cd /opt
dd if=/dev/zero of=/opt/demo1.log bs=1M count=40
dd if=/dev/zero of=/opt/demo2.log bs=1M count=40
dd if=/dev/zero of=/opt/demo3.log bs=1M count=40
dd if=/dev/zero of=/opt/demo4.log bs=1M count=40
dd if=/dev/zero of=/opt/demo5.log bs=1M count=40
 
ls -lh /opt
 
cp /opt/demo* /test/dis/
cp /opt/demo* /test/stripe/
cp /opt/demo* /test/rep/
cp /opt/demo* /test/dis_stripe/
cp /opt/demo* /test/dis_rep/  

將測試檔案分別複製到各個卷中

2、檢視檔案分佈

檢視分散式檔案分佈

 ls -lh /data/sdb1                                        #資料沒有被分片
 ll -h /data/sdb1  

檢視條帶卷檔案分佈

ls -lh /data/sdc1                                      #資料被分片50% 沒副本 沒冗餘
ll -h /data/sdc1                                       #資料被分片50% 沒副本 沒冗餘  

檢視複製卷分佈

ll -h /data/sdb1                                            #資料沒有被分片 有副本 有冗餘
ll -h /data/sdb1                                        #資料沒有被分片 有副本 有冗餘  

檢視分散式條帶卷分佈

ll -h /data/sdd1                                         #資料被分片50% 沒副本 沒冗餘
ll -h /data/sdd1
ll -h /data/sdd1
ll -h /data/sdd1    

檢視分散式複製卷分佈,資料沒有被分片,有副本,有冗餘

ll -h /data/sde1
ll -h /data/sde1
ll -h /data/sde1
ll -h /data/sde1

六、破壞性測試

1、掛起 node2 節點或者關閉glusterd服務來模擬故障

systemctl stop glusterd.service 

停止服務沒有故障效果的話,可直接關機或者掛起來模擬(在此我是直接關機,關閉服務依舊能夠正常查詢

2、在客戶端上檢視檔案是否正常

#分散式卷資料檢視

ll /test/dis/                                                        #在客戶機上發現少了demo5.log檔案,這個是在node2上的

條帶卷

cd /test/stripe/ #無法訪問,條帶卷不具備冗餘性
ll

分散式條帶卷

ll /test/dis_stripe/ #無法訪問,分佈條帶卷不具備冗餘性

分散式複製卷

ll /test/dis_rep/    #可以訪問,分散式複製卷具備冗餘性

3、掛起 node2 和 node4 節點,在客戶端上檢視檔案是否正常

#測試複製卷是否正常

ls -l /test/rep/  #在客戶機上測試正常 資料有

測試分散式條卷是否正常

ll /test/dis_stripe/   #在客戶機上測試沒有資料

測試分散式複製卷是否正常

ll /test/dis_rep/     #在客戶機上測試正常 有資料

上述實驗測試,凡是帶複製資料,相比而言,資料比較安全

七、其他的維護命令:

1、檢視GlusterFS卷

gluster volume list

2、檢視所有卷的資訊

gluster volume info

3、檢視所有卷的狀態

gluster volume status 

4、停止一個卷

gluster volume stop dis-stripe  

5、刪除一個卷,注意:刪除卷時,需要先停止卷,且信任池中不能有主機處於宕機狀態,否則刪除不成功

gluster volume delete dis-stripe

6、設定卷的訪問控制

僅拒絕

gluster volume set dis-rep auth.deny 192.168.2.200

僅允許

gluster volume set dis-rep auth.allow 192.168.2.* #設定192.168.2.0網段的所有IP地址都能訪問dis-rep卷(分散式複製卷)