知识大全 通过Heartbert2 让Mysql Replication 具有

Posted 资源

篇首语:世上无难事,只要肯登攀本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 通过Heartbert2 让Mysql Replication 具有相关的知识,希望对你有一定的参考价值。

通过Heartbert2 让Mysql Replication 具有  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  前言

  Master Slave 的数据库机构解决了很多问题 特别是read/write 比较高的应用 结构如图

  

  

   写操作全部在Master 结点执行 并由Slave 数据库结点定时(默认 s)读取Master 的bin log

   将众多的用户读请求分散到更多的数据库节点 从而减轻了单点的压力

  它的缺点是

   Slave 实时性的保障 对于实时性很高的场合可能需要做一些处理

   高可用性问题 Master 就是那个致命点(SPOF:Single point of failure)

  本文主要讨论的是如何解决第 个缺点

  解决方案如下图

  

   使用两个MySQL 主库master master 数据存在共享设备上 用heartbeat 进行监控 当master 发生故障时 将资源切换到master

   故障发生后 无需对slave 进行修改 slave 自动切到master (断电切换需要手工同步slave)

   网络设置      

  

   磁盘设置

  

   mysql 安装

   到官方网址 下载最新版本 mysql 找到对应的包 在ha ha 分别安装

  # cd /usr/local/

  # tar xzvf mysql linux x _ glibc tar gz

  # mv mysql linux x _ glibc mysql

  # groupadd mysql

  # useradd g mysql mysql

  #passwd mysql

   修改/etc/my cf 数据文件路径设置在共享磁盘 修改相关参数 这 个参数在ha ha 上必须一样

  datadir=/u /data #数据文件路径

  server id = #数据库ID

  log bin=/u /data/master # binlog 路径

   下面步骤先在ha 上执行 然后在ha 执行

  先在ha 把磁盘mount

  [root@ha mysql]# mount /dev/sdb /u

  [root@ha u ]# mkdir data

  [root@ha u ]# chown R mysql mysql data/

  安装mysql

  [root@ha u ]# cd /usr/local/mysql

  # /scripts/mysql_install_db user=mysql

  # cp support files/mysql server /etc/rc d/init d/mysqld

  # chmod +x /etc/rc d/init d/mysqld

  # cconfig add mysqld

  # /etc/rc d/init d/mysqld start

   在ha 把共享磁盘umount 在ha 上mount 把上面的数据删除后执行 步骤 完成后ha 也umount

   在slave 上安装mysql 数据放在slave 本地 过程略

   heartbeat 安装

   官方网址 分别在ha ha 安装 确认下列包安装

  [root@ha ~]# rpm ivh libnet x _ rpm

  [root@ha ~]# rpm ivh heartbeat pils x _ rpm

  [root@ha ~]# rpm ivh heartbeat stonith x _ rpm

  [root@ha ~]# rpm ivh perl TimeDate el noarch rpm

  [root@ha ~]# rpm ivh heartbeat x _ rpm

  [root@ha ~]# rpm ivh heartbeat devel x _ rpm

   开始编辑配置文件(ha ha 都执行)

  [root@ha local]# cp /usr/share/doc/packages/heartbeat/ha cf /etc/ha d/

  [root@ha local]# cp /usr/share/doc/packages/heartbeat/auteys /etc/ha d/

  编辑/etc/ha d/auteys 使用的是第 种认证方式(crc) 接着把文件的权限改为

  cat /etc/ha d/auteys

  显示

  auth

   crc

  更改文件权限

  chmod /etc/ha d/auteys

  [root@ha ~]# cat /etc/ha d/ha cf

  debugfile /var/log/ha debug

  logfile /var/log/ha log

  logfacility local

  keepalive

  deadtime

  warntime

  udpport

  crm yes

  node ha ha

  bcast eth

  auto_failback off

  apiauth cibmon uid=hacluster

  respawn hacluster /usr/lib /heartbeat/cibmon –d

  配置资源 共享IP 共享磁盘 MYSQL 个服务组成 组资源

  [root@ha ~]# cat /etc/ha d/haresources

  ha Filesystem::/dev/sdb::/u ::ext mysqld

  启动的时候从左到右依次运行脚本 关闭的时候从右到左依次关闭

  这个文件原名为haresources 在 x 上使用 不过为了区别使用此名称

  将资源文件转换成cib xml x 里编译好后自带有转换脚本

  [root@ha ~]# cd /var/lib/heartbeat/crm/

  [root@ha crm]# rm rf cib xml*

  [root@ha crm]#

  /usr/lib /heartbeat/haresources cib py stout c /etc/ha d/ha cf /etc/ha d/haresources

  [root@ha crm]# cat cib xml|grep mysql

  <primitive class= lsb id= mysqld_ provider= heartbeat type= mysqld >

  <op id= mysqld_ _mon interval= s name= monitor timeout= s />

  即每 秒检测资源运行情况 如果发现资源不在 则尝试启动资源 如果 s 后还未启动

  成功 则资源切换向另节点 可根据业务进行修改

   启动heartbeat 在ha 和ha 都启动

  [root@ha ~]# /etc/init d/heartbeat start

  查看资源情况

  ============

  Last updated: Tue Feb : :

  Current DC: ha ( c de bcb bb b eef)

   Nodes configured

   Resources configured

  ============

  Node: ha ( c de bcb bb b eef): online

  Node: ha (ab d f be a c fc f c ): online

  Resource Group: group_

  IPaddr_ _ _ _ (ocf::heartbeat:IPaddr): Started ha

  Filesystem_ (ocf::heartbeat:Filesystem): Started ha

  mysqld_ (lsb:mysqld): Started ha

   将heartbeat 设置成开机自动重启

  [root@ha ~]# cconfig add heartbeat

  [root@ha ~]# cconfig level heartbeat on

  [root@ha ~]# cconfig list heartbeat

  heartbeat :off :off :on :on :on :on :off

   mysql slave 配置

   在master 赋予slave 权限(任一节点操作)

  [root@ha ~]# /usr/local/mysql/bin/mysql u root p

  Enter password:

  Wele to the MySQL monitor Commands end with ; or \\g

  Your MySQL connection id is

  Server version: log MySQL Community Server (GPL)

  Type help; or \\h for help Type \\c to clear the buffer

  mysql> GRANT RELOAD REPLICATION SLAVE ON * * TO slave @

  IDENTIFIED BY nslave ;

  mysql> show master status\\G;

  *************************** row ***************************

  File: master

  Position:

  Binlog_Do_DB:

  Binlog_Ignore_DB:

   row in set ( sec)

   slave 同步

  因为没有数据 所以省略数据同步的步骤 在slalve 执行下列命令

  mysql> CHANGE MASTER TO MASTER_HOST=

  MASTER_PORT =

  MASTER_USER= slave

  MASTER_PASSWORD= nslave

  MASTER_LOG_FILE= master

  MASTER_LOG_POS = ;

  Query OK rows affected ( sec)

  mysql> start slave;

  Query OK rows affected ( sec)

  mysql> show slave status\\G;

  *************************** row ***************************

  Slave_IO_State:Waiting for master to send event

  Master_Host:

  Master_User: slave

  Master_Port:

  Connect_Retry:

  Master_Log_File: master

  Read_Master_Log_Pos:

  Relay_Log_File: mysql relay bin

  Relay_Log_Pos:

  Relay_Master_Log_File: master

  Slave_IO_Running: Yes

  Slave_SQL_Running: Yes

   row in set ( sec)

   失败测试

   网络切换测试

  将ha 的网线拔掉 在ha 看资源的切换情况

  Node: ha ( c de bcb bb b eef): online

  Node: ha (ab d f be a c fc f c ): OFFLINE

  Resource Group: group_

  IPaddr_ _ _ _ (ocf::heartbeat:IPaddr): Started ha

  Filesystem_ (ocf::heartbeat:Filesystem): Started ha

  mysqld_ (lsb:mysqld): Started ha

  没有问题 把ha 网线插上 资源又回切到ha

  Node: ha ( c de bcb bb b eef): online

  Node: ha (ab d f be a c fc f c ): online

  Resource Group: group_

  IPaddr_ _ _ _ (ocf::heartbeat:IPaddr): Started ha

  Filesystem_ (ocf::heartbeat:Filesystem): Started ha

  mysqld_ (lsb:mysqld): Started ha

   宕机切换

  将ha 强制关机在开机 这和 的情况差不多 能正常切换

   服务切换

  将ha 的mysql 服务强制中断 修改/etc/my cf

  datadir=/u /data #实际这个路径不存在

  [root@ha ~]# ps ef|grep mysql

  root : ? : : /bin/sh /bin/mysqld_safe

   datadir=/u /data pid file=/u /data/ha pid

  mysql : ? : : /usr/local/mysql/bin/mysqld

   basedir=/usr/local/mysql datadir=/u /data user=mysql log error=/u /data/ha err

   pid file=/u /data/ha pid socket=/tmp/mysql sock port=

  root : ? : : /bin/sh /etc/init d/mysqld start

  root : pts/ : : grep mysql

  [root@ha ~]# kill

  [root@ha ~]# ps ef|grep mysql

  root : pts/ : : grep mysql

  在ha 上查看资源情况 已经切换过来

  Node: ha ( c de bcb bb b eef): online

  Node: ha (ab d f be a c fc f c ): online

  Resource Group: group_

  IPaddr_ _ _ _ (ocf::heartbeat:IPaddr): Started ha

  Filesystem_ (ocf::heartbeat:Filesystem): Started ha

  mysqld_ (lsb:mysqld): Started ha

  Failed actions:

  mysqld_ _monitor_ (node=ha call= rc= ): plete

  mysqld_ _start_ (node=ha call= rc= ): plete

   slave 同步测试

  将ha 的heartbeat 关闭

  [root@ha data]# /etc/init d/heartbeat stop

  在ha 看资源情况

  Node: ha ( c de bcb bb b eef): online

  Node: ha (ab d f be a c fc f c ): OFFLINE

  Resource Group: group_

  IPaddr_ _ _ _ (ocf::heartbeat:IPaddr): Started ha

  Filesystem_ (ocf::heartbeat:Filesystem): Started ha

  mysqld_ (lsb:mysqld): Started ha

  资源全部切换到ha 我们执行一些操作 看是否同步

  [root@ha ~]# /usr/local/mysql/bin/mysql u root p D test

  Enter password:

  Wele to the MySQL monitor Commands end with ; or \\g

  Your MySQL connection id is

  Server version: log MySQL Community Server (GPL)

  Type help; or \\h for help Type \\c to clear the buffer

  root@test >create table t(t int);

  root@test >insert into t values( );

  root@test >select * from t;

  + +

  | t |

  + +

  | |

  + +

   row in set ( sec)

  在slave 查看是否同步

  [root@mysql ~]# /root/cron/lg sh

  Wele to the MySQL monitor Commands end with ; or \\g

  Your MySQL connection id is

  Server version: log MySQL Community Server (GPL)

  Type help; or \\h for help Type \\c to clear the buffer

  mysql> use test

  Database changed

  mysql> select * from t;

  + +

  | t |

  + +

  | |

  + +

   row in set ( sec)

  在将资源切回到ha 在进行操作 看slave 的情况

  [root@ha ~]# /etc/init d/heartbeat start

  Node: ha ( c de bcb bb b eef): online

  Node: ha (ab d f be a c fc f c ): online

  Resource Group: group_

  IPaddr_ _ _ _ (ocf::heartbeat:IPaddr): Started ha

  Filesystem_ (ocf::heartbeat:Filesystem): Started ha

  mysqld_ (lsb:mysqld): Started ha

  资源已经切回到ha 对其进行操作

  [root@ha ~]# /usr/local/mysql/bin/mysql u root p D test

  Enter password:

  Wele to the MySQL monitor Commands end with ; or \\g

  Your MySQL connection id is

  Server version: log MySQL Community Server (GPL)

  Type help; or \\h for help Type \\c to clear the buffer

  mysql> insert into t values( );

  mysql> insert into t values( );

  mysql> select * from t;

  + +

  | t |

  + +

  | |

  | |

  | |

  + +

   rows in set ( sec)

  在slave 查看是否同步

  mysql> select * from t;

  + +

  | t |

  + +

  | |

  | |

  | |

  + +

   rows in set ( sec)

  mysql> show slave status\\G;

  *************************** row ***************************

  Slave_IO_State:Waiting for master to send event

  Master_Host:

  Master_User: slave

  Master_Port:

  Connect_Retry:

  Master_Log_File: master

  Read_Master_Log_Pos:

  Relay_Log_File: mysql relay bin

  Relay_Log_Pos:

  Relay_Master_Log_File: master

  Slave_IO_Running: Yes

  Slave_SQL_Running: Yes

  Master 切换后 slave 无需任何人工介入 自动同步

   模拟写入 切换测试

  写个简单的循环

  [root@mysql cron]# cat test sh

  for ((num= ;num< ;num=num+ ))

  do

  echo

  /usr/local/mysql/bin/mysql u sg psg h D test e

  insert into t values($num);

  

  if (( $? )); then

  echo $num:no

  else

  echo $num:ok

  fi

  done

  在写入过程中 手工切换 手工reboot 等操作 和 的测试结果一样 在写入过程中强制ha 断电 需要手工处理slave 同步 将ha 断电后 资源切到ha 后 在slave 会报错

  mysql> show slave status\\G;

  *************************** row ***************************

  Slave_IO_State:

  Master_Host:

  Master_User: slave

  Master_Port:

  Connect_Retry:

  Master_Log_File: master

  Read_Master_Log_Pos:

  Relay_Log_File: mysql relay bin

  Relay_Log_Pos:

  Relay_Master_Log_File: master

  Slave_IO_Running: No

  Slave_SQL_Running: Yes

  查看slave 报错日志

   : : [Note] Slave I/O thread: Failed reading log event reconnecting to retry log

   master at postion

   : : [ERROR] Error reading packet from server: Client requested master to start

  replication from impossible position ( server_errno= )

   : : [ERROR] Got fatal error : Client requested master to start replication from

  impossible position from master when reading data from binary log

   : : [Note] Slave I/O thread exiting read up to log master position

  在master 中找不到position

  查看master 的binlog

  [root@ha data]# /usr/local/mysql/bin/mysqlbinlog master |tail

  /*!*/;

  # at

  # : : server id end_log_pos Query thread_id=

  exec_time= error_code=

  SET TIMESTAMP= /*!*/;

  insert into t values( )

  /*!*/;

  DELIMITER ;

  # End of log file

  ROLLBACK /* added by mysqlbinlog */;

  /*! SET PLETION_TYPE=@OLD_PLETION_TYPE*/;

  在master 上 master 最后值是 而在slave 却是 Slave 的Log_Pos比master 大 应该是在断电的时候 binlog 有部分没有及时写入磁盘 但从库已经读入 我们需要在slave 执行change maseter 操作 MASTER_LOG_FILE 在原来的基础上加 Log_Pos 为

  mysql> stop slave;

  Query OK rows affected ( sec)

  mysql> CHANGE MASTER TO MASTER_HOST= MASTER_PORT =

   MASTER_USER

  = slave MASTER_PASSWORD= nslave MASTER_LOG_FILE= master MAST

  ER_LOG_POS = ;

  Query OK rows affected ( sec)

  mysql> start slave;

  Query OK rows affected ( sec)

  mysql> show slave status\\G;

  *************************** row ***************************

  Slave_IO_State:Waiting for master to send event

  Master_Host:

  Master_User: slave

  Master_Port:

  Connect_Retry:

  Master_Log_File: master

  Read_Master_Log_Pos:

  Relay_Log_File: mysql relay bin

  Relay_Log_Pos:

  Relay_Master_Log_File: master

  Slave_IO_Running: Yes

  Slave_SQL_Running: Yes

  在这次断电的切换过程中 将会有 减去 条binlog 操作在slave 存在 而在masert 没有 在后面的复制中可能会产生错误 不过这些错误影响不大 如果对数据的同步要求很严格 可以在主库添加参数sync_binlog= 这样最多将只会有 条数据错误 不过这样将影响mysql 写性能

   heartbeat crm 常用命令

  查看资源状态

  #crm_mon –i

  查看节点资源

  #crm_resource L

  查看资源在那个节点上运行

  # crm_resource W r mysqld_

  启动/停止资源

  #crm_resource r mysqld_ p target_role v started

  #crm_resource r mysqld _ p target_role v stopped

  将资源组从当前节点转移到另个节点

  #crm_resource M r group_

  将资源组转移到指定节点

  #crm_resource M r group_ H ha

  允许资源组回到正常的节点

  #crm_resource U r group_

  将资源从CRM 中删除

  #crm_resource D r mysqld_ t primitive

  将资源组从CRM 中删除

  #crm_resource D –r group_ t group

  将资源从CRM 中禁用

  #crm_resource p is_managed r mysqld_ t primitive v off

  将资源从新从CRM 中启用

  #crm_resource p is_managed r mysqld _ t primitive v on

  重启资源

  #crm_resource C H ha r mysqld_

  检查所有节点上未在CRM 中的资源

  #crm_resource P

  检查指定节点上未在CRM 中的资源

  #crm_resource P H ha

  检查所有节点上未在CRM 中的资源

  #crm_resource P

  检查指定节点上未在CRM 中的资源

  #crm_resource P H ha

  八 讨论

   对写要求不是很高的应用 我觉得可以考虑用NFS 来代替共享存储设备 结构图如下

  

  

  将数据文件放在NFS 上 这样几台廉价的PC 机就能实现 相对成本降低

   参数sync_binlog= 对写的性能有多少影响 个人始终觉得会带来很大的写性能问题 在数据完整和性能之间做个平衡 有得有失吧

