说明:蓝色=命令名称
浅绿=命令参数
浅蓝=选项
紫色=目录
系统环境:CentOS 5.7 x86_64
一、所需准备mysql-master :192.168.1.71 mysql-slave :192.168.1.70mysql版本均为:5.5.21keepalive 版本:1.2.2vip:192.168.1.60
注;mysql安装可参考
二、方案介绍
两台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=testuse mysql; update test.table1 set ......第二句会执行但不会写入二进制日志,即从库不能同步,主从数据库出现差异如设置 binlog_ignore_db=mysqluse mysql; update test.table1 set ......第二句会执行但不会写入二进制日志,即从库不能同步,主从数据库出现差异
如设置 replicate_do_db=testuse mysql; update test.table1 set ......第二句将不会被执行,即从库不能同步,主从数据库出现差异
如设置 replicate_ignore_db=mysqluse 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 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/srcwget tar zxvf keepalived-1.2.2.tar.gzcd 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 identified by 'zzzzzzz'; mysql> flush privileges;在slave上建立测试帐号:
mysql> grant all privileges on *.* to identified by 'zzzzzzz'; 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帐号设置不同)
测试 成功。