mysql-mmm安装指南
翻译:飞鸿无痕
转载请注明出处!http://blog.chinaunix.net/u3/93755/showart.php?id=2379392
由于本人英语水平不是很好,翻译难免有错误,如果有翻译错误的地方,请指出,谢谢!
注意:本指南只是一个草稿,如果你觉得有些地方需要改善、扩展或者修正的话,你可以随意更改。本指南所描述的是基于Debian Lenny (5.0)平台的mysql-mmm2的安装(不包含mmm tools)。
一个最基本的安装必须至少包含2个数据库服务器和一个监控服务器,在这个指南中,我用了5台基于Debian Lenny (5.0)平台的服务器
function | ip | hostname | server id |
monitoring host | 192.168.0.10 | mon | - |
master 1 | 192.168.0.11 | db1 | 1 |
master 2 | 192.168.0.12 | db2 | 2 |
slave 1 | 192.168.0.13 | db3 | 3 |
slave 2 | 192.168.0.14 | db4 | 4 |
我用了以下的虚拟IP,他们将会在被mmm分配
ip | role | description |
192.168.0.100 | writer | 你的应用程序应该连接到这个ip进行写操作 |
192.168.0.101 | reader | 你的应用程序应该链接到这些ip中的一个进行读操作 |
192.168.0.102 | reader | |
192.168.0.103 | reader | |
192.168.0.104 | reader |
Master1的基本配置
首先我们在所有的主机上安装mysql
aptitude install mysql-server
然后我们修改/etc/mysql/my.cnf文件的配置,加入以下行,确保所有的主机使用的不同的server id:
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
log_bin_index = /var/log/mysql/mysql-bin.log.index
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index
expire_logs_days = 10
max_binlog_size = 100M
log_slave_updates = 1
read_only = 1
删除下面这行:
bind-address = 127.0.0.1
当然要配置绑定到你的ip上:
bind-address = <your_IP_address>
然后为了让我们更改的配置文件生效需要重启下mysql服务:
/etc/init.d/mysql restart
创建用户
现在我们来创建需要的用户,我们需要创建3个不同的用户
功能 | 描述 | 权限 |
monitor user | mmm监控用于对mysql服务器进程健康检查 | REPLICATION CLIENT |
agent user | mmm代理用来更改只读模式,复制的主服务器等等 | SUPER, REPLICATION CLIENT, PROCESS |
relication user | 用于复制 | REPLICATION SLAVE |
创建用户语句的代码如下:
GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.0.%' IDENTIFIED BY 'monitor_password';
GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.0.%' IDENTIFIED BY 'agent_password';
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.0.%' IDENTIFIED BY 'replication_password';
注意:就以上这些允许用户连接的主机而言我们可以设置更多的限制,比如mmm监控主机是从192.168.0.10连接的,mmm代理和复制是从192.168.0.11 - 192.168.0.14连接的,
服务器之间的数据同步
我们假定db1上的数据是正确的。假如你有一个空的数据库,你仍然需要同步我们刚才创建的些帐号。
首先,当我们创建备份的过程中必须保证没有人更改数据库上的数据:
(db1) mysql> FLUSH TABLES WITH READ LOCK;
然后获取二进制日志文件目前的位置,我们一会在设置db2、db3和db4主从复制的时候要用到:
(db1) mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 374 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
先不要关闭这个mysql命令行模式。假如你关闭了它,那么刚才设置的数据库锁定就会被解锁,因此你需要再开启一个终端,并输入:
db1$ mysqldump -u root -p --all-databases > /tmp/database-backup.sql
现在我们可以对数据库解除锁定了,在上面第一个mysql命令行输入:
(db1) mysql> UNLOCK TABLES;
复制刚才的数据库备份到db2, db3 and db4:
db1$ scp /tmp/database-backup.sql <user>@192.168.0.12:/tmp
db1$ scp /tmp/database-backup.sql <user>@192.168.0.13:/tmp
db1$ scp /tmp/database-backup.sql <user>@192.168.0.14:/tmp
然后将备份导入到db2, db3 and db4:
db2$ mysql -u root -p < /tmp/database-backup.sql
db3$ mysql -u root -p < /tmp/database-backup.sql
db4$ mysql -u root -p < /tmp/database-backup.sql
然后刷新db2, db3 and db4的权限,我们更改了user表,所以mysql要重新读取这个表
(db2) mysql> FLUSH PRIVILEGES;
(db3) mysql> FLUSH PRIVILEGES;
(db4) mysql> FLUSH PRIVILEGES;
在debian和ubuntu中,从db1复制/etc/mysql/debian.cnf文件中的密码到db2、db3和db4,这个密码是用来启动和停止数据库的
现在所有的数据库的数据都是一致的了,我们可以开始设置主从复制来保持数据一致的状况了!
设置同步
通过下面的命令设置在db2, db3和db4上的复制
(db2) mysql> CHANGE MASTER TO master_host='192.168.0.11', master_port=3306, master_user='replication',
master_password='replication_password', master_log_file='<file>', master_log_pos=<position>;
(db3) mysql> CHANGE MASTER TO master_host='192.168.0.11', master_port=3306, master_user='replication',
master_password='replication_password', master_log_file='<file>', master_log_pos=<position>;
(db4) mysql> CHANGE MASTER TO master_host='192.168.0.11', master_port=3306, master_user='replication',
master_password='replication_password', master_log_file='<file>', master_log_pos=<position>;
请在<file> 和 <position>上插入我们前面在db1上用“show master status”看到的二进制日志文件名和二进制日志的位置。
然后用以下命令启动3个主机上的slave进程
(db2) mysql> START SLAVE;
(db3) mysql> START SLAVE;
(db4) mysql> START SLAVE;
现在用一下命令检查所有主机上的复制是否正常
(db2) mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.11
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
…
(db3) mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.11
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
…
(db4) mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.11
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
现在我们要设置db1从db2上复制,首先我们要确定master_log_file 和 master_log_pos的值:
(db2) mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 98 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
我们用下面的命令配置db1上的复制:
(db1) mysql> CHANGE MASTER TO master_host = '192.168.0.12', master_port=3306, master_user='replication',master_password='replication_password',master_log_file='<file>',
master_log_pos=<position>;
请在<file> 和 <position>上插入我们前面在db2上用“show master status”看到的二进制日志文件名和二进制日志的位置。
启动从进程
(db1) mysql> START SLAVE;
检查db1上的复制是否正常
(db1) mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.12
Master_User: <replication>
Master_Port: 3306
Connect_Retry: 60
…
所有的复制应该已经ok了,试着在db1和db2上插入数据,然后看看会不会同步更新到所有的节点上去。
MMM安装
创建用户
可选的:创建MMM脚本和配置文件的所有者,这将能为安全地管理监控脚本提供更简单的方法。
useradd --comment "MMM Script owner" --shell /sbin/nologin mmmd
监控主机
首先安装依存包:
aptitude install liblog-log4perl-perl libmailtools-perl liblog-dispatch-perl libclass-singleton-perl libproc-daemon-perl libalgorithm-diff-perl libdbi-perl libdbd-mysql-perl
接下来取得最新版本的mysql-mmm-common*.deb 和mysql-mmm-monitor*.deb文件,并安装它们:
dpkg -i mysql-mmm-common_*.deb mysql-mmm-monitor*.deb
数据库主机
首先安装依存包:
aptitude install liblog-log4perl-perl libmailtools-perl liblog-dispatch-perl iproute libnet-arp-perl libproc-daemon-perl libalgorithm-diff-perl libdbi-perl libdbd-mysql-perl
接下来取得最新版本的mysql-mmm-common*.deb 和mysql-mmm-agent*.deb文件,并安装它们:
dpkg -i mysql-mmm-common_*.deb mysql-mmm-agent_*.deb
配置MMM
所有的配置选项都集合在了一个叫/etc/mysql-mmm/mmm_common.conf的单独文件中,系统中所有主机的该文件内容都是一样的:
active_master_role writer
<host default>
cluster_interface eth0
pid_path /var/run/mmmd_agent.pid
bin_path /usr/lib/mysql-mmm/
replication_user replication
replication_password replication_password
agent_user mmm_agent
agent_password agent_password
</host>
<host db1>
ip 192.168.0.11
mode master
peer db2
</host>
<host db2>
ip 192.168.0.12
mode master
peer db1
</host>
<host db3>
ip 192.168.0.13
mode slave
</host>
<host db4>
ip 192.168.0.14
mode slave
</host>
<role writer>
hosts db1, db2
ips 192.168.0.100
mode exclusive
</role>
<role reader>
hosts db1, db2, db3, db4
ips 192.168.0.101, 192.168.0.102, 192.168.0.103, 192.168.0.104
mode balanced
</role>
不要忘记了拷贝这个文件到所有的主机(包括监控主机)!
在数据库主机上我们需要编辑/etc/mysql-mmm/mmm_agent.conf文件,根据其他主机的不同更改db1的值(db2就将db1更改成db2):
include mmm_common.conf
this db1
在监控主机上我们需要编辑/etc/mysql-mmm/mmm_mon.conf文件:
include mmm_common.conf
<monitor>
ip 127.0.0.1
pid_path /var/run/mmmd_mon.pid
bin_path /usr/lib/mysql-mmm/
status_path /var/lib/misc/mmmd_mon.status
ping_ips 192.168.0.1, 192.168.0.11, 192.168.0.12, 192.168.0.13, 192.168.0.14
</monitor>
<host default>
monitor_user mmm_monitor
monitor_password monitor_password
</host>
debug 0
ping_ips选项是通过ping这些ip来确认监控机的网络连接是正常的,我配置的是我的交换机(192.168.0.1)和其他四台数据库服务器。
启动MMM
启动代理
(在数据库服务器上)编辑/etc/default/mysql-mmm-agent来开启代理
ENABLED=1
然后启动它:
/etc/init.d/mysql-mmm-agent start
启动监控
(在监控服务器上)编辑/etc/default/mysql-mmm-monitor文件来开启监控
ENABLED=1
然后启动它:
/etc/init.d/mysql-mmm-monitor start
等待几秒钟mmmd_mon启动,在几秒钟后你可以用mmm_control来检查群集的状态
mon$ mmm_control show
db1(192.168.0.11) master/AWAITING_RECOVERY. Roles:
db2(192.168.0.12) master/AWAITING_RECOVERY. Roles:
db3(192.168.0.13) slave/AWAITING_RECOVERY. Roles:
db4(192.168.0.14) slave/AWAITING_RECOVERY. Roles:
因为这是第一次启动,所以我们的监控还不知道我们的主机,因此会设置所有主机的状态为AWAITING_RECOVERY并且会记录一条警告信息!
mon$ tail /var/log/mysql-mmm/mmmd_mon.warn
…
2009/10/28 23:15:28 WARN Detected new host 'db1': Setting its initial state to 'AWAITING_RECOVERY'. Use 'mmm_control set_online db1' to switch it online.
2009/10/28 23:15:28 WARN Detected new host 'db2': Setting its initial state to 'AWAITING_RECOVERY'. Use 'mmm_control set_online db2' to switch it online.
2009/10/28 23:15:28 WARN Detected new host 'db3': Setting its initial state to 'AWAITING_RECOVERY'. Use 'mmm_control set_online db3' to switch it online.
2009/10/28 23:15:28 WARN Detected new host 'db4': Setting its initial state to 'AWAITING_RECOVERY'. Use 'mmm_control set_online db4' to switch it online.
现在我们设置我们的主机为在线状态(db1最先,因为其他的主机是从db1复制更新的!):
mon$ mmm_control set_online db1
OK: State of 'db1' changed to ONLINE. Now you can wait some time and check its new roles!
mon$ mmm_control set_online db2
OK: State of 'db2' changed to ONLINE. Now you can wait some time and check its new roles!
mon$ mmm_control set_online db3
OK: State of 'db3' changed to ONLINE. Now you can wait some time and check its new roles!
mon$ mmm_control set_online db4
OK: State of 'db4' changed to ONLINE. Now you can wait some time and check its new roles!
官方文档链接:http://mysql-mmm.org/mmm2:guide
由于放到博客是格式有的有点乱,欢迎下载doc文档阅读!
http://blogimg.chinaunix.net/blog/upfile2/101103085239.rar