乘機(jī)房搬遷的機(jī)會(huì),打算做一次業(yè)務(wù)整合?,F(xiàn)有的架構(gòu)是在2010年規(guī)劃并運(yùn)營(yíng)起來(lái)的,隨著時(shí)間的推移,項(xiàng)目也越來(lái)越多。打開(kāi)nginx配置文件,有四十多行include包含存在,每一個(gè)包含就是一個(gè)項(xiàng)目(有些是web,有些是app)。一整個(gè)機(jī)柜,老舊的設(shè)備,負(fù)載均衡高可用架構(gòu)。為保證業(yè)務(wù)一致性和降低成本,業(yè)務(wù)數(shù)據(jù)(開(kāi)發(fā)的應(yīng)用程序及用戶(hù)上傳數(shù)據(jù))共享一套NFS;各業(yè)務(wù)共享同一套物理數(shù)據(jù)庫(kù)(一臺(tái)物理服務(wù)器mysql創(chuàng)建多個(gè)庫(kù))。隨著業(yè)務(wù)和訪問(wèn)量的增長(zhǎng),這種隱患越來(lái)越令人擔(dān)憂(yōu),主要表現(xiàn)在以下幾個(gè)方面:
創(chuàng)新互聯(lián)建站專(zhuān)注于普陀網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供普陀營(yíng)銷(xiāo)型網(wǎng)站建設(shè),普陀網(wǎng)站制作、普陀網(wǎng)頁(yè)設(shè)計(jì)、普陀網(wǎng)站官網(wǎng)定制、微信小程序開(kāi)發(fā)服務(wù),打造普陀網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供普陀網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。◆安全問(wèn)題
數(shù)十個(gè)站點(diǎn)共享目錄,以nfs方式共享給各物理服務(wù)器,這幾十個(gè)項(xiàng)目,只要任何一個(gè)有安全漏洞存在,有心人都能進(jìn)來(lái)為所欲為,讓站點(diǎn)全部淪陷。時(shí)不時(shí)的,被人注入惡意代碼,針對(duì)性的進(jìn)行清除,但沒(méi)多久又被注入篡改。大家心里都有數(shù),存在漏洞的地方,不一定是被篡改的那個(gè)。但站點(diǎn)太多,又沒(méi)有隔離,根本無(wú)法用安全工具掃描(一個(gè)站點(diǎn)進(jìn)行掃描,平均花費(fèi)一天)。
[root@web57 ~]# more /usr/local/nginx/conf/nginx.conf user www www; worker_processes 6;
worker_rlimit_nofile 51200;
events { use epoll; #use kqueue; #FreeBSD system worker_connections 51200; }
http { include mime.types; default_type application/octet-stream; #charset gb2312; server_names_hash_bucket_size 256; client_header_buffer_size 256k; large_client_header_buffers 4 256k; client_max_body_size 500m; …………………………………………省略若干………………………………… include vhosts/faxian.quanzhen.com.conf; include vhosts/www.quanzhen.com.conf; include vhosts/news.quanzhen.com.conf; include vhosts/s.quanzhen.com.conf; include vhosts/down.quanzhen.com.conf; include vhosts/static.quanzhen.com.conf; include vhosts/image.quanzhen.com.conf; include vhosts/3g.quanzhen.com.conf; include vhosts/mini.quanzhen.com.conf; include vhosts/xml.quanzhen.com.conf; include vhosts/mayiapi.quanzhen.com.conf; include vhosts/www.android77.com.conf; include vhosts/fahongbao.android77.com.conf; include vhosts/update.android77.com.conf; include vhosts/dev.quanzhen.com.conf; include vhosts/qr.110.cc.conf; include vhosts/110.cc.conf; include vhosts/eggserver.quanzhen.com.conf; include vhosts/apkegg.quanzhen.com.conf; include vhosts/eggserver.yidong7.cn.conf; include vhosts/www.yidong7.cn.conf; include vhosts/down.yidong7.cn.conf; include vhosts/wan.quanzhen.com.conf; include vhosts/open.quanzhen.com.conf; include vhosts/bakdown.yidong7.cn.conf ; include vhosts/hanhua.quanzhen.com.conf; include vhosts/mpk.quanzhen.com.conf; include vhosts/android.quanzhen.com.conf; include vhosts/pay.quanzhen.com.conf; include vhosts/cmstop.quanzhen.cn.conf; include vhosts/news.quanzhen.cn.conf; include vhosts/pingce.quanzhen.cn.conf; include vhosts/gonglue.quanzhen.cn.conf; include vhosts/hao.quanzhen.cn.conf; include vhosts/all.quanzhen.cn.conf; include vhosts/s.quanzhen.cn.conf; include vhosts/apkz.quanzhen.com.conf; include vhosts/ajax.quanzhen.com.conf; include vhosts/union.quanzhen.com.conf; include vhosts/mai.quanzhen.com.conf; include vhosts/blog.quanzhen.com.conf; include vhosts/guazi.quanzhen.com.conf; include vhosts/lockscreen.yidong7.cn.conf; include vhosts/dsp.pujia8.com.conf; include vhosts/3svx4haii9.quanzhen.com.conf; include vhosts/u.quanzhen.com.conf; include vhosts/bianji.quanzhen.com.conf; include vhosts/default.conf; } |
◆性能問(wèn)題
主要集中在數(shù)據(jù)庫(kù)上邊,只要有一個(gè)庫(kù)出現(xiàn)問(wèn)題,引起鎖表或者其它競(jìng)爭(zhēng),全部相關(guān)業(yè)務(wù)都會(huì)掛起,煩不勝煩啊。想進(jìn)行拆分,決策人認(rèn)為,本來(lái)就滿(mǎn)機(jī)柜了,如果再新家機(jī)器,得另租機(jī)柜,考慮到成本等其它問(wèn)題,只求不出事即可。
整合的計(jì)劃是,遷移部分業(yè)務(wù)到公有云上,騰出服務(wù)器后,對(duì)現(xiàn)有的設(shè)備進(jìn)行擴(kuò)充配置(拼內(nèi)存、硬盤(pán)等,古舊的機(jī)器直接下架)。留下配置高的,進(jìn)行虛擬化,既能減少設(shè)備數(shù)量(托管費(fèi)降低),又有利于日常維護(hù)。
前邊說(shuō)了這么多,似乎與技術(shù)關(guān)系不大,但對(duì)于一些有遺留問(wèn)題的項(xiàng)目,還是具有參考意義。接下來(lái),我們就進(jìn)入正題,看看我們要遷移的項(xiàng)目狀況。要往云上遷移的數(shù)據(jù)包括網(wǎng)站數(shù)據(jù)及數(shù)據(jù)庫(kù)數(shù)據(jù),網(wǎng)站數(shù)據(jù)比較好辦,rsync同步到對(duì)應(yīng)的目錄,而數(shù)據(jù)庫(kù)相對(duì)而言,要麻煩不少。兩個(gè)數(shù)據(jù)庫(kù),一個(gè)容量38G,另一個(gè)29G,不算太大,但公用的ibdata1文件卻有123G,最初是嘗試把這兩個(gè)庫(kù),直接導(dǎo)入到阿里云的RDS,在進(jìn)行數(shù)次操作失敗后,咨詢(xún)客服得到的答復(fù)是RDS暫時(shí)不支持分表的數(shù)據(jù)庫(kù)。為節(jié)省成本,購(gòu)買(mǎi)一個(gè)配置高一點(diǎn)的云主機(jī)(cpu 8core,內(nèi)存32G,1T高效云盤(pán)),部署上mysql5.6,供兩個(gè)數(shù)據(jù)庫(kù)使用。
第一次嘗試
預(yù)估了一下,200G的數(shù)據(jù),貪心一把,看一次性能不能遷移完。提前幾天,把云上的環(huán)境全部準(zhǔn)備妥當(dāng)(能出來(lái)測(cè)試頁(yè)),運(yùn)營(yíng)部門(mén)把通知發(fā)下去,然后某天夜里0:30分,一些人在辦公室,一些人在家里,瞇著眼,莊重地在鍵盤(pán)敲入“screen”這幾個(gè)字符。在qq群里得到一致許可,可以進(jìn)行數(shù)據(jù)庫(kù)導(dǎo)出操作以后,小弟小心翼翼地發(fā)來(lái)一條指令:
[root@db-209 ~]# innobackupex --user=root --passwor='i%=KGb76' \ --defaults-file=/etc/my.cnf \ --databases=“quanzhen_mobile7lockscreen quanzhen_equipment” /data/bakmysql/ InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy and Percona Ireland Ltd 2009-2012. All Rights Reserved.
This software is published under the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.
180618 00:30:31 innobackupex: Starting mysql with options: --defaults-file='/etc/my.cnf' --password=xxxxxxxx --user='root' --unbuffered -- 180618 00:30:31 innobackupex: Connected to database with mysql child process (pid=20090) 180618 00:30:37 innobackupex: Connection to database server closed IMPORTANT: Please check that the backup run completes successfully. At the end of a successful backup run innobackupex prints "completed OK!".
innobackupex: Using mysql Ver 14.12 Distrib 5.0.95, for redhat-linux-gnu (x86_64) using readline 5.1 innobackupex: Using mysql server version Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
innobackupex: Created backup directory /data/bakmysql/2018-06-18_00-30-37 180618 00:30:37 innobackupex: Starting mysql with options: --defaults-file='/etc/my.cnf' --password=xxxxxxxx --user='root' --unbuffered -- 180618 00:30:37 innobackupex: Connected to database with mysql child process (pid=20123) 180618 00:30:39 innobackupex: Connection to database server closed
180618 00:30:39 innobackupex: Starting ibbackup with command: xtrabackup_55 --defaults-file="/etc/my.cnf" --defaults-group="mysqld" --backup --suspend-at-end --target-dir=/data/bakmysql/2018-06-18_00-30-37 --tmpdir=/tmp innobackupex: Waiting for ibbackup (pid=20132) to suspend innobackupex: Suspend file '/data/bakmysql/2018-06-18_00-30-37/xtrabackup_suspended'
xtrabackup_55 version 2.0.7 for Percona Server 5.5.16 Linux (x86_64) (revision id: 552) xtrabackup: uses posix_fadvise(). xtrabackup: cd to /data/mysql_db xtrabackup: Target instance is assumed as followings. xtrabackup: innodb_data_home_dir = ./ xtrabackup: innodb_data_file_path = ibdata1:10M:autoextend xtrabackup: innodb_log_group_home_dir = ./ xtrabackup: innodb_log_files_in_group = 2 xtrabackup: innodb_log_file_size = 5242880 >> log scanned up to (601191481892) [01] Copying ./ibdata1 to /data/bakmysql/2018-06-18_00-30-37/ibdata1 >> log scanned up to (601191481892) >> log scanned up to (601191481892) >> log scanned up to (601191481892) >> log scanned up to (601191481892) >> log scanned up to (601191481892) >> log scanned up to (601191481892) >> log scanned up to (601191481892) …………………………………省略…………………………………………… |
樂(lè)觀估計(jì),上午7點(diǎn)前,能完成整個(gè)遷移,幾個(gè)人商量輪流監(jiān)看進(jìn)展程度,等進(jìn)行完一步后叫醒休息的人,以便進(jìn)行下一步。結(jié)果,到凌晨六點(diǎn)多,才執(zhí)行完這個(gè)innobackupex,還差好幾步呢,每一步都同樣耗時(shí),只能宣告遷移暫時(shí)失敗,選個(gè)黃道吉日,分兩次進(jìn)行遷移。
第二次分拆遷移
萬(wàn)年歷排除近期諸事不宜的日子,再搖卦選利用用神的地支,選定日志,約上相關(guān)人等,繼續(xù)進(jìn)行遷移。有了上一次的教訓(xùn),在遷移前又對(duì)要遷移的庫(kù)做了清理,刪掉了一些無(wú)用的數(shù)據(jù),省出來(lái)好幾個(gè)G的空間。在源數(shù)據(jù)庫(kù),執(zhí)行指令:
[root@db-209 ~]#innobackupex --user=root --passwor='i%=KGb76' \ --defaults-file=/etc/my.cnf --databases=“quanzhen_equipment” /data/bakmysql/ |
我交到好以后,就躺下睡覺(jué),到凌晨三點(diǎn)電話響了,告知第一步完成。
[root@db-209 ~]#innobackupex --apply-log /data/bakmysql/2018-06-18_00-30-37 |
日志應(yīng)用倒是執(zhí)行的很快,回車(chē)即完。然后進(jìn)行tar 打包和復(fù)制文件到目標(biāo)服務(wù)器,由于租賃的出口帶寬太?。値?0M,現(xiàn)在讀者知道為什么要夜間訪問(wèn)低谷進(jìn)行遷移了吧?),復(fù)制文件到目標(biāo)服務(wù)花了一些時(shí)間。
目標(biāo)服務(wù)器,僅僅需要安裝好mysql軟件,創(chuàng)建好目錄/data/mysql_db,不需要執(zhí)行數(shù)據(jù)庫(kù)初始化操作,因?yàn)閕nnobackupex導(dǎo)入時(shí),要求數(shù)據(jù)目錄必須為空。阿里云的配置,遠(yuǎn)比源服務(wù)器配置高,解壓文件很快就完成。
檢查一下mysql選項(xiàng)文件/etc/my.cnf,注意是選項(xiàng)文件。設(shè)定“—datadir=/data/mysql_db”,就可執(zhí)行導(dǎo)入操作,指令如下:
[root@msyql mysql_db]#innobackupex --defaults-file=/etc/my.cnf \ --copy-back /data/db_bk/2018-06-18_00-30-37 |
源數(shù)據(jù)導(dǎo)出時(shí),沒(méi)有把庫(kù)mysql一并導(dǎo)出,這倒不是什么要緊的事情,反正只有一個(gè)賬戶(hù)需要?jiǎng)?chuàng)建。接下來(lái),初始化數(shù)據(jù)庫(kù)并創(chuàng)建應(yīng)用帳號(hào),具體操做如下:
[root@msyql mysql_db]#cd /usr/local/mysql/ [root@msyql ~]#scripts/mysql_install_db --user=mysql --datadir=/data/mysql_db [root@msyql ~]#mysql mysql>grant all on quanzhen_equipment.* to …… |
還要記得給mysql空密碼消除掉。
源庫(kù)與目標(biāo)庫(kù),比對(duì)一下表的數(shù)量,以及隨機(jī)抽取一些大表,對(duì)記錄數(shù)進(jìn)行比較。確認(rèn)數(shù)據(jù)完整以后,一幫去調(diào)試應(yīng)用,后續(xù)工作不表,沒(méi)我什么事。
第三次分拆遷移
有了上一次的成功經(jīng)驗(yàn),這次信心滿(mǎn)滿(mǎn)了,不過(guò)擔(dān)心還是有的,就是那個(gè)目標(biāo)庫(kù)導(dǎo)入時(shí),要求數(shù)據(jù)目錄為空。小弟在未開(kāi)始時(shí),就來(lái)征求我的意見(jiàn),我擔(dān)心可能會(huì)有障礙,就對(duì)他說(shuō),你只要把源站數(shù)據(jù)導(dǎo)出準(zhǔn)備好,放到目標(biāo)數(shù)據(jù)庫(kù),余下的我親自搞定。
自己的選擇有兩個(gè),一個(gè)是使用選項(xiàng)“--force-non-empty-directories”,如果不行,就再弄一個(gè)mysql實(shí)例,啟用3307端口,雙實(shí)例運(yùn)行。先嘗試第一個(gè)選項(xiàng),看能不能進(jìn)行下去,具體指令為:
[root@msyql db_bk]# pwd /data/db_bk [root@msyql db_bk]#innobackupex --defaults-file=/etc/my.cnf --copy-back \ --force-non-empty-directories 2018-06-22_00-24-52 180623 23:31:57 innobackupex: Starting the copy-back operation
IMPORTANT: Please check that the copy-back run completes successfully. At the end of a successful copy-back run innobackupex prints "completed OK!".
innobackupex version 2.4.11 based on MySQL server 5.7.19 Linux (x86_64) (revision id: b4e0db5) innobackupex: Can't create/write to file '/data/mysql_db/ib_logfile0' (Errcode: 17 - File exists) [01] error: cannot open the destination stream for ib_logfile0 [01] Error: copy_file() failed. |
悲催了,有同名文件存在,不行!直接終止運(yùn)行。好吧,我把文件“ib_logfile0、ib_logfile1”挪走,再執(zhí)行,還是不行,提示文件“ibdata1”存在,這可是個(gè)大家伙。雖然擔(dān)心新導(dǎo)入的ibdata1可能不包含現(xiàn)有數(shù)據(jù)庫(kù)相關(guān)信息,但忍不住想試一把??赡苡凶x者會(huì)問(wèn),這樣搞可能把數(shù)據(jù)庫(kù)原有的數(shù)據(jù)破壞掉了,其實(shí)我想到這一層來(lái),老早我就把整個(gè)庫(kù)做了備份,買(mǎi)了保險(xiǎn)的。
正全神貫注盯著屏幕查看輸出,希望進(jìn)展順利,突然,qq群有消息傳來(lái),問(wèn)進(jìn)展如何,啥時(shí)能完成。一看時(shí)間,六點(diǎn)了,北方大地已經(jīng)一片光明。時(shí)間來(lái)不及了,停掉進(jìn)程,試試直接復(fù)制文件,不使用innobuckupex。心中沒(méi)底,就去仔細(xì)比較了數(shù)據(jù)庫(kù)目錄與導(dǎo)出數(shù)據(jù)目錄中的三個(gè)文件“ibdata1、ib_logfile0、ib_logfile1”,發(fā)現(xiàn)其大小完全相同。不管了,把現(xiàn)有數(shù)據(jù)庫(kù)里的這幾個(gè)文件搬走,從導(dǎo)出目錄cp來(lái)著三個(gè)文件。復(fù)制完,執(zhí)行mysqld_safe啟動(dòng)服務(wù),失敗,提示ib_logfile0無(wú)寫(xiě)入權(quán)限;這好辦,一條chown指令而已。再執(zhí)行啟動(dòng)mysql服務(wù),正常。
那么數(shù)據(jù)對(duì)不對(duì)呢?我不能確定,萬(wàn)一不對(duì),就再配一個(gè)mysql,導(dǎo)入數(shù)據(jù),以雙實(shí)例啟動(dòng),后邊再想法整合;阿里云購(gòu)買(mǎi)的服務(wù)器,相互通信是內(nèi)網(wǎng),不會(huì)在傳輸上浪費(fèi)太多時(shí)間。
既然服務(wù)正常,就對(duì)一下數(shù)據(jù)吧,萬(wàn)一運(yùn)氣爆棚(前幾天夜里夢(mèng)到自己能飛,抓住一只巨型天鵝,我美美地?fù)е禊Z的脖子…),數(shù)據(jù)完整可用呢!我自己悄悄對(duì)比了一陣,沒(méi)差異呢,又到qq群呼叫其它人,說(shuō)導(dǎo)入有障礙,數(shù)次不成功,后邊采取了一些不確定的手段,mysql服務(wù)是起來(lái)了,請(qǐng)大家核實(shí)一下數(shù)據(jù),看是否完整可用。幾個(gè)程序員一陣忙碌,得到答復(fù),數(shù)據(jù)是完整可用的。到此,我的工作完成了。
有人可能要鄙視我一番,為什么不先測(cè)試?不制定完善的流程?這個(gè)問(wèn)題問(wèn)得好!我數(shù)次建議決策人,準(zhǔn)備點(diǎn)資源,說(shuō)白了就是準(zhǔn)備1臺(tái)空閑服務(wù)器,再內(nèi)網(wǎng)演練,就算白天也能能進(jìn)行(復(fù)制數(shù)據(jù)走內(nèi)網(wǎng),不在用戶(hù)訪問(wèn)的帶寬),但是,沒(méi)有資源給我啊,但事情又不得不做。雖然累點(diǎn),折騰一番,翻過(guò)來(lái)想,咱玩懸的也獲得經(jīng)驗(yàn),不然也沒(méi)有這個(gè)文章問(wèn)世,你們覺(jué)得覺(jué)呢?
本文名稱(chēng):螞蟻搬家式遷移mysql數(shù)據(jù)庫(kù)-創(chuàng)新互聯(lián)
文章位置:http://www.rwnh.cn/article32/dsoppc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、App設(shè)計(jì)、微信小程序、Google、網(wǎng)站制作、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容