说明:蓝色=命令名称
浅绿=命令参数
浅蓝=选项
紫色=目录
系统环境: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;
在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
- #mysql is 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'@'%' 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
在slave上执行:ifconfig
用一台同网段的机器访问通过vip数据库:
关闭master数据库:service mysqld stop
在slave上执行:ifconfig
用一台同网段的机器访问通过vip数据库:
通过此图可以看出此时反问的是slave(上文中master、slave帐号设置不同)
测试 成功。