標籤:
本文來自我的github pages部落格http://galengao.github.io/ 即www.gaohuirong.cn
MMM(Master-Master replication manager for MySQL)是一套支援雙主故障切換和雙主日常管理的指令碼程式。MMM使用Perl語言開發,主要用來監控和管理MySQL Master-Master(雙主)複製,雖然叫做雙主複製,但是業務上同一時刻只允許對一個主進行寫入,另一台備選主上提供部分讀服務,以加速在主主切換時刻備選主的預熱,可以說MMM這套指令碼程式一方面實現了故障切換的功能,另一方面其內部附加的工具指令碼也可以實現多個slave的read負載平衡。
MMM提供了自動和手動兩種方式移除一組伺服器中複寫延遲較高的伺服器的虛擬ip,同時它還可以備份資料,實現兩節點之間的資料同步等。由於MMM無法完全的保證資料一致性,所以MMM適用於對資料的一致性要求不是很高,但是又想最大程度的保證業務可用性的情境。對於那些對資料的一致性要求很高的業務,非常不建議採用MMM這種高可用架構。
實現原理
兩台master互為主從,一台為唯讀,做為備份,應急時可做為寫master.其中mmm_mond進程定時心跳檢測,失敗則將write ip 浮動到另外一台master。
MySQL-MMM優缺點
- 優點:高可用性,擴充性好,出現故障自動切換,對於主主同步,在同一時間只提供一台資料庫寫操作。
- 缺點:Monitor節點是單點,可以結合Keepalived實現高可用
- 由於MMM無法完全的保證資料一致性,所以MMM適用於對資料的一致性要求不是很高,但是又想最大程度的保證業務可用性的情境。對於那些對資料的一致性要求很高的業務,非常不建議採用MMM這種高可用架構。
安裝mysql軟體
在每台伺服器上安裝mysql軟體,安裝參照《linux 6 源碼安裝mysql5.6》 在每台伺服器上關閉selinux,關閉防火牆 在設定檔my.cnf裡增加如下內容:
[mysqld]datadir=/usr/local/mysql/datasocket=/var/lib/mysql/mysql.sockuser=mysql #下面為新添加的內容default-storage-engine = innodb replicate-ignore-db = mysqlbinlog-ignore-db= mysql server-id = 1log-bin = /usr/local/mysql/logs/mysql-bin.loglog_bin_index = /usr/local/mysql/logs/mysql-bin.log.indexrelay_log = /usr/local/mysql/logs/mysql-bin.relayrelay_log_index = /usr/local/mysql/logs/mysql-bin.relay.indexexpire_logs_days= 10max_binlog_size = 100Mlog_slave_updates sync-binlog = 1
在/etc/hosts裡配上所有主機資訊
192.168.10.131 db1192.168.10.132 db2192.168.10.133 db3192.168.10.134 db4192.168.10.135 db5
配置主主複製
即兩個主master(db1、db2)互為主從,與主從類似,只是需要逆向配置一下。
a、先查看db1 db2 binlog日誌和pos值
db1
db2
b、在db1執行:
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘replication‘@‘192.168.10.%‘ IDENTIFIED BY ‘replication‘;mysql> flush privileges;mysql> change master to master_host=‘192.168.10.132‘, master_user=‘replication‘,master_password=‘replication‘, master_log_file=‘mysql-bin.000003‘,master_log_pos=120; mysql> start slave; #啟動同步
c、在db2執行:
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘replication‘@‘192.168.10.%‘ IDENTIFIED BY ‘replication‘;mysql> flush privileges;mysql> change master to master_host=‘192.168.10.131‘, master_user=‘replication‘,master_password=‘replication‘, master_log_file=‘mysql-bin.000001‘,master_log_pos=120; mysql> start slave; #啟動同步
db3、db4作為db1的從庫slave
在db3、db4上執行
mysql> change master to master_host=‘192.168.10.131‘, master_user=‘replication‘,master_password=‘replication‘, master_log_file=‘mysql-bin.000001‘,master_log_pos=120; mysql> start slave; #啟動同步
MYSQL-MMM的安裝
(1)epel源安裝
CentOS 預設沒有 mysql-mmm 軟體包,官方推薦使用 epel 的網路源,五台都安裝epel:
wget http://mirrors.hustunique.com/epel/6/x86_64/epel-release-6-8.noarch.rpm wget http://mirrors.hustunique.com/epel/RPM-GPG-KEY-EPEL-6 rpm --import RPM-GPG-KEY-EPEL-6 rpm -ivh epel-release-6-8.noarch.rpm
(2)monitor節點安裝db5
在db5上執行
yum -y install mysql-mmm-monitor
(3)四台db節點上安裝agent
在db1 db2 db3 db4上執行
yum -y install mysql-mmm-agent
(4)四台db節點上授權monitor訪問
在db1 db2 db3 db4執行
mysql -uroot -pmysql> GRANT REPLICATION CLIENT ON *.* TO ‘mmm_monitor‘@‘192.168.10.%‘ IDENTIFIED BY ‘monitor‘; mysql> GRANT SUPER,REPLICATION CLIENT, PROCESS ON *.* TO ‘mmm_agent‘@‘192.168.10.%‘ IDENTIFIED BY‘agent‘;
(5)在db1上修改mmm_common.conf檔案(5台相同)
vi /etc/mysql-mmm/mmm_common.confactive_master_role writer<host default>cluster_interface eth0pid_path/var/run/mysql-mmm/mmm_agentd.pidbin_path/usr/libexec/mysql-mmm/replication_userreplicationreplication_passwordreplicationagent_user mmm_agentagent_password agent</host><host db1>ip 192.168.10.131modemasterpeerdb2</host><host db2>ip 192.168.10.132modemasterpeerdb1</host><host db3>ip 192.168.10.133modeslave</host><host db4>ip 192.168.10.134modeslave</host><role writer>hosts db1, db2ips 192.168.10.128modeexclusive #只有一個虛擬IP可以寫</role><role reader>hosts db3, db4ips 192.168.10.129, 192.168.10.130modebalanced #多個虛擬ip可以讀</role>
傳到其它4個節點
scp /etc/mysql-mmm/mmm_common.conf [email protected]192.168.10.132:/etc/mysql-mmm/scp /etc/mysql-mmm/mmm_common.conf [email protected]192.168.10.133:/etc/mysql-mmm/scp /etc/mysql-mmm/mmm_common.conf [email protected]192.168.10.134:/etc/mysql-mmm/scp /etc/mysql-mmm/mmm_common.conf [email protected]192.168.10.135:/etc/mysql-mmm/
若無scp命令,安裝一下包
yum install openssh-clients
(6)修改四台db代理端 mmm_agent.conf 檔案
在db1 db2 db3 db4上修改
vi /etc/mysql-mmm/mmm_agent.confinclude mmm_common.confthis db1 #分別修改為原生主機名稱,即db1、db2、db3和db4
(7)修改管理端的mmm_mon.conf檔案
在db5上執行
vi /etc/mysql-mmm/mmm_mon.confinclude mmm_common.conf<monitor>ip 127.0.0.1pid_path/var/run/mysql-mmm/mmm_mond.pidbin_path/usr/libexec/mysql-mmmstatus_path /var/lib/mysql-mmm/mmm_mond.statusping_ips192.168.10.131,192.168.10.132,192.168.10.133,192.168.10.133,192.168.10.134 #真實資料庫IP,來檢測網路是否正常auto_set_online 10 #恢複後自動化佈建線上的時間</monitor><host default>monitor_usermmm_monitormonitor_passwordmonitor</host>debug 0
啟動MYSQL-MMM
(1)db代理端啟動db1 db2 db3 db4
[[email protected] ~]# /etc/init.d/mysql-mmm-agent start[[email protected] ~]# chkconfig mysql-mmm-agent on
(2)monitor管理端啟動 db5
[[email protected] ~]# /etc/init.d/mysql-mmm-monitor start[[email protected] ~]# chkconfig mysql-mmm-monitor on
測試叢集
(1)查看叢集狀態db5
mmm_control show
(2)容錯移轉
類比停掉db1資料庫後
看它的狀態變了
CENTOS6.6下mysql MMM架構搭建