003.MMM雙主-雙從讀寫分離部署

一 前期規劃

1.1 主機規劃

image

1.2 虛擬IP規劃

image


1.3 用戶列表

image

提示:以上角色須要在全部節點添加。

1.4 總體架構

clipboard

1.4 hosts修改

  1 [root@localhost ~]# vi /etc/sysconfig/network
  2 NETWORKING=yes
  3 HOSTNAME=Master01
  4 [root@Master01 ~]# vi /etc/hosts
  5 Master01    172.24.8.10
  6 Master02    172.24.8.11
  7 Slave01     172.24.8.12
  8 Slave02     172.24.8.13
  9 Monitor     172.24.8.20

提示:全部主機添加對應的hostname和hosts,此步驟非必須,爲方便以後簡化配置,建議修改hosts。

1.5 NTP配置

略,具體可參考筆記NTP-《003.NTP客戶端配置》。
提示:針對高可用的優化,建議全部節點均配置NTP服務。

二 部署MySQL

2.1 安裝MySQL

略,具體可參考MySQL主從複製-《MySQL高可用主從複製部署》。
提示:除去monitor節點外全部節點均須要部署。

三 雙主複製部署

3.1 master01 my.cf配置

  1 [root@Master01 ~]# vi /etc/my.cnf
  2 [mysqld]
  3 ……
  4 server-id=1				#設置主服務器master的id
  5 log-bin=mysql-bin			#配置二進制變動日誌命名格式
  6 replicate-wild-ignore-table=mysql.%
  7 replicate-wild-ignore-table=test.%
  8 replicate-wild-ignore-table=information_schema.%
  9 sync-binlog=1              		#每條自動更新,安全性高,默認是0
 10 auto_increment_increment=2  	#字段一次遞增多少
 11 auto_increment_offset=1    		#自增字段的起始值
 12 log_slave_updates          		#當一個主故障,另外一個當即接管
 13 read_only=1

注意:
master開啓二進制日誌後默認記錄全部庫全部表的操做,能夠經過配置來指定只記錄指定的數據庫甚至指定的表的操做,具體在mysql配置文件的[mysqld]可添加修改以下選項:
方法一:
  1 # 不一樣步哪些數據庫
  2 binlog-ignore-db = mysql
  3 binlog-ignore-db = test
  4 binlog-ignore-db = information_schema
  5 # 只同步哪些數據庫,除此以外,其餘不一樣步
  6 binlog-do-db = mysqltest

方法二:
建議採用如下方式配置過濾:
  1 replicate-wild-ignore-table=mysql.%	#從庫配置不一樣步表
  2 replicate-wild-do-table=test.%		#從庫配置須要同步的表

提示:不要在主庫使用binlog-ignore-db和binlog-do-db,也不要在從庫使用replicate-wild-ignore和replicate-wild-do-table。html

3.2 Master02 my.cf配置

  1 [root@Master01 ~]# service mysqld start
  2 [root@Master01 ~]# mysql -uroot -px120952576
  3 mysql> grant replication slave on *.* to 'repl_user'@'172.24.8.%' identified by 'x12345678';
#建立用於複製的帳號
  4 mysql> grant replication client on *.* to 'mmm_monitor'@'172.24.8.%' identified by 'x12345678';
#建立用於監控MySQL服務健康的帳號
  5 mysql> grant super,replication client,process on *.* to 'mmm_agent'@'172.24.8.%' identified by 'x12345678';
#建立用於切換隻讀模式、同步Master信息的帳號
  6 mysql> grant select,insert,update,delete,create,drop on *.* to 'mmm_test'@'172.24.8.%'  identified by 'x120952576' with grant option;        #建立以後用於讀寫分離測試的帳號
  7 mysql> flush privileges;
  8 [root@Master01 ~]# service mysqld restart
  9 [root@Master01 ~]# mysql -uroot -px120952576
 10 mysql> show master status;

10_thumb1
master01:
file:mysql-bin.000001
position:120
注意:讀寫分離對於用於super或者all privileges權限的用戶無效,須要建立普通用戶進行測試。

3.4 Master02建立帳號

