说明蓝色=命令名称

      浅绿=命令参数

      浅蓝=选项

      紫色=目录

      系统环境:CentOS  5.7  x86_64

一、所需准备
mysql-master :192.168.1.71
mysql-slave  :192.168.1.70
mysql版本均为:5.5.21
keepalive 版本:1.2.2
vip:192.168.1.60

注;mysql安装可参考http://linux521.blog.51cto.com/4099846/803600

二、方案介绍

两台mysql互为主从,但只有master写,slave只负责读。主从通过keepalive做成高可用,当master出问题,由slave接替master工作,即读写都在slave操作。当master恢复正常,master自动同步故障时间段数据,接替slave的写工作。

三、双主配置

1、配置文件
master my.cnf 主要参数

log_slave_updates
log-bin = mysql-bin
server-id = 1
binlog-ignore-db=mysql
#auto_increment_increment = 2
#auto_increment_offset = 2

slave my.cnf 主要参数

log_slave_updates
log-bin = mysql-bin
server-id = 2
binlog-ignore-db=mysql
#auto_increment_increment = 2
#auto_increment_offset = 1

注:
log_slave_updates  同步数据时也写入日志,二进制记录id号,互为主从时时不会引起循环。建议开启方便实施日志恢复。 可选
slave-skip-errors  跳过错误,可以通过=指定特定的错误,如:slave-skip-errors=1062  可选
log-bin = mysql-bin 开启二进制日志,必须开启,主从同步主要是通过二进制日志。 必须
sync_binlog=n  设置二进制日志在写入多少此后与硬盘同步,1 为最安全的也是效率最低的,根据实际情况设定 可选
server-id  设置mysql的id号,主从不能相同。 必须
binlog-ignore-db 设置不写入日志的库,建议设置不需要的库,节省流量。如需设置多个库可加多个此参数  可选
binlog-do-db 设置写入二进制日志的库,如设置则只有设置的库才能写入二进制日志。如需设置多个库可加多个此参数。 可选
replicate-ignore-db 设置slave不同步的库,如需设置多个库可加多个此参数。 可选
replicate-do-db 设置slave同步的库,如需设置多个库可加多个此参数。 可选
auto_increment_increment  自增增长值,如:id 设置为 auto_increment,则每次插入数据自增值为2,以1,3,5...或2,4,6...方式增长。 可选
auto_increment_offset 自增初始化便宜值,如果前一个id 为2 则 下一个为3 然后在这个基础上按auto_increment_increment 设置的值进行自增。 可选
master-host = 192.168.1.2 设置master 服务器地址,也可以启动时通过change master to 设置 。 可选
master-user = repl 设置更新用的帐号,也可以启动时通过change master to 设置 。 可选
master-password = 123 设置跟新用的密码,也可以启动时通过change master to 设置 。 可选
master-port = 3306 设置master端口,也可以启动时通过change master to 设置 。 可选

binlog-do-db、binlog-ignore-db、replicate_do_db、replicate_ignore_db 在使用时应注意,若加了以上参数,则在操作数据库是要避免跨库操作(例:update test.table1 set...)
如设置 binlog-do-db=test
use mysql;
update test.table1 set ......
第二句会执行但不会写入二进制日志,即从库不能同步,主从数据库出现差异

如设置 binlog_ignore_db=mysql
use mysql;
update test.table1 set ......
第二句会执行但不会写入二进制日志,即从库不能同步,主从数据库出现差异

如设置 replicate_do_db=test
use mysql;
update test.table1 set ......
第二句将不会被执行,即从库不能同步,主从数据库出现差异

如设置 replicate_ignore_db=mysql
use mysql;
update test.table1 set ......
第二句会被忽略执行,即从库不能同步,主从数据库出现差异

原因是设置binlog-do-db、binlog-ignore-db、replicate_do_db或replicate_ignore_db后,MySQL执行sql前检查的是当前默认数据库,所以跨库更新语句被忽略。

2、安装准备

写好配置文件重启数据库
service mysqld restart

同步数据库
可通过 tcpdump 也可以直接打包拷贝,因本次mysql都是新装设置一样,无需同步,不会同步者建议google一下。


分别在master、slave上添加同步帐号
mysql>grant replication slave on *.* to zsz@'%' identified by 'zzzzzzz';

3、设置主从

查看master二进制日志状态:show master status;

mysql+keepalive 高可用_mysql+keepalive

在slave 执行:

mysql>change master to master_host='192.168.1.71',master_user='zsz', master_password='zzzzzzz',master_log_file='mysql-bin.000007',master_log_pos=107;

:master_log_file='mysql-bin.000007',master_log_pos=107 为master status中对应的内容。

mysql> slave start
mysql> show slave status\G;

mysql+keepalive 高可用_mysql 主主_02

其中 Slave_IO_Running: Yes,Slave_SQL_Running: Yes 表示设置成功。

测试:
在slave执行:
mysql> show databases;

mysql+keepalive 高可用_休闲_03

在master建立测试库,并插入数据:
mysql>create database zsz;
mysql>use zsz;
mysql>create table zsz
(id int(5) not null auto_increment primary key,
name char(10) not null,
qqgroup int(10)
)type=innodb;

mysql>show databases;
mysql> show databases;

mysql+keepalive 高可用_mysql 主主_04

在从库执行:

mysql > show databases;

mysql+keepalive 高可用_职场_05


第一个为master建立数据库前,第二个为建立后。从图可以看出一切ok。

