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

标签: mysql mysql ha | 发表时间:2013-05-17 17:36 | 作者:xuejiazhi
出处:http://blog.csdn.net

1.KeepAlived+Mysql

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

布署环境拓朴如下:

 Mysql VIP :192.168.187.61

Master1:192.168.187.129

Master:192.168.187.132

OS 环境:Cent OS 5.9

Mysql版本:Mysql5.5.31


2.安装mysql

2.1.Mysql升级安装

因为CentOS的Mysql还是停留在5.0.19,而我们做Mysql之间的同步复制,Mysql版本至少要在Mysql5.1以上,所以要对其进行升级安装。

>>使用 yum安装, yum 可以帮你解决依赖于冲突

# rpm –Uvh  http://repo.webtatic.com/yum/centos/5/latest.rpm   //安装最新的mysql的yum源

# yum –y install Mysql55 MySQL55-* --enablerepo=webtatic   //安装Mysql,--enablerepo参数是用来指定源

 

>>开启mysql服务

# service mysqld start  //开启mysql服务

 

>>刚安装密码为空,设置root密码

# mysqladmin –u root password ‘1234’  //设置root密码     

>>更改mysql配置文件

# cp /usr/share/mysql/my-medium.cnf  /etc/my.cnf  //在etc目录下建立mysql的配置文件my.cnf

# service mysqld restart//重启mysql服务

 

>>登陆Mysql

# mysql –u root –p 1234    //设置root密码

Mysql>     //登陆进了mysql

2.2.Mysql主/主配置

2.2.1 设置配置文件

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

#touch /var/log/mysql/mysql-bin.log   //建立日志文件

#chown mysql.mysql /var/log/mysql/mysql-bin.log  //将日志文件的所属用户和用户组更改成mysql

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

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

2.2.2查看配置情况

按上面的配置将两台服务器配置好以后,重新启动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:Master1(192.168.187.132)的情况

# mysql –u root –p 1234

mysql> show master status;

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

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

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

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

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

2.2.3建立权限帐户,实现同步

a.创建账户并授予REPLICATION SLAVE权限

mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '1234';   //建立一个用户名为slave的帐户

mysql> FLUSH PRIVILEGES;   //刷新相关权限表

因为进行双向复制,两边服务器都需要建立一个用于复制的的用户。两边可以复用上面的语句,用户名和密码可以自行进行修改。

b.同步设置

Master1(192.168.187.129)上操作如下:

mysql> stop slave;  //停止slave

mysql>change master to master_host='192.168.187.132', master_user='slave', master_password='1234', master_log_file='mysql-bin.000001', master_log_pos=107;  //修改当前的Master的值,因为是互为备份,所以Master1(192.168.187.129)的master为Master2(192.168.187.132),Master2设置复制的用户名为slave,密码是1234,上面通过 show master status我们得知,log_file是mysql-bin.000001,postion是107。

mysql>start slave;    //开始salve,开始同步

mysql>show slave status;   //检测slave状态,如果Slave_IO_Running: Yes    Slave_SQL_Running: Yes    Seconds_Behind_Master: 0就OK了

 

Master2(192.168.187.132)上面操作如下:

mysql> stop slave;  //停止slave

mysql>change master to master_host='192.168.187.129', master_user='slave', master_password='1234', master_log_file='mysql-bin.000001', master_log_pos=107;  //修改当前的Master的值,因为是互为备份,所以Master2(192.168.187.132)的master为Master2(192.168.187.129),Master1设置复制的用户名为slave,密码是1234,上面通过 show master status我们得知,log_file是mysql-bin.000001,postion是107。

mysql>start slave;    //开始salve,开始同步

mysql>show slave status;  //检测slave状态,如果Slave_IO_Running: Yes    Slave_SQL_Running: Yes    Seconds_Behind_Master: 0就OK了

c.测试情况:

Step1:建一个测试表Test,两个字段,id与name字段,id字段为自增,两个服务器上面都是同样的结构,如下图:

Step2:我在Master1(192.168.187.129)表上执行一个insert语句,并进行查询,如下图:

Step3:在Master2(192.168.187.132)中查询,可以发现数据已经同步过来了,如下图:

 

3KeepAlived安装配置

3.1 KeepAlived的安装方法

 可参照“高可用的负载均衡配置方法(Haproxy+KeepAlived)” 5.1 中KeepAlived的安装方法

3.2将keepalived加入服务

可参照“高可用的负载均衡配置方法(Haproxy+KeepAlived)” 5.2  中将keepalived加入服务

3.3 KeepAlived的配置

安装好以后,对其进行配置如下:

有两台机器(MASTER1)所在的 192.168.187.129与(Master2) 192.168.187.132,用(VIP)192.168.187.61做虚拟IP。

在两台服各器中的/etc/keepalived文件夹中的keepalived.conf下进行配置:

Master1的设置 

192.168.187.129

global_defs {

   router_id Mysql_HA  #当前节点名

}

vrrp_instance VI_1{

    state BACKUP       #两台配置节点均为BACKUP

interface eth0       #绑定虚拟IP的网络接口

virtual_router_id 51 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组

priority 100         #节点的优先级,另一台优先级改低一点

acvert_int 1         #组播信息发送间隔,两个节点设置必须一样

nopreempt      #不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置

authentication{      #设置验证信息,两个节点必须一致

    auth_type  PASS

    auth_pass  1111

}

Virtual_ipaddress{   #指定虚拟IP, 两个节点设置必须一样

192.168.187.61

     }

   }

virtual_server 192.168.187.61 3306 {   #linux虚拟服务器(LVS)配置

delay_loop 2     #每个2秒检查一次real_server状态

lb_algo wrr      #LVS调度算法, rr|wrr|lc|wlc|lblc|sh|dh

lb_kind DR      #LVS集群模式 , NAT|DR|TUN

persistence_timeout 60    #会话保持时间

protocol TCP    #使用的协议是TCP还是UDP

real_server 192.168.187.129 3306 {

weight 3   #权重

notify_down  /usr/local/bin/mysql.sh    #检测到服务down后执行的脚本

TCP_CHECK {

connect_timeout 10   #连接超时时间

nb_get_retry 3      #重连次数

delay_before_retry 3 #重连间隔时间

connect_port 3306    #健康检查端口

}

}

 

Master2的设置 

192.168.187.132

global_defs {

   router_id Mysql_HA  #当前节点名

}

vrrp_instance VI_1{

    state BACKUP       #两台配置节点均为BACKUP

interface eth0       #绑定虚拟IP的网络接口

virtual_router_id 51 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组

priority 90         #节点的优先级,另一台优先级改低一点

acvert_int 1         #组播信息发送间隔,两个节点设置必须一样

authentication{      #设置验证信息,两个节点必须一致

    auth_type  PASS

    auth_pass  1111

}

Virtual_ipaddress{   #指定虚拟IP, 两个节点设置必须一样

192.168.187.61

     }

   }

virtual_server 192.168.187.61 3306 {   #linux虚拟服务器(LVS)配置

delay_loop 2     #每个2秒检查一次real_server状态

lb_algo wrr      #LVS调度算法, rr|wrr|lc|wlc|lblc|sh|dh

lb_kind DR      #LVS集群模式 , NAT|DR|TUN

persistence_timeout 60    #会话保持时间

protocol TCP    #使用的协议是TCP还是UDP

real_server 192.168.187.132 3306 {

weight 3   #权重

notify_down   /usr/local/bin/mysql.sh    #检测到服务down后执行的脚本

TCP_CHECK {

connect_timeout 10   #连接超时时间

nb_get_retry 3      #重连次数

delay_before_retry 3 #重连间隔时间

connect_port 3306    #健康检查端口

}

}

脚本/usr/local/bin/mysql.sh

#vi  /usr/local/bin/mysql.sh

#!/bin/sh

killall keepalived

 

3.4 KeepAlived测试

可参照“高可用的负载均衡配置方法(Haproxy+KeepAlived)” 5.4 中KeepAlived测试

4.Mysql测试

Step1:打开三个服务器进行查看,刚开始三个都为空


Step2:在VIP(192.168.187.61)服务器中插入一条数据


Step3:再查看三个服务器中的数据都已经同步过来了


当关掉做为主机的192.168.187.129做为宕机处理,同样也不会出问题,虚拟IP由192.168.187.129漂移

到192.168.187.132上面。

 

5.安装时出现的问题及处理方法

NO1: Slave将无法链接到 Master情况

错误:Slave将无法链接到 Master  

原因:bind-address默认是127.0.0.1你必须更改它

解决办法:修改my.cnf,加上如下图红框所示的配置!


NO2: mysql error 1129 错误

错误:mysql 1129错误!如下图:

     

原因:是因为mysql将ip连接阻塞了。

解决办法:登录到mysql数据库服务器端,使用命令:

# mysqladmin -u root -p  flush-hosts;  

Enter password:

 

作者:xuejiazhi 发表于2013-5-17 17:36:01 原文链接
阅读:0 评论:0 查看评论

相关 [mysql mysql ha] 推荐:

MySQL HA 的選擇…

- - Gea-Suan Lin's BLOG
Percona 把常見的 MySQL High Availability 選擇整理後發表成 Webinar,投影片在這裡可以看到 (以及下載):「 Choosing a MySQL High Availability Solution」. 沒有太多新的東西,主要還是再次描述 MySQL HA 這塊目前沒有萬靈丹,常見的這幾個方案各有自己的優缺點,會依照環境與需求而產生不同的選擇.

MySQL HA 高可用性,MySQL Cluster 叢集

- - SSORC.tw
而 SQL Node (mysqld程序) 只是讓我們建立資料庫、表的地方 (看得到/var/lib/mysql/XXX),只是 SQL Node 這邊是看不到實際空間用量的. manager node 及所有的 node 都要裝 mysql-cluster (到 mysql 官網下載). manager node 設定,它只要 ndb_mgm 與 ndb_mgmd 而已.

利用keepalived构建高可用MySQL-HA(转)

- - 数据库 - ITeye博客
关于MySQL-HA,目前有多种解决方案,比如heartbeat、drbd、mmm、共享存储,但是它们各有优缺点. heartbeat、drbd配置较为复杂,需要自己写脚本才能实现MySQL自动切换,对于不会脚本语言的人来说,这无疑是一种脑裂问题;对于mmm,生产环境中很少有人用,且mmm 管理端需要单独运行一台服务器上,要是想实现高可用,就得对mmm管理端做HA,这样无疑又增加了硬件开支;对于共享存储,个人觉得MySQL数据还是放在本地较为安全,存储设备毕竟存在单点隐患.

Linux Ksplice,MySQL and Oracle

- Syn - DBA Notes
Oracle 在 7 月份收购了 Ksplice. 使用了 Ksplice 的 Linux 系统,为 Kernel 打补丁无需重启动,做系统维护的朋友应该明白这是一个杀手级特性. 现在该产品已经合并到 Oracle Linux 中. 目前已经有超过 700 家客户,超过 10 万套系统使用了 Ksplice (不知道国内是否已经有用户了.

MySQL Replication 线程

- - CSDN博客推荐文章
Replication 线程. Mysql 的Replication 是一个异步的复制过程,从一个Mysql instace(我们称之为Master)复制到另一个Mysql instance(我们称之Slave). 在Master 与Slave 之间的实现整个复制过程主. 要由三个线程来完成,其中两个线程(Sql 线程和IO 线程)在Slave 端,另外一个线程(IO 线程)在Master 端.

mysql backup 脚本

- - ITeye博客
网上备份脚本很多,但考虑都不周全. 保证创建备份文件只能是创建者跟root可以访问,其他用户没有权限,保证了数据库备份的安全. 上面脚本是负责备份的份数管理,. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

Oracle MySQL Or NoSQL续

- - Sky.Jian 朝阳的天空
接前面一篇,这里再将之前在“中国系统架构师大会”5周年的时候发布的纪念册“IT架构实录”上的一篇文章发出来,也算是前面博文中PPT的一个文字版解读吧. Oracle,MySQL 还是 NoSQL. 随着阿里系的“去IOE”运动在社区的宣传声越来越大,国内正在掀起一股“去xxx”的技术潮. 不仅仅是互联网企业,包括运营商以及金融机构都已经开始加入到这个潮流之中.

mysql优化

- - 数据库 - ITeye博客
公司网站访问量越来越大,MySQL自然成为瓶颈,因此最近我一直在研究 MySQL  的优化,第一步自然想到的是 MySQL 系统参数的优化,作为一个访问量很大的网站(日20万人次以上)的数据库系统,不可能指望 MySQL  默认的系统参数能够让 MySQL运行得非常顺畅. 在Apache, PHP,  MySQL的体系架构中,MySQL对于性能的影响最大,也是关键的核心部分.

MySql动态SQL

- - SQL - 编程语言 - ITeye博客
13.7. 用于预处理语句的SQL语法. MySQL 5.1对服务器一方的预制语句提供支持. 如果您使用合适的客户端编程界面,则这种支持可以发挥在MySQL 4.1中实施的高效客户端/服务器二进制协议的优势. 候选界面包括MySQL C API客户端库(用于C程序)、MySQL Connector/J(用于Java程序)和MySQL Connector/NET.

MySQL 性能

- - 谁主沉浮
这里罗列了一些基本的 MySQL 性能提示,但不是放之四海而皆准,需要根据实际的应用情况而决定. 使用标准化设计(数据库三范式),记住表的联合查询(join)性能不会差. 选择合适的字符集,虽然UTF16无所不能,但需要两倍的存储;UTF8适合各种字符,但比latin1慢,尽可能选用latin1(此条不适合中文).