略,同3.3 Master01建立帳號一樣操做便可。
  1 [root@Master01 ~]# service mysqld restart
  2 [root@Master01 ~]# mysql -uroot -px120952576
  3 mysql> show master status;

11_thumb1
master02:
file:mysql-bin.000001
position:120

3.5 啓動雙主複製

提示:若是Master01和Master02已經存在數據,則在開啓主備複製以前,須要將Master01和Master02手動同步一次(/var/lib/mysql整個目錄打包tar.gz),具體方法略。
注意:本實驗都是從新安裝的MySQL,可直接啓動同步
  1 [root@Master01 ~]# mysql -uroot -px120952576
  2 Enter password:
  3 mysql> change master to master_host='172.24.8.11',
  4     -> master_user='repl_user',
  5     -> master_password='x12345678',
  6     -> master_log_file='mysql-bin.000001',
  7 -> master_port=3306,
  8     -> master_log_pos=120;
  9 mysql> start slave;
 10 mysql> show slave status\G			#查看slave狀態

3.3 啓動Master02的slave功能

  1 [root@Master02 ~]# mysql -uroot -px120952576
  2 mysql> change master to master_host='172.24.8.10',
  3     -> master_user='repl_user',
  4     -> master_password='x12345678',
  5     -> master_log_file='mysql-bin.000001',
  6     -> master_log_pos=120;
  7 mysql> start slave;
  8 mysql> show slave status\G			#查看slave狀態

提示:
slave的I/O和SQL線程都已經開始運行,並且Seconds_Behind_Master再也不是NULL。日誌的位置增長了,意味着一些事件被獲取並執行了。若是你在master上進行修改,你能夠在slave上看到各類日誌文件的位置的變化,一樣,你也能夠看到數據庫中數據的變化。

四 其餘節點配置

4.1 全部Slave節點配置配置

  1 [root@Master01 ~]# scp /etc/my.cnf root@172.24.8.12:/etc/
  2 [root@Master01 ~]# scp /etc/my.cnf root@172.24.8.13:/etc/
  3 [root@Slave01 ~]# vi /etc/my.cnf
  4 [mysqld]
  5 ……
  6 server-id=3				#設置主服務器Slave01的id
  7 [root@Slave02 ~]# vi /etc/my.cnf
  8 [mysqld]
  9 ……
 10 server-id=4				#設置主服務器Slave02的id

提示:從Master01將複製my.cnf至全部節點(除去monitor外),並修改相應的server id。

4.2 全部Slave節點建立帳號

  1 [root@Slave01 ~]# service mysqld start
  2 [root@Slave01 ~]# mysql -uroot -px120952576
  3 mysql> grant replication slave on *.* to 'repl_user'@'172.24.8.%' identified by 'x12345678';			                               #建立用於複製的帳號
  4 mysql> grant replication client on *.* to 'mmm_monitor'@'172.24.8.%' identified by 'x12345678';			                               #建立用於監控MySQL服務健康的帳號
  5 mysql> grant super,replication client,process on *.* to 'mmm_agent'@'172.24.8.%' identified by 'x12345678';
                                       #建立用於切換隻讀模式、同步Master信息的帳號
  6 mysql> grant select,insert,update,delete,create,drop on *.* to 'mmm_test'@'172.24.8.%'  identified by 'x120952576' with grant option;	               #建立以後用於讀寫分離測試的帳號
  7 mysql> flush privileges;

提示:Slave02如上操做。

4.2 Slave節點配置Master01爲主

  1 [root@Slave01 ~]# service mysqld restart
  2 [root@Slave01 ~]# mysql -uroot -px120952576
  3 mysql> change master to master_host='172.24.8.10',
  4     -> master_user='repl_user',
  5     -> master_password='x12345678',
  6     -> master_log_file='mysql-bin.000001',
  7     -> master_log_pos=120;
  8 mysql> start slave;
  9 mysql> show slave status\G        #查看slave狀態

提示:Slave02如上操做。
注意:讀寫分離對於用於super或者all privileges權限的用戶無效,須要建立普通用戶進行測試。

五 安裝MMM組件

