MySQL高可用群集--MMM高可用架構
- 在實際生產環境中,當普通的MySQL主從復制和讀寫分離不能滿足實際需求時,就需要考慮MySQL的高可用群集,出於安全角度考慮,當數據訪問量過大帶來主服務器負載增大,當出現主服務器宕機一個時,保證數據服務不會中斷的情況下,從服務器會自動尋找另一主服務器,而從服務器也會像主服務器一樣,當其中一個宕機時,依舊可以保證服務不會中斷。
MMM高可用架構
什麽是MMM?
- MMM(Master-Master replication manager for MySQL)是一套支持雙主故障切換和雙主日常管理的腳本程序。MMM使用Perl語言開發,主要用來監控和管理MySQL Master-Master(雙主)復制,雖然叫做雙主復制,但是業務上同一時刻只允許對一個主進行寫入,另一臺備選主上提供部分讀服務,以加速在主主切換時刻備選主的預熱,可以說MMM這套腳本程序一方面實現了故障切換的功能,另一方面其內部附加的工具腳本也可以實現多個slave的read負載均衡。
- MMM提供了自動和手動兩種方式移除一組服務器中復制延遲較高的服務器的虛擬ip,同時它還可以備份數據,實現兩節點之間的數據同步等。由於MMM無法完全的保證數據一致性,所以MMM適用於對數據的一致性要求不是很高,但是又想最大程度的保證業務可用性的場景。對於那些對數據的一致性要求很高的業務,非常不建議采用MMM這種高可用架構。
MySQL-MMM優缺點
-
優點: 高可用性,擴展性好,出現故障自動切換,對於主主同步,在同一時間只提供一臺數據庫寫操作,保證的數據的一致性。
- 缺點: Monitor節點是單點,可以結合Keepalived實現高可用,對主機的數量有要求,需要實現讀寫分離,對程序來說是個挑戰。
MMM工作原理
- MMM(Master-Master replication managerfor Mysql,Mysql主主復制管理器)是一套靈活的腳本程序,基於perl實現,用來對mysql replication進行監控和故障遷移,並能管理mysql Master-Master復制的配置(同一時間只有一個節點是可寫的)。
MMM高可用架構說明
- mmm_mond:監控進程,負責所有的監控工作,決定和處理所有節點角色活動。此腳本需要在監管機上運行。
- mmm_agentd:運行在每個mysql服務器上的代理進程,完成監控的探針工作和執行簡單的遠端服務設置。此腳本需要在被監管機上運行。
- mmm_control:一個簡單的腳本,提供管理mmm_mond進程的命令。
- 在整個監管過程中,需要在mysql中添加相關授權用戶,以便讓mysql可以支持監理機的維護。授權的用戶包括一個mmm_monitor用戶和一個mmm_agent用戶,如果想使用mmm的備份工具則還要添加一個mmm_tools用戶。
實驗部署
什麽是Mariadb?
- MariaDB數據庫管理系統是MySQL的一個分支,主要由開源社區在維護,采用GPL授權許可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能輕松成為MySQL的代替品。在存儲引擎方面,使用XtraDB(英語:XtraDB)來代替MySQL的InnoDB。
- MariaDB基於事務的Maria存儲引擎,替換了MySQL的MyISAM存儲引擎,它使用了Percona的 XtraDB,InnoDB的變體,分支的開發者希望提供訪問即將到來的MySQL 5.4 InnoDB性能。這個版本還包括了 PrimeBase XT (PBXT) 和 FederatedX存儲引擎。
- 這裏我們為了試驗方便,不再一臺一臺服務器去安裝MySQL,這樣將消耗大量時間,選擇利用Mariadb臨時代替MySQL,但試驗操作與MySQL服務器相同。
實驗環境
服務器 | 操作系統 | IP地址 | 所需軟件 |
---|---|---|---|
master1 | centos7.3 x86_64 | 192.168.144.128 | mariadb、MySQL-MMM |
master2 | centos7.3 x86_64 | 192.168.144.145 | mariadb、MySQL-MMM |
slave1 | centos7.3 x86_64 | 192.168.144.141 | mariadb、MySQL-MMM |
slave2 | centos7.3 x86_64 | 192.168.144.129 | mariadb、MySQL-MMM |
monitor | centos7.3 x86_64 | 192.168.144.136 | MySQL-MMM |
搭建YUM源
- 由於centos默認沒有MySQL-MMM軟件包,因此我們需要通過配置YUM源以及通過使用epel源選擇在線安裝。
- 首先在每一臺需要做群集的服務器上搭建雲源,然後安裝epel-release源。
-
這裏需要註意的是我們選擇Mariadb替代MySQL。
- 配置ALI雲源,安裝epel源:
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum -y install epel-release
- 清除原有yum緩存與重新緩存yum元
yum clean all && yum makecache
安裝Mariadb
- 在每一臺服務器上安裝Mariadb替代MySQL
yum -y install mariadb-server mariadb
systemctl disable firewalld.service
systemctl stop firewalld.service
setenforce 0
- 配置每一臺MySQL服務器主配置文件
vim /etc/my.cnf
[mysqld]
log_error=/var/lib/mysql/mysql.err
log=/var/lib/mysql/mysql_log.log
log_slow_queries=/var/lib/mysql_slow_queris.log
binlog-ignore-db=mysql,information_schema
character_set_server=utf8
log_bin=mysql_bin
server_id=1 //這裏需要區分每臺服務器ID需不同
log_slave_updates=true
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=1
設置主主同步
master1同步master2
mysql>show master status;
MariaDB [(none)]> show master status;
+------------------+----------+--------------+--------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+--------------------------+
| mysql_bin.000001 | 577 | | mysql,information_schema |
+------------------+----------+--------------+--------------------------+
1 row in set (0.00 sec)
- 在m1上為m2授予從的權限,在m2上也要為m1授予從的權限
mysql>grant replication slave on . to ‘replication‘@‘192.168.144.%‘ identified by ‘123456‘; //兩臺主都執行,從不需要
- 設置相互同步,註意兩臺主服務器之間的位置參數
mysql>change master to master_host=‘192.168.144.145‘,master_user=‘replication‘,master_password=‘123456‘,master_log_file=‘mysql_bin.000001‘,master_log_pos=577;
mysql>start slave; //主主之間開啟相互slave模式
mysql>flush privileges;
mysql>show slave status\G; //查看狀態
mater2同步master1
- 操作步驟同上
設置主從同步
- 兩臺從服務器只需要跟其中一臺主服務器同步,另外一臺主服務器也會自動同步。
mysql>change master to master_host=‘192.168.144.128‘,master_user=‘replication‘,master_password=‘123456‘,master_log_file=‘mysql_bin.000001‘,master_log_pos=577;
mysql>start slave;
mysql>show slave status\G;
- 主從同步此處不再贅述,詳細內容可參見MySQL主從同步服務詳解
在所有服務器上安裝MySQL-MMM
yum -y install mysql-mmm*
- 安裝完成後, 對MMM進行配置
cd /etc/mysql-mmm/
vi mmm_common.conf //所有主機上都要配置
- 切記,對於每臺安裝了MySQL-MMM的服務器都需要配置地址池
<host default>
cluster_interface ens33
pid_path /run/mysql-mmm-agent.pid
bin_path /usr/libexec/mysql-mmm/
replication_user replication //MMM服務器切換驗證
replication_password 123456
agent_user mmm_agent //MMM訪問數據庫代理驗證
agent_password 123456
</host>
<host db1> //數據庫地址池的設定
ip 192.168.144.128
mode master
peer db2
</host>
<host db2>
ip 192.168.144.145
mode master
peer db1
</host>
<host db3>
ip 192.168.144.141
mode slave
</host>
<host db4>
ip 192.168.144.129
mode slave
</host>
<role writer> //設置僅可在主服務器上寫入
hosts db1, db2
ips 192.168.144.200 //設置主服務器虛擬IP
mode exclusive
</role>
<role reader> //設置僅可在從服務器上讀取
hosts db3, db4
ips 192.168.144.201, 192.168.144.202 //設置從服務器虛擬IP
mode balanced
</role>
- 按照上面的修改,為每一臺服務器確定db序列號
vi /etc/mysql-mmm/mmm_agent.conf
this db1 //根據規劃進行逐一調整
- 在所有數據庫服務器上為mmm_agent授權,方便故障點切換
mysql>grant super, replication client, process on . to ‘mmm_agent‘@‘192.168.144.%‘ identified by ‘123456‘;
- 在所有數據庫上為mmm_moniter授權,讓monitor可以監控服務器
mysql>grant replication client on . to ‘mmm_monitor‘@‘192.168.144.%‘ identified by ‘123456‘;
mysql>flush privileges;
- 在所有數據庫服務器上啟動MySQL-MMM服務
systemctl start mysql-mmm-agent.service
systemctl enable mysql-mmm-agent.service 加入開機自啟動
在monitor上配置
cd /etc/mysql-mmm/ //改密碼
vi mmm_mon.conf
<monitor>
ip 127.0.0.1
pid_path /run/mysql-mmm-monitor.pid
bin_path /usr/libexec/mysql-mmm
status_path /var/lib/mysql-mmm/mmm_mond.status
ping_ips 192.168.144.128,192.168.144.145,192.168.144.141,192.168.144.129 //設置監控地址池
auto_set_online 10 //設置自動上線時間10S
······
<host default>
monitor_user mmm_monitor
monitor_password 123456
</host>
- 啟動監控服務
systemctl start mysql-mmm-monitor.service
- 查看各服務器狀態
mmm_control show
- 顯示的均為設定好的虛擬IP
[root@bogon mysql-mmm]# mmm_control show db1(192.168.144.128) master/ONLINE. Roles: writer(192.168.144.200) db2(192.168.144.145) master/ONLINE. Roles: db3(192.168.144.141) slave/ONLINE. Roles: reader(192.168.144.202) db4(192.168.144.129) slave/ONLINE. Roles: reader(192.168.144.201)
故障測試
停止m1 確認 虛擬地址 200 是否移動到 m2 上。註意:主不會搶占
mmm_control show
db1(192.168.144.128) master/HARD_OFFLINE. Roles:
db2(192.168.144.145) master/ONLINE. Roles: writer(192.168.144.200)
在m1服務器上為監控機地址授權登錄
mysql>grant all on . to ‘testdba‘@‘192.168.144.136‘ identified by ‘123456‘;
flush privileges;
在監控服務器上登錄
mysql -utestdba -p -h 192.168.144.200 //虛擬地址
- 創建數據,測試同步情況。
MySQL高可用群集--MMM高可用架構