cha138/Article/program/MySQL/201311/29350

相关参考

知识大全 MySql通过二进制日志文件恢复数据

MySql通过二进制日志文件恢复数据  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Mysql配

知识大全 通过 Perl 存取 mSQL 和 MySQL 的内容

通过Perl存取mSQL和MySQL的内容  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  )知识

知识大全 Linux下通过C++语言代码来操作MySQL数据库

Linux下通过C++语言代码来操作MySQL数据库  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 PB通过ODBC访问MySQL数据库时报错的处理方法

PB通过ODBC访问MySQL数据库时报错的处理方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 配置最新的PHP加MYSQL服务器完全版

配置最新的PHP加MYSQL服务器完全版  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  通过一个

知识大全 让MYSQL彻底支持中文

让MYSQL彻底支持中文  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  提要系统自带的mysql

知识大全 如何才能让MySQL与OpenOffice共舞

如何才能让MySQL与OpenOffice共舞  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一

知识大全 分区和负载均衡让MySQL更大更好

分区和负载均衡让MySQL更大更好  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!lishixinz

知识大全 通过性能剖析进行优化

高性能MySQL:通过性能剖析进行优化  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  通过性能剖

知识大全 计划备份mysql数据库

  :mysql是我们使用最多的数据库如果在日常中正确的对mysql数据进行备份下面我们就来做这事通过脚本来实现  ##########################################