溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

發(fā)布時(shí)間:2020-02-14 11:09:20 來源:網(wǎng)絡(luò) 閱讀:1044 作者:ZeroOne01 欄目:MySQL數(shù)據(jù)庫

冷熱數(shù)據(jù)分離

業(yè)務(wù)不斷地在增長(zhǎng),集群分片中的數(shù)據(jù)也會(huì)隨著時(shí)間的推移而增加,其中有相當(dāng)一部分的數(shù)據(jù)是很少被使用的,例如幾年前的訂單記錄、交易記錄、商品評(píng)論等數(shù)據(jù)。這部分?jǐn)?shù)據(jù)就稱之為冷數(shù)據(jù),與之相反經(jīng)常被使用的數(shù)據(jù)則稱之為熱數(shù)據(jù)。

我們都知道當(dāng)MySQL的單表數(shù)據(jù)量超過兩千萬時(shí),讀寫性能就會(huì)急劇下降。如果其中存儲(chǔ)的大部分都是高價(jià)值的熱數(shù)據(jù)還好說,可以花費(fèi)資金去擴(kuò)展集群分片,因?yàn)檫@些數(shù)據(jù)可以帶來收益。但如果是低價(jià)值的冷數(shù)據(jù),就沒必要去花這個(gè)錢了。

所以我們要將冷數(shù)據(jù)從集群分片中剝離出來,存儲(chǔ)至專門的歸檔數(shù)據(jù)庫中,以騰出存儲(chǔ)空間、減輕集群分片的存儲(chǔ)壓力。讓集群分片盡量只存儲(chǔ)熱數(shù)據(jù),維持一個(gè)較好的讀寫性能,而不必浪費(fèi)存儲(chǔ)空間在冷數(shù)據(jù)上:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

在歸檔數(shù)據(jù)庫上不適合使用InnoDB引擎,因?yàn)镮nnoDB的瞬時(shí)寫入性能不高。通常會(huì)采用Percona出品的TokuDB作為歸檔數(shù)據(jù)庫的存儲(chǔ)引擎。因?yàn)樵撘婢哂腥缦绿攸c(diǎn):

  • 高壓縮比,高寫入性能
  • 可以在線創(chuàng)建索引和字段
  • 支持事務(wù)特性
  • 支持主從同步

搭建Replication集群

上一小節(jié)介紹了冷熱數(shù)據(jù)分離的概念,本小節(jié)我們來搭建一個(gè)用于歸檔冷數(shù)據(jù)的高可用Replication集群。雖然是歸檔庫,但也得讓其具有高可用性,畢竟在實(shí)際的企業(yè)中是不允許數(shù)據(jù)庫出現(xiàn)單點(diǎn)故障的。而且歸檔庫中的數(shù)據(jù)也不是不會(huì)被使用到,只不過是使用幾率不高而已。

本文中的Replication集群架構(gòu)設(shè)計(jì)如下:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

所謂Replication集群就是我們常說的主從架構(gòu),在Replication集群中,節(jié)點(diǎn)分為Master和Slave兩種角色。Master主要是提供寫服務(wù),Slave則提供讀服務(wù),并且通常Slave會(huì)被設(shè)置為read_only。

主從節(jié)點(diǎn)之間的數(shù)據(jù)同步是異步進(jìn)行的,Slave使用一個(gè)線程監(jiān)聽Master節(jié)點(diǎn)的binlog日志,當(dāng)Master的binlog日志發(fā)生變化時(shí),該線程就會(huì)讀取Master的binlog日志內(nèi)容并寫入到本地的relay_log中。然后mysql進(jìn)程會(huì)定時(shí)讀取relay_log并將數(shù)據(jù)寫入到本地的binlog文件,這樣就實(shí)現(xiàn)了主從之間的數(shù)據(jù)同步。如下圖所示:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

為了保證Replication集群的高可用,我們需要讓兩個(gè)數(shù)據(jù)庫節(jié)點(diǎn)之間互為主從關(guān)系,實(shí)現(xiàn)雙向的數(shù)據(jù)同步。這樣才能在主節(jié)點(diǎn)掛掉時(shí)進(jìn)行主從切換,否則主節(jié)點(diǎn)在恢復(fù)后不會(huì)向從節(jié)點(diǎn)同步數(shù)據(jù),會(huì)導(dǎo)致節(jié)點(diǎn)之間的數(shù)據(jù)不一致:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

