Mysql mmm演讲-冯浩

51
Mysql-mmm 实现 HA 《瞬间表锁 mmm-tools 实现快照备份》 演讲人 : :FH.CN|ISADBA Email [email protected] Blog: www.mysqlops.com | linuxguest.blog.51cto.com 1 ChinaUnix 技术沙龙 1

description

mysql,mysql-mmm,cu

Transcript of Mysql mmm演讲-冯浩

Page 1: Mysql mmm演讲-冯浩

《 Mysql-mmm实现 HA》 《瞬间表锁 mmm-tools 实现快照备份》

演讲人 : 冯 浩 网 名 :FH.CN|ISADBA

Email: [email protected] Blog: www.mysqlops.com | linuxguest.blog.51cto.com

1

ChinaUnix技术沙龙

1

Page 2: Mysql mmm演讲-冯浩

2

Page 3: Mysql mmm演讲-冯浩

什么是 HA?

• HA (High Availability)

– 所谓的HA就是高可用,度量高可用行使用平均无故障时间(MTTF),可维护性使用平均

维修时间(MTTR)来度量。计算计算机的可用性定义使用MTTF/(MTTF+MTTR)*100%

公式来计算。

– 为了达到这一目的就需要对提供服务器的设备提供冗余,在主设备挂掉的时候,从设备能够

顶上来,代替主设备,再失效的设备恢复以后,可以优先成为主设备提供服务或者成为现在

主设备的从设备。

– HA有三种工作方式

• 主从方式

• 双机双工方式

• 集群工作方式

3

Page 4: Mysql mmm演讲-冯浩

什么是 LB?

• LB (load balancing)

– 简单的理解为整合优化资源,将一个单元不能处理的压力尽量平均的分摊到多个单元上处理

– 五个目标• 一致性• 高效性• 可用性• 透明性• 可伸缩性

– 根据OSI7层网络结构定义,负载均衡技术可以通过 2-7层来实现, 2层主要是网络设备的

链路聚合技术,现在开源的负载均衡方案中,多以操作 4-7层来达到负载均衡目的。

– 硬件

• F5 、深信服、梭子鱼 等

– 软件

• LVS、HAPROXY、 Nginx、 Varnish,DNS 等

– 商业产品

• 智能DNS、 CDN 等4

Page 5: Mysql mmm演讲-冯浩

mysql常用 HA和 LB方案

• 常用的Mysql的HA+LB开源方案一般有以下几种

• 强调下mysql的架构特殊性,一般只有一个写入点, LB主要通过读写分离实现

– 主主复制

– 主从复制

– Mysql-proxy

– Mysql集群套件

– Mysql-mmm

– DRBD+heartbeat

– Lvs+keepalive

– Haproxy

– Amoeba

– 应用层软件自主开发(mysql_rw_php)

5

Page 6: Mysql mmm演讲-冯浩

mysql-mmm项目介绍

• 介绍:

– MMM(Master-Master replication manager for Mysql)是一套灵活的脚本程序,使用

perl语言开发。

• 功能:

– 用来监控和管理mysql Master-Master 复制的配置 (同一时间只有一个节点是可写的 )

– 做到故障切换的功能。

– 附带的工具套件可以实现多个 slaves的 read负载均衡 (我至今还不知道附带的哪个工具有

这个功能 ),不过我们可以通过其他的开源产品组合达到 LB的功能。

– 你可以让mmm自动的或者使用mmm自带的工具手工的移除一组服务器中复制延迟较高的

服务器的虚拟 IP,它还可以备份数据,两节点之间再同步等等。

6

Page 7: Mysql mmm演讲-冯浩

mysql-mmm有点和缺点

• 优点:

– 稳定和成熟的开源产品,经过了时间的考验

– 核心技术是 mysql自己的技术,只是使用脚本程序来控制,所以在原理上比较容易理解,而且

管理能够更智能化。

– 安装简单,配置简单,使用简单

– 功能强大 ( HA, failover, tools套件, cluster模式可以一个 monitor管理多个 mmm组)

• 缺点:

– 由于架构里只有一个写入点,所以扩展性是有限的,但是对一般中型企业够用了。

• 解决方案:对于大应用可以采取垂直拆分到多个 mmm架构的方式,使用 mmm cluster来管理。

– 对于读写分离和读负载均衡还是要程序来开发或者使用其他工具完成。

– 需要大量 perl库支持,安装比较耗时。

7

Page 8: Mysql mmm演讲-冯浩

mysql-mmm架构 (一 )

主主复制

MMM monitor

MysqlMaster A

MysqlMaster B

应用程序

real ip real ip

virtual ip virtual ip

8

Page 9: Mysql mmm演讲-冯浩

mysql-mmm架构 (二 )

主主复制

MMM monitor

MysqlMaster A

MysqlMaster B

应用程序

