1. 程式人生 > >003.MMM雙主-雙從讀寫分離部署

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

一 前期規劃

1.1 主機規劃

功能 IP
主機名 server id 應用屬性 VIP MySQL版本
Monitor 172.24.8.20 Monitor —— 監控
—— ——
Master01 172.24.8.10 Master01 1 寫-writer 172.24.8.100 MySQL 5.6.37
Master02 172.24.8.11 Master02 2 讀-reader 寫-writer 172.24.8.101 172.24.8.102 172.24.8.103 172.24.8.104
Slave01 172.24.8.12 Slave01 3 讀-reader
Slave02 172.24.8.13 Slave02 4 讀-reader

1.2 虛擬IP規劃

VIP 備註
172.24.8.100 Master01主庫寫操作 Master01正常時候,Master02的vip對外提供只讀服務; Master01出現故障時候,Master02接替Master01對外提供讀寫服務。
172.24.8.101 只讀,讀查詢VIP,每個資料節點一個讀VIP, 可搭配LVS,HAProxy等負載均衡軟體對讀VIP進行負載均衡。
172.24.8.102
172.24.8.103
172.24.8.104

1.3 使用者列表

角色 許可權 描述
monitor replication client mmm監控MySQL服務健康
agent user SUPER, REPLICATION CLIENT, PROCESS mmm代理用來更改只讀模式、複製的主伺服器等
replication user replication slave 用於複製
提示:以上角色需要在所有節點新增。

1.4 整體架構

09

1.4 hosts修改

  1 [[email protected] ~]# vi /etc/sysconfig/network
  2 NETWORKING=yes
  3 HOSTNAME=Master01
  4 [[email protected] ~]# 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 [[email protected] ~]# 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。

3.2 Master02 my.cf配置

  1 [[email protected] ~]# service mysqld start
  2 [[email protected] ~]# 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 [[email protected] ~]# service mysqld restart
  9 [[email protected] ~]# mysql -uroot -px120952576
 10 mysql> show master status;
10 master01: file:mysql-bin.000001 position:120 注意:讀寫分離對於用於super或者all privileges許可權的使用者無效,需要建立普通使用者進行測試。

3.4 Master02建立賬號

略,同3.3 Master01建立賬號同樣操作即可。
  1 [[email protected] ~]# service mysqld restart
  2 [[email protected] ~]# mysql -uroot -px120952576
  3 mysql> show master status;
11 master02: file:mysql-bin.000001 position:120

3.5 啟動雙主複製

提示:如果Master01和Master02已經存在資料,則在開啟主備複製之前,需要將Master01和Master02手動同步一次(/var/lib/mysql整個目錄打包tar.gz),具體方法略。 注意:本實驗都是重新安裝的MySQL,可直接啟動同步
  1 [[email protected] ~]# 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 [[email protected] ~]# 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 [[email protected] ~]# scp /etc/my.cnf [email protected]:/etc/
  2 [[email protected] ~]# scp /etc/my.cnf [email protected]:/etc/
  3 [[email protected] ~]# vi /etc/my.cnf
  4 [mysqld]
  5 ……
  6 server-id=3				#設定主伺服器Slave01的id
  7 [[email protected] ~]# vi /etc/my.cnf
  8 [mysqld]
  9 ……
 10 server-id=4				#設定主伺服器Slave02的id
提示:從Master01將複製my.cnf至所有節點(除去monitor外),並修改相應的server id。

4.2 所有Slave節點建立賬號

  1 [[email protected] ~]# service mysqld start
  2 [[email protected] ~]# 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 [[email protected] ~]# service mysqld restart
  2 [[email protected] ~]# 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 [[email protected] tmp]# wget http://mirrors.ustc.edu.cn/epel/epel-release-latest-6.noarch.rpm
  2 [[email protected] tmp]# rpm -ivh epel-release-latest-6.noarch.rpm
  3 [[email protected] ~]# yum -y install mysql-mmm*

5.2 其他節點安裝MMM

  1 [[email protected] ~]# wget http://mirrors.ustc.edu.cn/epel/epel-release-latest-6.noarch.rpm
  2 [[email protected] ~]# rpm -ivh epel-release-latest-6.noarch.rpm
  3 [[email protected] ~]# yum -y install mysql-mmm-agent
注意:
  • MMM元件在常規YUM中不包含,需要安裝epel源;
  • 除monitor節點外其他節點只需要安裝mysql-mmm-agent即可。

提示:若yum安裝出現以下報錯,建議在所有節點改用編譯安裝,操作見附1-附2:

12

附1 新增安裝Perl指令碼

  1 [[email protected] ~]# 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 [[email protected] tmp]# wget http://mysql-mmm.org/_media/:mmm2:mysql-mmm-2.2.1.tar.gz
  2 [[email protected] tmp]# mv \:mmm2\:mysql-mmm-2.2.1.tar.gz mysql-mmm-2.2.1.tar.gz
  3 [[email protected] tmp]# tar -zxvf mysql-mmm-2.2.1.tar.gz
  4 [[email protected] tmp]# cd mysql-mmm-2.2.1/
  5 [[email protected] 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 [[email protected] ~]# 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 [[email protected] ~]# 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 [[email protected] ~]# vi /etc/default/mysql-mmm-agent
  2 ENABLED=1
注意:使用yum安裝則不需要配置mysql-mmm-agent ,預設已經添加了ENABLED=1。

6.4 其他節點配置

  1 [[email protected] ~]# scp /etc/mysql-mmm/mmm_common.conf [email protected]:/etc/mysql-mmm/
  2 [[email protected] ~]# scp /etc/mysql-mmm/mmm_common.conf [email protected]:/etc/mysql-mmm/
  3 [[email protected] ~]# scp /etc/mysql-mmm/mmm_common.conf [email protected]:/etc/mysql-mmm/
  4 [[email protected] ~]# scp /etc/default/mysql-mmm-agent [email protected]://etc/default/
  5 [[email protected] ~]# scp /etc/default/mysql-mmm-agent [email protected]://etc/default/
  6 [[email protected] ~]# scp /etc/default/mysql-mmm-agent [email protected]://etc/default/
提示:所有節點的mysql-mmm-agent和mmm_common.conf內容一致,從Master01複製即可,Monitor不需要配置agent。
  1 [[email protected] ~]# vi /etc/mysql-mmm/mmm_agent.conf
  2 include mmm_common.conf
  3 this db2
  4 [[email protected] ~]## vi /etc/mysql-mmm/mmm_agent.conf
  5 include mmm_common.conf
  6 this db3
  7 [[email protected] ~]## vi /etc/mysql-mmm/mmm_agent.conf
  8 include mmm_common.conf
  9 this db4

6.5 管理Monitor節點配置

  1 [[email protected] ~]# 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 [[email protected] ~]# /etc/init.d/mysql-mmm-monitor start
  2 [[email protected] ~]# chkconfig mysql-mmm-monitor on

7.2 所有agent節點啟動

  1 [[email protected] ~]# /etc/init.d/mysql-mmm-agent start
  2 [[email protected] ~]# chkconfig mysql-mmm-agent on
  3 [[email protected] ~]# /etc/init.d/mysql-mmm-agent start
  4 [