準(zhǔn)備工作

接下來開始準(zhǔn)備集群搭建的前置環(huán)境,首先需要?jiǎng)?chuàng)建4臺(tái)虛擬機(jī),其中兩臺(tái)安裝Percona Server做Replication集群,兩臺(tái)安裝Haproxy和Keepalived做負(fù)載均衡和雙機(jī)熱備:

角色 Host IP
Haproxy+Keepalived HA-01 192.168.190.135
Haproxy+Keepalived HA-02 192.168.190.143
Percona Server node-A 192.168.190.142
Percona Server node-B 192.168.190.131

每臺(tái)虛擬機(jī)的配置如下:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

環(huán)境版本說明:

  • 操作系統(tǒng):CentOS 8
  • Percona Server:8.0.18
  • TokuDB:8.0.18
  • Haproxy:1.8.15-5.el8
  • Keepalived:2.0.10-4.el8_0.2

安裝TokuDB

之前說了InnoDB因?yàn)槠涮匦圆贿m合作為歸檔數(shù)據(jù)庫的存儲(chǔ)引擎,而應(yīng)采用TokuDB。TokuDB可以安裝在任意MySQL的衍生版本上,本文采用的是Percona Server這個(gè)MySQL衍生版作為演示。

我這里已經(jīng)事先在192.168.190.142192.168.190.131兩個(gè)虛擬機(jī)上安裝好了Percona Server,如不了解其安裝方式的話,可參考:安裝Percona Server數(shù)據(jù)庫(in CentOS 8)。接下來,我們就開始為Percona Server安裝TokuDB。

首先,在安裝TokuDB前確保系統(tǒng)中已有jemalloc庫,沒有的話可以使用如下命令安裝:

[root@node-A ~]# yum install -y jemalloc
[root@node-A ~]# ls /usr/lib64/ |grep jemalloc  # 庫文件所在路徑
libjemalloc.so.1
[root@node-A ~]#

在配置文件中添加jemalloc庫文件所在路徑的配置:

[root@node-A ~]# vim /etc/my.cnf
...

[mysql_safe]
malloc-lib=/usr/lib64/libjemalloc.so.1

完成配置文件的修改后,重啟數(shù)據(jù)庫服務(wù):

[root@node-A ~]# systemctl restart mysqld

為了保證TokuDB的寫入性能,我們需要調(diào)整一下Linux系統(tǒng)的大頁內(nèi)存管理的設(shè)置,命令如下:

# 采用動(dòng)態(tài)分配內(nèi)存而不是預(yù)先分配內(nèi)存
[root@node-A ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
# 開啟內(nèi)存的碎片整理
[root@node-A ~]# echo never > /sys/kernel/mm/transparent_hugepage/defrag

通過官方提供的yum倉庫安裝TokuDB引擎:

[root@node-A ~]# yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
[root@node-A ~]# percona-release setup ps80
[root@node-A ~]# yum install -y percona-server-tokudb.x86_64

接著使用ps-admin命令將TokuDB引擎安裝到MySQL上:

[root@node-A ~]# ps-admin --enable-tokudb -uroot -p

重啟數(shù)據(jù)庫服務(wù):

[root@node-A ~]# systemctl restart mysqld

數(shù)據(jù)庫重啟完成后,再執(zhí)行一次ps-admin命令以激活TokuDB引擎:

[root@node-A ~]# ps-admin --enable-tokudb -uroot -p

最后使用show engines;語句驗(yàn)證一下MySQL上是否已成功安裝了TokuDB引擎:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)


配置主從關(guān)系

首先在兩個(gè)節(jié)點(diǎn)上分別創(chuàng)建用于同步的數(shù)據(jù)庫賬戶:

create user 'backup'@'%' identified by 'Abc_123456';
grant super, reload, replication slave on *.* to 'backup'@'%';
flush privileges;
  • Tips:創(chuàng)建好賬戶后,需要使用該賬戶在兩個(gè)節(jié)點(diǎn)互相登錄一下,以確保賬戶是可用的

然后修改MySQL配置文件:

[root@node-A ~]# vim /etc/my.cnf
[mysqld]
# 設(shè)置節(jié)點(diǎn)的id
server_id=101
# 開啟binlog
log_bin=mysql_bin
# 開啟relay_log
relay_log=relay_bin

另外一個(gè)節(jié)點(diǎn)也是同樣的配置,只不過server_id不能是一樣的:

[root@node-B ~]# vim /etc/my.cnf
[mysqld]
server_id=102
log_bin=mysql_bin
relay_log=relay_bin

修改完配置文件后,重啟MySQL服務(wù):

[root@node-A ~]# systemctl restart mysqld
[root@node-B ~]# systemctl restart mysqld

配置node-B對(duì)node-A的主從關(guān)系

進(jìn)入node-B的MySQL命令行終端,分別執(zhí)行如下語句:

mysql> stop slave;  -- 停止主從同步
mysql> change master to master_host='192.168.190.142', master_port=3306, master_user='backup', master_password='Abc_123456';  -- 配置Master節(jié)點(diǎn)的連接信息
mysql> start slave;  -- 啟動(dòng)主從同步

使用show slave status\G;語句查看主從同步狀態(tài),Slave_IO_RunningSlave_SQL_Running的值均為Yes才能表示主從同步狀態(tài)是正常的:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)


配置node-A對(duì)node-B的主從關(guān)系

為了實(shí)現(xiàn)雙向同步,node-Anode-B需要互為主從關(guān)系,所以還需要配置node-A對(duì)node-B的主從關(guān)系。進(jìn)入node-A的MySQL命令行終端,分別執(zhí)行如下語句,注意這里的master_host需要為node-B的ip:

mysql> stop slave;  -- 停止主從同步
mysql> change master to master_host='192.168.190.131', master_port=3306, master_user='backup', master_password='Abc_123456';  -- 配置Master節(jié)點(diǎn)的連接信息
mysql> start slave;  -- 啟動(dòng)主從同步

同樣配置完成后,使用show slave status\G;語句查看主從同步狀態(tài),Slave_IO_RunningSlave_SQL_Running的值均為Yes才能表示主從同步狀態(tài)是正常的:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)


測(cè)試主從同步

配置好兩個(gè)節(jié)點(diǎn)的主從同步關(guān)系之后,我們就算是完成了Replication集群的搭建。接下來我們?cè)谌我庖粋€(gè)節(jié)點(diǎn)創(chuàng)建一張歸檔表,看看兩個(gè)節(jié)點(diǎn)之間是否能正常同步數(shù)據(jù)。具體的建表SQL如下:

create table t_purchase_201909 (
    id int unsigned primary key,
    purchase_price decimal(10, 2) not null comment '進(jìn)貨價(jià)格',
    purchase_num int unsigned not null comment '進(jìn)貨數(shù)量',
    purchase_sum decimal(10, 2) not null comment '進(jìn)貨總價(jià)',
    purchase_buyer int unsigned not null comment '采購者',
    purchase_date timestamp not null default current_timestamp comment '采購日期',
    company_id int unsigned not null comment '進(jìn)貨企業(yè)的id',
    goods_id int unsigned not null comment '商品id',
    key idx_company_id(company_id),
    key idx_goods_id(goods_id)
) engine=TokuDB comment '2019年9月的進(jìn)貨數(shù)據(jù)歸檔表';

我這里是能夠正常進(jìn)行同步的,如圖兩個(gè)節(jié)點(diǎn)都能看到這張表:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)


安裝Haproxy

到此為止,我們就完成了Replication集群的搭建及測(cè)試。接下來就是得讓Replication集群具有高可用的特性,這就輪到Haproxy上場(chǎng)了。Haproxy是一款提供高可用性、負(fù)載均衡以及基于TCP(第四層)和HTTP(第七層)應(yīng)用的代理軟件。使用Haproxy可以對(duì)MySQL集群進(jìn)行負(fù)載均衡,賦予集群高可用性并發(fā)揮集群的性能。

Haproxy由于是老牌的負(fù)載均衡組件了,所以CentOS的yum倉庫中自帶有該組件的安裝包,安裝起來就非常簡(jiǎn)單。安裝命令如下:

[root@HA-01 ~]# yum install -y haproxy

安裝完成后,編輯Haproxy的配置文件,添加監(jiān)控界面及需要代理的數(shù)據(jù)庫節(jié)點(diǎn)配置:

[root@HA-01 ~]# vim /etc/haproxy/haproxy.cfg
# 在文件的末尾添加如下配置項(xiàng)
# 監(jiān)控界面配置
listen admin_stats
    # 綁定的ip及監(jiān)聽的端口
    bind 0.0.0.0:4001
    # 訪問協(xié)議
    mode http
    # URI 相對(duì)地址
    stats uri /dbs
    # 統(tǒng)計(jì)報(bào)告格式
    stats realm Global\ statistics
    # 用于登錄監(jiān)控界面的賬戶密碼
    stats auth admin:abc123456

# 數(shù)據(jù)庫負(fù)載均衡配置
listen proxy-mysql
    # 綁定的ip及監(jiān)聽的端口
    bind 0.0.0.0:3306
    # 訪問協(xié)議
    mode tcp
    # 負(fù)載均衡算法
    # roundrobin:輪詢
    # static-rr:權(quán)重
    # leastconn:最少連接
    # source:請(qǐng)求源ip
    balance roundrobin
    # 日志格式
    option tcplog
    # 需要被負(fù)載均衡的主機(jī)
    server node-A 192.168.190.142:3306 check port 3306 weight 1 maxconn 2000
    server node-B 192.168.190.131:3306 check port 3306 weight 1 maxconn 2000
    # 使用keepalive檢測(cè)死鏈
    option tcpka

由于配置了3306端口用于TCP轉(zhuǎn)發(fā),以及4001作為Haproxy監(jiān)控界面的訪問端口,所以在防火墻上需要開放這兩個(gè)端口:

[root@HA-01 ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
[root@HA-01 ~]# firewall-cmd --zone=public --add-port=4001/tcp --permanent
[root@HA-01 ~]# firewall-cmd --reload

完成以上步驟后,啟動(dòng)Haproxy服務(wù):

[root@HA-01 ~]# systemctl start haproxy

然后使用瀏覽器訪問Haproxy的監(jiān)控界面,初次訪問會(huì)要求輸入用戶名密碼,這里的用戶名密碼就是配置文件中所配置的:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

登錄成功后,就會(huì)看到如下頁面:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

Haproxy的監(jiān)控界面提供的監(jiān)控信息也比較全面,在該界面下,我們可以看到每個(gè)主機(jī)的連接信息及其自身狀態(tài)。當(dāng)主機(jī)無法連接時(shí),Status一欄會(huì)顯示DOWN,并且背景色也會(huì)變?yōu)榧t色。正常狀態(tài)下的值則為UP,背景色為綠色。

另一個(gè)Haproxy節(jié)點(diǎn)也是使用以上的步驟進(jìn)行安裝和配置,這里就不再重復(fù)了。


測(cè)試Haproxy

Haproxy服務(wù)搭建起來后,我們來使用遠(yuǎn)程工具測(cè)試一下能否通過Haproxy正常連接到數(shù)據(jù)庫。如下:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

連接成功后,在Haproxy上執(zhí)行一些SQL語句,看看能否正常插入數(shù)據(jù)和查詢數(shù)據(jù):
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

我們搭建Haproxy是為了讓Replication集群具備高可用的,所以最后測(cè)試一下Replication集群是否已具備有高可用性,首先將其中一個(gè)節(jié)點(diǎn)給停掉:

[root@node-B ~]# systemctl stop mysqld

此時(shí),從Haproxy的監(jiān)控界面中,可以看到node-B這個(gè)節(jié)點(diǎn)已經(jīng)處于下線狀態(tài)了:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

現(xiàn)在集群中還剩一個(gè)節(jié)點(diǎn),然后我們到Haproxy上執(zhí)行一些SQL語句,看看是否還能正常插入數(shù)據(jù)和查詢數(shù)據(jù):
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

從測(cè)試結(jié)果可以看到,插入和查詢語句依舊是能正常執(zhí)行的。也就是說即便此時(shí)關(guān)掉一個(gè)節(jié)點(diǎn)整個(gè)數(shù)據(jù)庫集群還能夠正常使用,說明現(xiàn)在Replication集群是具有高可用性了。


