例如:
A:192.168.1.200
B:192.168.1.210
1)MySQL的A、B配置:
配置文件my.ini中
[mysqld]
# The TCP/IP Portthe MySQL Server will listen on
port=3306
找到以上配置,之后添加以下配置
server-id=200#服务器唯一标识,A与B中的id不能相同
log-bin=mysql-bin#同步事件的日志记录文件,可以指定路径如:”c:/mysql/binlog.txt”
binlog-do-db=test1#提供数据同步服务的数据库
binlog-do-db=test2#提供数据同步服务的数据库
replicate-do-db=test1#同步的数据库
replicate-do-db=test2#同步的数据库
replicate-ignore-db=mysql(不同步mysql库,不需要是这一项可以不添加)
2)*配置好后,重启A,B的MySQL服务!!!
可以在dos中输入命令net stop mysql和net start mysql
也可以在任务管理器中重启mysql
linux下ssh中输入service mysqld stop
3)登录A,B的mysql,然后分别执行下面命令:(A,B互相给予访问权限)
(远程访问用户名)mysql登陆账户要建立同步的对方IP本地mysql登陆密码,也就是双方要有对方的账户呗
mysql>grant allprivileges on *.* to root@'192.168.1.210' identifiedby 'root'
mysql> Flushprivileges;
grantall privileges on *.* to root@"%" identified by "root";
一般使用以上命令,“%”给所有用户给予权限;因为单独给权限时,tomcat集群会出现部分数据查询不到。
允许A服务器用户root从ip为192.168.1.210的主机连接到B服务器,并使用B服务器的mysql登陆密码’root’.
*.*表示所有数据库,如果要对某个数据库备份的话,假如数据库名称为some,
则要换成some.*
4)在A,B的mysql中输入命令:
先停止从服务器同步服务
mysql> stopslave;
改变当前主服务器(即远程访问用户)的IP,mysql用户名,mysql密码,mysql端口号;网上将这些主服务器的信息添加至my.ini配置中,经过多台pc机测试,无法重新启动mysql,故采用mysql命令输入方式,可行,但前做的是主主,故master_host=要互相知道,也就是填对方的地址。
mysql>changemaster to master_host='192.168.1.210',master_user='root',master_password=‘root'
,master_port=3306;
启动从服务器同步服务
mysql> startslave;
检查是否配置成功
mysql>showslave status\G
找到Slave_IO_Running: YESSlave_SQL_Running: YES;此两项为yes则同步成功
5)如果Slave_IO_Running:NO时
1、先查看A,B服务器IP能否ping通
2、A、B服务器用户名、密码是否正确
3、A、B服务器的防火墙是否关闭
4、A、B服务器是否相互授权
以上状态有一项不符,修改完后从第2步开始继续操作。
mysql> stopslave;
mysql> startslave;
然后输入show slave status\G命令,如果还是Slave_SQL_Running:NO
查看error信息是否有变化,有变化则继续输入上面命令,直到Slave_SQL_Running:YES。
原因:
a.程序可能在slave上进行了写操作
b.也可能是slave机器重起后,事务回滚造成的.
解决办法2:
a.首先停掉Slave服务:slave stop
b.到主服务器上查看主机状态:
记录File和Position对应的值。
mysql> show master status;
+------------------+-----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------+--------------+------------------+
| mysql-bin.000020 | 135617781 | | |
+------------------+-----------+--------------+------------------+
1 row in set (0.00 sec)
3.到slave服务器上执行手动同步:
mysql> change master to
> master_host='master_ip',
> master_user='user',
> master_password='pwd',
> master_port=3307,
> master_log_file='mysql-bin.000020',
> master_log_pos=135617781;
1 row in set (0.00 sec)
mysql> slave start;
1 row in set (0.00 sec)
再次查看slave状态发现:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...
Seconds_Behind_Master: 0
解决办法II:
mysql> slave stop;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;
自己的使用体会:方法一是强制性从某一个点开始同步,会有部分没有同步的数据丢失,后续主服务器上删除记录同步也会有一些错误信息,不会影响使用.方法二不一定会有效果.
keelalived实现mysql单点故障
1)安装:
#tar -zxvf keepalived-1.2.7.tar.gz
#cd keepalived-1.2.7
#./configure --prefix=/usr/local/keepalived
预编译后出现:
Keepalived configuration
------------------------
Keepalived version : 1.2.7
Compiler : gcc
Compiler flags : -g -O2 -DETHERTYPE_IPV6=0x86dd
Extra Lib : -lpopt -lssl -lcrypto
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
IPVS use libnl : No
Use VRRP Framework : Yes
Use VRRP VMAC : No
SNMP support : No
Use Debug flags : No
注意如果你没有用到LVS可以把lvs去掉即--disable-lvs-syncd --disable-lvs
#make && make install
整理管理文件:
#cp /usr/local/keepalived/sbin/keepalived /usr/sbin/#cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/#cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
建立配置文件目录(注意:keepalived的配置文件默认在/etc/keepalived/目录)
#mkdir/etc/keepalived
两台服务器(两个节点)都这样安装即可
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
admin@ajcheng.com
}
notification_email_from admin@ajcheng.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MySQL-ha
}
vrrp_instance VI_1 {
state BACKUP #两台配置此处均是BACKUPinterface eth0 #网卡什么都不用配置,这边会自动生成虚拟IP
virtual_router_id 61
priority 100 #优先级,另一台改为90
advert_int 1
nopreempt #不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置
authentication {
auth_type PASS
auth_pass 111
}
virtual_ipaddress {
192.168.1.86
}
}
virtual_server 192.168.1.86 3306 {
delay_loop 2 #每个2秒检查一次real_server状态
lb_algo wrr #LVS算法
lb_kind DR #LVS模式
persistence_timeout 60 #会话保持时间
protocol TCP
real_server 192.168.1.83 3306 {
weight 3
notify_down /root/mysql.sh #检测到服务down后执行的脚本
TCP_CHECK {
connect_timeout 10 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔时间
connect_port 3306 #健康检查端口
}
}
}
vim /usr/local/mysql/bin/mysql.sh
#!/bin/sh
pkill keepalived
service network restart
chmod -R 777 /usr/local/mysql/bin/mysql.sh
chkconfig keepalived on
service keepalived start
service keepalived stauts
ip add
如果在其中一台机子上看到了VIP 192.168.1.86,且在局域网内能ping通,通过Navicat能过连上,说明ok了!