文章转载:http://blog.163.com/yunlei_ma/blog/static/1272089352014526101110259/
1. MySQL高可用配置
服务器IP地址:192.168.1.17(服务器1), 192.168.1.19(服务器2)。
两台服务器的公共IP:192.168.1.18 #此地址对外提供服务。
1.1. MySQL双向数据复制
此过程需要在两台服务器中均添加数据库同步账号,两台服务器将彼此设置为主服务器,并且都开启slave进程实现数据的双向同步。
1.1.1. MySQL数据单向复制
首先配置服务器1的数据库可以实时的同步至服务器2。
1.1.1.1. 配置服务器1 的/etc/my.cnf文件
在/etc/my.cnf 文件中, [MySQLd] 字段里面,修改
server-id=1 注:server-id在MySQL集群中不得重复。
1.1.1.2. 服务器1配置同步账号
1. 在服务器1中设置同步账号
MySQL> grant replication slave on *.* to 'slave1'@'%' identified by 'ucap';
Query OK, 0 rows affected (0.01 sec)
MySQL> flush privileges;
Query OK, 0 rows affected (0.01 sec)
2. 显示服务器1数据库状态
MySQL> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| MySQL-bin.000008 | 25049381 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.32 sec)
记录File和Position的值,在服务器2配置同步时使用。
3. 将服务器1数据库文件拷贝至服务器2
锁定服务器1数据库的写操作,然后拷贝数据库文件至服务器2初始化时保持数据库一直,之后执行解锁操作。
锁定主数据库,防止在拷贝数据库文件时更新数据:
MySQL> flush tables with read lock;
Query OK, 0 rows affected (0.01 sec)
拷贝数据库至服务器2:
scp /da
解锁主数据库:
MySQL> unlock tables;
Query OK, 0 rows affected (0.01 sec)
1.1.1.3. 服务器2中指定主数据库
MySQL> CHANGE MASTER TO
MASTER_HOST='server1-ip',
MASTER_USER='slave1',
MASTER_PASSWORD='ucap',
MASTER_PORT=3306,
MASTER_LOG_FILE='MySQL-bin.000008', #服务器1数据库的状态值
MASTER_LOG_POS=25049381, #服务器1数据库的状态值
MASTER_CONNECT_RETRY=10;
1.1.1.4. 服务器2启动slave线程
MySQL> start slave;
Query OK, 0 rows affected (0.00 sec)
1.1.1.5. 服务器2查看slave状态
当看到Slave_IO_Running:YES Slave_SQL_Running:YES时,表示服务器1和2同步数据正常。可以通过插入数据进行测试,详见3.3。
1.1.2. MySQL数据双向复制
服务器1的数据库可以同步至服务器2后,配置服务器2的数据库同步至服务器1,实现数据库的双向同步。
1.1.2.1. 配置服务器1 /etc/my.cnf文件
在/etc/my.cnf 文件中, [MySQLd] 字段里面,修改
server-id=2 注:server-id在MySQL集群中不得重复。
1.1.2.2. 在服务器2中设置同步账号
1. 在服务器2中设置同步账号
MySQL> grant replication slave on *.* to 'slave2'@'%' identified by 'ucap';
Query OK, 0 rows affected (0.01 sec)
MySQL> flush privileges;
Query OK, 0 rows affected (0.01 sec)
2. 显示服务器2状态
MySQL> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| MySQL-bin.000009| 25049391 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.32 sec)
记录File和Position的值,在服务器1中配置同步时使用。
1.1.2.3. 服务器1指定主数据库
MySQL> CHANGE MASTER TO
MASTER_HOST='server2-ip',
MASTER_USER='slave2',
MASTER_PASSWORD='ucap',
MASTER_PORT=3306,
MASTER_LOG_FILE='MySQL-bin.000009', #服务器2的数据库状态值。
MASTER_LOG_POS=25049391, #服务器2的数据库状态值。
MASTER_CONNECT_RETRY=10;
1.1.2.4. 服务器1启动slave线程
MySQL> start slave;
Query OK, 0 rows affected (0.00 sec)
1.1.2.5. 服务器1查看slave状态
当看到Slave_IO_Running:YES Slave_SQL_Running:YES时,表示服务器1和2同步数据正常。可以通过在双方数据库中插入数据进行测试,详见3.3。注:此图的master_host=192.168.1.19,此图摘自6.1.1.5。
1.2. Keepalived
1.2.1. 配置keepalived
1.2.1.1. 配置keepalived:192.168.1.17
#Configuration File for keepalived
global_defs {
notification_email { #定义接受邮件的邮箱,也可以取消不配置邮箱。
acassen@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc #定义发送邮件的邮箱
smtp_server 127.0.0.1 #指定snmp服务器的地址(根据实际填写)
smtp_connect_timeout 10 #smtp连接超时时间
router_id LVS_DEVEL #运行keepalived的机器的一个标示
}
vrrp_script check_mysql { #定义监控mysql的脚本
script "/etc/keepalived/check_mysql.sh"
interval 2 #监控时间间隔
weight 2 #负载参数
}
vrrp_instance vrrptest { #定义vrrptest实例
state BACKUP #服务器状态(主为MASTER,从为BACKUP。开启nopreement时,需要将双方的state设置为BACKUP)。
interface eth0 #使用的网络接口
virtual_router_id 51 #虚拟路由的标志,一组lvs的虚拟路由标识必须相同,这样才能切换
priority 150 #服务启动优先级,值越大,优先级越高,BACKUP不能大于MASTER.
advert_int 1 #服务器之间的存活检查时间
nopreempt
###nopreement 设置为不抢占,注意这个配置只能设置在state为BACKUP的主机上,并且这个主机的priority的值比另外一套高。
authentication {
auth_type PASS #认证类型
auth_pass 1111 #认证密码,一组lvs 服务器的认证密码必须一致
}
track_script { #进行监控mysql进程的脚本
check_mysql
}
virtual_ipaddress { #虚拟IP地址
192.168.1.18
}
}
virtual_server 192.168.1.18 3306 { #设置一个vritual server :vip:vport
delay_loop 2 #service polling的delay的时间
lb_algo rr #LVS的调度算法 rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR #LVS集群模式 NAT|DR|TUN
persistence_timeout 60 #会话保持时间
protocol TCP #使用的协议是TCP还是UDP
real_server 192.168.1.17 3306 { #每台realserver服务器都需要这个配置
weight 1
TCP_CHECK { #TCP方式检查
connect_port 3306 #监控检测端口
connect_timeout 3 #连接超时时间
nb_get_retry 2 #重连次数
delay_before_retry 1 #重连间隔时间
}
}
}
1.2.1.2. 配置keepalived:192.168.1.19
#Configuration File for keepalived
global_defs {
notification_email { #定义接受邮件的邮箱,也可以取消不配置邮箱。
acassen@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc #定义发送邮件的邮箱
smtp_server 127.0.0.1 #指定snmp服务器的地址(根据实际填写)
smtp_connect_timeout 10 #smtp连接超时时间
router_id LVS_DEVEL #运行keepalived的机器的一个标示
}
vrrp_script check_mysql { #定义监控mysql的脚本
script "/etc/keepalived/check_mysql.sh"
interval 2 #监控时间间隔
weight 2 #负载参数
}
vrrp_instance vrrptest { #定义vrrptest实例
state BACKUP #服务器状态(主为MASTER,从为BACKUP。开启nopreement时,需要将双方的state设置为BACKUP)。
interface eth0 #使用的网络接口
virtual_router_id 51 #虚拟路由的标志,一组lvs的虚拟路由标识必须相同,这样才能切换
priority 100 #服务启动优先级,值越大,优先级越高,BACKUP不能大于MASTER
advert_int 1 #服务器之间的存活检查时间
nopreempt
###nopreement 设置为不抢占,注意这个配置只能设置在state为BACKUP的主机上,并且这个主机的priority的值比另外一套高。
authentication {
auth_type PASS #认证类型
auth_pass 1111 #认证密码,一组lvs 服务器的认证密码必须一致
}
track_script { #进行监控mysql进程的脚本
check_mysql
}
virtual_ipaddress { #虚拟IP地址
192.168.1.18
}
}
virtual_server 192.168.1.18 3306 { #设置一个vritual server :vip:vport
delay_loop 2 #service polling的delay的时间
lb_algo rr #LVS的调度算法 rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR #LVS集群模式 NAT|DR|TUN
persistence_timeout 60 #会话保持时间
protocol TCP #使用的协议是TCP还是UDP
real_server 192.168.1.19 3306 { #每台realserver服务器都需要这个配置
weight 1
TCP_CHECK { #TCP方式检查
connect_port 3306 #监控检测端口
connect_timeout 3 #连接超时时间
nb_get_retry 2 #重连次数
delay_before_retry 1 #重连间隔时间
}
}
}
1.2.1.3. MySQL检测脚本
MySQL检测语句:/etc/keepalived/check_mysql.sh
#!/bin/bash
if [ "$(ps -ef | egrep "mysqld|mysqld_safe" | grep -v egrep )" == "" ]
then
/etc/init.d/keepalived stop
fi
chmod +x /etc/keepalived/check_mysql.sh
注:双方服务器均需要设置;当MySQL停止时,脚本会将keepalived停止以释放公共IP:192.168.1.18,公共IP将转移至备用服务器。
查看公共IP命令:ip add
1.3. 防火墙设置
防火墙开放端口需要在两台服务器中均进行设置:
iptables -I INPUT -d 224.0.0.18 -j ACCEPT #keepalived组播地址
iptables –I INPUT –p tcp --dport 3306 –j ACCEPT
iptables –I INPUT –p udp –dport 3306 –j ACCEPT
/etc/init.d/iptables save
/etc/init.d/iptables restart