把数据库文件及存储位置移到drbd块中,my.cnf最好也放在drbd中 当切换到备机的时候就不需要再次配置mysql
在heartbeat资源脚本目录建立mysql启动脚本的软连接:[root@node1 ~]# ln -s /etc/init.d/mysqld /usr/local/ha/etc/ha.d/resource.d/mysqld
http://www.blogjava.net/dongbule/archive/2010/08/22/329602.html
http://369369.blog.51cto.com/319630/790921/
http://my.tv.sohu.com/us/181018113/59392643.shtml
测试环境: centos6.5 108主服务 114 从服务器 备份库名:zzx
1、主服务器配置my.cnf
[root@localhost ~]# vi /etc/my.cnf [mysqld]添加如下
[mysqld]
log-bin = mysql-bin # 开启BINLOG ,实际目录应该是上面语句的datadir=/var/lib/mysql
server-id=1 #随便都可以修改后restart mysql 不能重启就是配置文件写错了
2、主服务器给从服务器访问授权
mysql> GRANT REPLICATION SLAVE ON *.* TO IDENTIFIED BY '123456';//这里用114表示从114可访问 这样slave才能访问到master进行同步
Query OK, 0 rows affected (0.13 sec)
mysql> select host,user,Password from mysql.user; #可以查看到刚添加的slavezzx用户 从服务器用这个用户访问主服务器
3、获取主服务器当前二进制日志名和偏移量,这个操作的目的是为了在从数据库启动后,从这个点开始进行数据的恢复
mysql> show master status\G #这里不需要加 ; 不然会提示错误ERROR: No query specified
*************************** 1. row ***************************
File: mysql-bin.000002
Position: 106
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
ERROR: No query specified
4、mysqldump备份数据库然后传给从服务器
mysql> flush tables with read lock; #锁定数据库的写入 确保数据完整
Query OK, 0 rows affected (0.19 sec)
之后是mysqldump
mysqldump -h127.0.0.1 -p3306 -uroot -p zzx > /root/zzx.sql
最好在主数据库备份完毕,恢复写操作
mysql> unlock tables;
Query OK, 0 rows affected (0.28 sec)
(6)将刚才主数据备份的test.sql复制到从数据库,进行导入 mysql -uroot -p test < /root/zzx.sql
(7)接着修改从数据库的my.cnf,增加server-id参数,指定复制使用的用户,主数据库服务器的ip,端口以及开始执行复制日志的文件和位置
[mysqld]
server-id=2
log-bin = mysql-bin
master-host =192.168.1.108
master-user=slavezzx
master-pass=123456
master-port =3306
master-connect-retry=60
replicate-do-db =zzx #备份zzx这个database
mysql> show variables like 'server_id'; #这条语句检查value值 正确的话主服务器显示设置的1 从显示设置的2
8、重启从服务器mysql 接着测试从服务器和主服务器的连通性 注意selinux和iptables
[root@localhost ~]# mysql -u slavezzx -h 192.168.1.108 -p #确保能连接 ,exit
9、在从服务器进行show salve status验证
mysql> SHOW SLAVE STATUS\G #这一步内容为空 不正常 说明主从没连接上 检查之前的连通性 selinux和iptables
如果前面验证失败 进行修改 changemysql> CHANGE MASTER TO MASTER_HOST='192.168.1.108', MASTER_USER='slavezzx', MASTER_PASSWORD='123456' ,master_log_file='mysql-bin.000002',master_log_pos=106; #log_file文件多写了一个. 导致弄了几个小时到处检查,这里的MASTER_HOST其实也是heartbeat的VIP地址,log_pos表示日志的Position一般用98这个起始值
ERROR 1198 (HY000): This operation cannot be performed with a running slave; run STOP SLAVE first # change的时候需要先stop slave
mysql> slave stop;
Query OK, 0 rows affected (0.00 sec)
change完 slave start; //启动同步功能
mysql> SHOW SLAVE STATUS\G
*************************** 1. row *************************** Slave_IO_State: Master_Host: 192.168.1.108 Master_User: slavezzx Master_Port: 3306 Connect_Retry: 60 Master_Log_File: Read_Master_Log_Pos: 4 Relay_Log_File: mysqld-relay-bin.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: Slave_IO_Running: No # change时语法写错 file文件名字写错一个. Slave_SQL_Running: No #iptables没关导致无法连接 Replicate_Do_DB: zzx Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 0 Relay_Log_Space: 106 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: NULLMaster_SSL_Verify_Server_Cert: No Last_IO_Errno: 1593 Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it). Last_SQL_Errno: 0 Last_SQL_Error: 1 row in set (0.00 sec)
结果 以上两个必须为YES
(10)好了,现在可以在我们的主服务器做一些更新的操作,然后在从服务器查看是否已经更新
数据能否同步 主要检查 主服务器的 show master status\G 和从服务器的 show slave status\G 中的两个数据是否相同