bobpxp 发表于 2018-9-28 11:42:20

mysql+keepalive 高可用

  说明:蓝色=命令名称
  浅绿=命令参数
  浅蓝=选项
  紫色=目录
  系统环境:CentOS5.7x86_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@'%'>  3、设置主从
  查看master二进制日志状态:show master status;

  在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;

  其中 Slave_IO_Running: Yes,Slave_SQL_Running: Yes 表示设置成功。
  测试:
  
在slave执行:
  
mysql> show databases;

  在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 > show databases;

  
第一个为master建立数据库前,第二个为建立后。从图可以看出一切ok。
  4、设置双主
  在slave执行:mysql> show master status;

  在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;
  其中 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;
  

  在master执行:
  service mysqld start
  mysql -uroot -p
  mysql> use zsz;
  
mysql> select * from zsz;

  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
  内容如下
  


[*]#!/bin/bash
[*]MYSQL=/usr/local/mysql-5.5.21/bin/mysql
[*]MYSQL_HOST=localhost
[*]MYSQL_USER=root
[*]MYSQL_PASSWORD=
[*]CHECK_TIME=3
[*]#mysqlis working MYSQL_OK is 1 , mysql down MYSQL_OK is 0
[*]MYSQL_OK=1
[*]function check_mysql_helth (){
[*]$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -e "show status;" >/dev/null 2>&1
[*]if [ $? = 0 ] ;then
[*]   MYSQL_OK=1
[*]else
[*]   MYSQL_OK=0
[*]fi
[*]   return $MYSQL_OK
[*]}
[*]while [ $CHECK_TIME -ne 0 ]
[*]do
[*]   let "CHECK_TIME -= 1"
[*]   check_mysql_helth
[*]   if [ $MYSQL_OK = 1 ] ; then
[*]          CHECK_TIME=0
[*]          exit 0
[*]   fi
[*]
[*]   if [ $MYSQL_OK -eq 0 ] &&[ $CHECK_TIME -eq 0 ]
[*]   then
[*]          /etc/init.d/keepalived stop
[*]   exit 1
[*]   fi
[*]   sleep 1
[*]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'@'%'>  
mysql> flush privileges;
  在slave上建立测试帐号:

  
mysql> grant all privileges on *.* to 'slave'@'%'>  
mysql> flush privileges;
  
分别启动master、slave的keepalived进程
  
service keepalived start
  在master上执行:ifconfig
  

  在slave上执行:ifconfig
  


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

  关闭master数据库:service mysqld stop
  在master上执行:ifconfig
  在slave上执行:ifconfig

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

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


页: [1]
查看完整版本: mysql+keepalive 高可用