mysql-mmm高可用架構

出處http://navyaijm.blog.51cto.com/4647068/1230674

一、說明

1、本文將介紹如何使用mysql-mmm搭建數據庫的高可用架構,MMM即Master-Master Replication Manager for MySQL(mysql主主複製管理器)關於mysql主主複製配置的監控、故障轉移和管理的一套可伸縮的腳本套件(在任何時候只有一個節點可以被寫入),這個套件也能對居於標準的主從配置的任意數量的從服務器進行讀負載均衡,所以你可以用它來在一組居於複製的服務器啓動虛擬ip,除此之外,它還有實現數據備份、節點之間重新同步功能的腳本。MySQL本身沒有提供replication failover的解決方案,通過MMM方案能實現服務器的故障轉移,從而實現mysql的高可用。MMM不僅能提供浮動IP的功能,更可貴的是如果當前的主服務器掛掉後,會將你後端的從服務器自動轉向新的主服務器進行同步複製,不用手工更改同步配置。這個方案是目前比較成熟的解決方案(上面這段話從網上載錄)。至於mmm的具體介紹我這裏就不多講了,詳情請看官網:http://mysql-mmm.org。
2、該方案的優缺點:
優點:穩定性高,可擴展性好,高可用,當主服務器掛掉以後,另一個主立即接管,其他的從服務器能自動切換,不用人工干預。
缺點:monitor節點是單點,不過這個你也可以結合keepalived或者haertbeat做成高可用
二、環境
1、服務器列表
服務器主機名IPserverIDmysql版本系統
master1
db1
172.28.26.101
101
mysql5.5.15Centos 6.4
master2
db2
172.28.26.102
102
mysql5.5.15
Centos 6.4
slave1
db3
172.28.26.188
188
mysql5.5.15
Centos 6.4
slave2
db4
172.28.26.189
189
mysql5.5.15
Centos 6.4
monitor
monitor
172.28.26.103

Centos 6.4
2、虛擬IP列表
VIPRoledescription
172.28.26.104write應用配置的寫入VIP
172.28.26.105read
應用配置的讀入VIP
172.28.26.106read
應用配置的讀入VIP

三、mysql的安裝
1、只在master1上安裝即可,其他機器scp過去就好,最好用rsync
1
2
3
4
5
6
tar-zxvf mysql-5.5.15.tar.gz
cdmysql-5.5.15
cmake -DCMAKE_INSTALL_PREFIX:PATH=/data/mysql/navy1-DMYSQL_DATADIR=/data/mysql/navy1/db-DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DENABLED_LOCAL_INFILE=1
make
makeinstall
useraddmysql -s /sbin/nologin; cd/data/mysql/navy1; chownmysql:mysql db/ logs/ -R


