mysql 双主热备

    一、主从复制的原理

                                     (mysql官网复制原理图 )

       MySQL之间数据复制的基础是二进制日志文件(binary log file)。一台MySQL数据库一旦启用二进制日志后,其作为master,它的数据库中所有操作都会以“事件”的方式记录在二进制日志中,其他数据库作为slave通过一个I/O线程与主服务器保持通信,并监控master的二进制日志文件的变化,如果发现master二进制日志文件发生变化,则会把变化复制到自己的中继日志中,然后slave的一个SQL线程会把相关的“事件”执行到自己的数据库中,以此实现从数据库和主数据库的一致性,也就实现了主从复制。

二、环境准备

      安装mysql服务

      主节点master:           192.168.81.134:3310      (root/root)

      主节点master_back:  192.168.81.134:3311     (root/root)

三、双主热备架构

          master和master_back互为主从关系

          1、my.cnf双主配置
          (1) master节点配置
#主从复制配置
server-id =1
log-bin = mysql-bin
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = performance-schema
binlog-do-db = canteen_db
#binlog_format=mixed
#主-主热备主库配置
#log-slave-updates
#sync_binlog = 1
auto-increment-offset = 1
auto-increment-increment = 2
slave-skip-errors = all
replicate-do-db = canteen_db
replicate-ignore-db = mysql,information-schema,performance-schema

           (2)master_back节点配置

#主从复制从库配置
#binlog_format=mixed
server-id = 6
log-bin = mysql-bin
replicate-do-db = canteen_db
replicate-ignore-db = mysql
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
#双主热备从库配置
#sync_binlog = 1
auto-increment-increment = 2
auto-increment-offset = 1
slave-skip-errors = all
binlog-do-db = canteen_db
binlog-ignore-db = mysql,information_schema,performance_schema
          2、主从节点授权
        (1)master和master_back分别授权
grant replication  slave,reload,super  on *.*   to   'root'@'192.168.81.134'   identified  by  'root';

flush privileges;

show  master  status;
          (2) 设置master复制信息

change  master to master_host='192.168.81.134', master_user='root',master_password='root',master_port=3311,
         master_log_file='mysql-bin.000003',master_log_pos=619;
		 
flush privileges;

start slave;

show  slave  STATUS;

       (3)设置master_back复制信息
change  master to master_host='192.168.81.134', master_user='root',master_password='root',master_port=3311,
         master_log_file='mysql-bin.000003',master_log_pos=619;
		 
flush privileges;

start slave;

show  slave  STATUS;

     3、binlog_format类型
   (1)Row

      Row模式下日志中会记录成每一行数据被修改的形式,日志内容会非常清楚地记录下每一行数据修改的细节。但是Row 格式有一个很大的问题,那就是日志量太大了,特别是批量 update、整表 delete、alter 表等操作,由于要记录每一行数据的变化,此时会产生大量的日志,大量的日志也会带来 IO 性能问题。

    (2)Statement

       Statement模式下只记录执行的 SQL,每一条会修改数据的 SQL 都会记录到 master 的 bin-log 中。slave 在复制的时候 SQL 进程会解析成和原来 master 端执行过的相同的 SQL 再次执行。   

       优点:首先就是解决了 row 模式的缺点,不需要记录每一行数据的变化,减少了 bin-log 日志量,节省 I/O 以及存储资源,提高性能。因为他只需要记录在 master 上所执行的语句的细节,以及执行语句时候的上下文的信息。
        缺点:在 statement 模式下,由于他是记录的执行语句,在修改改数据的时候使用了某些特定的函数或者功能的时候会出现,比如:sleep() 函数在有些版本中就不能被正确复制,在存储过程中使用了 last_insert_id() 函数,可能会使 slave 和 master 上得到不一致的 id 等等。由于 row 是基于每一行来记录的变化,所以不会出现类似的问题。

      (3)Mixed

         Mixed 模式下系统会自动判断该用 Statement 还是 Row,一般的语句修改使用 Statement 格式保存 binlog,对于一些 Statement 无法准确完成主从复制的操作,则采用 Row保存binlog。Mixed 模式中,MySQL 会根据执行的每一条具体的 SQL 语句来区别对待记录的日志格式,也就是在 Statement 和 Row 之间选择一种。

 四、故障转移

       双主热备的目的是为了实现故障转移,一旦master节点挂了,master_back还能继续充当主节点工作,保证集群的高可用。在msyql集群中接入keepalived,实现主节点自动切换。

      1、数据库安装

        准备92.168.81.81.134、192.168.81.135两个主机,分别安装好数据库服务。依据上述步骤配置双主复制。

      2、安装 keepalived

      在192.168.81.81.134、192.168.81.135主机分别安装keepalived服务,以192.168.81.81.134为主机,192.168.81.135为备机:

yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel
yum install -y keepalived
       3、keepalived配置 

        切换至  /etc/keepalived/目录下,编辑keepalived.conf文件。

      (1)主机配置
global_defs {
  default_interface eth0
  router_id LVS_DEVEL
}

vrrp_instance VI_1 {
  #网卡配置要与所在物理机一直有eth0 或者ens33
  interface eth0
  #主机MASTER 从机BACKUP
  state MASTER
  #keepalive集群id
  virtual_router_id 51
  advert_int 1
  #优先级
  priority 150
  #不抢占
  nopreempt
  #本机实际ip
  mcast_src_ip 192.168.81.134

  #虚拟化ip,可以有多个
  virtual_ipaddress {
    192.168.81.205
  }

  #集群节点通信授权
  authentication {
    auth_type PASS
    auth_pass 11111
  }


  notify "/home/master/shell/notify.sh"
}

       其中notify.sh用来检测134机器上的mysql,一旦134的mysql挂了,134的keepalived调用次脚本停止服务,这时外部访问自动切换到135的keepalived上,这样就可以实现故障转移。

      (2)唤起脚本

        #notify.sh

#!/bin/bash
cname=master1-mysql
upStatus=Up
echo "keepalived开始执行$cname健康检查"
while(true)
do
  conStatus=`docker ps -a| grep $cname | awk '{print $7}'`
  if [[ "$upStatus" == "$conStatus" ]]; then
    echo "$cname容器状态$conStatus健康运行"
    sleep 5
  else
    echo "$cname容器状态$conStatus异常运行,停止本机keepalived运行切换至BACKUP"
    systemctl stop keepalived.service
    if [ $? -eq 0 ]; then
        echo "关闭keepalived成功"
    else
        cho "关闭keepalived失败"
    fi
    break  
  fi
done
 (3)备机配置

     

global_defs {
  default_interface eth0
  router_id LVS_DEVEL
}

vrrp_instance VI_1 {
  #网卡配置要与所在物理机一直有eth0 或者ens33
  interface eth0
  #主机MASTER 从机BACKUP
  state BACKUP
  #keepalive集群id
  virtual_router_id 51
  advert_int 1
  #优先级
  priority 150
  #不抢占
  nopreempt
  #本机实际ip
  mcast_src_ip 192.168.81.135

  #虚拟化ip,可以有多个
  virtual_ipaddress {
    192.168.81.205
  }

  #集群节点通信授权
  authentication {
    auth_type PASS
    auth_pass 11111
  }

}
  (4)keepalived启停操作
#启动keepalived 
systemctl start keepalived

#加入开机启动keepalive
systemctl enable keepalived   

#关闭keepalived
systemctl stop keepalived 

#查看keepalived状态
systemctl status keepalived 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值