1. 程式人生 > >MySql-MMM搭建高可用mysql集群

MySql-MMM搭建高可用mysql集群

fff tab 兩臺 虛擬地址 mon pre emc base mysql-mmm

簡介

MMM(Master-Master replication manager for MySQL)是一套支持雙主故障切換和雙主日常管理的腳本程序。MMM使用Perl語言開發,主要用來監控和管理MySQL Master-Master(雙主)復制,雖然叫做雙主復制,但是業務上同一時刻只允許對一個主進行寫入,另一臺備選主上提供部分讀服務,以加速在主主切換時刻備選主的預熱,可以說MMM這套腳本程序一方面實現了故障切換的功能,另一方面其內部附加的工具腳本也可以實現多個slave的read負載均衡。

MMM提供了自動和手動兩種方式移除一組服務器中復制延遲較高的服務器的虛擬ip,同時它還可以備份數據,實現兩節點之間的數據同步等。由於MMM無法完全的保證數據一致性,所以MMM適用於對數據的一致性要求不是很高,但是又想最大程度的保證業務可用性的場景。對於那些對數據的一致性要求很高的業務,非常不建議采用MMM這種高可用架構。

MMM項目來自 Google:http://code.google.com/p/mysql-master-master

官方網站為:http://mysql-mmm.org

系統環境

主機名 操作系統 IP地址 VIP地址 角色
mysql-mmm服務器 CentOS 7.0 x86_64 192.168.96.169
master01服務器 CentOS 7.0 x86_64 192.168.96.166 192.168.96.170 db1
master02服務器 CentOS 7.0 x86_64 192.168.96.165 192.168.96.170 db2
slave01服務器 CentOS 7.0 x86_64 192.168.96.167 192.168.96.171 db3
slave02服務器 CentOS 7.0 x86_64 192.168.96.168 192.168.96.172 db4
  • 所有服務器均關閉防火墻及Selinux
    systemctl stop firewalld
    setenforce 0

開始部署

一、master01、master02、slave01、slave02四臺mysql服務器操作一致,步驟如下

1.選擇使用阿裏雲數據源(國內源速度快)

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

2.安裝epel-release源

yum -y install epel-release

3.清空原緩存並生成新的緩存文件

yum clean all && yum makecache

4.安裝mariadb數據庫和mysql-mmm軟件包

yum -y install mariadb-server mariadb  mysql-mmm*

5.修改maridb數據庫主配置文件

vi /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
log_slave_updates=true
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=1

6.將配置文件傳輸到其它3臺數據庫服務器上

scp /etc/my.cnf [email protected]:/etc/
scp /etc/my.cnf [email protected]:/etc/
scp /etc/my.cnf [email protected]:/etc/

註意:分別修改mysql-master02、mysql-slave01、mysql-slave01的配置文件server_id參數

7.啟動mariadb服務

systemctl enable mariadb
systemctl start mariadb

二、配置主主復制(master01、master02主服務器相互同步)

master01服務器

1.登陸maridb

mysql

2.記錄master02的日誌文件名稱和偏移值

show master status;

3.為master02授予從的權限

grant replication slave on *.* to ‘replication‘@‘192.168.96.%‘ identified by ‘123456‘; 
change master to master_host=‘192.168.96.166‘,master_user=‘replication‘,master_password=‘123456‘,master_log_file=‘mysql_bin.000001‘,master_log_pos=335;

4.開啟同步

start slave;

5.查看master01的服務器同步狀態

show slave status\G;

技術分享圖片

master02主服務器

1.登陸mariadb

mysql

2.記錄master01的日誌文件名稱和偏移值

show master status;

3.為mysql-master01授予從的權限

grant replication slave on *.* to ‘replication‘@‘192.168.96.%‘ identified by ‘123456‘; 
change master to master_host=‘192.168.96.165‘,master_user=‘replication‘,master_password=‘123456‘,master_log_file=‘mysql_bin.000001‘,master_log_pos=335;

4.開啟同步

start slave;

