? ? ?今天星期天,么事就寫個MYSQL的主主架構的博客,原理如下圖,不是我畫的網上找的。
主機作用 | 操作系統 | mysql版本 | 對應IP | vip數據庫 |
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 |
? 一: 在每個節點安裝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》下面是我安裝的數據庫的一些信息
? ? ??
? ? ?
二、 在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 ?到備的上面解壓。
??
??
? 在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;
五、配置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;
注意:
?我在主上執行了自己同步自己了 要取消用這個命令?change master to master_host=' ';
六:在MysqlA和MysqlB上測試數據的復制情況
《2》在MysqlB上建立庫,表和插入數據在MysqlA上查看;
? 《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》登錄
《2》建立庫和表看看各個節點的信息是否正確。
在遠程上建立信息:
在MysqlB和MYSQLA上查看都有信息:
《3》把mysqlB弄故障,看切換的正確可行:
注意的問題:
? ? ?經過我測試我,我的監控腳本這樣寫的把那個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的信息:
配置完成!!!
轉載于:https://blog.51cto.com/shaonian/1757212