mysql 主主互备实现
? ? ?今天星期天,么事就寫個MYSQL的主主架構(gòu)的博客,原理如下圖,不是我畫的網(wǎng)上找的。
| 主機作用 | 操作系統(tǒng) | mysql版本 | 對應(yīng)IP | vip數(shù)據(jù)庫 |
| mysqlA(主) | centos6.4 | mysql?5.5.48 | 192.168.48.129 | 192.168.48.126 |
| mysqlB(備) | centos6.4 | mysql?5.5.48 | 192.168.48.132 |
? 一: 在每個節(jié)點安裝mysql數(shù)據(jù)庫:
? ? ? ?《1》到官網(wǎng)去下載最新的yum倉庫,并安裝
??????? http://dev.mysql.com/downloads/repo/yum/ ?
????????yum install mysql-community-server
? ? ? ?《2》用第三方y(tǒng)um
????????????1、導(dǎo)入第三方源webtatic
????????????????rpm -Uvh http://repo.webtatic.com/yum/el6/latest.rpm
????????????2、如果已安裝低版本的mysql就刪除
????????????????yum remove mysql mysql-*
????????????3、安裝libmysqlclient15
????????????????yum install libmysqlclient15 --enablerepo=webtatic
????????????4、安裝mysql5.5
????????????????yum install mysql55 mysql55-server --enablerepo=webtatic
? ? ? ?《3》安裝MariaDB? 我這里用的這安裝的
??????????? 1、vi /etc/yum.repos.d/MariaDB.repo? 加個文件在yum倉庫中
?[mariabd]name=MariaDBbaseurl=http://yum.mariadb.org/5.5.48/centos6-x86/gpgkey=http://yum.mariadb.org/RPM-GPG-KEY-MariaDBgpgcheck=1yum?install?-y?MariaDB-server?MariaDB-client??##安裝數(shù)據(jù)庫service?mysql?start??##啟動服務(wù)GRANT?ALL?PRIVILEGES?ON?*.*?TO?root@"%"?IDENTIFIED?BY?"123456";##設(shè)置ROOT密碼;update?mysql.user?set?authentication_string=password('123456')?where?user='root'?;##mysql5.7這樣更新密碼。flush?privileges;##刷新? ? ? 《4》下面是我安裝的數(shù)據(jù)庫的一些信息
? ? ??
? ? ?
二、 在Mysql上配置my.cnf
? ? 《1》配置MysqlA
????innodb_file_per_table = on
????skip_name_resolve = on
????server-id = 1
????log-bin = mysql-bin
????relay-log = mysql-relay-bin ? #單個主從這個可以不寫
????replicate-wild-ignore-table=mysql.%
????replicate-wild-ignore-table=test.%
????replicate-wild-ignore-table=information_schema.%
? ? 《2》配置MysqlB
? ? ?
? ? server-id = 2
? ? log-bin = mysql-bin ?###單個主從這個可以不寫,咱們是互相主從都要設(shè)置
? ? relay-log = mysql-relay-bin
? ? replicate-wild-ignore-table=mysql.%
? ? replicate-wild-ignore-table=test.%
? ? replicate-wild-ignore-table=information_schema.%
? ?注釋:
? ?server-id 是節(jié)點的標(biāo)識,主從節(jié)點不能相同,必須唯一。
? ?log-bin 表示開啟mysql的binlog日志功能。
? ‘mysql-bin’表示日志文件的名稱,也可以叫aa.log 看你自己了,mysql會在名稱后面加上數(shù)字,mysql-bin.000001、mysql-bin.000002等日志文件
? ?relay-log 用來定義relay-log日志文件
? ?replicate-wild-ignore-table是復(fù)制過程過濾選項,可以過濾不需要的數(shù)據(jù)庫和表,例如 'mysql.%' 表示不復(fù)制mysql庫
? ?replicate-wild-do_table ?明確指定復(fù)制那個數(shù)據(jù)庫和表
? ?注意:不要在主庫上使用binlog-do-db 或者 binlog-ignore-db 選項,也不要在從庫上使用replicate-do-db或者replicate-ignore-db選項,因為這樣可能產(chǎn)生跨庫更新失敗的問題,建 ? ?議在從庫使用replicate-wild-do-table和replicate-wild-ignore-table連個選項解決復(fù)制過濾的問題。
三、 手動同步一次數(shù)據(jù),新數(shù)據(jù)庫不用這部分
? 可以直接鎖定 ?flush tables with read lock; 或者直接關(guān)閉數(shù)據(jù)庫打包目錄/var/lib/mysql ?到從服務(wù)器恢復(fù)。
? tar zcvf /var/lib/mysql.tar.gz ?/var/lib/mysql ?到備的上面解壓。
??
??
? 在my.cnf ?添加read-only=1開啟只讀 ?目的都是保證復(fù)制前數(shù)據(jù)都是一樣的。
四、配置MysqlA---MysqlB的主從配置
《1》在MysqlA創(chuàng)建復(fù)制用戶并且授權(quán)。
? ? ?grant replication slave on *.* to 'tao'@'192.168.48.%' identified by 'www.daxia.help';
《2》在B服務(wù)器上設(shè)置主服務(wù)器信息:注意:master_log_file和master_log_pos這兩個選項的值要對應(yīng)在MysqlA上通過SQL語句"show master status" 查詢到的值
?change master to \
?master_host='192.168.48.129',
?master_user='tao',
?master_password='www.daxia.help',
?master_log_file='mysql-bin。000005',
?master_log_pos=405;
五、配置MysqlB---MysqlA的主從配置
《1》在MysqlB創(chuàng)建復(fù)制用戶并且授權(quán)。
? ? ?grant replication slave on *.* to 'tao'@'192.168.48.%' identified by 'www.daxia.help';
《2》在A服務(wù)器上設(shè)置主服務(wù)器信息:注意:master_log_file和master_log_pos這兩個選項的值要對應(yīng)在MysqlB上通過SQL語句"show master status" 查詢到的值
?change master to \
?master_host='192.168.48.132',
?master_user='tao',
?master_password='www.daxia.help',
?master_log_file='mysql-bin',
?master_log_pos=106;
注意:
?我在主上執(zhí)行了自己同步自己了 要取消用這個命令?change master to master_host=' ';
六:在MysqlA和MysqlB上測試數(shù)據(jù)的復(fù)制情況
《2》在MysqlB上建立庫,表和插入數(shù)據(jù)在MysqlA上查看;
? 《3》我在test下面建立了一個表,是不能同步過來的,說明過濾也對的。
七:配置keepalived實現(xiàn)mysql雙主高可用。
keepalived 配置主和從的配置就是priority 優(yōu)先級一個100一個90 從的取消nopreempt選項即可。
!?Configuration?File?for?keepalived global_defs?{notification_email?{acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from?Alexandre.Cassen@firewall.locsmtp_server?192.168.200.1smtp_connect_timeout?30router_id?LVS_DEVEL } Vrrp_script?check_mysqld?{ script?"/etc/keepalived/check_slave.pl?127.0.0.1" interval?2 weight?21 } vrrp_instance?HA_1?{state?BACKUP??????###??在MYSQLA和MysqlB上都配置為BACKUPinterface?eth0virtual_router_id?80priority?100advert_int?2nopreempt????????????##?不搶占模式,只在優(yōu)先權(quán)高的服務(wù)器上設(shè)置,優(yōu)先級第的可以不設(shè)置authentication?{auth_type?PASSauth_pass?daxia.help}track_script?{ check_mysqld }virtual_ipaddress?{192.168.48.126} }?check_slave.pl腳本如下:
#!/usr/bin/perl?-w use?DBI; use?DBD::mysql;#?CONFIG?VARIABLES $SBM?=?120; $db?=?"mysql"; $host?=?$ARGV[0]; $port?=?3306; $user?=?"root"; $pw?=?"123456";#?SQL?query $query?=?"show?slave?status";$dbh?=?DBI->connect("DBI:mysql:$db:$host:$port",?$user,?$pw,?{?RaiseError?=>?0,PrintError?=>?0?});if?(!defined($dbh))?{exit?1; }$sqlQuery?=?$dbh->prepare($query); $sqlQuery->execute;$Slave_IO_Running?=??""; $Slave_SQL_Running?=?""; $Seconds_Behind_Master?=?"";while?(my?$ref?=?$sqlQuery->fetchrow_hashref())?{$Slave_IO_Running?=?$ref->{'Slave_IO_Running'};$Slave_SQL_Running?=?$ref->{'Slave_SQL_Running'};$Seconds_Behind_Master?=?$ref->{'Seconds_Behind_Master'}; }$sqlQuery->finish; $dbh->disconnect();if?(?$Slave_IO_Running?eq?"No"?||?$Slave_SQL_Running?eq?"No"?)?{exit?1; }?else?{if?(?$Seconds_Behind_Master?>?$SBM?)?{exit?1;}?else?{exit?0;} }八、進行測試:
《1》登錄
《2》建立庫和表看看各個節(jié)點的信息是否正確。
在遠程上建立信息:
在MysqlB和MYSQLA上查看都有信息:
《3》把mysqlB弄故障,看切換的正確可行:
注意的問題:
? ? ?經(jīng)過我測試我,我的監(jiān)控腳本這樣寫的把那個weight選項取消就可以使用高可用,要是加上就會出現(xiàn)在mysqlA復(fù)制出錯,vip就會漂移到mysqlB上面,這時把MysqlA修復(fù)好后加上nopreempt選項就不會搶占,當(dāng)這時候Mysqlb的復(fù)制出問題了就不會漂移VIP因為那個weight優(yōu)先級的問題,搞了很久也不行,反正把它取消就可以使用咱們的高可用,你要是能解決請下面留言給我,咱們一起學(xué)習(xí)。
vrrp_script?check_mysqld?{script?"/etc/keepalived/mysql.pl?127.0.0.1"interval?2}還有就是在寫檢測腳本的時候先進行運行測試:
[root@test1?keepalived]#?./mysql.pl?127.0.0.1 [root@test1?keepalived]#?echo?$? 0正常就是0不正常就是1測試正常在上還要安裝依賴的# yum install??perl-DBI perl-DBD-MySQL -y確保這些包也安裝了要調(diào)用這些庫。
九、用shell腳本的方法配置Keepalived,連個就是下面檢測自己的ip3306端口就行我貼一個主機的(注意這個方法沒有上面的好因為只能檢測3306端口不知道slave的情況,測試直接關(guān)掉MYSQL)
!?Configuration?File?for?keepalived global_defs?{notification_email?{acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from?Alexandre.Cassen@firewall.locsmtp_server?192.168.200.1smtp_connect_timeout?30router_id?LVS_DEVEL } vrrp_instance?HA_1?{state?BACKUPinterface?eth0virtual_router_id?80priority?100advert_int?2nopreemptauthentication?{auth_type?PASSauth_pass?daxia.help}virtual_ipaddress?{192.168.48.126}virtual_server?192.168.48.126?3306?{????????///檢測自己的3306端口不通就執(zhí)行下面的Mysql.sh腳本重啟keepalived服務(wù)讓vip飄到另外的機器上去 delay_loop?6 lb_algo?wrr lb_kind?DR? nat_mask?255.255.255.0 persistence_timeout?50 real_server?192.168.48.129?3306?{ weight?1 notify_down?/etc/keepalived/mysql.sh TCP_CHECK?{ connect_timeout?10???? nb_get_retry????3 connect_port?3306? } } }mysql.sh腳本如下
[root@test1?keepalived]#?vi?mysql.sh? #!/bin/bash /etc/init.d/keepalived??stop sleep?10 /etc/init.d/keepalived??start我停止mysql 就會觸發(fā)腳本讓vip飄到另外一個機器上下面是keepalive的信息:
配置完成!!!
轉(zhuǎn)載于:https://blog.51cto.com/shaonian/1757212
總結(jié)
以上是生活随笔為你收集整理的mysql 主主互备实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lastb
- 下一篇: linux cmake编译源码,linu