利用Keepalived實(shí)現(xiàn)Haproxy的高可用

實(shí)現(xiàn)了Replication集群的高可用之后,我們還得實(shí)現(xiàn)Haproxy的高可用,因?yàn)镠aproxy作為一個(gè)負(fù)責(zé)接收客戶端請(qǐng)求,并將請(qǐng)求轉(zhuǎn)發(fā)到后端數(shù)據(jù)庫集群的入口,不可避免的需要具備高可用性。否則Haproxy出現(xiàn)單點(diǎn)故障,就無法訪問被Haproxy代理的所有數(shù)據(jù)庫集群節(jié)點(diǎn)了,這對(duì)整個(gè)系統(tǒng)的影響是十分巨大的。

在同一時(shí)間只需要存在一個(gè)可用的Haproxy,否則客戶端就不知道該連哪個(gè)Haproxy了。這也是為什么要采用Keepalived的虛擬IP的原因,這種機(jī)制能讓多個(gè)節(jié)點(diǎn)互相接替時(shí)依舊使用同一個(gè)IP,客戶端至始至終只需要連接這個(gè)虛擬IP。所以實(shí)現(xiàn)Haproxy的高可用就要輪到Keepalived出場(chǎng)了,在安裝Keepalived之前需要開啟防火墻的VRRP協(xié)議:

[root@HA-01 ~]# firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --protocol vrrp -j ACCEPT
[root@HA-01 ~]# firewall-cmd --reload

然后就可以使用yum命令安裝Keepalived了:

[root@HA-01 ~]# yum install -y keepalived

安裝完成后,編輯keepalived的配置文件:

[root@HA-01 ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak  # 不使用自帶的配置文件
[root@HA-01 ~]# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
   state MASTER
   interface ens32
   virtual_router_id 51
   priority 100
   advert_int 1
   authentication {  
       auth_type PASS
       auth_pass 123456
   }

   virtual_ipaddress {
       192.168.190.101
   }
}

配置說明:

  • state MASTER:定義節(jié)點(diǎn)角色為master,當(dāng)角色為master時(shí),該節(jié)點(diǎn)無需爭(zhēng)搶就能獲取到VIP。集群內(nèi)允許有多個(gè)master,當(dāng)存在多個(gè)master時(shí),master之間就需要爭(zhēng)搶VIP。為其他角色時(shí),只有master下線才能獲取到VIP
  • interface ens32:定義可用于外部通信的網(wǎng)卡名稱,網(wǎng)卡名稱可以通過ip addr命令查看
  • virtual_router_id 51:定義虛擬路由的id,取值在0-255,每個(gè)節(jié)點(diǎn)的值需要唯一,也就是不能配置成一樣的
  • priority 100:定義權(quán)重,權(quán)重越高就越優(yōu)先獲取到VIP
  • advert_int 1:定義檢測(cè)間隔時(shí)間為1秒
  • authentication:定義心跳檢查時(shí)所使用的認(rèn)證信息
    • auth_type PASS:定義認(rèn)證類型為密碼
    • auth_pass 123456:定義具體的密碼
  • virtual_ipaddress:定義虛擬IP(VIP),需要為同一網(wǎng)段下的IP,并且每個(gè)節(jié)點(diǎn)需要一致

完成以上配置后,啟動(dòng)keepalived服務(wù):

[root@HA-01 ~]# systemctl start keepalived

當(dāng)keepalived服務(wù)啟動(dòng)成功,使用ip addr命令可以查看到網(wǎng)卡綁定的虛擬IP:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

另一個(gè)節(jié)點(diǎn)也是使用以上的步驟進(jìn)行安裝和配置,這里就不再重復(fù)了。不過要注意virtual_router_id不能配置成一樣的,而virtual_ipaddress則必須配置成同一個(gè)虛擬ip。


測(cè)試Keepalived

以上我們完成了Keepalived的安裝與配置,最后我們來測(cè)試Keepalived服務(wù)是否正??捎?,以及測(cè)試Haproxy是否已具有高可用性。

首先,在其他節(jié)點(diǎn)上測(cè)試虛擬IP能否正常ping通,如果不能ping通就需要檢查配置了。如圖,我這里是能正常ping通的:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