4、设置双主

在slave执行:mysql> show master status;

mysql+keepalive 高可用_mysql 主从_06

在master执行:
mysql>change master to master_host='192.168.1.70',master_user='zsz', master_password='zzzzzzz',master_log_file='mysql-bin.000005',master_log_pos=107;

注:master_log_file='mysql-bin.000005',master_log_pos=107 为master status中对应的内容。

mysql> slave start
mysql> show slave status\G;
mysql+keepalive 高可用_mysql+keepalive_07

其中 Slave_IO_Running: Yes,Slave_SQL_Running: Yes 表示设置成功。


测试:
在master执行;
mysql> use zsz;
Database changed
mysql> select * from zsz;
Empty set (0.00 sec)

关闭master
service mysqld stop

在slave执行:

mysql> use zsz;
mysql> insert into zsz(name,qqgroup) values('秦汉唐宋元','31013074');
mysql> select * from zsz;
mysql+keepalive 高可用_mysql 主主_08
 

在master执行:

service mysqld start

mysql -uroot -p

mysql> use zsz;
mysql> select * from zsz;

mysql+keepalive 高可用_mysql 主主_09

ok,一切成功。

三、keepalive高可用配置

1、keepalive安装

分别在master,slave上安装keepalive

cd /usr/local/src
wget http://www.keepalived.org/software/keepalived-1.2.2.tar.gz
tar zxvf keepalived-1.2.2.tar.gz
cd keepalived-1.2.2
./configure --prefix=/
make
make install

分别在master,slave上新建检查脚本

vim /root/check_mysql.sh

内容如下

  1. #!/bin/bash  
  2. MYSQL=/usr/local/mysql-5.5.21/bin/mysql  
  3. MYSQL_HOST=localhost 
  4. MYSQL_USER=root 
  5. MYSQL_PASSWORD=  
  6. CHECK_TIME=3  
  7. #mysql  is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0  
  8. MYSQL_OK=1 
  9. function check_mysql_helth (){  
  10. $MYSQL -h $MYSQL_HOST -u $MYSQL_USER -e "show status;" >/dev/null 2>&1  
  11. if [ $? = 0 ] ;then  
  12.      MYSQL_OK=1 
  13. else  
  14.      MYSQL_OK=0 
  15. fi  
  16.      return $MYSQL_OK  
  17. }  
  18. while [ $CHECK_TIME -ne 0 ]  
  19. do  
  20.      let "CHECK_TIME -1"  
  21.      check_mysql_helth  
  22.      if [ $MYSQL_OK = 1 ] ; then  
  23.           CHECK_TIME=0 
  24.           exit 0  
  25.      fi  
  26.  
  27.      if [ $MYSQL_OK -eq 0 ] &&  [ $CHECK_TIME -eq 0 ]  
  28.      then  
  29.           /etc/init.d/keepalived stop  
  30.      exit 1   
  31.      fi  
  32.      sleep 1  
  33. done  

chmod +x /root/check_mysql.sh
 

2、编写配置文件

vim /usr/local/keepalived/etc/keepalived/keepalived.conf

master配置内容:
###########################master##########################
! Configuration File for keepalived
global_defs {
    router_id zsz
}
vrrp_script check_run {
    script "/root/check_mysql.sh"
    interval 5
}
vrrp_sync_group VG1 {
     group {
        VI_1
     }
}
vrrp_instance VI_1 {
     state MASTER
     interface eth0
     virtual_router_id 11
     priority 100
     advert_int 1
     nopreempt
     authentication {
         auth_type PASS
         auth_pass zzzzzzz
     }
     track_script {
         check_run
     }
     virtual_ipaddress {
         192.168.1.60 dev eth0 label eth0:0
     }
}
##########################end##########################

slave配置内容:
#########################backup##########################
! Configuration File for keepalived
global_defs {
    router_id zsz
}
vrrp_script check_run {
    script "/root/check_mysql.sh"
    interval 5
}
vrrp_sync_group VG1 {
     group {
       VI_1
     }
}
vrrp_instance VI_1 {
     state BACKUP
     interface eth0
     virtual_router_id 11
     priority 80
     advert_int 1
     authentication {
         auth_type PASS
         auth_pass zzzzzzz
     }
     track_script {
         check_run
     }
     virtual_ipaddress {
         192.168.1.60 dev eth0 label eth0:0
     }
}
################end####################################

3、测试

在master上建立测试帐号:
mysql> grant all privileges on *.* to 'master'@'%' identified by 'zzzzzzz';
mysql> flush privileges;

在slave上建立测试帐号:
mysql> grant all privileges on *.* to 'slave'@'%' identified by 'zzzzzzz';
mysql> flush privileges;


分别启动master、slave的keepalived进程
service keepalived start

在master上执行:ifconfigmysql+keepalive 高可用_mysql+keepalive_10
 

在slave上执行:ifconfig
 

mysql+keepalive 高可用_mysql+keepalive_11

用一台同网段的机器访问通过vip数据库:

mysql+keepalive 高可用_休闲_12

 关闭master数据库:service mysqld stop

在master上执行:ifconfigmysql+keepalive 高可用_休闲_13

在slave上执行:ifconfig

mysql+keepalive 高可用_休闲_14

用一台同网段的机器访问通过vip数据库:

mysql+keepalive 高可用_休闲_15

通过此图可以看出此时反问的是slave(上文中master、slave帐号设置不同)

测试 成功。