`
wangking717
  • 浏览: 257611 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

高可用的Mysql双机热备(Mysql_HA)

阅读更多
 
mysql双主热备,也称主主互备,目的是mysql数据库高可用,只支持双机,原因是mysql的复制是一主多从,但一个从服务器只能有一个主服务器。
  
下面要讲的,除了“主主互备”以外,还加了keepalived。进行容灾的控制。
 
通常说的「双机热备」是指两台机器都在运行,但并不是两台机器都同时在提供服务。当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短。

使用KeepAlived实现高可用的MYSQL_HA集群环境中,MySQL为(Master/Master)主/主同步复制关系,保证MYSQL服务器数据的一致性,用KeepAlived提供虚拟IP,通过KeepAlived来进行故障监控,实现Mysql故障时自动切换。

布署环境拓朴如下:

Mysql VIP :192.168.187.61
Master1:192.168.187.129
Master2:192.168.187.132

OS 环境:Cent OS 6.5

Mysql版本:Mysql5.5.31

 



 

一:设置配置文件:

Mysql是通过日志进行同步复制的,先建立日志文件

 

touch /var/log/mysql/mysql-bin.log   //建立日志文件,请设置权限,如777
chown mysql.mysql /var/log/mysql/mysql-bin.log  //将日志文件的所属用户和用户组更改成mysql

 在两台要进行备份的mysql服务器上的my.cnf文件进行配置如下(将下面的配置分别加入相关服务器的my.cnf,放在配置文件的[mysqld_safe]上面):

Master1(192.168.187.129)

Master(192.168.187.132)

#主标服务标识号,必需唯一

server-id = 1

#因为MYSQL是基于二进制的日志来做同步的,每个日志文件大小为 1G

log-bin=/var/log/mysql/mysql-bin.log

#要同步的库名

binlog-do-db = test

#不记录日志的库,即不需要同步的库

binlog-ignore-db=mysql

#用从属服务器上的日志功能

log-slave-updates

#经过1日志写操作就把日志文件写入硬盘一次(对日志信息进行一次同步)。n=1是最安全的做法,但效率最低。默认设置是n=0。

sync_binlog=1

# auto_increment,控制自增列AUTO_INCREMENT的行为

用于MASTER-MASTER之间的复制,防止出现重复值,

auto_increment_increment=n有多少台服务器,n就设置为多少,

auto_increment_offset=1设置步长,这里设置为1,这样Master的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID

auto_increment_offset=1

auto_increment_increment=2

#进行镜像处理的数据库

replicate-do-db = test

#不进行镜像处理的数据库

replicate-ignore-db= mysql

#主标服务标识号,必需唯一

server-id = 2

#因为MYSQL是基于二进制的日志来做同步的,每个日志文件大小为 1G

log-bin=/var/log/mysql/mysql-bin.log

#要同步的库名

binlog-do-db = test

#不记录日志的库,即不需要同步的库

binlog-ignore-db=mysql

#用从属服务器上的日志功能

log-slave-updates

#经过1日志写操作就把日志文件写入硬盘一次(对日志信息进行一次同步)。n=1是最安全的做法,但效率最低。默认设置是n=0。

sync_binlog=1

# auto_increment,控制自增列AUTO_INCREMENT的行为

用于MASTER-MASTER之间的复制,防止出现重复值,

auto_increment_increment=n有多少台服务器,n就设置为多少,

auto_increment_offset=2设置步长,这里设置为2,这样Master的auto_increment字段产生的数值是:2, 4, 6, 8, …等奇数ID

auto_increment_offset=2

auto_increment_increment=2

#进行镜像处理的数据库

replicate-do-db = test

#不进行镜像处理的数据库

replicate-ignore-db= mysql

 

 

二:查看配置情况

按上面的配置将两台服务器配置好以后,重新启动mysql服务,用showmaster status查看一下两台服务器的Master配置情况,可以看出已经配置成功,如下:

NO1:Master1(192.168.187.129)的情况

 

# mysql –u root –p 1234

mysql> show master status;

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000001|      107 | test         | mysql            |

+------------------+----------+--------------+------------------+

 

 

NO2:Master2(192.168.187.132)的情况

 

# mysql –u root –p 1234

mysql> show master status;

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000002|      125 | test         | mysql            |

+------------------+----------+--------------+------------------+

 

 

三:建立权限帐户,实现同步

 

Master1(192.168.187.129)

Master2(192.168.187.132)

mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';

mysql> FLUSH PRIVILEGES;

#在MYSQL中设置对端Master2的复制账号

 

mysql> change master to master_host='192.168.187.132', master_user='slave', master_password='123456', master_log_file='mysql-bin.000002', master_log_pos=125;

mysql> start slave;

#启动从服务器复制功能

 

mysql> show slave status;

#检测slave状态,如果Slave_IO_Running: Yes    Slave_SQL_Running: Yes    Seconds_Behind_Master: 0就证明已经同步了

mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';

mysql> FLUSH PRIVILEGES;

#在MYSQL中设置对端Master1的复制账号

 

mysql> change master to master_host='192.168.187.129', master_user='slave', master_password='123456', master_log_file='mysql-bin.000001', master_log_pos=107;

mysql> start slave;

#启动从服务器复制功能

 

mysql> show slave status;

#检测slave状态,如果Slave_IO_Running: Yes    Slave_SQL_Running: Yes    Seconds_Behind_Master: 0就证明已经同步了

 

 

四:测试同步效果

在Master1上创建表:

mysql -uroot -p1234;

use test;

CREATE TABLE `card` (
   `card_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
   `card_number` varchar(100) DEFAULT NULL COMMENT '卡号',
   PRIMARY KEY (`card_id`)
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC;