5.1 監控Monitor節點安裝MMM

  1 [root@Monitor tmp]# wget http://mirrors.ustc.edu.cn/epel/epel-release-latest-6.noarch.rpm
  2 [root@Monitor tmp]# rpm -ivh epel-release-latest-6.noarch.rpm
  3 [root@Monitor ~]# yum -y install mysql-mmm*

5.2 其餘節點安裝MMM

  1 [root@Master01 ~]# wget http://mirrors.ustc.edu.cn/epel/epel-release-latest-6.noarch.rpm
  2 [root@Master01 ~]# rpm -ivh epel-release-latest-6.noarch.rpm
  3 [root@Master01 ~]# yum -y install mysql-mmm-agent

注意:
  • MMM組件在常規YUM中不包含,須要安裝epel源;
  • 除monitor節點外其餘節點只須要安裝mysql-mmm-agent便可。

提示:若yum安裝出現如下報錯,建議在全部節點改用編譯安裝,操做見附1-附2:
mysql

12_thumb1

附1 添加安裝Perl腳本

  1 [root@Master01 ~]# cat install.sh
  2 #!/bin/bash
  3 wget http://xrl.us/cpanm --no-check-certificate
  4 mv cpanm /usr/bin
  5 chmod 755 /usr/bin/cpanm
  6 cat > /root/list << EOF
  7 install Algorithm::Diff
  8 install Class::Singleton
  9 install DBI
 10 install DBD::mysql
 11 install File::Basename
 12 install File::stat
 13 install File::Temp
 14 install Log::Dispatch
 15 install Log::Log4perl
 16 install Mail::Send
 17 install Net::ARP
 18 install Net::Ping
 19 install Proc::Daemon
 20 install Thread::Queue
 21 install Time::HiRes
 22 EOF
 23 for package in `cat /root/list`
 24 do
 25     cpanm $package
 26 done

附2 編譯安裝

  1 [root@Master01 tmp]# wget http://mysql-mmm.org/_media/:mmm2:mysql-mmm-2.2.1.tar.gz
  2 [root@Master01 tmp]# mv \:mmm2\:mysql-mmm-2.2.1.tar.gz mysql-mmm-2.2.1.tar.gz
  3 [root@Master01 tmp]# tar -zxvf mysql-mmm-2.2.1.tar.gz
  4 [root@Master01 tmp]# cd mysql-mmm-2.2.1/
  5 [root@Master01 mysql-mmm-2.2.1]# make install

注意,注意,注意:
一般使用以上編譯安裝也會失敗,強烈建議使用yum安裝,但yum安裝必須使得MySQL版本爲mysql-community-server-5.6.37(或以上)!

5.3 目錄構成

目錄
介紹
/usr/lib/perl5/vendor_perl/5.8.8/MMM
MMM使用的主要perl模塊
/usr/lib/mysql-mmm
MMM使用的主要腳本
/usr/sbin
MM使用的主要命令的路徑
/etc/init.d/
MMM的agent和monitor啓動服務的目錄
/etc/mysql-mmm
MMM配置文件的路徑,默認因此的配置文件
/var/log/mysql-mmm
默認的MMM保存日誌的位置

六 配置MMM

6.1 Master01的mmm_agent配置

  1 [root@Master01 ~]# vi /etc/mysql-mmm/mmm_agent.conf
  2 include mmm_common.conf
  3 this db1

提示:設置db1的配置信息,此db1名字可自定義,但必須和mmm_common.conf 中一致。

