- 1.MMM的概述
- 2.MMM的工作原理
- 3.如何實現主主複製
1.MMM的概述
MMM(Master-Master replication manager for MySQL,MySQL主主複製管理器)
是一套支援雙主故障切換和雙主日常管理的指令碼程式。MMM 使用 Perl 語言開發,主要用來監控和管理 MySQL Master-Master (雙主)複製,雖然叫做雙主複製,但是業務上同一時刻只允許對一個主進行寫入,另一臺備選主上提供部分讀服務,以加速在主主切換時備選主的預熱,可以說MMM這套指令碼程式一方面實現了故障切換的功能,另一方面其內部附加的工具指令碼也可以實現多個 Slave 的 read 負載均衡。
MMM提供了自動和手動兩種方式移除一組伺服器中複製延遲較高的伺服器的虛擬ip,同時它還可以備份資料,實現兩節點之間的資料同步等。由於MMM無法完全保證資料的一致性,所以MMM適用於對資料的一致性要求不是很高,但是又想最大程度地保證業務可用性的場景。
MMM是一套靈活的指令碼程式,基於perl實現,用來對 mysql replication 進行監控和故障遷移,並能管理 MySQL Master-Master 複製的配置。
關於 MMM 高可用架構的說明如下:
mmm_mon:監控程序,負責所有的監控工作,決定和處理所有節點角色活動。此指令碼需要在監控主機上執行。
mmm_agent:執行在每個MySQL伺服器上的代理程序,完成監控的探針工作和執行簡單的遠端服務設定。此指令碼需要在被監管機上執行。
mmm_control:一個簡單的指令碼,提供管理 mmm_mon 程序的命令。
mysql-mmm 的監管端會提供多個虛擬 IP(VIP),包括一個可寫 VIP,多個可讀 VIP,透過監管的管理,這些 IP 會繫結在可用 MySQL 之上,當某一臺 MySQL 當機時,監管會將 VIP 遷移至其他 MySQL。
在整個監管過程中,需要在 MySQL 中新增相關授權使用者,以便讓 MySQL 可以支援監控主機的維護。 授權的使用者包括一個 mmm_monitor 使用者和一個 mmm_agent 使用者。
2.MMM的工作原理
MMM 透過監控 MySQL 例項的狀態來實現故障檢測和自動故障轉移。當一個主節點發生故障時,MMM 會自動將其中一個從節點提升為新的主節點,確保資料庫的可用性。
MMM 還可以根據負載情況自動進行負載均衡。它可以根據每個節點的負載情況,將讀操作分發到不同的節點上,從而提高系統的整體效能。
MMM 還提供了一些管理工具,可以方便地進行節點的新增、刪除和配置修改等操作
3.如何實現主主複製
1)時間同步:確保兩臺伺服器的時間同步
2)配置檔案修改:在兩臺伺服器的MySQL配置檔案中啟用二進位制日誌和主從複製相關引數。
3)建立複製使用者:在兩臺伺服器上分別建立用於複製的使用者,並授予必要許可權
4)互為主從配置:在伺服器A上設定伺服器B為從庫;在伺服器B上設定伺服器A為從庫
5)啟動複製:在兩臺伺服器上分別執行 START SLAVE
6)檢查狀態:使用 SHOW SLAVE STATUS\G 檢視複製狀態,確保無錯誤
1)MMM 方案(單主)
MMM 透過監控 MySQL 例項的狀態來實現故障檢測和自動故障轉移。當一個主節點發生故障時,MMM 會自動將其中一個從節點提升為新的主節點,確保資料庫的可用性。
MMM 還可以根據負載情況自動進行負載均衡。它可以根據每個節點的負載情況,將讀操作分發到不同的節點上,從而提高系統的整體效能。
MMM 還提供了一些管理工具,可以方便地進行節點的新增、刪除和配置修改等操作。
優點:
高可用性:MMM 透過自動故障檢測和故障轉移機制,可以快速將一個從節點提升為新的主節點,從而實現資料庫的高可用性,減少系統的停機時間。
負載均衡:MMM 可以根據節點的負載情況,將讀操作分發到不同的節點上,從而實現負載均衡,提高系統的整體效能。
簡單易用:MMM 提供了一些管理工具,可以方便地進行節點的新增、刪除和配置修改等操作,使得系統的管理和維護變得簡單易用。
缺點:
資料一致性:由於 MMM 採用的是非同步複製機制,主節點和從節點之間存在一定的延遲,可能導致資料的不一致。在某些場景下,可能需要額外的措施來確保資料的一致性。
單點故障:雖然 MMM 可以自動進行故障轉移,但在故障轉移過程中,可能會存在一段時間的資料庫不可用。如果 MMM 本身發生故障,可能會導致整個系統的不可用。
配置複雜性:MMM 的配置相對複雜,需要對 MySQL 的複製機制和 MMM 的工作原理有一定的瞭解。在配置過程中,需要注意各個節點的配置一致性和正確性。
搭建 MySQL MMM
1)Master1節點伺服器20.0.0.140
2)Master2 節點伺服器20.0.0.150
3)Slave1節點伺服器20.0.0.170
4)Slave2節點伺服器20.0.0.180
5)monitor 20.0.0.110
systemctl disable --now firewalld
setenforce 0
vim /etc/selinux/config
disabled
##修改 Master、Slave1、Slave2、MHA manager節點的主機名
hostnamectl set-hostname mysql1 ##Master1
hostnamectl set-hostname mysql2 ##Master2
hostnamectl set-hostname mysql3 ##Slave1
hostnamectl set-hostname mysql4 ##Slave2
hostnamectl set-hostname monitor ##monitor
bash
1)Master1節點伺服器20.0.0.140
##修改 master1 配置檔案
vim /etc/my.cnf
······
/usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
##這裡要改##
server-id = *
##插入##
log-error=/usr/local/mysql/data/mysql_error.log
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
slow_query_log=ON
slow_query_log_file=mysql_slow_query.log
long_query_time=5
binlog-ignore-db=mysql,information_schema
log_bin=mysql_bin
log_slave_updates=true
sync_binlog=1
innodb_flush_log_at_trx_commit=1
auto_increment_increment=2
auto_increment_offset=1
##把配置檔案複製到其它 3 臺資料庫伺服器上並啟動伺服器,注意:配置檔案中的 server_id 要修改
scp /etc/my.cnf root@<主MySQL伺服器2IP>:/etc/
scp /etc/my.cnf root@<從MySQL伺服器1IP>:/etc/
scp /etc/my.cnf root@<從MySQL伺服器2IP>:/etc/
2)Master2 節點伺服器20.0.0.150
3)Slave1節點伺服器20.0.0.170
4)Slave2節點伺服器20.0.0.180
vim /etc/my.cnf
server-id = *
systemctl restart mysqld
1)Master1節點伺服器20.0.0.140
2)Master2 節點伺服器20.0.0.150
配置主主複製,兩臺主伺服器相互複製,在兩臺主伺服器上,從伺服器上不需要執行.
grant replication slave on *.* to '<主從使用者名稱>'@'<登入網段>%' identified by '<主從密碼>';
show master status;
1)Master1節點伺服器20.0.0.140
在 主MySQL伺服器1 上配置同步
change master to master_host='<主MySQL伺服器2IP>',master_user='<主從使用者名稱>',master_password='<主從密碼>',master_log_file='<主MySQL伺服器2二進位制日誌檔名>',master_log_pos=<偏移量>;
start slave;
show slave status\G
2)Master 節點伺服器20.0.0.150
在 主MySQL伺服器2 上配置同步
change master to master_host='<主MySQL伺服器1IP>',master_user='<主從使用者名稱>',master_password='<主從密碼>',master_log_file='<主MySQL伺服器1二進位制日誌檔名>',master_log_pos=<偏移量>;
start slave;
show slave status\G
3)Slave1節點伺服器20.0.0.170
4)Slave2節點伺服器20.0.0.180
在兩臺從伺服器上,主伺服器上不需要執行,配置主從複製,在兩臺從伺服器上做
change master to master_host='<主MySQL伺服器1IP>',master_user='<主從使用者名稱>',master_password='Admin@123',master_log_file='<主MySQL伺服器1二進位制日誌檔名>',master_log_pos=<偏移量>;
start slave;
show slave status\G
##授權配置錯誤修正
STOP SLAVE;
RESET SLAVE;
1)Master節點伺服器20.0.0.140
測試主主、主從 同步情況
show databases;
create database mydb;
show databases;
在所有伺服器上安裝 MySQL-MMM
1)Master節點伺服器20.0.0.140
2)Master 節點伺服器20.0.0.150
3)Slave1節點伺服器20.0.0.170
4)Slave2節點伺服器20.0.0.180
5)monitor伺服器20.0.0.110
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
cd /etc/yum.repos.d/
rz -E 上傳 epel.repo
vim epel.repo
gpgcheck=0
cd /opt/
mkdir /opt/yumcache
cd /etc/yum.repos.d
mv repo.bak/* ./
mv local.repo repo.bak
cd /opt/yumcache
yum install -y epel-release
yum -y install mysql-mmm*
在 主MySQL伺服器1 上對 MySQL-MMM 進行配置
1)Master節點伺服器20.0.0.140
cd /etc/mysql-mmm/
cp mmm_common.conf mmm_common.conf.bak
vim mmm_common.conf
······
##修改##
<host default>
cluster_interface <網路卡名> ens33
……
replication_user <主從使用者名稱> replication
replication_password <主從密碼> replication123
agent_user <MMM代理使用者名稱> mmm_agent
agent_password <MMM代理密碼> mmm_agent123
<host db1>
ip <主MySQL伺服器1IP> 20.0.0.140
mode master
peer db2
</host>
<host db2>
ip <主MySQL伺服器2IP> 20.0.0.150
mode master
peer db1
</host>
<host db3>
ip <從MySQL伺服器1IP> 20.0.0.170
mode slave
</host>
##複製<host db3>開始的4行貼上到這##
<host db4>
ip <從MySQL伺服器2IP> 20.0.0.180
mode slave
</host>
<role writer>
hosts db1, db2
ips <主虛擬IP> 20.0.0.66 ##設定寫VIP
mode exclusive #只有一個 host 可以進行寫操作模式
</role>
<role reader>
hosts db3, db4
ips <從虛擬IP1>, <從虛擬IP2> 20.0.0.88, 20.0.0.99 ##設定讀VIP
mode balanced ##多個 slave 主機可以進行讀操作模式
</role>
##把配置檔案複製到其它 4 臺主機,所有主機該配置檔案內容都是一樣的
scp mmm_common.conf root@<主MySQL伺服器2IP>:/etc/mysql-mmm/
scp mmm_common.conf root@<從MySQL伺服器1IP>:/etc/mysql-mmm/
scp mmm_common.conf root@<從MySQL伺服器2IP>:/etc/mysql-mmm/
scp mmm_common.conf root@<節點伺服器1IP>:/etc/mysql-mmm/
修改所有資料庫伺服器的代理配置檔案 mmm_agent.conf
1)Master節點伺服器20.0.0.140
2)Master 節點伺服器20.0.0.150
3)Slave1節點伺服器20.0.0.170
4)Slave2節點伺服器20.0.0.180
vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
······
this db*
#根據不同的主機分別修改為 db1,db2,db3,db4上文hosdb配置
在 monitor 監控伺服器上修改監控配置檔案 mmm_mon.conf
5)monitor 20.0.0.110
vim /etc/mysql-mmm/mmm_mon.conf
include mmm_common.conf
<monitor>
.....
ping_ips <主MySQL伺服器1IP>,<主MySQL伺服器2IP>,<從MySQL伺服器1IP>,<從MySQL伺服器2IP>
auto_set_online <10~60之間任選一個數字>
</monitor>
<host default>
monitor_user <MMM監控使用者名稱> monitor
monitor_password <MMM監控密碼> monitor123
</host>
在所有資料庫上為 mmm_agent(代理程序)、 mmm_moniter(監控程序)授權
1)Master節點伺服器20.0.0.140
2)Master 節點伺服器20.0.0.150
3)Slave2節點伺服器20.0.0.170
4)Slave1節點伺服器20.0.0.180
grant super, replication client, process on *.* to '<MMM代理使用者名稱>'@'<登入網段>%' identified by '<MMM代理密碼>';
grant replication client on *.* to '<MMM監控使用者名稱>'@'<登入網段>%' identified by '<MMM監控密碼>';
flush privileges;
在所有資料庫伺服器上啟動 mysql-mmm-agent
1)Master節點伺服器20.0.0.140
2)Master 節點伺服器20.0.0.150
3)Slave1節點伺服器20.0.0.170
4)Slave2節點伺服器20.0.0.180
systemctl enable mysql-mmm-agent.service --now ##在所有資料庫伺服器上啟動 mysql-mmm-agent
5)monitor 20.0.0.110
systemctl start mysql-mmm-monitor.service ##在 monitor 伺服器上啟動 mysql-mmm-monitor
在 monitor 伺服器上測試,檢視各節點的情況
5)monitor 20.0.0.110
mmm_control show ##檢測監控功能是否都完善,需要各種OK
mmm_control move_role writer db2 ##指定繫結 VIP 的主機
##故障測試
mmm_control move_role writer db1
#停止 master01 確認 VIP 是否移動到 master02 上。注意:master01 主伺服器恢復服務後,不會搶佔
systemctl stop mysqld
mmm_control show
#停止一臺從伺服器,另一臺將接管兩個虛擬IP,以保證業務不停止
systemctl stop mysqld
mmm_control show
客戶端測試
在 master01 伺服器上為 monitor 伺服器地址授權登入
grant all on *.* to 'testdba'@'<節點伺服器1IP>' identified by 'Admin@123';
flush privileges;
在 monitor 伺服器上使用 VIP 登入
yum install -y mariadb-server mariadb
systemctl start mariadb.service
mysql -utestdba -p -h <主VIP>
mysql -utestdba -p -h 20.0.0.66
#建立資料,測試同步情況
create database testdba;
show databases;
同步
注意啟動錯誤