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