6.2 Master01的mmm_common配置

  1 [root@Master01 ~]# vi /etc/mysql-mmm/mmm_common.conf
  2 active_master_role      writer
  3 #當設置爲writer的時候,須要在全部MySQL節點設置「read_only=1」,則MMM會本劇每一個節點的角色進行動態判斷,當MMM的角色設置<role writer>時候,則會自動添加「set global read_only=0」操做,即打開寫權限。
  4 <host default>
  5 cluster_interface       eth0			        #設置網絡接口,不能爲子接口。
  6 pid_path                /var/run/mysql-mmm/mmm_agentd.pid	#設定PID文件路徑
  7 bin_path                /usr/libexec/mysql-mmm/		#設置MMM可執行文件路徑
  8 replication_user        repl_user			        #設置複製的用戶名
  9 replication_password    x12345678			        #設置複製的用戶名的密碼
 10 agent_user              mmm_agent			        #設置更改只讀操做的用戶
 11 agent_password          x12345678			        #設置更改只讀操做用戶的密碼
 12 </host>
 13 
 14 <host db1>                          #設置db1的配置信息,此db1名字可自定義,但必須和mmm_agent.conf中一致。
 16 ip      172.24.8.10			#設置db1的物理IP
 17 mode    master			#設置db1角色爲Master
 18 peer    db2				#設置db1對等的主機名,即db2和db1均爲Master
 19 </host>
 20 
 21 <host db2>				#相似db1的設置
 22 ip      172.24.8.11
 23 mode    master
 24 peer    db1
 25 </host>
 26 
 27 <host db3>				#相似db1的設置
 28     ip      172.24.8.12
 29     mode    slave			#設置db3的角色爲Slave
 30 </host>
 31 
 32 <host db4>				#相似db1的設置
 33     ip      172.24.8.13
 34     mode    slave			#設置db4的角色爲Slave
 35 </host>
 36 
 37 <role writer>			#設置可寫角色
 38 hosts   db1, db2			#設置可執行寫操做的主機
 39 ips     172.24.8.100		#設置可寫的虛擬IP
 40 mode    exclusive	                #設置角色的模式爲互斥,互斥角色只有一個IP,而且同一時間只能分配一個主機。
 41 </role>
 42 
 43 <role reader>			#設置只讀角色
 44 hosts   db1, db2, db3, db4		#設置只讀角色的主機
 45 ips     172.24.8.101, 172.24.8.102, 172.24.8.103, 172.24.8.104
 46 #設置可讀的虛擬IP,能夠有多個。
 47 mode    balanced
#設置角色的模式爲負載均衡,在負載均衡角色中,能夠有多個IP,這些IP被均衡地、動態地分配給多個MySQL主機。
 49 </role>

6.3 Master01的mysql-mmm-agent配置

  1 [root@Master01 ~]# vi /etc/default/mysql-mmm-agent
  2 ENABLED=1

注意:使用yum安裝則不須要配置mysql-mmm-agent ,默認已經添加了ENABLED=1。

6.4 其餘節點配置

  1 [root@Master01 ~]# scp /etc/mysql-mmm/mmm_common.conf root@172.24.8.11:/etc/mysql-mmm/
  2 [root@Master01 ~]# scp /etc/mysql-mmm/mmm_common.conf root@172.24.8.12:/etc/mysql-mmm/
  3 [root@Master01 ~]# scp /etc/mysql-mmm/mmm_common.conf root@172.24.8.13:/etc/mysql-mmm/
  4 [root@Master01 ~]# scp /etc/default/mysql-mmm-agent root@172.24.8.11://etc/default/
  5 [root@Master01 ~]# scp /etc/default/mysql-mmm-agent root@172.24.8.12://etc/default/
  6 [root@Master01 ~]# scp /etc/default/mysql-mmm-agent root@172.24.8.13://etc/default/

提示:全部節點的mysql-mmm-agent和mmm_common.conf內容一致,從Master01複製便可,Monitor不須要配置agent。
  1 [root@Master02 ~]# vi /etc/mysql-mmm/mmm_agent.conf
  2 include mmm_common.conf
  3 this db2
  4 [root@Slave01 ~]## vi /etc/mysql-mmm/mmm_agent.conf
  5 include mmm_common.conf
  6 this db3
  7 [root@Slave02 ~]## vi /etc/mysql-mmm/mmm_agent.conf
  8 include mmm_common.conf
  9 this db4

6.5 管理Monitor節點配置

  1 [root@Monitor ~]# vi /etc/mysql-mmm/mmm_mon.conf
  2 include mmm_common.conf
  3 <monitor>
  4     ip                  127.0.0.1                          #爲了安全,只設置本機監聽,mmm_mond默認監聽的端口爲9988
  6     pid_path            /var/run/mysql-mmm/mmm_mond.pid    #設置mmm_mond進程pid文件位置
  8     bin_path            /usr/libexec/mysql-mmm             #mmm可執行文件路徑
 10     status_path         /var/lib/mysql-mmm/mmm_mond.status #mmm集羣的狀態文件
 12     ping_ips            172.24.8.10, 172.24.8.11, 172.24.8.12, 172.24.8.13
 13 #用於測試的IP,只要其中有一個地址能ping通,表明網絡正常,不要寫入本機(即Monitor)IP。
 14     auto_set_online     60                                 #設置是否自動上線,若大於0,抖動的主機在抖動時間範圍事後,自動上線。
 16 ……
 17 </monitor>
 18 
 19 <host default>
 20     monitor_user        mmm_monitor                        #設置mmm_monitor帳號。
 22     monitor_password    x12345678                          #設置mmm_monitor密碼。
 24 </host>
 25 debug 0                                                    #mmm管理器的運行模式,1爲debug模式,0爲正常模式。

注意:mmm-mon.conf只須要在監控管理Monitor節點上配置便可。

七 MMM集羣的啓動

7.1 管理監控Monitor節點啓動

  1 [root@Monitor ~]# /etc/init.d/mysql-mmm-monitor start
  2 [root@Monitor ~]# chkconfig mysql-mmm-monitor on

7.2 全部agent節點啓動

  1 [root@Master01 ~]# /etc/init.d/mysql-mmm-agent start
  2 [root@Master01 ~]# chkconfig mysql-mmm-agent on
  3 [root@Master02 ~]# /etc/init.d/mysql-mmm-agent start
  4 [root@Master02 ~]# chkconfig mysql-mmm-agent on
  5 [root@Slave01 ~]# /etc/init.d/mysql-mmm-agent start
  6 [root@Slave01 ~]# chkconfig mysql-mmm-agent on
  7 [root@Slave02 ~]# /etc/init.d/mysql-mmm-agent start
  8 [root@Slave02 ~]# chkconfig mysql-mmm-agent on

八 MMM基本維護

8.1 MMM常見命令

  1 [root@Monitor ~]# mmm_control help
  2 Valid commands are:
  3     help                              - show this message	        #顯示幫助信息
  4     ping                              - ping monitor		#測試網絡運行狀態
  5     show                              - show status		        #顯示MMM集羣節點狀態
  6     checks [<host>|all [<check>|all]] - show checks status          #顯示MMM集羣中指定(全部)節點的詳細狀態
  8     set_online <host>                 - set host <host> online      #將MMM集羣中的節點設置爲online狀態
 10     set_offline <host>                - set host <host> offline     #將MMM集羣中的節點設置爲offline狀態
 12     mode                              - print current mode.         #顯示MMM集羣當前的運行模式,有active(默認)、manual和passive三種模式。
 14     set_active                        - switch into active mode.
 15     set_manual                        - switch into manual mode.
 16     set_passive                       - switch into passive mode.   #切換MMM集羣到以上三種模式。
 18     move_role [--force] <role> <host> - move exclusive role <role> to host <host>
 19 #在互斥模式下切換角色
 20                                      (Only use --force if you know what you are doing!)
 21     set_ip <ip> <host>                - set role with ip <ip> to host <host>
 22 #用來在被動模式下操縱角色

8.2 查看集羣狀態

  1 [root@Monitor ~]# mmm_control show
13_thumb1
解釋:
ONLINE:節點運行正常,處於在線狀態;
ADMIN_OFFLINE:節點是經過手動模式離線的;
HARD_OFFLINE:節點是MMM集羣執行ping操縱失敗或檢測到MySQL失敗而切換的一種狀態;
AWAITING_RECOVERY:等待恢復狀態;
REPLICATION_FAIL:主從複製失敗狀態,通常因爲複製主線程沒運行致使;
REPLICATION_DELAY:複製日誌有延遲,通常是因爲檢測日誌失敗致使的。

8.3 查看集羣運行模式

  1 [root@Monitor ~]# mmm_control mode
