----本文大綱
簡介
資源配置
拓撲圖
實現過程
一、簡介
MMM 即Master-Master Replication Manager for MySQL(mysql主主復制管理器)關於mysql主主復制配置的監控、故障轉移和管理的一套可伸縮的腳本套件(在任何時候只有一個節點可以被寫 入),這個套件也能對居於標准的主從配置的任意數量的從服務器進行讀負載均衡,所以你可以用它來在一組居於復制的服務器啟動虛擬ip,除此之外,它還有實 現數據備份、節點之間重新同步功能的腳本。MySQL本身沒有提供replication failover的解決方案,通過MMM方案能實現服務器的故障轉移,從而實現mysql的高可用。MMM不僅能提供浮動IP的功能,更可貴的是如果當前 的主服務器掛掉後,會將你後端的從服務器自動轉向新的主服務器進行同步復制,不用手工更改同步配置。這個方案是目前比較成熟的解決方案。
方案優缺點優點:安全性、穩定性高,可擴展性好,高可用,當主服務器掛掉以後,另一個主立即接管,其他的從服務器能自動切換,不用人工干預。
缺點:至少三個節點,對主機的數量有要求,需要實現讀寫分離,對程序來說是個挑戰。
第一步是在主庫上記錄二進制日志(稍後介紹如何設置)。在每次准備提交事務完成數 據更新前,主庫將數據更新的事件記錄到二進制日志中。MySQL會按事務提交的順序 而非每條語句的執行順序來記錄二進制日志。在記錄二進制日志後,主庫會告訴存儲引 擎可以提交事務了。 _
下一步,備庫將主庫的二進制日志復制到其本地的中繼日志中。首先,備庫會啟動一個 工作線程,稱為I/O線程,I/O線程跟主庫建立一個普通的客戶端連接,然後在主庫上啟 動一個特殊的二進制轉儲(binhg dump、線程(該線程沒有對應的SQL命令),這個二 進制轉儲線程會讀取主庫上二進制日志中的事件。它不會對事件進行輪詢。如果該線程 追趕上了主庫,它將進入睡眠狀態,直到主庫發送信號量通知其有新的事件產生時才會 被喚醒,備庫I/O線程會將接收到的事件記錄到中繼日志中。
備庫的SQL線程執行最後一步,該線程從中繼日志中讀取事件並在備庫執行,從而實現 備庫數據的更新。當SQL線程追趕上I/O線程時,中繼日志通常已經在系統緩存中,所 以中繼日志的開銷很低。SQL線程執行的事件也可以通過配置選項來決定是否寫入其自 己的二進制日志中,它對於我們稍後提到的場景非常有用。這種復制架構實現了獲取事件和重放事件的解耦,允許這兩個過程異步進行。也就是說 I/o線程能夠獨立於SQL線程之外工作。但這種架構也限制了復制的過程,其中最重要 的一點是在主庫上並發運行的査詢在備庫只能串行化執行,因為只有一個SQL線程來重 放中繼日志中的事件。後面我們將會看到,這是很多工作負載的性能瓶頸所在。雖然有 一些針對該問題的解決方案,但大多數用戶仍然受制於單線程。
二、資源配置
主機屬性
虛擬ip(VIP)
DB1 192.168.1.109 192.168.1.24
DB2 192.168.1.112 192.168.1.24,192.168.1.22
DB3 192.168.1.113 192.168.1.23
三、拓撲圖
要在MySQL 5.6中使用復制功能,其服務配置段[mysqld]中於少應該定義如下選項:
binlog-. 開始,可以用以下三種模式來實現:基於SQL語句的復制(statement-based replication, SBR),基於行的復制(row-based replication, RBR),混合模式復制(mixed-===> SET SESSION binlog_format = > SET SESSION binlog_format = > SET SESSION binlog_format = > SET GLOBAL binlog_format = > SET GLOBAL binlog_format = > SET GLOBAL binlog_format = ***** SYSDATE() (除非啟動時啟用了 --sysdate-is-***--slave-updates、gtid-mode、enforce-gtid-consistency、report-port和report---repository和relay-log---master--paralles--checksum、master-verify-checksum和slave-sql-verify--rows-query-log--bin:啟用二進制日志,這是保證復制功能的基本前提;如果主服務器運行時沒有啟用--logs-bin,SHOW MASTER STATUS或mysqldump --master--:同一個復制拓撲中的所有服務器的id號必須唯一;這些ID值能唯一識別復制服務器群集中的每個服務器實例
四、實現過程
1、配置DB1
修改配置文件/etc/my.cnf,添加如下語句
server-==/mariadb/data/mysql-=-slave-==默認地,AUTO_INCREMENT 的開始值是 1,每條新記錄遞增 1。=
授權用戶
MariaDB [(none)]> grant replication slave,replication client on *.* to @ identified by rows affected (> grant replication slave,replication client on *.* to @ identified by rows affected ( sec)
查看binlog日志標記
MariaDB [(none)]>+------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin. | | | | +------------------+----------+--------------+------------------+ row set ( sec)
2、配置DB2
修改配置文件/etc/my.cnf,添加如下語句
log-bin=mysql-=-slave-===-=
授權用戶
MariaDB [(none)]> grant replication slave,replication client on *.* to @ identified by rows affected ( sec)
查看binlog日志標記
MariaDB [(none)]>+------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin. | | | | +------------------+----------+--------------+------------------+ row set ( sec)
連接DB1
MariaDB [(none)]>+------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin. | | | | +------------------+----------+--------------+------------------+ row set ( sec)
3、配置DB3
修改配置文件/etc/my.cnf添加如下語句
server-=-bin=mysql--slave-relay-log=relay-log-bin
連接DB1
MariaDB [(none)]> change master to master_host=,master_user=,master_password=,master_log_file=,master_log_pos= rows affected (> rows affected (>*************************** . row ***************************.-bin.-log-bin.-bin./etc/slave//etc/slave//etc/slave//etc/slave/ row set ( sec)
DB1連接DB2
MariaDB [(none)]> change master to master_host=,master_user=,master_password=,master_log_file=,master_log_pos= rows affected (> rows affected (>*************************** . row ***************************.-bin.-relay-bin.-bin. row set ( sec)
4、測試
在DB2中建立一個數據庫testdb
MariaDB [(none)]> change master to master_host=,master_user=,master_password=,master_log_file=,master_log_pos= rows affected (> rows affected (>*************************** . row ***************************.-bin.-relay-bin.-bin. row set ( sec)
在DB1中對testdb,插入一條數據
MariaDB [testdb]> insert t1 values (, row affected ( sec)
在DB3中查看結果
MariaDB [(none)]> *+------+-----+ | name | age | +------+-----+ | tom | | | king | | +------+-----+ rows set (>
OK!三台DB的主從配置正常工作
5、安裝mysql-mmm-agent
在DB1~3上安裝mysql-mmmo-agent
注:mysql-mmm-agent是在epel源中,所以要下載EPEL源安裝包即可http://download.fedoraproject.org/pub/epel/6/i386/repoview/epel-release.html
下載對應的版本就可以的。
#rpm -ivh epel-release-- -y mysql-mmm-agent
每一個節點都要安裝
在每一個節點上要給Monitor授權用戶
MariaDB [(none)]> GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO @ IDENTIFIED BY rows affected (> GRANT REPLICATION CLIENT ON *.* TO @ IDENTIFIED BY rows affected (> GRANT REPLICATION CLIENT ON *.* TO @ IDENTIFIED BY rows affected ( sec)
6、在Monitor節點上要安裝
# -y mysql-mmm*
此包同樣也在epel源中
7、在Monitor端的設置/etc/mysql-mmm/mmm_common.conf
<host default>/var/run/mysql-mmm//usr/libexec/mysql-mmm/</host> <host db1>.</host> <host db2>.</host> <host db3>.</host> <role writer>.</role> <role reader>., .</role>
將此文件分發到各DB1~3中的/etc/mysql-mmm/下
8、每一個DB中都會有mmm_agent的配置文件,編輯mmm_agent.conf
在數據庫服務器上,還有一個mmm_agent.conf需要修改,其內容是:
第一行表示:將之前Monitor中的mmm_common.conf文件載入到此文件中,供此文件中的參數設用。
最後一行標記此主機的角色(引用mmm_common.conf中的host段)在不同的數據庫服務器上要分別改為db1和db3否則代理就會無法啟動。
9、編輯mmm_mon.confg
在Monitor上,修改mmm_mon.conf文件,修改後內容為:
<monitor>./var/run/mysql-mmm//usr/libexec/mysql-/var/lib/mysql-mmm/., . # Functionality /usr/libexec/mysql-mmm/monitor/</monitor> <host default></host> #關閉debug功能,如果程序無法監控得到,可以使用debug 1查錯
10、啟動MMM
在各DB端啟動mmm-agent
#cd /etc/init.d/-mmm--mmm-monitor start
在Monitor端啟動監控程序
#cd /etc/init.d/-mmm--mmm-monitor start
過幾秒鐘,就可以使用mmm_control show查看在線監控端(DB)了
[root@essun ~]# service mysql-mmm-~.) master/.) master/ONLINE. Roles: reader(.), writer(..) slave/ONLINE. Roles: reader(.)
注:可以使用
[root@essun ~]# mmm_control --- - -<host>|all [<check>|all]] -<host> - set host <host><host> - set host <host>------force] <role> <host> - move exclusive role <role> to host <host>--force you know what you are doing!<ip> <host> - set role with ip <ip> to host <host>
查看mmm_control的可用參數
11、模擬DB2下線
Monitor當前狀態
讓DB2下線,當前可寫主機是db1,db3
db2沒有下線之前還可以讀寫,當下線之後,可寫的切換到DB1上了,所有讀的都到了db3上了
當DB2重新上線後的情況如下
注:DB1、DB同時只能一有個寫,一個讀!
========================================== Mariadb高可用演示完畢========================