5.查看從服務器同步狀態

show slave status\G;

技術分享圖片

6.master01服務器上創建數據庫測試主主同步

#master01服務器上創建數據庫並去master02服務器上檢查是否也有了該數據庫
create database db_test;

技術分享圖片

技術分享圖片


主從復制(slave01、slave02兩臺服務器操作一樣(重復第1至4步))

1.登陸maridb

mysql

2.在兩臺從mysql服務器上操作(註意master01的日誌文件和偏移量參數)

change master to master_host=‘192.168.96.166‘,master_user=‘replication‘,master_password=‘123456‘,master_log_file=‘mysql_bin.000002‘,master_log_pos=335;

3.開啟同步

start slave;

4.查看從服務器同步狀態

show slave status\G;

slave01從服務器:

技術分享圖片

slave02從服務器:

技術分享圖片

5.創建數據庫測試主主同步

#在任意一臺主服務器上創建數據庫,再去檢查其他三臺數據庫是否同步了
create database db_01;

技術分享圖片
技術分享圖片
技術分享圖片
技術分享圖片


三、安裝mysql-MMM服務器

1.選擇使用阿裏雲數據源(國內速度快)

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

2.安裝epel-release源

yum -y install epel-release

3.清空原緩存並生成新的緩存文件

yum clean all && yum makecache

4.安裝mariadb數據庫和mysql-mmm軟件包

yum -y install mariadb-server mariadb  mysql-mmm*

5.編輯mysql-mmm的配置文件

cd /etc/mysql-mmm/
vi mmm_common.conf     

1 active_master_role writer
2
3 <host default>
4 cluster_interface ens33
5 pid_path /run/mysql-mmm-agent.pid
6 bin_path /usr/libexec/mysql-mmm/
7 replication_user replication
8 replication_password 123456
9 agent_user mmm_agent
10 agent_password 123456
11 </host>
12
13 <host db1>
14 ip 192.168.96.166
15 mode master
16 peer db2
17 </host>
18
19 <host db2>
20 ip 192.168.96.165
21 mode master
22 peer db1
23 </host>
24
25 <host db3>
26 ip 192.168.96.167
27 mode slave
28 </host>
29
30 <host db4>
31 ip 192.168.96.168
32 mode slave
33 </host>
34
35 <role writer>
36 hosts db1, db2
37 ips 192.168.96.170
38 mode exclusive
39 </role>
40
41 <role reader>
42 hosts db3, db4
43 ips 192.168.100.171, 192.168.100.172
44 mode balanced
45 </role>

6.所有的服務器中mmm_common.conf文件一樣,所以這裏直接傳輸到每一臺主機上

scp mmm_common.conf [email protected]:/etc/mysql-mmm/ #master02服務器
scp mmm_common.conf [email protected]:/etc/mysql-mmm/ #master01服務器
scp mmm_common.conf [email protected]:/etc/mysql-mmm/ #slave01服務器
scp mmm_common.conf [email protected]:/etc/mysql-mmm/ #slave02服務器

7.在monitor服務器上編輯mmm_mon.conf配置文件

cd /etc/mysql-mmm/ 
vi mmm_mon.conf

......
ping_ips 192.168.96.165, 192.168.96.166, 192.168.96.167, 192.168.96.168 #mysql數據庫服務器地址
auto_set_online 10
......
<host default>
monitor_user mmm_monitor #監控機用戶名
monitor_password 123456 #密碼
</host>

8.啟動mysql-mmm-monitor

systemctl start mysql-mmm-monitor

四、配置四臺mysql服務器的mysql-mmm代理

1.在四臺mysql服務器上為mmm_agent授權

grant super, replication client, process on *.* to ‘mmm_agent‘@‘192.168.96.%‘ identified by ‘123456‘;

2.在所有數據庫上為mmm_moniter授權

grant replication client on *.* to ‘mmm_monitor‘@‘192.168.96.%‘ identified by ‘123456‘;

3.刷新權限

flush privileges;

