摘要:摘要本文主要介紹了亞馬遜的使用過程中發(fā)現(xiàn)的問題以及基于亞馬遜實例自己搭建服務(wù)器的一些經(jīng)驗。之前公司使用亞馬遜的實例,一切都非常好。但是我們架設(shè)在亞馬遜實例上的服務(wù)器為了安全起見都是跨網(wǎng)段的,不支持,實現(xiàn)不了啊。
摘要
本文主要介紹了亞馬遜RDS的使用過程中發(fā)現(xiàn)的問題以及基于亞馬遜EC2實例自己搭建Mysql服務(wù)器的一些經(jīng)驗。
初始公司項目初始,就使用了亞馬遜的各項云服務(wù),亞馬遜的各項服務(wù)真的非常棒,大大簡化了公司產(chǎn)品的擴容和運維工作。
之前公司使用亞馬遜的EC2實例,一切都非常好。隨著業(yè)務(wù)的擴展,客戶需要mysql關(guān)系型數(shù)據(jù)庫,為了使用方便,我們選了亞馬遜提供的RDS服務(wù),這玩意兒就是那么簡單,選個mysql版本,直接就部署好了,什么my.cnf 文件,那是啥?我不關(guān)心啊。
開始運行的挺好,各種方便,還能動態(tài)制作一個主機的鏡像實例,真是簡單又省心。
隨著用戶量的增加,高可用和負載均衡提上了日程。
高可用?很簡單啊,亞馬遜的RDS高可用跟用戶沒關(guān)系,他自己內(nèi)部都冗余好了,亞馬遜系統(tǒng)自己準備的slave會頂上去的;負載均衡,嗯,這有點麻煩,我找找資料。
深入亞馬遜提供了一個通用的ELB模塊,來動態(tài)分配訪問落到哪臺RDS上,但兩臺RDS的數(shù)據(jù)一致性怎么解決呢?
mysql社區(qū)版本并不提供集群服務(wù),也就是說實際上在很多mysql系統(tǒng)中,并沒有官方的負載均衡的解決方案,這就意味著,如果要從系統(tǒng)層面解決,必須使用第三方工具,或者通過用戶的應(yīng)用代碼來完成?,F(xiàn)在RDS就是提供一個數(shù)據(jù)庫鏈接,所有系統(tǒng)工具都不能用。
第三方系統(tǒng)工具用不了,那么讓用戶改代碼?這豈不是和我們的目標沖突了?我們的目標就是讓用戶能夠零修改就能使用我們服務(wù)。
于是,我們分析了RDS的狀況。
優(yōu)點:
簡單易用
自動高可用
定期有snapshot
缺點:
缺乏系統(tǒng)級的數(shù)據(jù)庫管理界面
沒有root權(quán)限
…(不說了)
缺點的第一和第二兩點,足以讓我們放棄RDS的應(yīng)用了。
這難道就是一言不合就開撕?呵呵,并不是,如果亞馬遜的RDS能交出root權(quán)限,能解決數(shù)據(jù)同步,讀寫分離,負載均衡,動態(tài)遷移… 。嗯,我們還會是好朋友的 ?。
棄坑挖新坑好了言歸正傳,我們轉(zhuǎn)手搞了3臺EC2實例,搭了三個mysql,一主兩叢,結(jié)構(gòu)是1常主,一備主,一永從。
這很好理解了,2臺做主的,性能比較好,一臺永從的,只做數(shù)據(jù)備份用,按照一定的時間間隔備份數(shù)據(jù)到S3服務(wù)器上。
這里要介紹一個熟悉mysql都會知道的專門搞mysql,擴展mysql的大牛公司:PERCONA。寫下這個幾個字母的時候,俺的心情是激動的,所以都是大寫的。
大家都知道m(xù)ysql的存儲引擎現(xiàn)在主流的有兩種MyISAM和INNODB,其中的差別我們不說,只說數(shù)據(jù)備份,MyISAM的備份很簡單,拷貝復(fù)制; INNODB的備份就扯了,用mysqldump 命令對數(shù)據(jù)庫進行蹂躪。有時還會偶爾疏忽,漏了個參數(shù),咋辦?vi打開sql文件改幾十,幾百個地方?還是再來重復(fù)蹂躪一下,再dump一遍?Oh my god,太痛苦了,想想就是一場噩夢。
一方有難八方支援之一Percona華麗麗的給出了一份在線熱備的工具XtraBackup。這真是mysql admin的居家旅行,XXXX的利器啊,老鳥可以不用在意,小鳥同學(xué)們,你們可要好好的掌握這一大殺器??!
XtraBackup在運行期間,不鎖庫,不鎖庫,不鎖庫。重要的事情說三遍,光這個優(yōu)勢就可以棄用mysqldump了。
還有什么增量備份,差異備份,單庫備份恢復(fù)等等,猶如瑞士軍刀,總有一件適合你。
下面給三條命令:
備份(備份的時候不需要停服務(wù),如果是主庫,用戶是無感的)
innobackupex --defaults-file=/etc/my.cnf --user="root" --password="xxxxx" /opt/data/abcd --no-timestamp
注:/opt/data/abcd 是指定數(shù)據(jù)庫備份輸出的目錄, --no-timestamp讓工具不要主動生成時間戳目錄
恢復(fù)
innobackupex --user=root --default-file=/etc/my.cnf --apply-log /opt/data/abcd innobackupex --user=root --default-file=/etc/my.cnf --copy-back /opt/data/abcd
注1:以上是兩條命令
注2:恢復(fù)之前,需要停mysql服務(wù),刪除mysql的data目錄下的所有數(shù)據(jù),恢復(fù)完之后,需要執(zhí)行命令chown –R 命令把mysql data目錄改為mysql:mysql ,之后啟動mysql 服務(wù)。
Xtrabackup輸出的數(shù)據(jù)目錄會有一個文件,里面記錄了bin-log文件的序號和position位置,也就是說,我們在執(zhí)行Xtrabackup命令進行備份的時候,此時輸出的數(shù)據(jù),是和此文件序號中的position位置的log記錄相匹配的。(如果你搭建過主從,就會明白,否則就會認為我在胡言亂語。)
想要深入了解Xtrabackup是怎么干的,可以去看下[Mysql技術(shù)內(nèi)幕-InnoDB存儲引擎]。
有了這個工具,搭建主從不要太方便。
先找臺做主服務(wù)的EC2,搭個mysql。
裝下google的半同步插件(寫到這里,不禁想到,RDS不知道是用的是啥,難道是異步同步)
INSTALL PLUGIN rpl_semi_sync_master SONAME "semisync_master.so"; INSTALL PLUGIN rpl_semi_sync_slave SONAME "semisync_slave.so";
把REPLICATION SLAVE和REPLICATION CLIENT都搞上,然后就能用Xtrabackup來一式兩份了。
GRANT REPLICATION SLAVE ON *.* to "xxx"@"%" identified by "xxx"; GRANT REPLICATION CLIENT ON *.* to "xxx"@"%" identified by "xxx";
把Xtrabackup輸出的目錄打個包,scp到兩臺從機上,恢復(fù)并啟動mysql服務(wù)之后,執(zhí)行命令:
CHANGE MASTER TO MASTER_HOST="xxx",master_port=3306,master_user="xxx",master_password="xxx",master_log_file="xxx",master_log_pos=xxx;
命令中的xxx各不相同哦,各位謹慎。
master_log_file="xxx",master_log_pos=xxx; 這兩個數(shù)據(jù)可以從xtrabackup_binlog_pos_innodb 文件中獲取。
然后在mysql命令行下 show slave statusG; 看下主從復(fù)制的情況,就萬事OK了!
一方有難八方支援之二既然搭建了主從,那么MHA也是必須的。
MHA項目地址 https://code.google.com/p/mys...
雖然這個項目許久沒有更新,不過歷史證明還是蠻可靠的。
我曾經(jīng)做過一個無負載測試,搞了1600多次,每次都在10-15秒之內(nèi)順利切換完成。如果你的服務(wù)器能停止mysql服務(wù)1600多次,那我還能說什么呢?
MHA一般配合Keepalived 給App提供一個唯一可用的mysql鏈接ip,一旦MHA腳本檢測到mysql 服務(wù)中斷,可以自己寫腳本,中斷目標服務(wù)器的keepalived服務(wù),這樣VIP就漂移到新的服務(wù)器上,繼續(xù)提供服務(wù)了。
但是我們架設(shè)在亞馬遜EC2實例上的mysql服務(wù)器為了安全起見都是跨網(wǎng)段的,Keepalived不支持,實現(xiàn)不了啊。還好天無絕人之路,EC2實例提供了輔助私有ip的功能,用AWS命令為主服務(wù)器添加一個輔助私有IP,并且把原來的輔助私有IP回收掉,不就可以了嗎?
想到就干。
回收:
aws ec2 unassign-private-ip-addresses --network-interface-id xxx --private-ip-addresses $VIP
添加:
aws ec2 assign-private-ip-addresses --network-interface-id xxx --private-ip-addresses $VIP --allow-reassignment
之后我們看下MHA提供的代碼:
打開文件master_ip_failover 這是用perl寫的(寫到這里,又情不自禁的想到了,誰說perl不行了,系統(tǒng)管理處處是perl??!):
GetOptions( "command=s" => $command, "orig_master_host=s" => $orig_master_host, "orig_master_ip=s" => $orig_master_ip, "orig_master_port=i" => $orig_master_port, "orig_master_user=s" => $orig_master_user, "orig_master_password=s" => $orig_master_password, "new_master_host=s" => $new_master_host, "new_master_ip=s" => $new_master_ip, "new_master_port=i" => $new_master_port, "new_master_user=s" => $new_master_user, "new_master_password=s" => $new_master_password, );
這串代碼蠻關(guān)鍵,是上游代碼調(diào)用該腳本時傳進來的參數(shù),這些參數(shù)也蠻好理解,望文生意的。通過這些拿到的ip,帳號,就能上服務(wù)器去折騰一下,重新分配IP到備主上,這樣就能很方便的完成常主->備主的切換了。
再看下MHA的配置腳本:
[server default] user=xxx password=xxx repl_user=xxx ssh_user=xxx master_binlog_dir=/opt/mysql remote_workdir=/var/log/masterha secondary_check_script= masterha_secondary_check -s x.x.x.x -s x.x.x.x -s x.x.x.x ping_interval=3 master_ip_failover_script=/mha4mysql/script/master_ip_failover_app1 report_script= /mha4mysql/script/send_report [server1] candidate_master=1 hostname=x.x.x.x [server2] candidate_master=1 hostname=x.x.x.x [server3] no_master=1 hostname=x.x.x.x
需要解釋下的包括:
secondary_check_script= masterha_secondary_check -s x.x.x.x -s x.x.x.x -s x.x.x.x
mha檢查機制,內(nèi)置的,咱不用管,只要接著填寫-s 后面的ip就好了,有幾個就填幾個。
ping_interval=3
俗語說叫采樣間隔,放這兒就叫探測間隔吧。
master_ip_failover_script=/mha4mysql/script/master_ip_failover_app1
failover時執(zhí)行的腳本,做一些IP回收,分配啥的,主從強制數(shù)據(jù)同步,以及最新數(shù)據(jù)源挑選等在主服務(wù)器拒絕服務(wù)之后,MHA內(nèi)置腳本幫我們都搞定了,我們也不要care了。(我們這里不用選,就一個 ?)
report_script= /mha4mysql/script/send_report
這個也挺關(guān)鍵,failover之后發(fā)送郵件通知,要不數(shù)據(jù)庫少了一個服務(wù),你還不知道,那不是扯淡么。
后臺Daemon運行:
nohup masterha_manager --conf=/etc/app1.cnf < /dev/null >> /var/log/masterha/app1.log 2>&1 &
好了,一套可靠的mysql服務(wù)就搭好了。
那么各位要說了,MHA搞定了,那負載均衡呢?
呃~ 各位等我喝口水,且聽下回分解吧,哈哈!
作者信息
原文作者來自 MaxLeap 團隊_Service&Infra 成員:Kevin, 喜歡開發(fā)一些小腳本來協(xié)助流程建設(shè)。
力譜宿云 LeapCloud首發(fā):https://blog.maxleap.cn/archi...
相關(guān)閱讀
快速部署Test-Driven Development/Debug環(huán)境
歡迎大家來請關(guān)注我們的微信公眾號:MaxLeap_yidongyanfa
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/11766.html
摘要:為了減少在中創(chuàng)建的字符串的數(shù)量,字符串類維護了一個字符串常量池。但是當(dāng)執(zhí)行了方法后,將指向字符串常量池中的那個字符串常量。由于和都是字符串常量池中的字面量的引用,所以。究其原因,是因為常量池要保存的是已確定的字面量值。 String,是Java中除了基本數(shù)據(jù)類型以外,最為重要的一個類型了。很多人會認為他比較簡單。但是和String有關(guān)的面試題有很多,下面我隨便找兩道面試題,看看你能不能...
摘要:一結(jié)構(gòu)體的聲明與定義結(jié)構(gòu)體的聲明結(jié)構(gòu)是一些值的集合,這些值稱為成員變量。但是結(jié)構(gòu)體變量的變量名并不是指向該結(jié)構(gòu)體的地址,所以要使用取地址運算符才能獲取其地址。因此,結(jié)構(gòu)體傳參的時候,要傳結(jié)構(gòu)體的地址。 ...
摘要:如果手動的維護編寫格式的數(shù)據(jù)是很麻煩的,所以推薦生成數(shù)據(jù)來方便我們進行接口的測試。用真實數(shù)據(jù)測試將使你的應(yīng)用程序更加健壯,因為你會有可能發(fā)現(xiàn)生產(chǎn)前一天發(fā)布的錯誤。 如果你正在測試一個線上產(chǎn)品,你會想確保你的密切模擬生產(chǎn)環(huán)境條件下的測試。在生產(chǎn)中,你將有用戶的軍隊在你的應(yīng)用程序乒乒乓乓,并用數(shù)據(jù)填充數(shù)據(jù)庫,這是你的代碼壓力。更糟的是,你輸入的數(shù)據(jù)將偏向你自己的使用模式,將不符合實際使用,...
摘要:正文以下,我將闡述一下,怎么樣在多主機網(wǎng)絡(luò)中運行。舉個例子,當(dāng)你在主機上運行發(fā)現(xiàn)服務(wù)的時候,你可以這樣啟動節(jié)點這個節(jié)點就會自己把自己注冊到發(fā)現(xiàn)服務(wù)中去,并且加入名為的集群中。 譯者前言 Percona 所維護的XtraDB 是mysql的一個分支,使用了性能比innodb更加出色的xtrodb驅(qū)動,XtraDB-Cluster產(chǎn)品,是其集群化的方案,方案內(nèi)容,請自行g(shù)oogle。最近X...
閱讀 698·2021-11-15 11:37
閱讀 4189·2021-09-09 09:34
閱讀 3592·2019-08-30 15:52
閱讀 2631·2019-08-29 14:03
閱讀 2870·2019-08-26 13:36
閱讀 1617·2019-08-26 12:16
閱讀 1619·2019-08-26 11:45
閱讀 3513·2019-08-23 18:41