MySQL MMM

1、MMM簡介:java

MMM即Master-Master Replication Manager for MySQL(mysql主主複製管理器)關於mysql主主複製配置的監控、故障轉移和管理的一套可伸縮的腳本套件(在任什麼時候候只有一個節點能夠被寫入),這個套件也能對居於標準的主從配置的任意數量的從服務器進行讀負載均衡,因此你能夠用它來在一組居於複製的服務器啓動虛擬ip,除此以外,它還有實現數據備份、節點之間從新同步功能的腳本。mysql

MySQL自己沒有提供replication failover的解決方案,經過MMM方案能實現服務器的故障轉移,從而實現mysql的高可用。linux

MMM項目來自 Google:http://code.google.com/p/mysql-master-mastersql

官方網站爲:http://mysql-mmm.org數據庫

Mmm主要功能由下面三個腳本提供api

    mmm_mond  負責全部的監控工做的監控守護進程,決定節點的移除等等服務器

    mmm_agentd  運行在mysql服務器上的代理守護進程,經過簡單遠程服務集提供給監控節點架構

    mmm_control  經過命令行管理mmm_mond進程負載均衡

2、mysql-mmm架構的搭建    ssh

編號 名稱 主機名 IP
1 監控服務器 monitor 172.16.100.129
2 MySQL_M1 M1 172.16.100.100
3 MySQL_M2 M2 172.16.100.130
4 MySQl_Slave Salve1 172.16.100.131
5 Vip-write 172.16.100.252
6 Vip-read 172.16.100.251

wKioL1R-kZDjC1cfAAIEFTGi51w185.jpg

配置集羣確保如下信息同步:

雙擊互信:

Monitor:

# sed -i 's@\(HOSTNAME=\).*@\1monitor@g'/etc/sysconfig/network
# hostname monitor

M1:

# sed -i 's@\(HOSTNAME=\).*@\1M1@g'/etc/sysconfig/network
# hostname M1

M2:

# sed -i 's@\(HOSTNAME=\).*@\1M2@g'/etc/sysconfig/network
# hostname M2

Salve1:

# sed -i 's@\(HOSTNAME=\).*@\1Slave1@g'/etc/sysconfig/network
# hostname Slave1

Host文件以下:

Monitor:

# cat /etc/hosts | grep ^172
172.16.100.129        monitor
172.16.100.100        M1
172.16.100.130        M2
172.16.100.131        Slave
# ssh-keygen  -t rsa

祕鑰的拷貝:

# for i in M1 M2 Slave1; do ssh-copy-id -i~/.ssh/id_rsa.pub root@$i;done
# for i in M1 M2 Slave1; do ssh $i'date';done
Sun Nov 16 15:36:50 CST 2014
Sun Nov 16 15:36:50 CST 2014
Sun Nov 16 15:36:50 CST 2014
[root@localhost ~]#

能顯示以上說明雙擊互信配置成功

# for i in M1 M2 Slave1; do scp  /etc/hosts root@$i:/etc/;done

查看HOSTS文件是否已經同步:

# for i in M1 M2 Slave1;do ssh  $i'cat  /etc/hosts | grep ^172 ';done
172.16.100.129        monitor
172.16.100.100        M1
172.16.100.130        M2
172.16.100.131        Slave1
172.16.100.129        monitor
172.16.100.100        M1
172.16.100.130        M2
172.16.100.131        Slave1
172.16.100.129        monitor
172.16.100.100        M1
172.16.100.130        M2
172.16.100.131        Slave1
[root@localhost ~]#

時間同步:

配置monitor爲NTP服務器:

# yum install ntp
# ntpdate ntp.api.bz
# /etc/init.d/ntpd start

分別在MySQL服務器上執行:

# ntpdate 172.16.100.129

安裝MySQL

配置好M1和M2的主主同步,M1和salve1的主從同步

主主同步:

二進制包安裝:

複製二進制的安裝包到各個節點:

# for i in M1 M2 Slave1;do scpmysql-5.5.40-linux2.6-x86_64.tar.gz root@$i:/tmp/;done
mysql-5.5.40-linux2.6-x86_64.tar.gz                                                           100%  176MB   8.4MB/s  00:21   
mysql-5.5.40-linux2.6-x86_64.tar.gz                                                                100%  176MB   8.8MB/s  00:20   
mysql-5.5.40-linux2.6-x86_64.tar.gz                                                                100%  176MB   9.3MB/s  00:19   
[root@localhost ~]#
# for i in M1 M2 Slave1;do ssh $i 'tar zxvf/tmp/mysql-5.5.40-linux2.6-x86_64.tar.gz -C /usr/local';done

建立MySQL帳戶:

# for i in M1 M2 Slave1;do ssh $i 'groupadd-g 3306 mysql';done
# for i in M1 M2 Slave1;do ssh $i 'useradd-u 3306 -g mysql -s /sbin/nologin -M mysq1';done
# for i in M1 M2 Slave1;do ssh $i 'idmysq';done
uid=3306(mysq) gid=3306(mysql)groups=3306(mysql)
uid=3306(mysq) gid=3306(mysql)groups=3306(mysql)
uid=3306(mysq) gid=3306(mysql)groups=3306(mysql)
[root@localhost ~]#
# for i in M1 M2 Slave1;do ssh $i 'cd/usr/local/;ln -s mysql-5.5.40-linux2.6-x86_64 mysql';done
# for i in M1 M2 Slave1;do ssh $i 'cd/usr/local/mysql;chown root:mysql -R ./';done
# for i in M1 M2 Slave1;do ssh $i 'cd/usr/local/mysql;\cp support-files/my-huge.cnf /etc/my.cnf';done
# for i in M1 M2 Slave1;do ssh $i 'cd/usr/local/mysql;\cp support-files/mysql.server /etc/init.d/mysqld';done

判斷腳本的執行權限:

# for i in M1 M2 Slave1;do ssh $i '[ -x/etc/init.d/mysqld ] && echo "ok" || echo"NO"';done
ok
ok
ok
[root@localhost ~]#

建立MySQL存儲目錄:

# for i in M1 M2 Slave1;do ssh $i 'mkdir-pv /data/mysqldata;chown -R mysql:mysql /data/';done
[root@localhost ~]#
# for i in M1 M2 Slave1;do ssh $i 'yuminstall libaio -y';done
# for i in M1 M2 Slave1;do ssh $i 'sed -i"37a\datadir = /data/mysqldata/" /etc/my.cnf ';done
# for i in M1 M2 Slave1;do ssh $i 'sed -i"38a\log-error = /data/mysqldata/mysql_error.log" /etc/my.cnf ';done
# for i in M1 M2 Slave1;do ssh $i 'sed -i"39a\pid-file = /data/mysqldata/mysql.pid" /etc/my.cnf ';done
# for i in M1 M2 Slave1;do ssh $i'chkconfig  --add mysqld;chkconfig  mysqld on;service mysqld start';done
Starting MySQL......... SUCCESS!
Starting MySQL........ SUCCESS!
Starting MySQL....... SUCCESS!
[root@localhost ~]#

MySQL服務已經安裝好,下面進行主主同步:

M1:

mysql> GRANT REPLICATION SLAVE,replication client ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl';
mysql> GRANT REPLICATION CLIENT ON *.*TO 'mmm_monitor'@'%' IDENTIFIED BY '123456';
mysql> GRANT SUPER,REPLICATIONCLIENT,PROCESS ON *.* TO 'mmm_agent'@'%' IDENTIFIED BY '123456';
mysql> FLUSH PRIVILEGES;

M2:

mysql> GRANT REPLICATION SLAVE,replication client ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl';
mysql> GRANT REPLICATION CLIENT ON *.*TO 'mmm_monitor'@'%' IDENTIFIED BY '123456';
mysql> GRANT SUPER,REPLICATIONCLIENT,PROCESS ON *.* TO 'mmm_agent'@'%' IDENTIFIED BY '123456';
mysql> FLUSH PRIVILEGES;

Slave1:

mysql> GRANT REPLICATION CLIENT ON *.*TO 'mmm_monitor'@'%' IDENTIFIED BY '123456';
mysql> GRANT SUPER,REPLICATIONCLIENT,PROCESS ON *.* TO 'mmm_agent'@'%' IDENTIFIED BY '123456';
mysql> FLUSH PRIVILEGES;

備註:

因爲MMM集羣套件對數據庫的讀寫進行了嚴格的控制,根據MMM管理機制,須要首先在全部的MySQL服務器上,這是read_only參數,也就是在/etc/my.cnf的mysqld組中進行配置:

read_only=1

此參數對全部的非臨時表進行控制,如下兩個例外:

對replication threads例外

對擁有超級權限的帳戶例外

# for i in M1 M2 Slave1;do ssh $i 'sed -i"40a\read_only = 1" /etc/my.cnf';done
# for i in M1 M2 Slave1;do ssh $i 'servicemysqld restart';done
Shutting down MySQL.. SUCCESS!
Starting MySQL...... SUCCESS!
Shutting down MySQL.. SUCCESS!
Starting MySQL....... SUCCESS!
Shutting down MySQL.. SUCCESS!
Starting MySQL....... SUCCESS!
[root@localhost ~]#