常見的虛擬IP ping不通的情況:

  • 防火墻配置有誤,沒有正確開啟VRRP協(xié)議
  • 配置的虛擬IP與其他節(jié)點(diǎn)的IP不處于同一網(wǎng)段
  • Keepalived配置有誤,或Keepalived根本沒啟動(dòng)成功

確認(rèn)能夠從外部ping通Keepalived的虛擬IP后,使用Navicat測(cè)試能否通過虛擬IP連接到數(shù)據(jù)庫:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

連接成功后,執(zhí)行一些語句測(cè)試能否正常插入、查詢數(shù)據(jù):
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

到此就基本沒什么問題了,最后測(cè)試一下Haproxy的高可用性,將其中一個(gè)Haproxy節(jié)點(diǎn)上的Keepalived和Haproxy服務(wù)給關(guān)掉:

[root@HA-01 ~]# systemctl stop keepalived
[root@HA-01 ~]# systemctl stop haproxy

然后再次執(zhí)行執(zhí)行一些語句測(cè)試能否正常插入、查詢數(shù)據(jù),如下能正常執(zhí)行代表Haproxy節(jié)點(diǎn)已具有高可用性:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

最后將所有的服務(wù)恢復(fù)成運(yùn)行狀態(tài),驗(yàn)證停止的節(jié)點(diǎn)恢復(fù)之后數(shù)據(jù)是否是一致的。如下,我這里兩個(gè)Replication節(jié)點(diǎn)的數(shù)據(jù)都是一致的:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)


實(shí)踐數(shù)據(jù)歸檔

到此為止,我們就完成了高可用Replication集群的搭建。接下來就是實(shí)踐如何將大量的冷數(shù)據(jù)從PXC集群分片中剝離出來并歸檔到Replication集群中,我這里有兩個(gè)PXC集群分片:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

  • 關(guān)于PXC集群的內(nèi)容可以參考另一篇文章:為PXC集群引入Mycat并構(gòu)建完整的高可用集群架構(gòu)

每個(gè)分片里都有一張t_purchase表,其建表SQL如下。

create table t_purchase (
    id int unsigned primary key,
    purchase_price decimal(10, 2) not null comment '進(jìn)貨價(jià)格',
    purchase_num int unsigned not null comment '進(jìn)貨數(shù)量',
    purchase_sum decimal(10, 2) not null comment '進(jìn)貨總價(jià)',
    purchase_buyer int unsigned not null comment '采購者',
    purchase_date timestamp not null default current_timestamp comment '采購日期',
    company_id int unsigned not null comment '進(jìn)貨企業(yè)的id',
    goods_id int unsigned not null comment '商品id',
    key idx_company_id(company_id),
    key idx_goods_id(goods_id)
) comment '進(jìn)貨表';

每個(gè)分片合計(jì)共存儲(chǔ)了100w條進(jìn)貨數(shù)據(jù):
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

其中有60w條進(jìn)貨數(shù)據(jù)的采購日期都是2019-11-01之前的:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

現(xiàn)在的需求是將2019-11-01之前的數(shù)據(jù)都剝離出來進(jìn)行歸檔,這要如何實(shí)現(xiàn)呢?自己寫代碼肯定是比較麻煩的,好在Percona工具包里提供了一個(gè)用于歸檔數(shù)據(jù)的工具:pt-archiver,使用該工具可以很輕松的完成數(shù)據(jù)歸檔,免除了自己寫歸檔程序的麻煩。pt-archiver主要有兩個(gè)用途:

  • 將線上數(shù)據(jù)導(dǎo)出到線下做數(shù)據(jù)處理
  • 清理過期數(shù)據(jù),并把數(shù)據(jù)歸檔到本地歸檔表中,或者遠(yuǎn)程歸檔服務(wù)器

想要使用pt-archiver首先得安裝Percona工具包:

[root@node-A ~]# yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
[root@node-A ~]# percona-release enable ps-80 release
[root@node-A ~]# yum install -y percona-toolkit

安裝完成后,驗(yàn)證pt-archiver命令是否可用:

[root@node-A ~]# pt-archiver --version
pt-archiver 3.1.0
[root@node-A ~]# 