4.修改所有數據庫的mmm_agent.conf

vi /etc/mysql-mmm/mmm_agent.conf

#重要提醒:按順序分別修改其他MySQL服務器為db2、db3、db4
this db1

5.在所有mysql服務器上啟動mysql-mmm-agent服務

systemctl enable mysql-mmm-agent
systemctl start mysql-mmm-agent

五、再回到mysql-mmm服務器上

1.查看各節點的情況

mmm_control show

db1(192.168.96.166) master/ONLINE. Roles: writer(192.168.96.170)
db2(192.168.96.165) master/ONLINE. Roles:
db3(192.168.96.167) slave/ONLINE. Roles: reader(192.168.100.172)
db4(192.168.96.168) slave/ONLINE. Roles: reader(192.168.100.171)

2.檢查所有選項,均為OK就沒有問題

mmm_control checks all

db4 ping [last change: 2018/07/12 00:09:29] OK
db4 mysql [last change: 2018/07/11 22:15:13] OK
db4 rep_threads [last change: 2018/07/11 22:05:28] OK
db4 rep_backlog [last change: 2018/07/11 22:05:28] OK: Backlog is null
db2 ping [last change: 2018/07/11 22:05:28] OK
db2 mysql [last change: 2018/07/11 22:05:28] OK
db2 rep_threads [last change: 2018/07/11 22:05:28] OK
db2 rep_backlog [last change: 2018/07/11 22:05:28] OK: Backlog is null
db3 ping [last change: 2018/07/11 22:05:28] OK
db3 mysql [last change: 2018/07/11 22:13:59] OK
db3 rep_threads [last change: 2018/07/11 22:05:28] OK
db3 rep_backlog [last change: 2018/07/11 22:05:28] OK: Backlog is null
db1 ping [last change: 2018/07/11 22:05:28] OK
db1 mysql [last change: 2018/07/11 22:14:54] OK
db1 rep_threads [last change: 2018/07/11 22:05:28] OK
db1 rep_backlog [last change: 2018/07/11 22:05:28] OK: Backlog is null

技術分享圖片

3.該命令可以手動切換主服務器

mmm_control move_role writer db2

六、模擬故障測試

1. 停止db1服務器的mariadb服務,再檢查狀態(虛擬地址:192.168.96.170 是否移動到 db2 上)

systemctl stop mariadb

技術分享圖片

2. 再查看mysql-mmm服務器狀態

mmm_control show

db1(192.168.96.166) master/HARD_OFFLINE. Roles:
db2(192.168.96.165) master/ONLINE. Roles: writer(192.168.96.170)
db3(192.168.96.167) slave/ONLINE. Roles: reader(192.168.100.172)
db4(192.168.96.168) slave/ONLINE. Roles: reader(192.168.100.171)

這裏db1的虛擬ip地址已經漂移到 了db2上

技術分享圖片

3. 暫停db3服務器的mariadb服務,再檢查狀態

systemctl stop mariadb

技術分享圖片

4. 再查看mysql-mmm服務器狀態

mmm_control show

db1(192.168.96.166) master/HARD_OFFLINE. Roles:
db2(192.168.96.165) master/ONLINE. Roles: writer(192.168.96.170)
db3(192.168.96.167) slave/HARD_OFFLINE. Roles:
db4(192.168.96.168) slave/ONLINE. Roles: reader(192.168.100.171), reader(192.168.100.172)

技術分享圖片

恢復db1、db3服務器,再檢查狀態

mmm_control show

db1(192.168.96.166) master/ONLINE. Roles:
db2(192.168.96.165) master/ONLINE. Roles: writer(192.168.96.170)
db3(192.168.96.167) slave/ONLINE. Roles: reader(192.168.100.171)
db4(192.168.96.168) slave/ONLINE. Roles: reader(192.168.100.172)

這裏註意,當db1服務器恢復,並不會搶占vip地址,而是作為備用機在等待著,好了,寫到這裏結束了。

MySql-MMM搭建高可用mysql集群