mysql-mmm-2.2.1安装手册
MMM Installation GuideMysql Master-Master Replication Manager
(mysql-mmm installation Guide)
Version:mysql-mmm-2.2.1
作者:andy.feng
网名:FH.CN
Email:lr@isadba.com
BLOG:http://linuxguest.blog.51cto.com
PDF版下载>>>>>
目录
一、安装环境介绍 4
一、确定MMM架构(参见手册第二章,典型应用) 4
二、确定操作系统和mysql版本及相关信息 4
二、安装步骤分析 5
三、正式安装 5
一、安装系统 5
二、安装mysql 5
1、检查系统是否安装过mysql 5
2、下载mysql软件,编译安装,在四台机器上都需要做 5
三、配置mysql master-master复制 6
1、修改my.cnf配置 6
2、创建复制使用的mysql用户 7
3、同步数据 7
4、配置复制关系 8
四、安装mysql-mmm 11
1、安装agent和monitor需要的perl库 12
2、下载安装mysql-mmm 13
3、mysql-mmm使用的目录和存放文件简介 13
4、配置MYSQL-MMM-agentd 13
5、启动MYSQL-mmm_agent 15
6、配置MYSQL-MMM-monitor 15
7、启动MYSQL-MMM-monitor 16
8、管理MYSQL-MMM-monitor 16
9、从2个master架构扩展到2个master多个slave架构(已修正) 17
四、测试 17
一、测试写入数据是否同步 19
二、测试writer故障切换 20
三、测试db3的主是否会自动切换 22
四、测试角色优先配置的影响 24
一、安装环境介绍
一、确定MMM架构(参见手册第二章,典型应用)
我们使用两个master,一个slave的架构。
二、确定操作系统和MYSQL版本及相关信息
1、三台安装mysql的服务器
主机名 IP地址角色 mysql_server_id
db110.1.1.15master1 1
db210.1.1.14master2 2
db310.1.1.13slave1 3
mmm 10.1.1.12mmm_mon-
虚拟IP规划
IP 角色 描述
10.1.1.20writer应用程序连接此服务器写入数据
10.1.1.21reader应用程序连接此服务器读取数据
10.1.1.22reader应用程序连接此服务器读取数据
10.1.1.23reader应用程序连接此服务器读取数据
2、软件版本
LINUX所有服务器使用RHEL5.4
MYSQL使用mysql-5.1.40.tar.gz
MMM使用mysql-mmm-2.2.1.tar.gz
3、其他
Mysql使用utf8字符集
存储引擎使用myisam
Binlog格式使用ROW
Mysql端口使用9188
3、获得软件
RHEL5.4:http://rhel.ieesee.net/uingei/
MYSQL:http://downloads.mysql.com/archives.php?p=mysql-5.1&o=other
MMM:http://mysql-mmm.org/_media/:mmm2:mysql-mmm-2.2.1.tar.gz
二、安装步骤分析
一、编译安装mysql
二、搭建mysql的master-master复制架构
三、安装mysql-mmm-agent
四、安装mysql-mmm,搭建成完成两个master的架构(参见手册第二章,典型应用)
五、在刚才的基础上增加一个slave,最终完成两个master,多个slave的架构
三、正式安装
一、安装系统
略过
二、安装MYSQL
1、检查系统是否安装过MYSQL
# rpm -qa | grep mysql#如果有,使用以下命令先卸载
#yum remove mysql*
2、下载MYSQL软件,编译安装,在四台机器上都需要做
#useradd mysql
#mkdir /soft && cd /soft
#wget http://downloads.mysql.com/archives/mysql-5.1/mysql-5.1.40.tar.gz
#tar -zxvf mysql-5.1.40.tar.gz&& cd mysql-5.1.40
#mkdir /usr/local/mysql
#./configure \
--prefix=/usr/local/mysql \
--without-debug \
--enable-thread-safe-client \
--enable-assembler \
--enable-profiling \
--with-mysqld-ldflags=-all-static \
--with-client-ldflags=-all-static \
--with- \
--with-extra-charsets=all\
--with-big-tables \
--enable-largefile \
--without-ndb-debug \
--with-plugins=partition
#make && make install
#cp support-files/my-medium.cnf /etc/my.cnf
#cd /usr/local/mysql/bin
#./mysql_install_db --user=mysql
#./mysqld_safe --user=mysql --skip_name_resolve&
#/usr/local/mysql/bin/mysql -uroot mysql -e "delete from user where user = '';"
# echo "/usr/local/mysql/bin/mysqld_safe --user=mysql --skip_name_resolve &" >> /etc/rc.local\\修改系统启动默认启动mysql
#修改.bash_profile PATH=$PATH:$HOME/bin:/usr/local/mysql/bin/
三、配置MYSQL MASTER-MASTER复制
1、修改MY.CNF配置
db1 修改my.cnf,确定有以下内容
port = 9188
server-id = 1
log-bin=mysql-bin
binlog_format=ROW
log-slave-updates
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=1
example:
port = 9188
socket = /tmp/mysql.sock
port = 9188
socket = /tmp/mysql.sock
skip-locking
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
log-bin=mysql-bin
binlog_format=ROW
log-slave-updates
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=1
server-id = 1
quick
max_allowed_packet = 16M
no-auto-rehash
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
interactive-timeout
db2 修改my.cnf,确定有以下内容
port = 9188
server-id = 2
log-bin=mysql-bin
binlog_format=ROW
log-slave-updates
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=2
db3修改my.cnf,确定有以下内容
port = 9188
server-id = 3
log-bin=mysql-bin
log-slave-updates
db4修改my.cnf,确定有以下内容
port = 9188
server-id = 4
log-bin=mysql-bin
log-slave-updates
现在正式开始配置db1和db2的master-master复制
修改过刚才的配置文件以后,重新启动mysql
2、创建复制使用的MYSQL用户
db1:
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'10.1.1.14'>
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'10.1.1.13'> flush privileges;
db2:
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'10.1.1.15'>
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'10.1.1.13'> flush privileges;
3、同步数据
由于我们都是新装的库,数据是同步的,但是我们也简单操作以下步骤,开始配置同步数据到复制结尾,都不要让任何的mysql服务器写入数据,避免导致数据不同步。
db1:
mysql> flush tables with read lock;
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 409
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
通过任何方法拷贝db1的数据到db2去
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
4、配置复制关系
先配置db2复制db1的数据
db2:
mysql> CHANGE MASTER TO
-> MASTER_HOST='10.1.1.15',
-> MASTER_USER='slave',
-> MASTER_PASSWORD='slave',
-> MASTER_PORT=9188,
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=409,
-> MASTER_CONNECT_RETRY=10;
Query OK, 0 rows affected (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.1.1.15
Master_User: slave
Master_Port: 9188
Connect_Retry: 10
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 409
>
>
> Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 409
> Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
这两个值是YES,证明db2复制db1的数据成功了
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 325
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
接着配置db1复制db2的数据:
db1:
mysql> CHANGE MASTER TO
-> MASTER_HOST='10.1.1.14',
-> MASTER_USER='slave',
-> MASTER_PASSWORD='slave',
-> MASTER_PORT=9188,
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=325,
-> MASTER_CONNECT_RETRY=10;
Query OK, 0 rows affected (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.1.1.14
Master_User: slave
Master_Port: 9188
Connect_Retry: 10
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 325
>
>
> Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 325
> Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
5、简单的master-master测试
在db1的test目录建立一张表
db1:
mysql> use test
Database changed
mysql> create table t (id int(11) not null auto_increment,name varchar(30),primary key (id));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t(name) values ('andy.feng');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t;
+----+-----------+
|> +----+-----------+
|1 | andy.feng |
+----+-----------+
1 row in set (0.00 sec)
在db2上查询,并且也插入一条数据,到db1再查看,是否两边同步,并且注意id的值
db2:
mysql> use test
Database changed
mysql> select * from t;
+----+-----------+
|> +----+-----------+
|1 | andy.feng |
+----+-----------+
1 row in set (0.00 sec)
mysql> insert into t(name) values ('fh.cn');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t(name) values ('mysql-mmm');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t;
+----+-----------+
|> +----+-----------+
|1 | andy.feng |
|2 | fh.cn |
|4 | mysql-mmm |
+----+-----------+
3 rows in set (0.00 sec)
db1:
mysql> select * from t;
+----+-----------+
|> +----+-----------+
|1 | andy.feng |
|2 | fh.cn |
|4 | mysql-mmm |
+----+-----------+
3 rows in set (0.00 sec)
这样看来,master-master复制是搭建成功了。
四、安装MYSQL-MMM
1、安装AGENT和MONITOR需要的PERL库
注意: 如果你想要使用非root用户运行mmm_mond进程请在db4上安装fping。
请在agent机器上(db1,db2,db3)上安装iproute包,一般系统默认是安装过的。
安装使用perl MCPAN,具体方法自己google
在 db1,db2,db3上都安装如下perl库(mysql-agent需求的perl库)
有些perl库,特别是红色的三个库系统默认应该是有的,可以通过以下方法查看是否,安装,如果安装,就不必要安装,因为安装这三个库比较麻烦,特别DBD::mysql,需要下载软件手工编译
确认是否安装一下模块:
#find /usr/lib/perl5/-name mysql.pm
#find /usr/lib/perl5/-name stat.pm
#find /usr/lib/perl5/-name Basename.pm
# perl -MCPAN -e shell
cpan> install Algorithm::Diff
cpan> install DBI
cpan>install Log::Dispatch
cpan> install Log::Log4perl
cpan> install Mail::Send
cpan> install Net::ARP
cpan> install Proc::Daemon
cpan> install Time::HiRes
cpan>install DBD::mysql
cpan>install File::stat
cpan>install File:basename
手工编译安装DBD::mysql的几点注意:
# PERL -MCPAN -E SHELL
CPAN> GET DBD::MYSQL
存放的地址一般在这里/ROOT/.CPAN/SOURCES/AUTHORS/ID/C/CA/CAPTTOFU/DBD-MYSQL-4.019.TAR.GZ
注意:
? 如果手工编译的MYSQL,一定要把加载MYSQL的LIB
# ECHO "/USR/LOCAL/MYSQL/LIB/MYSQL/" >>/ETC/LD.SO.CONF
#LDCONF
?在PERL MAKEFILE.PL 的时候,一定要指定你定制的一些MYSQL的信息
#PERL MAKEFILE.PL--MYSQL_CONFIG=/USR/LOCAL/MYSQL/BIN/MYSQL_CONFIG --WITH-MYSQL=/USR/LOCAL/MYSQL/
? 一定要MAKE TEST,通过了再MAKE INSTALL
在db4上安装如下perl库(mysql-monitor需求的perl库)
先使用类似上面的find语句查找是否已经安装对应模块,如果已经安装,就不必要再安装一次
# perl -MCPAN -e shell
cpan> install Algorithm::Diff
cpan> install> cpan> install Log::Dispatch
cpan> install Log::Log4perl
cpan> install Mail:Send
cpan> install Proc::Daemon
cpan> install Thread::Queue
cpan> install Time::HiRes
红色的应该是系统自带的:
--DBI and DBD::mysql
--File::Basename
--File::stat
--File::Temp
--Net::Ping
2、下载安装MYSQL-MMM
db1,db2,db3,db4都要安装:
/soft]# wget http://mysql-mmm.org/_media/:mmm2:mysql-mmm-2.2.1.tar.gz
# mv :mmm2:mysql-mmm-2.2.1.tar.gz mysql-mmm-2.2.1.tar.gz
# tar -zxvf mysql-mmm-2.2.1.tar.gz
# cd mysql-mmm-2.2.1
# make install
3、MYSQL-MMM使用的目录和存放文件简介
文件目录 描述
/usr/lib/perl5/vendor_perl/5.8.8/MMM MMM使用的perl模块
/usr/lib/mysql-mmm MMM的脚本插件
/usr/sbin MMM的命令保存路径
/var/log/mysql-mmm MMM的日志保存路径
/etc MMM配置文件保存的路径
/etc/mysql-mmm MMM配置文件保存的路径,优先级最高
/etc/init.d/agentd和monitor的启动关闭脚本
4、配置MYSQL-MMM-AGENTD
添加agentd使用的mysql用户,db1,db2,db3都要添加
db1,db2,db3:
mysql>grant super,replication client,process on *.* to 'mmm_agent'@'10.1.1.15'>
mysql>grant super,replication client,process on *.* to 'mmm_agent'@'10.1.1.14'>
mysql>grant super,replication client,process on *.* to 'mmm_agent'@'10.1.1.13'>
mysql>grant super,replication client,process on *.* to 'mmm_agent'@'10.1.1.12'> (由于db1和db2有复制,所以只需要在其中一台执行就可以了。db3需要单独执行一遍)
修改mysql-mmm配置文件
db1:
# cat /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db1
# cat /etc/mysql-mmm/mmm_common.conf
active_master_role writer
cluster_interface eth1#由于我eth0配置的外网IP,eth1配置的10网段IP,所以我这里写的是eth1
pid_path /var/run/mmm_agentd.pid
bin_path /usr/lib/mysql-mmm/
replication_user slave
replication_password slave
agent_user mmm_agent
agent_password mmm_agent
mysql_port 9188
ip 10.1.1.15
mode master
peer db2
ip 10.1.1.14
mode master
peer db1
ip 10.1.1.13
mode slave
hosts db1, db2
ips 10.1.1.20
mode exclusive
hosts db1, db2,db3
ips 10.1.1.23,10.1.1.22,10.1.1.21
mode balanced
将db1的/etc/mysql-mmm/mmm_common.conf文件拷贝到db2,db3,db4相同的位置,拷贝方法自定义
db2:
# cat /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db2
db3:
# cat /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db3
5、启动MYSQL-MMM_AGENT
db1,db2,db3:
# /etc/init.d/mysql-mmm-agent start
Daemon bin: '/usr/sbin/mmm_agentd'
Daemon pid: '/var/run/mmm_agentd.pid'
Starting MMM Agent daemon... Ok
# /etc/init.d/mysql-mmm-agent status
Daemon bin: '/usr/sbin/mmm_agentd'
Daemon pid: '/var/run/mmm_agentd.pid'
Checking MMM Agent process: running.
# ps aux | grep mmm
root 267580.00.1115246912 ? S 14:52 0:00 mmm_agentd
root 267590.00.1115687088 ? S 14:52 0:00 mmm_agentd
root 267980.00.0 3920 672 pts/1 S+ 14:55 0:00 grep mmm
# netstat -tulnp | grep mmm
tcp 0 0 10.1.1.15:9989 0.0.0.0:* LISTEN 26759/mmm_agentd
# /etc/init.d/mysql-mmm-agent --help
Daemon bin: '/usr/sbin/mmm_agentd'
Daemon pid: '/var/run/mmm_agentd.pid'
Usage: /etc/init.d/mysql-mmm-agent {start|stop|restart|status}
Note:如果不能启动,可以查看/var/log/mysql-mmm/mmm_agentd.log 文件的提示,或者启动时候的报错,最大的可能是perl对应模块没有安装成功,成功安装对应的模块就可以解决问题了。
6、配置MYSQL-MMM-MONITOR
创建mmm-monitor使用的mysql用户,在db1,db2,db3上
db1,db2,db3:
mysql>grant replication client on *.* to 'mmm_monitor'@'10.1.1.12'> 在实际使用中可以简化用户,让复制,agent,monitor使用同一个用户,注意权限就可以行了。下面配置monitor
db4:
# cat /etc/mysql-mmm/mmm_mon.conf
include mmm_common.conf
ip 10.1.1.12
pid_path /var/run/mmm_mond.pid
bin_path /usr/lib/mysql-mmm/
status_path /var/lib/misc/mmm_mond.status
ping_ips 10.1.1.13, 10.1.1.14, 10.1.1.15
monitor_user mmm_monitor
monitor_password mmm_monitor
debug 0
7、启动MYSQL-MMM-MONITOR
# /etc/init.d/mysql-mmm-monitor start
Daemon bin: '/usr/sbin/mmm_mond'
Daemon pid: '/var/run/mmm_mond.pid'
Starting MMM Monitor daemon: Ok
# /etc/init.d/mysql-mmm-monitor --help
Daemon bin: '/usr/sbin/mmm_mond'
Daemon pid: '/var/run/mmm_mond.pid'
Usage: /etc/init.d/mysql-mmm-monitor {start|stop|restart|status}
# ps aux | grep mmm
root 27370.00.2137648892 ? S 15:10 0:00 mmm_mond
root 27381.30.9 108480 39992 ? Sl 15:10 0:00 mmm_mond
root 27450.40.1106766668 ? S 15:10 0:00 perl /usr/lib/mysql-mmm//monitor/checker ping_ip
root 27480.50.1128607776 ? S 15:10 0:00 perl /usr/lib/mysql-mmm//monitor/checker mysql
root 27500.40.1106766668 ? S 15:10 0:00 perl /usr/lib/mysql-mmm//monitor/checker ping
root 27520.50.1128607824 ? S 15:10 0:00 perl /usr/lib/mysql-mmm//monitor/checker rep_backlog
root 27540.50.1128607820 ? S 15:10 0:00 perl /usr/lib/mysql-mmm//monitor/checker rep_threads
8、管理MYSQL-MMM-MONITOR
查看mmm集群节点的状态:
db4:
# mmm_control mode
ACTIVE
# mmm_control show
db1(10.1.1.15) master/AWAITING_RECOVERY. Roles:
db2(10.1.1.14) master/AWAITING_RECOVERY. Roles:
db3(10.1.1.13) slave/AWAITING_RECOVERY. Roles:
现在都处于AWATING_RECOVERY状态
我们将db1和db2两个master置于ONLINE状态
# mmm_control set_online db1
OK: State of 'db1' changed to ONLINE. Now you can wait some time and check its new roles!
# mmm_control set_online db2
OK: State of 'db2' changed to ONLINE. Now you can wait some time and check its new roles!
# mmm_control show
db1(10.1.1.15) master/ONLINE. Roles: reader(10.1.1.22), writer(10.1.1.20)
db2(10.1.1.14) master/ONLINE. Roles: reader(10.1.1.21), reader(10.1.1.23)
db3(10.1.1.13) slave/AWAITING_RECOVERY. Roles:。
现在mysql-mmm两个master的模式已经搭建完成,我们对所有节点做一次检查:
# mmm_control checks all
db2ping OK
db2mysql OK
db2rep_threadsOK
db2rep_backlogOK: Backlog is null
db3ping OK
db3mysql OK
db3rep_threadsERROR: Replication is not set up
db3rep_backlogERROR: Replication is not set up
db1ping OK
db1mysql OK
db1rep_threadsOK
db1rep_backlogOK: Backlog is null
db1和db2已经正常了,只有db3复制是失败的,因为我们还没有配置,现在我们开始配置db3的复制,完成两个master多个slave的架构。
9、从2个MASTER架构扩展到2个MASTER多个SLAVE架构
现在的mysql-mmm集群还属于未使用状态,数据还是不能更新的,我们先从db1备份数据然后恢复到db3上,然后再db3开始配置复制:
Note:这里存在一个问题,就是关于选择哪个db作为db3的主。由于网上关于两主多slave的架构的方案文档很少,我曾经在这里也犯过一个错误,所以现在给大家强调一下,如果大家觉得我所说的内容有问题,请反馈给我,谢谢。那么是选择10.1.1.20作为主?因为10.1.1.20是永远在线并且唯一的ip?错!选择10.1.1.20作为主是最严重的错误,虽然10.1.1.20会切换到其他机器,但是db3上,Master_Log_File:和Read_Master_Log_Pos却会出现问题,具体细节问题大家自己测试下吧。选择其他三个虚拟IP也是不可以取的,所以我们最终选择db2或者db1的真实IP。我以前就纠结是选择db1还是选择db2的真实ip作为db3的主呢?其实这个问题不用纠结,mysql-mmm比我们想象中智能,他会在db3的master offline的时候,自动切换主到另外一个master服务器,也就说说db3的master是跟着writer角色迁移的,前提是你配置好了mysql-mmm 我们就把db2配置成db3的主吧: db2:
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000002
Position: 582
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
db3:
mysql>CHANGE MASTER TO
MASTER_HOST='10.1.1.14',
MASTER_USER='slave',
MASTER_PASSWORD='slave',
MASTER_PORT=9188,
MASTER_LOG_FILE=' mysql-bin.000002',
MASTER_LOG_POS=582,
MASTER_CONNECT_RETRY=10;
mysql> start slave;
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.1.1.14
Master_User: slave
Master_Port: 9188
Connect_Retry: 10
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 582
>
>
> Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 582
> Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
重要:在mmm-monitor上查看各个节点的状态,将writer角色以外的主机的mysql都设置成read-only=1,不要设置错误哦。
# mmm_control show
db1(10.1.1.15) master/ONLINE. Roles: reader(10.1.1.22), writer(10.1.1.20)
db2(10.1.1.14) master/ONLINE. Roles: reader(10.1.1.21), reader(10.1.1.23)
db3(10.1.1.13) slave/AWAITING_RECOVERY. Roles:
# Role writer is assigned to it's preferred host db1.
db2:
mysql> show global variables like 'read_only'\G
*************************** 1. row ***************************
Variable_name: read_only
Value: OFF
1 row in set (0.00 sec)
mysql> set global read_only=on;
Query OK, 0 rows affected (0.00 sec)
db3:
mysql> set global read_only=on;
Query OK, 0 rows affected (0.00 sec)
然后再mmm-monitor上将db3的agent置于online状态
# mmm_control set_online db3
OK: State of 'db3' changed to ONLINE. Now you can wait some time and check its new roles!
# mmm_control set_online db3
OK: State of 'db3' changed to ONLINE. Now you can wait some time and check its new roles!
# mmm_control show
db1(10.1.1.15) master/ONLINE. Roles: reader(10.1.1.22), writer(10.1.1.20)
db2(10.1.1.14) master/ONLINE. Roles: reader(10.1.1.23)
db3(10.1.1.13) slave/ONLINE. Roles: reader(10.1.1.21)
# mmm_control checks all
db2ping OK
db2mysql OK
db2rep_threadsOK
db2rep_backlogOK: Backlog is null
db3ping OK
db3mysql OK
db3rep_threadsOK
db3rep_backlogOK: Backlog is null
db1ping OK
db1mysql OK
db1rep_threadsOK
db1rep_backlogOK: Backlog is null
现在一切OK,我们准备测试吧。
四、测试
一、测试写入数据是否同步
在mmm-monitor上连接10.1.1.20,尝试写入数据,然后查看三个服务器是否同步数据。
1、 从writer角色的机器登陆自己的mysql,创建一个大家都可以登陆用户。
db3:
#mysql
mysql> grant all privileges on *.* to 'andy'@'10.1.1.12'> mysql>flush privileges;
2、 登陆db2和db3,查看是否存在此用户
db2:
#mysql
mysql> select user,host from mysql.user;
+-------------+-------------+
| user | host |
+-------------+-------------+
| andy | 10.1.1.12 |
| mmm_agent | 10.1.1.12 |
| mmm_monitor | 10.1.1.12 |
| mmm_agent | 10.1.1.13 |
| slave | 10.1.1.13 |
| mmm_agent | 10.1.1.14 |
| mmm_agent | 10.1.1.15 |
| slave | 10.1.1.15 |
| web | 10.1.1.8 |
| root | 127.0.0.1 |
| root | localhost |
+-------------+-------------+
11 rows in set (0.00 sec)
db3:
mysql> select user,host from mysql.user;
+-------------+------------------+
| user | host |
+-------------+------------------+
| andy | 10.1.1.12 |
| mmm_agent | 10.1.1.12 |
| mmm_monitor | 10.1.1.12 |
| mmm_agent | 10.1.1.13 |
| mmm_agent | 10.1.1.14 |
| mmm_agent | 10.1.1.15 |
| root | 127.0.0.1 |
| root | localhost |
| root | zj12.dq-game.com |
+-------------+------------------+
9 rows in set (0.00 sec)
3、 从db4登陆10.1.1.20往test.t表里添加数据
# mysql -uandy -p -h 10.1.1.20 -P9188
mysql> use test
Database changed
mysql> select * from t;
+----+-----------+
|> +----+-----------+
|1 | andy.feng |
|2 | fh.cn |
|4 | mysql-mmm |
+----+-----------+
3 rows in set (0.00 sec)
mysql> insert into t(name) values ('from-monitor');
Query OK, 1 row affected (0.01 sec)
db2和db3:
mysql> select * from t;
+----+--------------+
|> +----+--------------+
|1 | andy.feng |
|2 | fh.cn |
|4 | mysql-mmm |
|5 | from-monitor |
+----+--------------+
4 rows in set (0.00 sec
二、测试WRITER故障切换
1、关闭现在的writer角色的mysql服务器,也就是现在的db1.
# killall mysqld
2、在monitor上检查节点的状态
# mmm_control show
db1(10.1.1.15) master/HARD_OFFLINE. Roles:
db2(10.1.1.14) master/ONLINE. Roles: reader(10.1.1.22), writer(10.1.1.20)
db3(10.1.1.13) slave/ONLINE. Roles: reader(10.1.1.21), reader(10.1.1.23)
已经检测到故障,自动切换了
# mmm_control checks all
db2ping OK
db2mysql OK
db2rep_threadsERROR: Replication is broken
db2rep_backlogOK: Backlog is null
db3ping OK
db3mysql OK
db3rep_threadsOK
db3rep_backlogOK: Backlog is null
db1ping OK
db1mysql ERROR: Connect error (host = 10.1.1.15:9188, user = mmm_monitor)! Lost connection to MySQL server at 'reading initial communication packet', system error: 111
db1rep_threadsOK
db1rep_backlogOK: Backlog is null
现在db3复制是正常的,db2的slave角色复制线程失败,db1的mysql连接失败
4、 在monitor上连接10.1.1.20写入数据
# mysql -uandy -p -h10.1.1.20 -P9188
mysql> use test
mysql> insert into t(name) values ('from-monitor2');
mysql> insert into t(name) values ('from-monitor3');
在db3上查看数据是否同步:
mysql> select * from t;
+----+---------------+
|> +----+---------------+
|1 | andy.feng |
|2 | fh.cn |
|4 | mysql-mmm |
|5 | from-monitor|
|7 | from-monitor2 |
|8 | from-monitor3 |
+----+---------------+
6 rows in set (0.00 sec)
数据同步成功!!!
5、恢复db1,查看db1数据是否同步:
启动db1数据库
# mmm_control show
db1(10.1.1.15) master/AWAITING_RECOVERY. Roles:
db2(10.1.1.14) master/ONLINE. Roles: reader(10.1.1.22), writer(10.1.1.20)
db3(10.1.1.13) slave/ONLINE. Roles: reader(10.1.1.21), reader(10.1.1.23)
由于db1停机大于了60s,所以需要手动设置online
# mmm_control set_online db1
OK: State of 'db1' changed to ONLINE. Now you can wait some time and check its new roles!
连接上db1,查看数据是否完整:
db1:
mysql> use test;
Database changed
mysql> select * from t;
+----+---------------+
|> +----+---------------+
|1 | andy.feng |
|2 | fh.cn |
|4 | mysql-mmm |
|5 | from-monitor|
|7 | from-monitor2 |
|8 | from-monitor3 |
+----+---------------+
6 rows in set (0.00 sec)
顺便看一下read_only状态
mysql> show global variables like 'read_only';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only | OFF |
+---------------+-------+
1 row in set (0.00 sec)
三、测试db3的主是否会自动切换db3:mysql> show slave status\G*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.1.1.14 Master_User: slave Master_Port: 9188 Connect_Retry: 10 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 65724106 > > > Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 65724106 > Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: 1 row in set (0.00 sec)现在db3的主是10.1.1.14(db2),是正常的情况,那么如果我们停掉db2会出现什么效果呢?# mmm_control set_offline db2OK: State of 'db2' changed to ADMIN_OFFLINE. Now you can wait some time and check all roles!# mmm_control show db1(10.1.1.15) master/ONLINE. Roles: reader(10.1.1.23), writer(10.1.1.20) db2(10.1.1.14) master/ADMIN_OFFLINE. Roles: db3(10.1.1.13) slave/ONLINE. Roles: reader(10.1.1.21), reader(10.1.1.22)我们来看看db3的情况db3:mysql> show slave status\G*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.1.1.15 Master_User: slave Master_Port: 9188 Connect_Retry: 10 Master_Log_File: mysql-bin.000006 Read_Master_Log_Pos: 65726122 > > > Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 65726122 > Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: 1 row in set (0.00 sec)db3已经自动把主切换到了db1,通过mmm_monitor观察,db3的复制是正确的。这个大家可以自己测试。 四、测试角色优先配置的影响先配置角色优先先修改mmm-monitor的配置,让db1具有优先获取writer角色。#vim /etc/mysql-mmm/mmm_common.conf hosts db1, db2 ips 10.1.1.20 mode exclusive prefer db1# /etc/init.d/mysql-mmm-monitor restart# mmm_control show db1(10.1.1.15) master/ONLINE. Roles: reader(10.1.1.22), writer(10.1.1.20) db2(10.1.1.14) master/ONLINE. Roles: reader(10.1.1.21), reader(10.1.1.23) db3(10.1.1.13) slave/AWAITING_RECOVERY. Roles:# Role writer is assigned to it's preferred host db1. 我直接说结果吧,大家自己测试一下。1、 当db1在线的时候,db1优先成为writer角色由于db3是优先使用writer角色作为自己的master,所以db3的master也会自动迁移。最后很好,数据还是同步的,刚才我们临时修改了read_only值,但是没有修改my.cnf,所以现在就把read_only设置到所有的mysql服务器的my.cnf里里添加 read_only=1,下次重启时候,就会生效。
页:
[1]