• 1. 《Mysql-mmm实现HA》 《瞬间表锁 mmm-tools实现快照备份》演讲人:冯 浩 网 名:FH.CN|ISADBA Email:lr@isadba.com Blog: www.mysqlops.com | linuxguest.blog.51cto.com1ChinaUnix技术沙龙1
  • 2. Mysql Master-Master Replication ManagerMMM2
  • 3. 什么是HA?HA (High Availability) 所谓的HA就是高可用,度量高可用行使用平均无故障时间(MTTF),可维护性使用平均维修时间(MTTR)来度量。计算计算机的可用性定义使用MTTF/(MTTF+MTTR)*100%公式来计算。 为了达到这一目的就需要对提供服务器的设备提供冗余,在主设备挂掉的时候,从设备能够顶上来,代替主设备,再失效的设备恢复以后,可以优先成为主设备提供服务或者成为现在主设备的从设备。 HA有三种工作方式 主从方式 双机双工方式 集群工作方式3
  • 4. 什么是LB?LB (load balancing) 简单的理解为整合优化资源,将一个单元不能处理的压力尽量平均的分摊到多个单元上处理 五个目标 一致性 高效性 可用性 透明性 可伸缩性 根据ISO7层网络结构定义,负载均衡技术可以通过2-7层来实现,2层主要是网络设备的链路聚合技术,现在开源的负载均衡方案中,多以操作4-7层来达到负载均衡目的。 硬件 F5、深信服、梭子鱼 等 软件 LVS、HAPROXY、Nginx、Varnish,DNS 等 商业产品 智能DNS、CDN 等 4
  • 5. mysql常用HA和LB方案常用的Mysql的HA+LB开源方案一般有以下几种 强调下mysql的架构特殊性,一般只有一个写入点,LB主要通过读写分离实现 主主复制 主从复制 Mysql-proxy Mysql集群套件 Mysql-mmm DRBD+heartbeat Lvs+keepalive Haproxy Amoeba 应用层软件自主开发(mysql_rw_php) 5
  • 6. mysql-mmm项目介绍介绍: MMM(Master-Master replication manager for Mysql)是一套灵活的脚本程序,使用perl语言开发。 功能: 用来监控和管理mysql Master-Master复制的配置 (同一时间只有一个节点是可写的) 做到故障切换的功能。 附带的工具套件可以实现多个slaves的read负载均衡(我至今还不知道附带的哪个工具有这个功能),不过我们可以通过其他的开源产品组合达到LB的功能。 你可以让mmm自动的或者使用mmm自带的工具手工的移除一组服务器中复制延迟较高的服务器的虚拟IP,它还可以备份数据,两节点之间再同步等等。 6
  • 7. mysql-mmm有点和缺点优点: 稳定和成熟的开源产品,经过了时间的考验 核心技术是mysql自己的技术,只是使用脚本程序来控制,所以在原理上比较容易理解,而且管理能够更智能化。 安装简单,配置简单,使用简单 功能强大 (HA,failover,tools套件,cluster模式可以一个monitor管理多个mmm组) 缺点: 由于架构里只有一个写入点,所以扩展性是有限的,但是对一般中型企业够用了。 解决方案:对于大应用可以采取垂直拆分到多个mmm架构的方式,使用mmm cluster来管理。 对于读写分离和读负载均衡还是要程序来开发或者使用其他工具完成。 需要大量perl库支持,安装比较耗时。 7
  • 8. mysql-mmm架构(一)主主复制MMM monitorMysql Master AMysql Master B 应用程序real ipreal ipvirtual ipvirtual ip8
  • 9. mysql-mmm架构(二)主主复制MMM monitorMysql Master AMysql Master B 应用程序Mysql Slave Cvirtual ipvirtual ipvirtual ipreal ipreal ip9
  • 10. mysql-mmm运行机制MMM_MONITOR Listen:tcp9988Mysql Master A AgentMysql Master B AgentMysql slave C AgentListen:tcp9989Listen:tcp9989 Listen:tcp9989 mmm_monitor进程用监控的数据和读取配置文件中的信息,通过tcp9988和9989与客户端通信,完成各种对客户端的设置操作,比如虚拟IP的添加和删除……mmm_monitor进程读取配置文件中的信息连接到agent的mysql端口,检查mysql的的相关状态。10
  • 11. mysql-mmm安装规划安装步骤规划 安装系统,完成lvm分区的规划 完成IP规划,完成数据库的编译和安装。 安装mysql mmm需要的perl模块 在数据库里面创建mysql mmm相关的用户和分配对应的权限 下载mysql-mmm 安装mysql-mmm 修改配置文件 启动mysql-mmm进程 测试mysql-mmm 添加slave并测试 11
  • 12. mysql-mmm安装需求(一)Server n+1 N台安装mysql的机器和1台安装mmm monitor的机器。 2*(n+1)Ips 每个主机一个固定ip、一个虚拟IP(reader role),全局一个writer role IP Monitor User 一个可以在mmm monitor机器上使用的并且拥有REPLICATION CLIENT权限的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
  • 13. 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::HiRes13
  • 14. 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
  • 15. 安装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
  • 16. 完成IP规划我们以两台master和一台slave的架构来演示 三台安装mysql的服务器 虚拟IP规划 主机名IP地址角色Mysql_server_iddb1192.168.199.128masterA1db2192.168.199.129masterB2db3192.168.199.130slaveC3mmm192.168.199.127mmm_mon-IP地址角色描述192.168.199.200writer应用服务器连接此服务器写入数据192.168.199.201reader应用服务器连接此服务器读取数据192.168.199.202reader应用服务器连接此服务器读取数据192.168.199.203reader应用服务器连接此服务器读取数据16
  • 17. 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 install17
  • 18. mysql-mmm安装后文件一览文件目录描述/usr/lib/perl5/vendor_perl/5.8.8/MMMMMM使用的perl模块/usr/lib/mysql-mmmMMM的脚本插件/usr/sbin MMM的命令保存路径/var/log/mysql-mmm MMM的日志保存路径/etc MMM配置文件保存的路径/etc/mysql-mmm MMM配置文件保存的路径,优先级最高/etc/init.d/ agentd和monitor的启动关闭脚本18
  • 19. 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
  • 20. mmm_common.conf(一)默认的主机定义部分 active_master_role writer 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 20
  • 21. mmm_common.conf(二)主机配置部分 ip 192.168.199.128 mode master peer db2 ip 192.168.199.129 mode master peer db1 ip 192.168.199.130 mode slave 21
  • 22. mmm_common.conf(三)角色配置部分 hosts db1, db2 ips 192.168.199.200 mode exclusive prefer db1 hosts db1, db2,db3 ips 192.168.199.201,192.168.199.202,192.168.199.203 mode balanced 22
  • 23. mmm_agent.conf此配置文件在启动mmm_agent进程的机器上配置,由于每个服务器上的mmm_common.conf都一样,这个服务器紧紧需要指定当前节点的host名字,需要和common.conf中主机配置中的内容想对应。 include mmm_common.conf this db1 23
  • 24. mmm_mon.conf此文件只需要在mmm_mon进程的机器上配置 include mmm_common.conf 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_user mmm_monitor monitor_password mmm_monitor debug 024
  • 25. 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 启动agent # /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-monitor –help查看使用方法,agent也可以。 使用ps aux | grep mmm 或者 netstat –tulnp | grep mmm 查看进程是否启动成功25
  • 26. mysql-mmm管理工具# mmm_control help Valid commands are: help - show this message ping - ping monitor show - show status checks [|all [|all]] - show checks status set_online - set host online set_offline - set 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] - move exclusive role to host (Only use --force if you know what you are doing!) set_ip - set role with ip to host 26
  • 27. 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
  • 28. mysql-mmm故障处理机制28MMM_MONITOR Listen:tcp9988Mysql Master A AgentMysql Master B AgentMysql slave C AgentListen:tcp9989Listen:tcp9989 Listen:tcp9989 monitor检查agent的以下几个状态 1、agent进程 2、ping 3、mysql 4、rep_threads、 5、rep_backlog ping检查默认是1s,通过ping_interval配置 mysql相关的检查默认是5s,通过check_period配置,trap_period表示一个节点检测不成功持续的时间,默认为10秒,如果超过这个时间就认为这个节点失败了。如果活动的master检测到失败,那么writer role将从原来的主机上移除。 active master: 1、mysql设置为read_only模式 2、删除活动的连接 3、删除虚拟IP slave: 1、完成原来主机上的复制工作 2、切换master到新的主机上 new active master: 1、mysql设置为可写模式 2、配置虚拟ip
  • 29. 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
  • 30. 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
  • 31. 基于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
  • 32. Mysql Master-Master Replication ManagerMMM-Tools32
  • 33. 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
  • 34. 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
  • 35. 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/Installations35
  • 36. mmm_tools.conf(一)更详细的配置参见我提供的《mmm-tools配置手册》 工具全局的配置和主机的默认配置 include mmm_agent.conf default_copy_method scp clone_dirs data 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 //需要自己创建 36
  • 37. mmm_tools.conf(二) //三种备份方法相关的配置 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 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 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 37
  • 38. mmm_clone介绍及演示(一) 用法: Usage: /usr/sbin/mmm_clone [--config ] --host --clone-mode [--copy-method ] [--dest-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
  • 39. 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 'root@192.168.199.128' (command: ssh -p 22 root@192.168.199.128 date)... root@192.168.199.128's password:39
  • 40. 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 root@192.168.199.128:/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 root@192.168.199.128:/mmm_snapshot/_mmm /usr/local/mysql// root@192.168.199.128'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 root@192.168.199.128 /usr/lib/mysql-mmm//tools/remove_snapshot root@192.168.199.128'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
  • 41. 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
  • 42. mmm_backup介绍 基于上面搭建的环境,我们来演示三种copy方法。 用法: Usage: /usr/sbin/mmm_backup [--config ] --host [--copy-method ] [--dest-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
  • 43. 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 root@192.168.199.128:/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 root@192.168.199.128:/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 root@192.168.199.128 /usr/lib/mysql-mmm//tools/remove_snapshot Logical volume "mmm_snapshot" successfully removed OK: Snapshot removed!43
  • 44. 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
  • 45. 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
  • 46. 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
  • 47. mmm_restore介绍还原也分三种拷贝模式,scp和ssh-gz差不多,rdiff属于增量备份,可以选择还原的版本号。这里我们就只演示scp和rdiff两种还原。 用法: Usage: /usr/sbin/mmm_restore [--config ] [--mode ] [--version ] [--src-dir ] [--dest-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
  • 48. 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
  • 49. 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
  • 50. mmm故障总结mysql-mmm出现故障的最大可能就是你的perl模块没有安装齐全,导致mysql-mmm不能够预期工作 定期优化检查myisam表,定期使用mk-table-checksum检查主从的一致性 mmm-tools存在以下几个注意 如果当命令执行到一半而由于配置错误退出时,快照已经生成,但是命令未执行完,导致快照没有删除,需要自己使用lvremove –f 快照名 删除快照。 注意mmm_tools.cnf要针对所在主机环境配置,不是所有都一样,特别注意server-id和自动增长列。 生产环境下,备份好以后,需要转移做测试,看备份是否可以用。还原最好手工操作,避免误伤。 最后:上线前各种故障模拟测试,故障后日志是解决问题的关键。50
  • 51. Thanks for everyone!!!51AUTHOR:FH.CN | ISADBAF&QF&Q