MysqlSlave Cvirtual ip virtual ip

virtual ip

real ip real ip

9

Page 10: Mysql mmm演讲-冯浩

mysql-mmm运行机制

MMM_MONITORListen:tcp9988

MysqlMaster A

Agent

MysqlMaster B

Agent

Mysqlslave C

Agent

Listen:tcp9989

Listen:tcp9989

Listen:tcp9989

mmm_ monitor进程用监控的数据和读取配置文件中的信息,通过 tcp9988和 9989与客户端通信,完成各种对客户端的设置操作,比如虚拟 I P 的添

… …加和删除

mmm_ monitor进程读取配置文件中的信息连接到agent的 mysql端口,检查mysql的的相关状态。

10

Page 11: Mysql mmm演讲-冯浩

mysql-mmm安装规划

• 安装步骤规划

– 安装系统,完成 lvm分区的规划

– 完成 I P规划,完成数据库的编译和安装。

– 安装 mysql mmm需要的 perl模块

– 在数据库里面创建 mysql mmm相关的用户和分配对应的权限

– 下载 mysql-mmm

– 安装 mysql-mmm

– 修改配置文件

– 启动 mysql-mmm进程

– 测试 mysql-mmm

– 添加 slave并测试

11

Page 12: Mysql mmm演讲-冯浩

mysql-mmm安装需求 (一 )

• Server n+1

– N 台安装 mysql的机器和 1 台安装 mmm monitor的机器。

• 2* ( n+1) I ps

– 每个主机一个固定 ip、一个虚拟 I P(reader role),全局一个 writer role I P

• Monitor User

– 一个可以在 mmm monitor机器上使用的并且拥有 REPLI CATI ON CLI ENT 权限的 mysql用户

• Agent User

– 一个可以在 mmm agent机器上使用的并且拥有 super, replication client, process权限的 mysql用户

• Replication user

– 一个 slaves主机上可以使用的并且有用 replication slave权限的用户

• Tools user

– 一个 mmm tools主机可以使用的,并且有用 super, replication client, reload权限的 mysql用户

12

Page 13: Mysql mmm演讲-冯浩

mysql-mmm安装需求 (二 )

• Mysql_mmm是有 perl编写的,所以肯定对 perl的一些模块有依耐关系,下面我们来理

一理mmm需要哪些 perl模块

• Monitor host需要安装的 perl模块:

– Fping(如果你想要使用非 root用户运行mmm_mond进程 )

– Algorithm::Diff

– Class:Singleton

– DBI and DBD::mysql

– File::Basename

– File::stat

– File::Temp

– Log::Dispatch

– Log::Log4perl

– Mail::Send

– Net::Ping

– Proc::Daemon

– Thread::Queue

– Time::HiRes 13

Page 14: Mysql mmm演讲-冯浩

mysql-mmm安装需求 (三 )

• nodes host需要安装的 perl库

– Iproute

– Send_arp(solaris)

• Perl模块如下:

– Fping(如果你想要使用非 root用户运行mmm_mond进程 )

– Algorithm::Diff

– DBI and DBD::mysql

– File::Basename

– File::stat

– Log::Dispatch

– Log::Log4perl

– Mail::Send

– Net::ARP(linux)

– Proc::Daemon

– Time::HiRes

14

Page 15: Mysql mmm演讲-冯浩

安装 perl模块的方法

• 普通青年:

– #perl –MCPAN –e shell

– cpan>install 模块名

• 文艺青年:

– cd /usr/sbin/

– wget http://xrl.us/cpanm --no-check-certificate

– chmod 755 cpanm

– #cpanm 模块名

• 技术青年:

– 当然你也可以通过 cpan下载后,自己手工编译安装相关模块,只是比较麻烦一点

• 注意:安装DBD::mysql的前,如果是自己编译安装的mysql,需要

在 /etc/ld.so.conf文件中加上mysql库所在的位置,然后运行 ldconfig命令。– Example:

– # cat /etc/ld.so.conf