接著就可以使用pt-archiver命令進(jìn)行數(shù)據(jù)的歸檔了,首先需要在Replication集群中創(chuàng)建一張歸檔表,表名以歸檔的數(shù)據(jù)日期為后綴,存儲(chǔ)引擎使用TokuDB。具體的建表SQL如下:

create table t_purchase_201910 (
    id int unsigned primary key,
    purchase_price decimal(10, 2) not null comment '進(jìn)貨價(jià)格',
    purchase_num int unsigned not null comment '進(jìn)貨數(shù)量',
    purchase_sum decimal(10, 2) not null comment '進(jìn)貨總價(jià)',
    purchase_buyer int unsigned not null comment '采購者',
    purchase_date timestamp not null default current_timestamp comment '采購日期',
    company_id int unsigned not null comment '進(jìn)貨企業(yè)的id',
    goods_id int unsigned not null comment '商品id',
    key idx_company_id(company_id),
    key idx_goods_id(goods_id)
) engine=TokuDB comment '2019年10月的進(jìn)貨數(shù)據(jù)歸檔表';

然后使用pt-archiver命令完成數(shù)據(jù)歸檔,如下示例:

[root@node-A ~]# pt-archiver --source h=192.168.190.100,P=3306,u=admin,p=Abc_123456,D=test,t=t_purchase --dest h=192.168.190.101,P=3306,u=archive,p=Abc_123456,D=test,t=t_purchase_201910 --no-check-charset --where 'purchase_date < "2019-11-01 0:0:0"' --progress 50000 --bulk-delete --bulk-insert --limit=100000 --statistics
  • Tips:pt-archiver命令是使用load data語句進(jìn)行數(shù)據(jù)導(dǎo)入的,所以要確保MySQL開啟了local_infile。如果沒有開啟的話歸檔數(shù)據(jù)會(huì)失敗,可以使用set global local_infile = 'ON';語句來開啟local_infile

命令參數(shù)說明:

  • --source:指定從哪個(gè)數(shù)據(jù)庫讀取數(shù)據(jù)
  • --dest:指定將數(shù)據(jù)歸檔至哪個(gè)數(shù)據(jù)庫
  • --no-check-charset:不檢查數(shù)據(jù)的字符集
  • --where:指定將哪些數(shù)據(jù)進(jìn)行歸檔,在本例中就是將2019-09-11之前的數(shù)據(jù)進(jìn)行歸檔
  • --progress:指定當(dāng)歸檔完多少條數(shù)據(jù)時(shí)打印一次狀態(tài)信息
  • --bulk-delete:指定批量刪除歸檔數(shù)據(jù)。數(shù)據(jù)的刪除有事務(wù)保證,不會(huì)出現(xiàn)未歸檔成功就將數(shù)據(jù)刪除了的情況
  • --bulk-insert:指定批量寫入歸檔數(shù)據(jù)
  • --limit:指定每次歸檔多少條數(shù)據(jù)
  • --statistics:歸檔數(shù)據(jù)完成后打印統(tǒng)計(jì)信息

等待大約15分鐘左右數(shù)據(jù)就歸檔完成了,輸出的統(tǒng)計(jì)信息如下:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

此時(shí)在Replication集群上可以看到那60w數(shù)據(jù)都已經(jīng)存儲(chǔ)到了歸檔表中:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

而原本的PXC集群中就只剩40w數(shù)據(jù)了:
搭建高可用的Replication集群歸檔大量的冷數(shù)據(jù)

如此一來我們就完成了冷熱數(shù)據(jù)分離,并將大量的冷數(shù)據(jù)存儲(chǔ)至指定的歸檔數(shù)據(jù)庫中。


總結(jié)

  • 將冷熱數(shù)據(jù)分離,低價(jià)值的冷數(shù)據(jù)存儲(chǔ)至歸檔庫,維持熱數(shù)據(jù)的讀寫效率
  • 使用TokuDB引擎保存歸檔數(shù)據(jù),擁有高速寫入特性
  • 使用雙機(jī)熱備方案搭建歸檔庫,具備高可用性
  • 使用pt-archiver可以導(dǎo)出大量數(shù)據(jù)并歸檔存儲(chǔ),且簡(jiǎn)便易行
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI