Keepalived实现HA
Storage <--> Mysql Keepalived <-------
|
R V |
e r |
p r |
l p |
i VIP ---> Aplication
c c |
a h |
t e |
i c |
o k |
n |
|
Storage Mysql Keepalived <------
下载keepalived
www.keepalived.org
两种方式安装 rpm和源码
源码安装 最简单
./configure
./make
./make install
源码生成rpm文件
cd /var/scr/
cp keepalived-1.2.12.tar.gz /var/scr/
tar zxvf keepalived-1.2.12.tar.gz
./configure
rpmbuild ~
cd
mkdir -p rpmbuild/BUILD
mkdir -p rpmbuild/BUILDROOT
mkdir -p rpmbuild/RPMS/i386
mkdir -p rpmbuild/RPMS/noarch
mkdir -p rpmbuild/SOURCES
mkdir -p rpmbuild/SPECS
mkdir -p rpmbuild/SRPMS
mkdir -p rpmbuild/tmp
cd /var/scr/keepalived-1.2.12
cp keepalived.spec ~/rpmbuild/SPECS
cp keepalived-1.2.12.tar.gz ~/rpmbuild/SOURCES
cd ~/rpmbuild/SPECS
rpmbuild -bb keepalived.spec
修改主机密码
192.168.75.23上修改主机名
vi /etc/hosts
127.0.0.1 host1
192.168.75.23 host1
192.168.75.51 host2
192.168.74.52 host3
vi /etc/sysconfig/network
HOSTNAME=host1
192.168.75.51 上修改主机名
vi /etc/hosts
127.0.0.1 host2
192.168.75.23 host1
192.168.75.51 host2
192.168.74.52 host3
vi /etc/sysconfig/network
HOSTNAME=host2
192.168.75.52 上修改主机名
vi /etc/hosts
127.0.0.1 host3
192.168.75.23 host1
192.168.75.51 host2
192.168.74.52 host3
vi /etc/sysconfig/network
HOSTNAME=host3
配置replication
编写host1上的my.cnf
[mysqld]
server-id=1
log-bin
service mysql restart
编写host3上的my.cnf
[mysqld]
server-id=2
log-bin
service mysql restart
检测所有的防火墙是否关闭
iptables -F
iptables -L
getenforce
在host1上登陆mysql
grant replication slave on *.* to slave@192.168.75.52 identified by '123';
flush priveleges;
在host3上登陆mysql
grant replication slave on *.* to slave@192.168.75.23 identified by '123';
flush privileges;
在host3上操作
change master to
master_host='192.168.75.23',
master_user='slave',
master_password='123',
master_log_file='host1-bin.000001',
master_log_pos=120;
start slave;
show slave status \G;
在host1上操作
change master to
master_host='192.168.75.52',
master_user='slave',
master_password='123';
start slave;
show slave status \G;
在host1上创建测试数据
create database world;
use word
create table t1(id int);
insert into t1 values(1),(2),(3);
在host3上检查是否复制正确
show databases;
use world
select * from t1;
在host3上的world.t1上插入数据测试是否会复制到host1
insert into t1 values (4);
检查是否复制到host1上
select * from t1;
keepalived配置
配置文件放置的位置/usr/local/etc/keepalived
注意priority设置要不一样 越大优先级越高 谁当主设置高点
修改host1下的keepalived.cnf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost.localdomain --邮箱地址例如875381900@qq.com
}
notification_email_from root@localhost.localdomain
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id xc-mysql-ha --起个名字
}
vrrp_instance VI_1 {
state BACKUP --这个keepalived扮演的角色 最好两边都配置为BACKUP
interface eth0 --网卡名字
virtual_router_id 51
priority 100
nopreempt --确定出问题时切到host3后,host1又好后不会再切换回来到host1,知道host3出问题时才进行切换,只在这一侧加这个参数
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.75.55 --随便写个
}
}
virtual_server 192.168.75.55 3306 {
delay_loop 1
lb_algo wrr --算法
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.75.23 3306 { --host1的实际ip
weight 1
notify_down /usr/local/etc/keepalived/mysql.sh
TCP_CHECK {
connect_timeout 10
bingto 192.168.75.55 --虚拟ip
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
mysql.sh
#!/bin/bash
pkill keepalived
chmod 755 mysql.sh
修改host3下的keepalived.cnf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost.localdomain
}
notification_email_from root@localhost.localdomain
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id xc-mysql-ha
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.75.55
}
}
virtual_server 192.168.75.55 3306 {
delay_loop 1
lb_algo wrr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.75.52 3306 {
weight 1
notify_down /usr/local/etc/keepalived/mysql.sh
TCP_CHECK {
connect_timeout 10
bingto 192.168.75.55
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
mysql.sh
#!/bin/bash
pkill keepalived
chmod 755 mysql.sh
测试keepalived
host1启动keepalived
/etc/init.d/keepalived start
host3启动keepalived
/etc/init.d/keepalived start
最终检测
ps -ef|grep keepalived
ps -ef|grep mysql
less /var/log/messages
测试方法
1.使用ping命令持续检测VIP的连通情况
2.关闭主节点上的mysql服务
3.观察主节点上的keepalived进程
4.观察VIP的ping结果
5.观察在切换后能否正常访问数据库
在host1上执行,host3也会复制
grant all on waorld.* to xc@192.168.75.51 identified by '123';
flush privileges;
用host2专门做检测
在host2上,检测虚拟ip地址
ping 192.168.75.55
mysql -h 192.168.75.55 -uxc -p123 --使用虚拟ip连接数据库
在host1上模拟数据库故障
service mysql stop
ps -ef|grep keepalived
发现host1没有服务了,切换到了host3,host2的ping是一直通的,因为主有问题立即切换到备,所有ping是一直通的
Storage <--> Mysql Keepalived <-------
|
R V |
e r |
p r |
l p |
i VIP ---> Aplication
c c |
a h |
t e |
i c |
o k |
n |
|
Storage Mysql Keepalived <------
下载keepalived
www.keepalived.org
两种方式安装 rpm和源码
源码安装 最简单
./configure
./make
./make install
源码生成rpm文件
cd /var/scr/
cp keepalived-1.2.12.tar.gz /var/scr/
tar zxvf keepalived-1.2.12.tar.gz
./configure
rpmbuild ~
cd
mkdir -p rpmbuild/BUILD
mkdir -p rpmbuild/BUILDROOT
mkdir -p rpmbuild/RPMS/i386
mkdir -p rpmbuild/RPMS/noarch
mkdir -p rpmbuild/SOURCES
mkdir -p rpmbuild/SPECS
mkdir -p rpmbuild/SRPMS
mkdir -p rpmbuild/tmp
cd /var/scr/keepalived-1.2.12
cp keepalived.spec ~/rpmbuild/SPECS
cp keepalived-1.2.12.tar.gz ~/rpmbuild/SOURCES
cd ~/rpmbuild/SPECS
rpmbuild -bb keepalived.spec
修改主机密码
192.168.75.23上修改主机名
vi /etc/hosts
127.0.0.1 host1
192.168.75.23 host1
192.168.75.51 host2
192.168.74.52 host3
vi /etc/sysconfig/network
HOSTNAME=host1
192.168.75.51 上修改主机名
vi /etc/hosts
127.0.0.1 host2
192.168.75.23 host1
192.168.75.51 host2
192.168.74.52 host3
vi /etc/sysconfig/network
HOSTNAME=host2
192.168.75.52 上修改主机名
vi /etc/hosts
127.0.0.1 host3
192.168.75.23 host1
192.168.75.51 host2
192.168.74.52 host3
vi /etc/sysconfig/network
HOSTNAME=host3
配置replication
编写host1上的my.cnf
[mysqld]
server-id=1
log-bin
service mysql restart
编写host3上的my.cnf
[mysqld]
server-id=2
log-bin
service mysql restart
检测所有的防火墙是否关闭
iptables -F
iptables -L
getenforce
在host1上登陆mysql
grant replication slave on *.* to slave@192.168.75.52 identified by '123';
flush priveleges;
在host3上登陆mysql
grant replication slave on *.* to slave@192.168.75.23 identified by '123';
flush privileges;
在host3上操作
change master to
master_host='192.168.75.23',
master_user='slave',
master_password='123',
master_log_file='host1-bin.000001',
master_log_pos=120;
start slave;
show slave status \G;
在host1上操作
change master to
master_host='192.168.75.52',
master_user='slave',
master_password='123';
start slave;
show slave status \G;
在host1上创建测试数据
create database world;
use word
create table t1(id int);
insert into t1 values(1),(2),(3);
在host3上检查是否复制正确
show databases;
use world
select * from t1;
在host3上的world.t1上插入数据测试是否会复制到host1
insert into t1 values (4);
检查是否复制到host1上
select * from t1;
keepalived配置
配置文件放置的位置/usr/local/etc/keepalived
注意priority设置要不一样 越大优先级越高 谁当主设置高点
修改host1下的keepalived.cnf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost.localdomain --邮箱地址例如875381900@qq.com
}
notification_email_from root@localhost.localdomain
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id xc-mysql-ha --起个名字
}
vrrp_instance VI_1 {
state BACKUP --这个keepalived扮演的角色 最好两边都配置为BACKUP
interface eth0 --网卡名字
virtual_router_id 51
priority 100
nopreempt --确定出问题时切到host3后,host1又好后不会再切换回来到host1,知道host3出问题时才进行切换,只在这一侧加这个参数
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.75.55 --随便写个
}
}
virtual_server 192.168.75.55 3306 {
delay_loop 1
lb_algo wrr --算法
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.75.23 3306 { --host1的实际ip
weight 1
notify_down /usr/local/etc/keepalived/mysql.sh
TCP_CHECK {
connect_timeout 10
bingto 192.168.75.55 --虚拟ip
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
mysql.sh
#!/bin/bash
pkill keepalived
chmod 755 mysql.sh
修改host3下的keepalived.cnf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost.localdomain
}
notification_email_from root@localhost.localdomain
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id xc-mysql-ha
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.75.55
}
}
virtual_server 192.168.75.55 3306 {
delay_loop 1
lb_algo wrr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.75.52 3306 {
weight 1
notify_down /usr/local/etc/keepalived/mysql.sh
TCP_CHECK {
connect_timeout 10
bingto 192.168.75.55
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
mysql.sh
#!/bin/bash
pkill keepalived
chmod 755 mysql.sh
测试keepalived
host1启动keepalived
/etc/init.d/keepalived start
host3启动keepalived
/etc/init.d/keepalived start
最终检测
ps -ef|grep keepalived
ps -ef|grep mysql
less /var/log/messages
测试方法
1.使用ping命令持续检测VIP的连通情况
2.关闭主节点上的mysql服务
3.观察主节点上的keepalived进程
4.观察VIP的ping结果
5.观察在切换后能否正常访问数据库
在host1上执行,host3也会复制
grant all on waorld.* to xc@192.168.75.51 identified by '123';
flush privileges;
用host2专门做检测
在host2上,检测虚拟ip地址
ping 192.168.75.55
mysql -h 192.168.75.55 -uxc -p123 --使用虚拟ip连接数据库
在host1上模拟数据库故障
service mysql stop
ps -ef|grep keepalived
发现host1没有服务了,切换到了host3,host2的ping是一直通的,因为主有问题立即切换到备,所有ping是一直通的