14_thumb1
解釋:
ACTIVE:表示主動模式,也是默認模式,即活動的Master故障後另外一個備份的Master可自動接管故障Master角色,繼續提供服務。Slave故障後其餘節點的Slave也會自動接管故障Slave角色,繼續提供服務。
MANUAL:表示手動模式,該模式不會自動執行切換,節點故障須要手動進行切換。
PASSIVE:表示被動模式,在此模式下,MMM管理端不會改變集羣節點的角色,也不更新狀態文件和發送任何信息給每一個agent節點。

8.4 檢查節點狀況

  1 [root@Monitor ~]# mmm_control checks all
15_thumb1
解釋:
ping:主要用來探測網絡可用性;
MySQL:檢測MySQL服務器是否運行正常;
rep_threads:檢測MySQL的複製線程是否正常運行;
rep_backlog:檢測MySQL的複製日誌是否有積壓。
注意:
以上四個檢測任何一項出現問題,都會進行角色切換操做,從而保證MySQL服務的高可用性。

8.5 日誌文件

db端:/var/log/mysql-mmm/mmm_agentd.log
監控端:/var/log/mysql-mmm/mmm_mond.log

九 測試MMM

9.1 測試集羣複製功能

  1 [root@Client ~]# mysql -uroot -px120952576 -h172.24.8.100
  2 mysql> show variables like "%hostname%";
  3 mysql> show variables like "%server_id%";

16_thumb1
  1 mysql> create database mysqltest;
  2 mysql> use mysqltest;
  3 mysql> create table user(id int(5),name char(10));
  4 mysql> insert into user values (00001,'zhangsan');

在Slave從服務器上進行驗證:
  1 [root@Master02 ~]# mysql -uroot -px120952576
  2 mysql> show databases;
  3 mysql> select * from mysqltest.user;

17_thumb1
其餘全部slave節點測試略。

9.2 讀寫分離測試

  1 [root@Client ~]# mysql -ummm_test -px120952576 -h172.24.8.101
  2 mysql> use mysqltest;
  3 mysql> create table test_mmm(id int,email varchar(100));

18_thumb1
結論:從reader權限的vip進入後只能進行讀,不能寫,實現了讀寫分離。

9.3 故障轉移測試

A Master轉移
  1 [root@Monitor ~]# mmm_control show			#查看現有集羣狀況
19_thumb1
  1 [root@Master01 ~]# service mysqld stop		#中止Master01節點
  2 [root@Monitor ~]# mmm_control show			#再次查看集羣節點狀況

20_thumb1
  1 [root@Master01 ~]# service mysqld start		#再次啓動Master01節點
  2 [root@Monitor ~]# mmm_control show

21_thumb1
結論:由上可知當Master01節點故障時,writer vip自動切換到Master02上,當Master01節點從新啓動,writer vip並不會切回Master01,相似Keepalived中的不搶佔模式,若須要Master01切回writer,可執行如下命令手動切回:
  1 [root@Monitor ~]# mmm_control move_role writer db1
  2 [root@Monitor ~]# mmm_control show

22_thumb1
B Slave轉移
  1 [root@Slave01 ~]# service mysqld stop
  2 [root@Monitor ~]# mmm_control show

23_thumb1
  1 [root@Slave01 ~]# service mysqld start
  2 [root@Monitor ~]# mmm_control show

24_thumb1
結論:由上可知當Slave01節點故障時,reader vip自動切換到Master02上,當Slave01節點從新啓動,reader vip會切回Slave01。

十 MMM總結

  1. Master02節點宕機不影響集羣的狀態,只是移除了Master02節點的讀狀態;
  2. Master01主節點宕機,由Master02主節點接管寫角色,Slave0一、Slave02指向新Master02主庫進行復制,Slave0一、Slave02會自動change master到Master02;
  3. MMM架構須要多個節點、多個IP,對服務器數量有要求;
  4. 在讀寫很是繁忙的業務系統下表現不是很穩定,可能會出現複製延時、切換失效等問題;
  5. MMM方案並不太適應於對數據安全性要求很高,而且讀、寫繁忙的環境中
參考資料1:http://www.cnblogs.com/chenmh/p/5563778.html
參考資料2:http://www.cnblogs.com/gomysql/p/3671896.html
參考資料3:《按部就班Linux》
相關文章
相關標籤/搜索