M1--->M2的複製

M1上的配置以下:

log-bin=mysql-bin
server-id       = 1
relay-log = mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
# Service mysqld restart

M2配置:

log-bin=mysql-bin
server-id       = 2
relay-log = mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
# Service mysqld restart

M1信息:

wKioL1R-k1fS5Bn1AAErO0H8JWA022.jpg

M2上操做:

wKiom1R-ku_RoBf8AAEb8YyPzSU128.jpg

wKiom1R-kxHCNASuAAJjBzitcao860.jpg

M2---->M1的複製:

M2的複製信息:

wKioL1R-k8PSCvauAAEs4wipw-c380.jpg

M1上操做:

mysql> CHANGE MASTER TO\
   -> master_host='172.16.100.130',
   -> master_user='repl',
   -> master_password='repl',
   -> master_log_file='mysql-bin.000005',
->master_log_pos=107;

wKiom1R-oWzy3BtDAAKFsrKwq2s611.jpg

驗證主主同步複製:

mysql> CREATE DATABASE repl;
Query OK, 1 row affected (0.02 sec)
 
mysql> use repl;
Database changed
mysql> create table user_info (Idint(3),Name varchar(8));
Query OK, 0 rows affected (0.23 sec)
mysql> insert into user_info values(100,'James');
Query OK, 1 row affected (0.09 sec)
mysql>

M2上操做:

wKiom1R-oaOgNuGgAAEg-SqthlE139.jpg

M1上查看:

wKioL1R-okfCFsLLAAC1bnRByIw317.jpg

已經同步成功

M1-->Slave1的主從同步:

Slave1上的配置:

log-bin=mysql-bin
server-id       = 11
relay-log = mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
# service mysqld restart

導出M1上的數據到Slave1上

wKiom1R-ogKBm0KMAAB64KpaoJ4111.jpg

不要退出此終端,開啓兩外一個終端,進行導出數據

# /usr/local/mysql/bin/mysqldump -uroot -prepl > /tmp/repl.sql
# scp /tmp/repl.sql root@Slave1:/tmp/

M1上執行

wKiom1R-ojuBEIGDAABsd4WF_1U736.jpg

Slave1上進行數據還原和同步:

# /usr/local/mysql/bin/mysql -uroot -e"create database repl"
# /usr/local/mysql/bin/mysqldump -uroot -prepl < /tmp/repl.sql
mysql> CHANGE MASTER TO\
   -> master_user='repl',
   -> master_password='repl',
   -> master_log_file='mysql-bin.000007',
   -> master_log_pos=503,
->master_host='172.16.100.100';

wKioL1R-ozTiqRJvAAIL3rUg7DA289.jpg

能夠看到數據已經同步過來。

M1上插入數據:

mysql> insert into user_info values(112,'adny');
Query OK, 1 row affected (0.18 sec)

Slave1上進行查看

wKiom1R-otjjUKNKAADDpoQxSzI450.jpg

安裝MySQL-MMM集羣套件

下載yum源:

wKiom1R-ovWSm5PKAARAJ5-mbeA741.jpg

批量執行下載:

# for i in M1 M2 Slave1;do ssh $i 'wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm';done
# for i in M1 M2 Slave1 monitor;do ssh $i'rpm -vih epel-release-6-8.noarch.rpm';done

全部節點批量安裝:

# for i in M1 M2 Slave1 monitor;do ssh $i'yum install mysql-mmm* -y';done

安裝完成以後,查看安裝的位置:

# rpm -ql mysql-mmm-2.2.1
/etc/logrotate.d/mysql-mmm
/etc/mysql-mmm
/etc/mysql-mmm/mmm_common.conf

配置文件以下:

# cp mmm_common.conf mmm_common.conf.default
# cat mmm_common.conf
active_master_role      writer
 
<host default>
   cluster_interface       eth0
   pid_path               /var/run/mysql-mmm/mmm_agentd.pid
   bin_path               /usr/libexec/mysql-mmm/
   replication_user        repl       #主從複製的帳戶
   replication_password    repl       #主從複製的密碼
   agent_user              mmm_agent      #代理帳號
   agent_password          123456    #代理帳號的密碼
</host>
 
<host M1>
   ip      172.16.100.100
   mode    master
   peer    M2
</host>
 
<host M2>
   ip      172.16.100.130
   mode    master
   peer    M1
</host>
 