insert  into `card`(`card_number`) values ('haha1');
insert  into `card`(`card_number`) values ('haha2');

 执行完毕后,master2下如果对应的card表已经生成,并且也有相应的数据,证明同步成功,相应在master2上执行任何操作,master1也会相应修改。

 

五:配置keepalived实现热备

 

A) 安装keepalived

yum -y install keepalived

B) 修改配置

[root@masterr ~] vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     test@qq.com
   }
   notification_email_from admin@test.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id MYSQL_HA  #标识,双主相同
}

vrrp_instance VI_1 {
    state BACKUP     #两台都设置BACKUP
    interface eth0
    virtual_router_id 51   #主备相同
    priority 100    #优先级,backup设置90
    advert_int 1    #组播信息发送间隔,两个节点设置必须一样
    nopreempt       #不主动抢占资源,只在master这台优先级高的设置,backup不设置
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.187.61  #指定VIP,两个节点设置必须一样
    }
}

virtual_server 192.168.187.61 3306 {
    delay_loop 2     #每个2秒检查一次real_server状态
    #lb_algo rr      #LVS算法,用不到,我们就关闭了
    #lb_kind NAT     #LVS模式,如果不关闭,备用服务器不能通过VIP连接本机MySQL
    persistence_timeout 50 #会话保持时间
    protocol TCP     #使用的协议是TCP还是UDP

    real_server 192.168.187.132 3306 {  //这里填写各自的真实内网IP地址
        weight 3         #权重
        notify_down /usr/local/keepalived/mysql.sh    #当mysq服down时,执行此脚本,杀死keepalived实现切换
        TCP_CHECK {
            connect_timeout 3    #连接超时
            nb_get_retry 3       #重试次数
            delay_before_retry 3 #重试间隔时间
        }
    }
}

 

C) 配置keepalived脚本

[root@masterr ~] vim /usr/local/keepalived/mysql.sh
#!/bin/bash
pkill keepalived
[root@masterr ~]# chmod +x /usr/local/keepalived/mysql.sh
[root@masterr ~]# /etc/init.d/keepalived start

 

六:测试高可用性

1、通过Mysql客户端通过VIP连接,看是否连接成功。

2、停止master这台mysql服务,是否能正常切换过去,可通过ip addr命令来查看VIP在哪台服务器上。

3、可通过查看/var/log/messges日志,看出主备切换过程

4、master服务器故障恢复后,是否主动抢占资源,成为活动服务器。

 

  • 大小: 26.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics