mysql 学习记录8-高可用
Slave + LVS + Keepalived实现高可用
环境
LVS服务器IP : 192.168.23.8
MySQL服务器IP : 192.168.23.9,192.168.23.10
LVS虚拟IP : 192.168.23.11
配置LVS
先安装ipvsadm命令,yum install ipvsadm -y
1. 配置LVS服务器
LVS服务器上创建文件并执行
#! /bin/bash
# DR Model
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/sbin/ipvsadm
vip=192.168.23.11
rs1=192.168.23.9
rs2=192.168.23.10
gt=192.168.23.2
ifconfig eth0:0 down
ifconfig eth0:0 $vip up
#ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev eth0:0
$ipv -C
$ipv -A -t $vip:3307 -s rr
$ipv -a -t $vip:3307 -r $rs1:3307 -g
$ipv -a -t $vip:3307 -r $rs2:3307 -g
2. 配置RealServer服务器(MySQL)
LVS服务器上创建文件并执行
#! /bin/bash
vip=192.168.23.11
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
3. 测试连接
mysql -h 192.168.23.11 -u root -pxxxxx
配置Keepalived
LVS并不支持故障自动切换,需要通过Keepalived实现
1. 安装Keepalived
yum install -y keepalived
2. 清除ipvsadm已经设置的规则
ipvsadm -C
3.配置keepalived
修改/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
# 发送提醒邮件地址
notification_email {
jin@jin.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
# smtp服务器地址
smtp_server 192.168.23.1
smtp_connect_timeout 30 #smtp的超时时间
router_id LVS_DEVEL #物理服务器的主机名
}
vrrp_instance VI_MYSQL { #定义一个虚拟路由
state Master # #当前节点在此虚拟路由器上的初始状态;只能有一个是MASTER,余下的都应该为BACKUP;
interface eth0:0 #绑定为当前虚拟路由器使用的物理接口;
virtual_router_id 1 #当前虚拟路由器的惟一标识,范围是0-255;
priority 100 #当前主机在此虚拟路径器中的优先级;范围1-254;
advert_int 1 #通告发送间隔,包含主机优先级、心跳等。
authentication { #认证配置,keepalived的Master和Backup服务器之间需要验证这个
auth_type PASS #认证类型,PASS表示简单字符串认证
auth_pass 3307 #密码,PASS密码最长为8位
}
virtual_ipaddress {
192.168.23.11 #虚拟路由IP地址,以辅助地址方式设置
}
}
virtual_server 192.168.23.11 3307 { #LVS配置段 ,设置LVS的VIP地址和端口
delay_loop 6 #服务轮询的时间间隔;检测RS服务器的状态。
lb_algo rr #调度算法,可选rr|wrr|lc|wlc|lblc|sh|dh。
lb_kind DR #集群类型。
nat_mask 255.255.255.0 #子网掩码,可选项。
persistence_timeout 50 #是否启用持久连接,连接保存时长
protocol TCP #协议,只支持TCP
real_server 192.168.23.9 3307 { #配置RS服务器的地址和端口
weight 1 #权重
TCP_CHECK {
connect_timeout 3 #连接请求的超时时长;
nb_get_retry 3 #超时重试次数
delay_before_retry 3 #每次超时过后多久再进行连接
connect_port 3307 #连接端口
}
}
real_server 192.168.23.10 3307 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3307
}
}
}
4. 设置keepalived虚拟IP
添加bash文件并执行
#! /bin/bash
# DR Model
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/sbin/ipvsadm
vip=192.168.23.11
gt=192.168.23.2
ifconfig eth0:0 down
ifconfig eth0:0 $vip up
#ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev eth0:0
4. 设置RS服务器IP
添加bash文件并执行
#! /bin/bash
vip=192.168.23.11
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
Dual-Master高可用
使用keepalived和双master实现故障自动切来保证高可用
双节点读写的隐患
自增主键导致同步线程报错,导致同步进程报错,进而同步失败,如下
# 停止slave
stop slave
# 插入记录,新纪录会自动生成主键ID(自增)
insert into test_db.test (name) value ('jin');
# 重新开始同步
start slave
# 查看报错信息
show slave status;
处理报错
两种处理方式
- 手动修复数据,后面还是会出现错误
stop slave;
delete from test_db.test where name = 'jin';
start slave;
- 跳过错误(sql_slave_skip_counter)后面还是会出现错误
set global sql_slave_skip_counter=1;
start slave;
- 避免自增列值冲突
使用下列值来避免出现自增主键冲突
auto_increment_increment
: 指定递增值,默认为1(即每次增长1)auto_increment_offset
: 自增偏移量,自增初始值
例如设置从8开始自增,每次增长88888
set auto_increment_increment = 6;
set auto_increment_offset = 88888;
IP自动漂移
修改/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
# 发送提醒邮件地址
notification_email {
jin@jin.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
# smtp服务器地址
smtp_server 192.168.23.1
smtp_connect_timeout 30 #smtp的超时时间
router_id LVS_DEVEL #物理服务器的主机名
}
vrrp_script check_run {
script "/root/check_mysql.php"
interval 10
}
vrrp_instance VI_MYSQL { #定义一个虚拟路由
state Backup # # 初始指定两台服务器均为备份状态,以避免服务器重启时可能造成的震荡(master角色争夺)
interface eth0:0 #绑定为当前虚拟路由器使用的物理接口;
virtual_router_id 1 #当前虚拟路由器的惟一标识,范围是0-255;
priority 100 #当前主机在此虚拟路径器中的优先级,另一节点中本参数的值可以设置得稍小一些;
advert_int 1 #通告发送间隔,包含主机优先级、心跳等。
nopreempt # 不抢占,只在优先级搞的机器上设置即可,优先级低的机器不设置
authentication { #认证配置,keepalived的Master和Backup服务器之间需要验证这个
auth_type PASS #认证类型,PASS表示简单字符串认证
auth_pass 3307 #密码,PASS密码最长为8位
}
virtual_ipaddress {
192.168.23.11 #虚拟路由IP地址,以辅助地址方式设置
}
}
virtual_server 192.168.23.11 3307 { #LVS配置段 ,设置LVS的VIP地址和端口
delay_loop 6 #服务轮询的时间间隔;检测RS服务器的状态。
lb_algo rr #调度算法,可选rr|wrr|lc|wlc|lblc|sh|dh。
lb_kind DR #集群类型。
nat_mask 255.255.255.0 #子网掩码,可选项。
persistence_timeout 50 #是否启用持久连接,连接保存时长
protocol TCP #协议,只支持TCP
real_server 192.168.23.9 3307 { #配置RS服务器的地址和端口
weight 1 #权重
TCP_CHECK {
connect_timeout 3 #连接请求的超时时长;
nb_get_retry 3 #超时重试次数
delay_before_retry 3 #每次超时过后多久再进行连接
connect_port 3307 #连接端口
}
}
real_server 192.168.23.10 3307 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3307
}
}
}