【博文推薦】Microsoft Azure部署MYSQL-MMM過程詳解
本博文出自51CTO博客之星李珣博主,有任何問題請進入博主頁面互動討論! |
MMM即Master-Master Replication Manager for MySQL(mysql主主復制管理器)關于mysql主主復制配置的監控、故障轉移和管理的一套可伸縮的腳本套件(在任何時候只有一個節點可以被寫 入),這個套件也能對居于標準的主從配置的任意數量的從服務器進行讀負載均衡,所以你可以用它來在一組居于復制的服務器啟動虛擬ip,除此之外,它還有實 現數據備份、節點之間重新同步功能的腳本。
MySQL本身沒有提供replication failover的解決方案,通過MMM方案能實現服務器的故障轉移,從而實現mysql的高可用。
MMM項目來自 Google:http://code.google.com/p/mysql-master-master
官方網站為:http://mysql-mmm.org
MMM主要功能由下面三個腳本提供
- l mmm_mond 負責所有的監控工作的監控守護進程,決定節點的移除等等
- l mmm_agentd 運行在mysql服務器上的代理守護進程,通過簡單遠程服務集提供給監控節點
- l mmm_control 通過命令行管理mmm_mond進程
在兩個節點的master-master環境下,MMM使用5個IP。每個單獨的節點使用一個固定IP,這個固定IP永遠不會變化。
2個reader IPs(read-only)和一個writer IP(updates),后面三個IP(2個reader IP和一個Writer IP)在兩個節點之間遷移,如何遷移取決于節點的可用性。
正 常情況下(沒有復制失敗,沒有復制延遲等)活動的master有兩個虛擬ip(reader和writer),備用的master有一個虛擬 ip(reader),如果活動的master失敗了,那么所有的reader和writer虛擬IP都會被分配給備用的master。
具體的配置信息如下所示:
- 角色 ip地址 主機名字 server-id
- monitoring 10.0.0.6 monitor -
- master1 10.0.0.4 db1 1
- master2 10.0.0.5 db2 2
- slave1 10.0.0.7 db3 3
業務中的服務ip信息如下所示:
- ip地址 角色 描述
- 10.0.0.80 write 應用程序連接該ip對主庫進行寫請求
- 10.0.0.90 read 應用程序連接該ip進行讀請求
- 10.0.0.100 read 應用程序連接該ip進行讀請求
部署架構如下圖:
MySQL-MMM優缺點
優點:高可用性,擴展性好,出現故障自動切換,對于主主同步,在同一時間只提供一臺數據庫寫操作,保證的數據的一致性。
缺點:Monitor節點是單點,可以結合Keepalived實現高可用。
#p#
具體的部署步驟如下:
(1)主機配置
在Azure中創建一個虛擬網絡,然后在庫中創建虛擬機,選擇基于CENTOS Openlogic 6.5
PS:由于MMM的監控機制需要檢查PING,請確保所有虛擬機在一個VNET下。
同時完成四臺虛擬機的創建,分別是master1、master2、slave、monitor,如下圖:
使用那個Xshell連接到VM
首先獲取root權限并修改root密碼,如下操作
Sudo su -
輸入密碼
Passwd root
在每一臺服務器上用yum命令安裝MYSQL服務
- # yum install mysql-server
安裝完成后重啟MYSQL服務
- # service mysqld restart
連接到mysql,修改mysql root密碼,如下操作:
- # mysql -uroot
- use mysql
- update user set password=password('p@ssw0rd') where user='root';
- flush privileges;
select user,host,password from mysql.user
#p#
(2)配置Master-Master復制
在db1(master1)、db2(master2)、db3(slave)上編譯my.conf
- #vi /etc/my.cnf
- [mysqld]
- datadir=/var/lib/mysql
- socket=/var/lib/mysql/mysql.sock
- user=mysql
- #下面為新添加的內容
- default-storage-engine = innodb
- replicate-ignore-db = mysql
- binlog-ignore-db = mysql
- server-id = 1 #每臺服務器不能相同
- log-bin = /var/log/mysql/mysql-bin.log
- log_bin_index = /var/log/mysql/mysql-bin.log.index
- relay_log = /var/log/mysql/mysql-bin.relay
- relay_log_index = /var/log/mysql/mysql-bin.relay.index
- expire_logs_days = 10
- max_binlog_size = 100M
- log_slave_updates = 1
注意:
1)server-id在每臺服務器上的值都是不一樣,在這里依次為1、2、3、4。
2) 因為在這里把log文件配置到了/var/log/mysql下,而mysql默認的目錄是在/var/lib/mysql,所以首先要新建mysql文 件夾,Mkdir /var/log/mysql,然后用chown -R mysql.mysql /var/log/mysql mysql命令將mysql的所有者修改為用戶mysql。其次要保證,mysql文件夾的權限755(即-rwxr-xr-x)。
如果沒 有修改權限和所有者,重啟服務時就會在錯誤日志中出現找不到mysql-bin.log或者mysql-bin.log.index的錯誤(/usr /libexec/mysqld: File '/var/log/mysql/mysql-bin.log.index' not found (Errcode: 13))。
完成編譯后重啟MYSQL服務
檢查復制狀態,如下圖:
show master status;
檢查日志是否生成道新目錄,如下
# ls /var/log/mysql
使用mysql-mmm時一共需要三個用戶: replication、mmm_agent和mmm_monitor(管理服務器上用來監控cluster狀態的用戶,所以可以限定只能從管理服務器登錄)。使用下面三條命令新建這三個用戶并分配相應的權限
GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'10.0.0.%' IDENTIFIED BY 'monitor';
GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'10.0.0.%' IDENTIFIED BY 'agent';
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'10.0.0.%' IDENTIFIED BY 'replication';
接下來再db1和db2分別執行下面命令修改復制賬戶和密碼。并啟動SLAVE進程。
change master to master_host='10.0.0.4', master_port=3306, master_user='replication', master_password='replication';start slave;
change master to master_host='10.0.0.5', master_port=3306, master_user='replication', master_password='replication';start slave;
檢查復制狀態,如下圖:
show slave status\G
#p#
(3)安裝配置MYSQL-MMM
在db1、db2、db3安裝MMM所需要的Perl模塊(所有服務器)執行該腳本,然后 yum -y install mysql-mmm-agent來安裝MMM :
- # rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
- # yum -y install mysql-mmm-agent
在Monitor節點安裝mysql-mmm-monitor
- # yum -y install mysql-mmm-monitor*
- # yum -y install perl-Time-HiRes*
編譯DB1上的mmm_common.conf配置agent:
- # sudo vim /etc/mysql-mmm/mmm_common.conf
- active_master_role writer
- cluster_interface eth0
- pid_path /var/run/mysql-mmm/mmm_agentd.pid
- bin_path /usr/libexec/mysql-mmm/
- replication_user replication
- replication_password replication
- agent_user mmm_agent
- agent_password agent
- ip 10.0.0.4
- mode master
- peer db2
- ip 10.0.0.5
- mode master
- peer db1
- ip 10.0.0.7
- mode slave
- hosts db1, db2
- ips 10.0.0.100
- mode exclusive
- hosts db2, db3
- ips 10.0.0.80, 10.0.0.90
- mode balanced
其中 replication_user 用于檢查復制的用戶, agent_user 為agent的用戶, mode 標明是否為主或者備選主,或者從庫。 mode exclusive 主為獨占模式,同一時刻只能有一個主, 中hosts表示目前的主庫和備選主的真實主機ip或者主機名, ips 為對外提供的虛擬機ip地址, 中hosts代表從庫真實的ip和主機名, ips 代表從庫的虛擬ip地址。
完成編譯后通過scp復制到db2、db3、monitor節點:
- # scp /etc/mysql-mmm/mmm_common.conf 10.0.0.5:/etc/mysql-mmm/
- # scp /etc/mysql-mmm/mmm_common.conf 10.0.0.7:/etc/mysql-mmm/
- # scp /etc/mysql-mmm/mmm_common.conf 10.0.0.6:/etc/mysql-mmm/
分別在db1,db2,db3三臺主機的/etc/mysql-mmm配置mmm_agent.conf文件,分別用不同的字符標識,注意這三臺機器的this db1這塊要想,比如本環境中,db1要配置this db1,db2要配置為this db2,而db3要配置為this db3。
- # sudo vim /etc/mysql-mmm/mmm_agent.conf
在monitor節點編譯monitor配置文件,添加ping_ips中的內容
- # sudo vim /etc/mysql-mmm/mmm_mon.conf
在db1、db2、db3啟動agent服務
- # service mysql-mmm-agent start
在monitor啟動monitor服務