– include ld.so.conf.d/*.conf

– /usr/local/mysql/lib/mysql/15

Page 16: Mysql mmm演讲-冯浩

完成 IP规划

• 我们以两台master和一台 slave的架构来演示

– 三台安装mysql的服务器

– 虚拟 IP规划

主机名 IP地址 角色 Mysql_server_id

db1 192.168.199.128 masterA 1

db2 192.168.199.129 masterB 2

db3 192.168.199.130 slaveC 3

mmm 192.168.199.127 mmm_mon -

IP地址 角色 描述

192.168.199.200 writer 应用服务器连接此服务器写入数据

192.168.199.201 reader 应用服务器连接此服务器读取数据

192.168.199.202 reader 应用服务器连接此服务器读取数据

192.168.199.203 reader 应用服务器连接此服务器读取数据

16

Page 17: Mysql mmm演讲-冯浩

mysql-mmm下载安装

• 在数据库里面创建mysql mmm相关的用户和分配对应的权限– mysql> grant replication slave on *.* to 'slave'@'192.168.199.%' identified by 'slave';

– mysql> grant replication client,process,super on *.* to 'mmm_agent'@'192.168.199.%' identified by

'mmm_agent';

– mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.199.%' identified by 'mmm_monitor';

– mysql> grant replication client,reload,super on *.* to 'mmm_tools'@'192.168.199.%' identified by 'mmm_tools';

• 下载mysql-mmm

– http://mysql-mmm.org/_media/:mmm2:mysql-mmm-2.2.1.tar.gz

• 在mysql-mmm架构中的所有机器上安装mysql-mmm软件

– # 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

17

Page 18: Mysql mmm演讲-冯浩

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的启动关闭脚本

18

Page 19: Mysql mmm演讲-冯浩

mysql-mmm配置文件介绍

• mysql-mmm有以下几个配置文件

– mmm_agent.conf

• mmm_agent进程调用,作用是确定当前的节点名字

– mmm_common.conf

• monitor和 agent都会调用,大部分配置内容都在这里面

– mmm_mon.conf

• mmm_mon进程调用,monitor相关的配置

– mmm_tools.conf

• mmm_tools调用的配置文件,如果要使用mmm_tools工具就需要配置此文件

19

Page 20: Mysql mmm演讲-冯浩

mmm_common.conf(一 )

默认的主机定义部分

– active_master_role writer

– < host default>

– cluster_interface eth0

– 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

– < /host>

20

Page 21: Mysql mmm演讲-冯浩

mmm_common.conf(二 )

主机配置部分

– < host db1>

– ip 192.168.199.128

– mode master

– peer db2

– < /host>

– < host db2>

– ip 192.168.199.129

– mode master

– peer db1

– < /host>

– < host db3>

– ip 192.168.199.130

– mode slave

– < /host>

21

Page 22: Mysql mmm演讲-冯浩

mmm_common.conf(三 )

角色配置部分

– < role writer>

– hosts db1, db2

– ips 192.168.199.200

– mode exclusive

– prefer db1

– < /role>

– < role reader>

– hosts db1, db2,db3

– ips 192.168.199.201,192.168.199.202,192.168.199.203

– mode balanced

– < /role>

22

Page 23: Mysql mmm演讲-冯浩

mmm_agent.conf

此配置文件在启动mmm_agent进程的机器上配置,由于每个服务器上的mmm_common.conf

都一样,这个服务器紧紧需要指定当前节点的 host名字,需要和 common.conf中主机配置中的内容

想对应。

–include mmm_common.conf

–this db1

23

Page 24: Mysql mmm演讲-冯浩

mmm_mon.conf

此文件只需要在mmm_mon进程的机器上配置

– include mmm_common.conf

– <monitor>

– ip 192.168.199.127

– pid_path /var/run/mmm_mond.pid

– bin_path /usr/lib/mysql-mmm/

– status_path /var/lib/misc/mmm_mond.status

– ping_ips 192.168.199.128,192.168.199.129,192.168.199.130

– auto_set_online 10

– </monitor>

– <host default>

– monitor_user mmm_monitor

– monitor_password mmm_monitor

– </host>

– debug 0

24

Page 25: Mysql mmm演讲-冯浩

mysql-mmm启动

• 启动 monitor

– # /etc/init.d/mysql-mmm-monitor start

D aemon bin: ' /usr/sbin/mmm_ mond'

D aemon pid: ' /var/run/mmm_ mond.pid'

Starting MMM Monitor daemon: Ok

• 启动 agent

– # /etc/init.d/mysql-mmm-agent start

D aemon bin: ' /usr/sbin/mmm_ agentd'

D aemon pid: ' /var/run/mmm_ agentd.pid'

Starting MMM Agent daemon... Ok

• 可以使用 /etc/init.d/mysql-mmm-monitor – help查看使用方法, agent也可以。

• 使用 ps aux | grep mmm 或者 netstat – tulnp | grep mmm 查看进程是否启动成功

25

Page 26: Mysql mmm演讲-冯浩

mysql-mmm管理工具

# mmm_control help

Valid commands are:

help - show this message

ping - ping monitor

show - show status

checks [<host>|all [<check>|all]] - show checks status

set_online <host> - set host <host> online

set_offline <host> - set host <host> offline

mode - print current mode.

set_active - switch into active mode.

set_manual - switch into manual mode.

set_passive - switch into passive mode.

move_role [--force] <role> <host> - move exclusive role <role> to host <host>

(Only use --force if you know what you are doing!)

set_ip <ip> <host> - set role with ip <ip> to host <host>

26

Page 27: Mysql mmm演讲-冯浩

mysql-mmm运行状态分析

# mmm_control show //查看当前虚拟 IP的分布状况

db1(192.168.199.128) master/ONLINE. Roles: reader(192.168.199.201), writer(192.168.199.200)

db2(192.168.199.129) master/ONLINE. Roles: reader(192.168.199.203)

db3(192.168.199.130) slave/ONLINE. Roles: reader(192.168.199.202)

# mmm_control checks all //对所有节点进行所有检查

db2 ping [last change: 2011/12/07 19:03:05] OK

db2 mysql [last change: 2011/12/07 19:03:05] OK

db2 rep_threads [last change: 2011/12/07 19:03:05] OK

db2 rep_backlog [last change: 2011/12/07 19:03:05] OK: Backlog is null

db3 ping [last change: 2011/12/07 18:17:41] OK

db3 mysql [last change: 2011/12/07 18:58:28] OK

db3 rep_threads [last change: 2011/12/07 19:16:29] OK

db3 rep_backlog [last change: 2011/12/07 18:17:41] OK: Backlog is null

db1 ping [last change: 2011/12/07 16:40:10] OK

db1 mysql [last change: 2011/12/07 16:40:10] OK

db1 rep_threads [last change: 2011/12/07 16:40:10] OK

db1 rep_backlog [last change: 2011/12/07 16:40:10] OK: Backlog is null

# mmm_control mode //查看mmm当前运行的模式

ACTIVE27

Page 28: Mysql mmm演讲-冯浩

mysql-mmm故障处理机制

28

MMM_MONITORListen:tcp9988

MysqlMaster A

Agent

MysqlMaster B

Agent

Mysqlslave C

Agent

Listen:tcp9989

Listen:tcp9989

Listen:tcp9989

monitor检查 agent的以下几个状态1、 agent进程2、 ping3、mysql4、 rep_threads、5、 rep_backlogping检查默认是 1s,通过ping_interval配置mysql相关的检查默认是 5s,通过check_period配置, trap_period表示一个节点检测不成功持续的时间,默认为 10秒,如果超过这个时间就认为这个节点失败了。

如果活动的master检测到失败,那么 writer role将从原来的主机上移除。active master:1、mysql设置为 read_only模式2、删除活动的连接3、删除虚拟 IPslave:1、完成原来主机上的复制工作2、切换master到新的主机上new active master:1、mysql设置为可写模式2、配置虚拟 ip

Page 29: Mysql mmm演讲-冯浩

mysql-mmm故障模拟 (一 )

• 备份master故障演示

• 通过 iptables来模拟mysql故障

– on db2:

– # iptables -A INPUT -p tcp --dport 9188 -j DROP && date

– 大概 15秒mmm完成了故障切换– # mmm_control show

– db1(192.168.199.128) master/ONLINE. Roles: reader(192.168.199.201), writer(192.168.199.200)

– db2(192.168.199.129) master/HARD_OFFLINE. Roles:

– db3(192.168.199.130) slave/ONLINE. Roles: reader(192.168.199.202), reader(192.168.199.203)

– #mmm_control checks all

– db2 ping [last change: 2011/12/07 23:32:12] OK

– db2 mysql [last change: 2011/12/07 23:36:06] ERROR: Connect error (host = 192.168.199.129:9188,

user = mmm_monitor)! Can't connect to MySQL server on '192.168.199.129' (4)

– 故障修复后,大概 5 秒完成了 恢复。

29

Page 30: Mysql mmm演讲-冯浩

mysql-mmm故障模拟 (二 )

• 活动的master故障演示

• on db1

• # iptables -A INPUT -p tcp --dport 9188 -j DROP && date

• 大概 15秒mmm完成了故障切换– # mmm_control show

– db1(192.168.199.128) master/HARD_OFFLINE. Roles:

– db2(192.168.199.129) master/ONLINE. Roles: reader(192.168.199.202), writer(192.168.199.200)

– db3(192.168.199.130) slave/ONLINE. Roles: reader(192.168.199.201), reader(192.168.199.203)

– # mmm_control checks all

– db1 mysql [last change: 2011/12/07 23:48:39] ERROR: Connect error (host = 192.168.199.128:9188, user =

mmm_monitor)! Can't connect to MySQL server on '192.168.199.128' (4)

– db1 rep_threads [last change: 2011/12/07 23:35:05] OK

– db1 rep_backlog [last change: 2011/12/07 23:32:12] OK: Backlog is null

– 故障切换完成以后,检查DB3 slave的复制情况,发现已经自动调整到masterB了。

– 故障修复后,大概 5秒完成了恢复。

30

Page 31: Mysql mmm演讲-冯浩

基于mysql-mmm的 LB实现

• 之前已经介绍了什么是 LB和mysql LB的实现方式。

• 下面我以 php代码为例,完成的实现基于mysql-mmm的读写分离和读负载均衡。

– 该代码是否mysql_rw_php项目修改而来– require_once('mysql_rw_php.class.php');

– $ro_host=array(“192.168.199.201:9188”,“ 192.168.199.202:9188 ” “, 192.168.199.203:9188”);

– $a=array_rand($ro_host,1);

– //rw info

– $db_rw = array(

– 'dbhost'=>‘192.168.199.200:9188',

– 'dbuser'=>'andy',

– 'dbpw'=>'andy',

– 'dbname'=>'test‘

– );

– $db_ro = array(

– 'dbhost'=>$ro_host[$a],

– 'dbuser'=>'andy',

– 'dbpw'=>'andy‘

– );

31

Page 32: Mysql mmm演讲-冯浩

32

Page 33: Mysql mmm演讲-冯浩

mmm-tools介绍

• mmm_ tools是 mysql-mmm软件附带的一个工具箱,自带三个工具

• mmm_ clone

– 用来克隆一个 mysql数据库到另外的机器,并且自动完成 master-master或者 master-slave的环境搭建

,很好用。 (前面我们的架构只搭建了 master-master的架构,我们将用 mmm_ clone完成 master-master-

slave的架构 )

• mmm_ backup

– 用来备份一个 mysql数据库,备份的时候使用了 lvm快照技术,所以支持热备,并且锁表的时

间相当的短,支持三种拷贝的方法, scp, ssh-gz, rdiff,下面会详细介绍。

• mmm_ restore

– 还原数据到一个 mysql数据库,并完成 master-master或者 master-slave的环境搭建,不过还原还是建

议手动操作,除非你对此工具很熟悉,能够熟练使用,这样才能降低操作带来的风险

33

Page 34: Mysql mmm演讲-冯浩

mmm_tools预备知识

• mysql-mmm中文手册: http://linuxguest.blog.51cto.com/195664/578311

• mysql-mmm安装手册: http://linuxguest.blog.51cto.com/195664/578307

• lvm快照技术: http://asram.blog.51cto.com/1442164/313073

• 使用 lvm快照备份mysql:

http://linuxguest.blog.51cto.com/195664/585036

• 如果你对以上知识没有了解的话,请先阅读以上资料,并预先搭建好mysql-mmm架

构,应为mmm_tools是依赖mysql-mmm架构工作的。

34

Page 35: Mysql mmm演讲-冯浩

mmm-tools环境需求

• 搭建好mysql-mmm环境,

• 安装mmm-tools需要的 perl插件和创建 tools的mysql用户

– Path::Class

– Data::Dumper

• 安装好mysql数据库,所有服务器尽量使用相同的mysql版本

• mysql数据库软件放在 lvm的逻辑卷上面(备份需要 lvm快照功能),并且存放

mysql数据库的逻辑卷组除了mysql数据库使用的空间外,还要剩余 1-10G的空间

用于创建快照,快照空间大小根据你数据库的大小和备份时会改变的数据量大小来定,

宁多勿少。

• 安装 rdiff-backup, rdiff-backup是支持增量备份的一种软件。在mysql-backup

rdiff拷贝方法中会用到。

– 参考: http://wiki.rdiff-backup.org/wiki/index.php/Installations

35

Page 36: Mysql mmm演讲-冯浩

mmm_tools.conf(一 )

• 更详细的配置参见我提供的《mmm-tools配置手册》

• 工具全局的配置和主机的默认配置– include mmm_agent.conf

– default_copy_method scp

– clone_dirs data

– <host default>

– ssh_user root

– lvm_snapshot_size 1G

– lvm_logical_volume lvmdb

– lvm_volume_group myvg

– lvm_mount_dir /mmm_snapshot //需要自己创建

– lvm_mount_opts -o rw

– tools_user mmm_tools

– tools_password mmm_tools

– backup_dir /mmm_backup //需要自己创建

– restore_dir /mysql //需要自己创建

– </host>

36

Page 37: Mysql mmm演讲-冯浩

mmm_tools.conf(二 )– <copy_method scp> //三种备份方法相关的配置

– backup_command scp -c blowfish -r %SSH_USER%@%IP%:%SNAPSHOT%/%CLONE_DIR% %DEST_DIR%/

– restore_command cp -axv %BACKUP_DIR%/* %DEST_DIR%/

– true_copy 1

– </copy_method>

– <copy_method rdiff>

– backup_command rdiff-backup --ssh-no-compression -v 5 !--include %SNAPSHOT%/%CLONE_DIR%!

--exclude %SNAPSHOT% %SSH_USER%@%IP%::%SNAPSHOT%/ %DEST_DIR%/

– restore_command rdiff-backup --force -v 5 -r %VERSION% %BACKUP_DIR% %DEST_DIR

%/.mmm_restore; cp -axvl --remove-destination %DEST_DIR%/.mmm_restore/* %DEST_DIR%/; rm -r

%DEST_DIR%/.mmm_restore/

– incremental_command rdiff-backup --parsable-output -l %BACKUP_DIR%

– single_run 1

– incremental 1

– </copy_method>

– <copy_method ssh-gz>

– backup_command ssh -c blowfish %SSH_USER%@%IP% "cd '%SNAPSHOT%'; tar cv !'%CLONE_DIR%'!" |

gzip > %DEST_DIR%/backup.tar.gz

– restore_command cd %DEST_DIR%; tar xzfv %BACKUP_DIR%/backup.tar.gz

– single_run 1

– </copy_method>37

Page 38: Mysql mmm演讲-冯浩

mmm_clone介绍及演示 (一 )

• 用法 :

• Usage: /usr/sbin/mmm_clone [--config <config file>] --host <host> --clone-mode <mode>

[--copy-method <copy method>] [--dest-dir <dir>]

• Where:

• host : db1 | db2

• clone-mode : master-master | master-slave | slave-slave

• copy-method: scp (default: ssh-gz)

• dest-dir : directory where data should be cloned to

• 需求:将 db1的数据克隆到 db2,并搭建master-master的复制架构

• 准备工作:

• 1、mysql-mmm已经安装好,mmm相关的配置文件已经完成。

• 2、my.cnf已经配置好(具体配置和注意事项请参照《mysql-mmm安装手册》)。

• 3、将要使用的数据导入到 db1

• 完成以上任务后,启动 db1。把 db2的数据库关闭

38

Page 39: Mysql mmm演讲-冯浩

mmm_clone介绍及演示 (二 )

• 现在我们使用mmm_clone完成 db1到 db2的数据同步,并且完成master-master架构的搭建。

• 在 db2上运行下面命令 :

• #mmm_clone --host db1 --copy-method scp --clone-mode master-master --dest-dir

/usr/local/mysql/

– INFO: Checking destination directory '/usr/local/mysql/'...

– INFO: Directory is ok

– Source host : db1

– Destination dir : /usr/local/mysql/

– Dirs to clone : var

– Clone mode : master-master

– Copy method : scp

– Replication peer : db1

– Setup master-master replication: yes

– Dry run : no

– WARN: MySQL is not running now, skipping shutdown ...

– INFO: Verifying ssh connection to remote host '[email protected]' (command: ssh -p 22

[email protected] date)...

[email protected]'s password:

39

Page 40: Mysql mmm演讲-冯浩

mmm_clone介绍及演示 (三 )

– File descriptor 4 (socket:[1661904]) leaked on lvcreate invocation. Parent PID 1141: perl

– Logical volume "mmm_snapshot" created

– OK: Snapshot created!

– INFO: Copying 'var' from snapshot on host 'db1' with copy method 'scp'

– INFO: Executing command scp -P22 -c blowfish -r

[email protected]:/mmm_snapshot/var /usr/local/mysql//

– 拷贝文件到 db2

– INFO: Copied directory var!

– INFO: Copying '_mmm' from snapshot on host 'db1' with copy method 'scp'

– INFO: Executing command scp -P22 -c blowfish -r [email protected]:/mmm_snapshot/_mmm

/usr/local/mysql//

[email protected]'s password:

– status.txt 100% 2454 2.4KB/s 00:00

– my.cnf 100% 5570 5.4KB/s 00:00

– INFO: Copied directory _mmm!

– INFO: ssh -p 22 [email protected] /usr/lib/mysql-mmm//tools/remove_snapshot

[email protected]'s password:

– Logical volume "mmm_snapshot" successfully removed

– OK: Snapshot removed!

– INFO: Cleaning dump from master.info and binary logs...

– INFO: Deleting master binary logs: mysql-bin.*

– “已删除 /usr/local/mysql/var/mysql-bin.index”

– “已删除 /usr/local/mysql/var/mysql-bin.000002”

– “已删除 /usr/local/mysql/var/mysql-bin.000003”

– “已删除 /usr/local/mysql/var/mysql-bin.000001”

– INFO: Deleting relay binary logs: andy-relay-bin.*

– “已删除 /usr/local/mysql/var/andy-relay-bin.000008”

– “已删除 /usr/local/mysql/var/andy-relay-bin.000007”

– “已删除 /usr/local/mysql/var/andy-relay-bin.index”

– INFO: Deleting .info and .pid files...

– “已删除 /usr/local/mysql/var/master.info”

– “已删除 /usr/local/mysql/var/relay-log.info”

– “已删除 /usr/local/mysql/var/andy.example.com.pid”

– INFO: Changing permissions on mysql data dir...

– INFO: MySQL is not running. Going to start it...

– Starting MySQL...................... [确定 ]

– INFO: MySQL has been started!

– INFO: Changing master of host db2 to 192.168.199.128 ...

– INFO: Successfully changed master.

– INFO: Changing master of host db1 to 192.168.199.129 ...

– INFO: Successfully changed master.

– INFO: Clone operation finished!

40

Page 41: Mysql mmm演讲-冯浩

mmm_clone介绍及演示 (三 )

[root@andy var]# mmm_control show

db1(192.168.199.128) master/AWAITING_RECOVERY. Roles:

db2(192.168.199.129) master/ONLINE. Roles: reader(192.168.199.201), reader(192.168.199.202),

writer(192.168.199.200)

[root@andy var]# mmm_control set_online db1

OK: State of 'db1' changed to ONLINE. Now you can wait some time and check its new roles!

[root@andy var]# mmm_control show

db1(192.168.199.128) master/ONLINE. Roles: reader(192.168.199.202)

db2(192.168.199.129) master/ONLINE. Roles: reader(192.168.199.201), writer(192.168.199.200)

[root@andy var]# mmm_control checks all

db2 ping [last change: 2011/07/03 02:10:35] OK

db2 mysql [last change: 2011/07/09 21:48:05] OK

db2 rep_threads [last change: 2011/07/09 22:01:22] OK

db2 rep_backlog [last change: 2011/07/09 22:01:22] OK: Backlog is null

db1 ping [last change: 2011/07/02 18:27:51] OK

db1 mysql [last change: 2011/07/09 22:01:22] OK

db1 rep_threads [last change: 2011/07/09 22:01:22] OK

db1 rep_backlog [last change: 2011/07/02 18:27:51] OK: Backlog is null

当然,你还可以登陆到每台机器,使用 show slave status\G来详细检查。呵呵,是不是很爽呢。

41

Page 42: Mysql mmm演讲-冯浩

mmm_backup介绍

• 基于上面搭建的环境,我们来演示三种 copy方法。

• 用法:

• Usage: /usr/sbin/mmm_backup [--config <config file>] --host <host>

[--copy-method <copy method>] [--dest-dir <dir>]

• Where:

• host : db1 | db2

• copy-method: rdiff | scp | ssh-gz (default: ssh-gz)

• dest-dir : directory where data should be backed up to

42

Page 43: Mysql mmm演讲-冯浩

mmm_backup的 scp方法 (一 )

使用 scp方法把 db1的数据备份到本地的 /mmm_backup中。

– [root@andy ~]# mmm_backup --host db1 --copy-method scp --dest-dir /mmm_backup/

– File descriptor 4 (socket:[1785871]) leaked on lvcreate invocation. Parent PID 16900: perl

– Logical volume "mmm_snapshot" created

– OK: Snapshot created!

– INFO: Copying 'var' from snapshot on host 'db1' with copy method 'scp'

– INFO: Executing command scp -P22 -c blowfish -r [email protected]:/mmm_snapshot/var /mmm_backup//

– 拷贝文件

– INFO: Copied directory var!

– INFO: Copying '_mmm' from snapshot on host 'db1' with copy method 'scp'

– INFO: Executing command scp -P22 -c blowfish -r [email protected]:/mmm_snapshot/_mmm

/mmm_backup//

– status.txt 100% 2345 2.3KB/s 00:00

– my.cnf 100% 5570 5.4KB/s 00:00

– INFO: Copied directory _mmm!

– INFO: ssh -p 22 [email protected] /usr/lib/mysql-mmm//tools/remove_snapshot

– Logical volume "mmm_snapshot" successfully removed

– OK: Snapshot removed!

43

Page 44: Mysql mmm演讲-冯浩

mmm_backup的 scp方法 (二 )

• 备份的结果

– 备份完成后, --dest-dir里有两个目录 _mmm和 var。

– _mmm:主要保存三个文件

• Copy_method.txt备份使用的拷贝方法

• My.cnf 备份的my.cnf

• Status.txt 包含备份的节点名字,备份时的master状态和 slave状态

– var:

• 保存了备份数据库 /var目录下的所有文件,包括数据文件, bin-log, relay-log,等

44

Page 45: Mysql mmm演讲-冯浩

mmm_backup的 ssh-gz方法

• B、使用 ssh-gz方法把 db1的数据备份到本地的 /mmm_backup中。

– 注意,此时 /mmm_backup中已经存在一个备份了,所以在备份到这个目录会不成功,我们可以重新指定

一个目录,或者将此目录中备份删掉。

– db1:

– # cd /mmm_backup/

– [root@andy mmm_backup]# ls

– _mmm var

– [root@andy mmm_backup]# rm -rf *

– [root@andy mmm_backup]# mmm_backup --host db1 --copy-method ssh-gz --dest-dir

/mmm_backup/

• 备份的结果有一个 _mmm目录和一个 backup.tar.gz文件。

– _mmm目录和 scp方法备份出来的一样

– Backup.tar.gz就是 var使用 gzip压缩以后的文件,可以大大节约存储空间

• 推荐使用这种方法备份

45

Page 46: Mysql mmm演讲-冯浩

mmm_backup的 rdiff方法

• C、使用 rdiff方法把 db2的数据备份到本地的 /mmm_backup中。

– 使用词拷贝方法,记得要先安装 rdiff-backup工具。

– db1:

– [root@andy mmm_backup]# mmm_backup --host db2 --copy-method rdiff --dest-dir /mmm_backup/

46

Page 47: Mysql mmm演讲-冯浩

mmm_restore介绍

• 还原也分三种拷贝模式, scp和 ssh-gz差不多, rdiff属于增量备份,可以选择还原的版本号。这里我们

就只演示 scp和 rdiff两种还原。

• 用法:

– Usage: /usr/sbin/mmm_restore [--config <config file>] [--mode <mode>] [--version <version | list>] [--src-dir

<dir>] [--dest-dir <dir>] [--dry-run]

– Where:

– src-dir : directory where backup resides

– dest-dir: directory where backup should be restored to

– mode : data-only, single-single, slave-single, master-single, master-slave, slave-slave

– version :

• when run with 'list' parameter, displays available versions of incremental backups

• if version is specified, tries to restore backup for specified version

– dry-run : check everything and exit without any changes

– 从上面可以看出,mmm_restore使用的— src-dir和— dest-dir,而不是— host。

47

Page 48: Mysql mmm演讲-冯浩

mmm_restore的 scp和 ssh-gz方法

• 使用 scp拷贝模式还原数据库

• 现在我们模仿 db1数据库文件丢失,需要还原数据的场景。首先手工删除 test数据文件。

• [root@andy var]# cd /usr/local/mysql/var/ && rm -rf test/

• [root@andy var]# ls

• andy.example.com.pid andy-relay-bin.000002 master.info mysql-bin.000001 relay-log.info

• andy-relay-bin.000001 andy-relay-bin.index mysql mysql-bin.index

• 还原数据:

• [root@andy var]# mmm_restore

• INFO: Checking restore source directory '/mmm_backup'...

• 这里并没有演示完整还原,因为还原或导致master-master复制失败,还原完成, db1已经自动把master转向

db2,但是 db2对 db1的复制失败了,应为 db1的 bin-log发生了变化,需要手工恢复master-master复制。

• 如果真实情况master数据丢失需要还原的话,就需要先 resote到master,然后再mmm_clone生成复制架构

。如果只是 slave损坏,没必要还原,直接mmm_clone过来就可以了

48

Page 49: Mysql mmm演讲-冯浩

mmm_restore的 rdiff方法

• 还原 rdiff的备份

• [root@andy ~]# mmm_restore --mode master-slave --version list --src-dir /mmm_backup/ --dest-

dir /usr/local/mysql/ --dry-run

– INFO: Checking restore source directory '/mmm_backup/'...

– INFO: Directory is ok

– Following backup versions are available:

– Version | Date

– 1310222305 | Sat Jul 9 22:38:25 2011

– 1310222616 | Sat Jul 9 22:43:36 2011

• [ root@andy ]# mmm_ restore --mode master-slave --version 1310222616 --src-dir /mmm_ backup/ --dest-dir /usr/local/mysql/ --dry-run ~

• --version //选择 version编号或者使用— list显示可用的编号。

• --dry-run //测试是否可以运行,不真正运行。

• 使用还原前关掉 mysql数据库,貌似 mmm_ tools存在一个 bug,关于还原前和 clone前关闭数据库的命令。

• [ root@andy var]# mmm_ restore --mode master-slave --version 1310222616 --src-dir /mmm_ backup/ --dest-dir /usr/local/mysql/

• 还原完成, db1 已经自动把 master转向 db2,但是 db2对 db1 的复制失败了,应为 db1 的 bin-log发生了变化,这个只有

手工处理。

49

Page 50: Mysql mmm演讲-冯浩

mmm故障总结

• mysql-mmm出现故障的最大可能就是你的 perl模块没有安装齐全,导致mysql-

mmm不能够预期工作

• 定期优化检查myisam表,定期使用mk-table-checksum检查主从的一致性

• mmm-tools存在以下几个注意

– 如果当命令执行到一半而由于配置错误退出时,快照已经生成,但是命令未执行完,导致快

照没有删除,需要自己使用 lvremove –f 快照名 删除快照。

– 注意mmm_tools.cnf要针对所在主机环境配置,不是所有都一样,特别注意 server-id和

自动增长列。

– 生产环境下,备份好以后,需要转移做测试,看备份是否可以用。还原最好手工操作,避免

误伤。

• 最后:上线前各种故障模拟测试,故障后日志是解决问题的关键。

50

Page 51: Mysql mmm演讲-冯浩

51