vi /data/mysql/navy1/my.cnf (cp一份線上的配置文件修改一下)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
[mysqld_safe]
log-error=/data/mysql/navy1/logs/mysqld.log
pid-file=/data/mysql/navy1/logs/mysqld.pid
[client]
port            = 3306
socket          = /data/mysql/navy1/logs/mysql.sock
[mysqld]
port            = 3306
socket          = /data/mysql/navy1/logs/mysql.sock
key_buffer = 384M
max_allowed_packet = 1M
table_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 64M
basedir=/data/mysql/navy1
datadir=/data/mysql/navy1/db
thread_concurrency = 8
log-bin=mysql-bin
binlog_format = mixed
server-id= 101
max_connections=2048
character_set_server=utf8
wait_timeout=1800
interactive_timeout=1800
skip-show-database
skip-name-resolve
tmp_table_size = 512M
max_heap_table_size = 512M
binlog-ignore-db = mysql
replicate-ignore-db = mysql
binlog-ignore-db = information_schema
replicate-ignore-db = information_schema
binlog-ignore-db = performance_schema
replicate-ignore-db = performance_schema
binlog-ignore-db = test
replicate-ignore-db = test
innodb_data_home_dir = /data/mysql/navy1/db
#innodb_data_file_path = ibdata1:4000M;ibdata2:10M:autoextend
innodb_file_per_table=1
innodb_log_group_home_dir = /data/mysql/navy1/db
innodb_buffer_pool_size = 2000M
innodb_additional_mem_pool_size = 20M
innodb_log_file_size = 100M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 2
innodb_lock_wait_timeout = 50
#default-storage-engine = MyISAM
default-storage-engine = InnoDB
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[isamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[myisamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout


初始化數據庫:
1
/data/mysql/navy1/scripts/mysql_install_db--user=mysql --basedir=/data/mysql/navy1--datadir=/data/mysql/navy1/db/


啓動數據庫:
1
cd/data/mysql/navy1; /data/mysql/navy1/bin/mysqld_safe--defaults-extra-file=/data/mysql/navy1/my.cnf --user=mysql &


2、其他三天機器的mysql的安裝僅需四步:
A、把已經安裝好的master上的mysql停掉,rsync到master2、和兩臺slave的對應目錄下(/data/mysql/navy1)
B、建用戶、改權限
1
useraddmysql -s /sbin/nologin; cd/data/mysql/navy1; chownmysql:mysql db/ logs/ -R
C、修改/data/mysql/navy1/my.cnf中的serverID
D、啓動數據庫:
1
cd/data/mysql/navy1; /data/mysql/navy1/bin/mysqld_safe--defaults-extra-file=/data/mysql/navy1/my.cnf --user=mysql &


四、主從配置(master1和master2配置成主主,slave1和slave2配置成master1的從):
1、在master1上授權:
1
2
3
grant replication slave on *.* to slave@'172.28.26.102'identified by "123456";
grant replication slave on *.* to slave@'172.28.26.188'identified by "123456";
grant replication slave on *.* to slave@'172.28.26.189'identified by "123456";


2、在master2上授權:
1
2
3
grant replication slave on *.* to slave@'172.28.26.101'identified by "123456";
grant replication slave on *.* to slave@'172.28.26.188'identified by "123456";
grant replication slave on *.* to slave@'172.28.26.189'identified by "123456";


3、把master2、slave1和slave2配置成master1的從庫:
A、在master1上執行show master status \G 獲取binlog文件和Position點
1
2
3
4
5
6
7
8
9
10
11
mysql> show master status \G
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    3974
Current database: *** NONE ***
*************************** 1. row ***************************
File: mysql-bin.000024
Position: 107
Binlog_Do_DB:
Binlog_Ignore_DB: mysql,information_schema,performance_schema,test,mysql,information_schema,performance_schema,test
1 row inset(0.00 sec)


B、在master2、slave1和slave2執行
1
2
change master to master_host='172.28.26.101', master_Port=3306, master_user='slave', master_password='123456', master_log_file='mysql-bin.000024', master_log_pos=107;
slave start;


4、把master1配置成master2的從庫:
A、在master2上執行show master status \G 獲取binlog文件和Position點
1
2
3
4
5
6
7
mysql>  show master status \G
*************************** 1. row ***************************
File: mysql-bin.000025
Position: 107
Binlog_Do_DB: navy
Binlog_Ignore_DB: mysql,mysql,information_schema,performance_schema,test,mysql,information_schema,performance_schema,test
1 row inset(0.00 sec)


B、在master1上執行:
1
2
change master to master_host='172.28.26.101', master_Port=3306, master_user='slave', master_password='123456', master_log_file='mysql-bin.000025', master_log_pos=107;
slave start;


5、在各個機器上執行:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting formaster to send event
Master_Host: 172.28.26.102
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000025
Read_Master_Log_Pos: 107
Relay_Log_File: mysqld-relay-bin.000015
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000025
Slave_IO_Running: Yes
Slave_SQL_Running: Yes


如果Slave_IO_Running和Slave_SQL_Running都爲yes,那麼主從就已經配置OK了


五、mysql-mmm安裝
1、db節點:
1
yum -y installmysql-mmm-agent


2、monitor節點:
1
yum -y installmysql-mmm*


六、mysql-mmm的配置:
1、在4個db節點授權:
1
2
GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'172.28.26.%'IDENTIFIED BY'123456';
GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'172.28.26.%'IDENTIFIED BY '123456';


2、修改配置文件
vi /etc/mysql-mmm/mmm_common.conf (db、monitor一樣樣的)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
active_master_role      writer
<host default>
cluster_interface       eth1
pid_path                /var/run/mysql-mmm/mmm_agentd.pid
bin_path                /usr/libexec/mysql-mmm/
replication_user        slave
replication_password    123456
agent_user              mmm_agent
agent_password          123456
</host>
<host db1>
ip      172.28.26.101
mysql_port              3306
mode    master
peer    db2
</host>
<host db2>
ip      172.28.26.102
mysql_port              3306
mode    master
peer    db1
</host>
<host db3>
ip      172.28.26.188
mysql_port              3306
mode    slave
peer    db3
</host>
<host db4>
ip      172.28.26.189
mysql_port              3306
mode    slave
peer    db4
</host>
<role writer>
hosts   db1, db2
ips     172.28.26.104
mode    exclusive
</role>
<role reader>
hosts   db3, db4
ips     172.28.26.105,172.28.26.106
mode    balanced
</role>


PS:

peer的意思是等同,表示db1db2是同等的。

ips指定VIP

mode exclusive 只有兩種模式:exclusive是排他,在這種模式下任何時候只能一個host擁有該角色

balanced模式下可以多個host同時擁有此角色。一般writerexclusivereaderbalanced

vi /etc/mysql-mmm/mmm_agent.conf (master1、master2、slave1和slave2分別修改爲:this db1、db2、db3、db4)
vi /etc/mysql-mmm/mmm_mon.conf(僅monitor節點有)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
include mmm_common.conf
<monitor>
ip                  127.0.0.1
pid_path            /var/run/mysql-mmm/mmm_mond.pid
bin_path            /usr/libexec/mysql-mmm
status_path         /var/lib/mysql-mmm/mmm_mond.status
ping_ips            172.28.26.101,172.28.26.102
auto_set_online     10
# The kill_host_bin does not exist by default, though the monitor will
# throw a warning about it missing.  See the section 5.10 "Kill Host
# Functionality" in the PDF documentation.
#
# kill_host_bin     /usr/libexec/mysql-mmm/monitor/kill_host
#
</monitor>
<host default>
monitor_user        mmm_monitor
monitor_password    123456
</host>
debug 0


七、mmm啓動
1、db節點:
1
2
/etc/init.d/mysql-mmm-agentstart
echo"/etc/init.d/mysql-mmm-agent start">> /etc/rc.local


2、 monitor節點:


八、測試
1、集羣正常啓動:
1
2
3
4
5
[root@monitor ~]# mmm_control show
db1(172.28.26.101) master/ONLINE. Roles: writer(172.28.26.104)
db2(172.28.26.102) master/ONLINE. Roles:
db3(172.28.26.188) slave/ONLINE. Roles: reader(172.28.26.106)
db4(172.28.26.189) slave/ONLINE. Roles: reader(172.28.26.105)


2、停掉db1,看172.28.26.104是否漂移到db2上,db3、db4的主是否切換到db2
1
2
3
4
5
[root@monitor ~]# mmm_control show
db1(172.28.26.101) master/HARD_OFFLINE. Roles:
db2(172.28.26.102) master/ONLINE. Roles: writer(172.28.26.104)
db3(172.28.26.188) slave/ONLINE. Roles: reader(172.28.26.106)
db4(172.28.26.189) slave/ONLINE. Roles: reader(172.28.26.105)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> show slave status \G
Connection id:    5844
Current database: *** NONE ***
*************************** 1. row ***************************
Slave_IO_State: Waiting formaster to send event
Master_Host: 172.28.26.102
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000025
Read_Master_Log_Pos: 107
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000025
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章