<host Slave1>
   ip      172.16.100.131
   mode    slave
</host>
#<host db3>
#       ip192.16.100.51
#       modeslav
#</host>
 
<role writer>
   hosts   M1, M2     #可以做爲寫的服務器主機名
   ips     172.16.100.252        #寫的VIP地址
   mode    exclusive          #排他模式,該模式下只有一個主機擁有
</role>
 
<role reader>
   hosts   M1, M2, Slave1        #做爲讀的服務器主機名
   ips     172.16.100.251                #讀的VIP地址
   mode    balanced          #平衡模式
</role>

此配置文件四個節點的配置相同:

# for i in M1 M2 Slave1;do scp /etc/mysql-mmm/mmm_common.confroot@$i:/etc/mysql-mmm;done
mmm_common.conf                                                                                    100%  810     0.8KB/s  00:00   
mmm_common.conf                                                                                    100%  810    0.8KB/s   00:00   
mmm_common.conf                                                                                    100%  810     0.8KB/s  00:00   
[root@localhost mysql-mmm]#

M1的mmm_agent.conf配置

# cat mmm_agent.conf  |  grep-v ^# | sed -e '/^$/d'
include mmm_common.conf
this M1
[root@localhost mysql-mmm]#
M2的mmm_agent.conf配置
# cat mmm_agent.conf  |  grep-v ^# | sed -e '/^$/d'
include mmm_common.conf
this M2
[root@localhost mysql-mmm]#

Slave1上的mmm_agent.conf配置

# cat mmm_agent.conf  | grep -v ^# | awk 'NF>0'
include mmm_common.conf
this Slave1
[root@localhost mysql-mmm]#
 
Monitor的mmm_mon.conf配置
# cat mmm_mon.conf | grep -v "#"| awk 'NF>0'
include mmm_common.conf
<monitor>
   ip                  127.0.0.1
   pid_path           /var/run/mysql-mmm/mmm_mond.pid
   bin_path           /usr/libexec/mysql-mmm
   status_path        /var/lib/mysql-mmm/mmm_mond.status
   ping_ips           172.16.100.100,172.16.100.130,172.16.100.131     #ping方式監控
    auto_set_online     10                  #發現節點丟失10秒鐘後進行切換
</monitor>
<host default>
   monitor_user        mmm_monitor           #監控帳號
   monitor_password    123456                         #監控密碼
</host>
debug 0
[root@localhost mysql-mmm]#

至此MYSQL_,MMM已經配置完成,下面進行啓動:

M1 M2 Slave1上一次啓動:

/etc/init.d/mysql-mmm-agent  start

完成以後在monitor上啓動:

/etc/init.d/mysql-mmm-monitor  start

在monitor上查看集羣的狀態:

wKioL1R-pEKBHam-AARGniboswM972.jpg

其中:M1負責寫操做,M2負責讀操做

模擬宕機切換測試:

在M2上鎖住user_info表而後,在M1上進行更新表操做:

wKiom1R-pCLzp9-rAAGzP7At9Yw207.jpg

wKioL1R-pMXD2ZL4AAG-hehNLWs754.jpg

wKiom1R-pFOBNCWDAACCCGhJA9A393.jpg

而後關閉M1的MySQL進程,此時VIP漂移到M2上以後,必須等到同步完成才能夠切換,不然就在哪裏等待,在此過程當中是用的是如圖所示的函數:

wKiom1R-pHrCEvplAAQd3Eq8BwY673.jpg

Master_pos_wait必須等到中繼日誌執行完成後,再釋放鎖,遇到這種問題,若是延時很大,要切換,只能人工kil掉此進程,此時S1會自動指向M2,自動執行change master命令進行同步複製。

此時monitor的信息沒法顯示,等待釋放鎖,而後進行切換:

wKioL1R-pR7QzY0JAABChWCbe4U644.jpg

M2解鎖:

wKiom1R-pMWAknkYAAByg20F5XM702.jpg

Monitor:

wKioL1R-pWiTqUYAAAEjNhX2nNE453.jpg

從新啓動M1

wKiom1R-pPaReEw-AAEe4eU-qpE288.jpg

VIP還在M2上,不會由於M1修復好,切換回去。

Slave切換:

S1上執行stop slave,VIP就會漂移到M1上

wKioL1R-paaC-qXbAAE0AB5CEaw717.jpg

若是在M1上執行stop slave,VIP就會漂移到M2上,以後若是在slave1上執行start slave,此時VIP又會回到slave1上

wKiom1R-pWizBjmKAAEhyoZtjiI532.jpg

相關文章
相關標籤/搜索