? ? ?今天星期天,么事就寫個MYSQL的主主架構的博客,原理如下圖,不是我畫的網上找的。

wKiom1b3SnfxAvxSAACENORecl8170.png


主機作用操作系統mysql版本對應IPvip數據庫
mysqlA(主)centos6.4
mysql?5.5.48192.168.48.129192.168.48.126
mysqlB(備)centos6.4mysql?5.5.48192.168.48.132


? 一: 在每個節點安裝mysql數據庫:

? ? ? ?《1》到官網去下載最新的yum倉庫,并安裝

??????? http://dev.mysql.com/downloads/repo/yum/ ?

????????yum install mysql-community-server

? ? ? ?《2》用第三方yum

????????????1、導入第三方源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??##安裝數據庫service?mysql?start??##啟動服務GRANT?ALL?PRIVILEGES?ON?*.*?TO?root@"%"?IDENTIFIED?BY?"123456";##設置ROOT密碼;update?mysql.user?set?authentication_string=password('123456')?where?user='root'?;##mysql5.7這樣更新密碼。flush?privileges;##刷新

? ? ? 《4》下面是我安裝的數據庫的一些信息

? ? ??wKioL1b3SgiDTxK_AAAiK1mAOTY327.png

? ? ?wKiom1b3SXrTesjVAAA8imvPf6Q749.png

二、 在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 ?###單個主從這個可以不寫,咱們是互相主從都要設置

? ? relay-log = mysql-relay-bin

? ? replicate-wild-ignore-table=mysql.%

? ? replicate-wild-ignore-table=test.%

? ? replicate-wild-ignore-table=information_schema.%

? ?注釋:

? ?server-id 是節點的標識,主從節點不能相同,必須唯一。

? ?log-bin 表示開啟mysql的binlog日志功能。

? ‘mysql-bin’表示日志文件的名稱,也可以叫aa.log 看你自己了,mysql會在名稱后面加上數字,mysql-bin.000001、mysql-bin.000002等日志文件

? ?relay-log 用來定義relay-log日志文件

? ?replicate-wild-ignore-table是復制過程過濾選項,可以過濾不需要的數據庫和表,例如 'mysql.%' 表示不復制mysql庫

? ?replicate-wild-do_table ?明確指定復制那個數據庫和表

? ?注意:不要在主庫上使用binlog-do-db 或者 binlog-ignore-db 選項,也不要在從庫上使用replicate-do-db或者replicate-ignore-db選項,因為這樣可能產生跨庫更新失敗的問題,建 ? ?議在從庫使用replicate-wild-do-table和replicate-wild-ignore-table連個選項解決復制過濾的問題。

三、 手動同步一次數據,新數據庫不用這部分

? 可以直接鎖定 ?flush tables with read lock; 或者直接關閉數據庫打包目錄/var/lib/mysql ?到從服務器恢復。

? tar zcvf /var/lib/mysql.tar.gz ?/var/lib/mysql ?到備的上面解壓。

??wKiom1b3U5_TLg45AAAX-lAqUkQ609.png

??wKioL1b3VLyBqNdQAAAcdnqVLV4540.png

? 在my.cnf ?添加read-only=1開啟只讀 ?目的都是保證復制前數據都是一樣的。

四、配置MysqlA---MysqlB的主從配置

《1》在MysqlA創建復制用戶并且授權。

? ? ?grant replication slave on *.* to 'tao'@'192.168.48.%' identified by 'www.daxia.help';

《2》在B服務器上設置主服務器信息:注意:master_log_file和master_log_pos這兩個選項的值要對應在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;

wKioL1b3VkGiazzPAAApX_HbOfU564.png

五、配置MysqlB---MysqlA的主從配置

《1》在MysqlB創建復制用戶并且授權

? ? ?grant replication slave on *.* to 'tao'@'192.168.48.%' identified by 'www.daxia.help';

《2》在A服務器上設置主服務器信息:注意:master_log_file和master_log_pos這兩個選項的值要對應在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;

wKioL1b3V8bxGm7EAAAlpzKZhrQ391.png

wKioL1b3WFTgPegbAABohBXDlFY542.png

注意:

?我在主上執行了自己同步自己了 要取消用這個命令?change master to master_host=' ';

wKiom1b3WaqzzXTyAABSBGbmYbo809.png


六:在MysqlA和MysqlB上測試數據的復制情況


wKioL1b3W3Kjnv5GAAAnmXGyUkQ911.png

wKioL1b3W7aRKMcvAAAtzIIjX0g918.png

《2》在MysqlB上建立庫,表和插入數據在MysqlA上查看;

wKioL1b3XBfjj9T_AAAmUILUmZQ823.png

wKiom1b3W8nQkkxaAAA1f5TqDyI857.png


? 《3》我在test下面建立了一個表,是不能同步過來的,說明過濾也對的

七:配置keepalived實現mysql雙主高可用。

keepalived 配置主和從的配置就是priority 優先級一個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????????????##?不搶占模式,只在優先權高的服務器上設置,優先級第的可以不設置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》登錄

wKioL1b3bPygsTOdAABPI3VKO_o166.png

《2》建立庫和表看看各個節點的信息是否正確。

在遠程上建立信息:

wKiom1b3bTuie7zTAABT29gL_So959.png

在MysqlB和MYSQLA上查看都有信息:

wKiom1b3bX6jHLfVAAAmoXF0o2E204.png

《3》把mysqlB弄故障,看切換的正確可行:

wKioL1b3bqSDn7w8AABF-9pGUlQ355.png

注意的問題:

? ? ?經過我測試我,我的監控腳本這樣寫的把那個weight選項取消就可以使用高可用,要是加上就會出現在mysqlA復制出錯,vip就會漂移到mysqlB上面,這時把MysqlA修復好后加上nopreempt選項就不會搶占,當這時候Mysqlb的復制出問題了就不會漂移VIP因為那個weight優先級的問題,搞了很久也不行,反正把它取消就可以使用咱們的高可用,你要是能解決請下面留言給我,咱們一起學習。

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確保這些包也安裝了要調用這些庫。



九、用shell腳本的方法配置Keepalived,連個就是下面檢測自己的ip3306端口就行我貼一個主機的(注意這個方法沒有上面的好因為只能檢測3306端口不知道slave的情況,測試直接關掉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端口不通就執行下面的Mysql.sh腳本重啟keepalived服務讓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 就會觸發腳本讓vip飄到另外一個機器上下面是keepalive的信息:

wKioL1b3hn-xFr22AADJffUu36k066.png


wKiom1b3iDyBbzzWAACrtMY78WM167.png


wKioL1b3iOfSJK77AACxioNLxRY080.png

配置完成!!!