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;
处理报错

两种处理方式

  1. 手动修复数据,后面还是会出现错误
stop slave;
delete from test_db.test where name = 'jin';
start slave;
  1. 跳过错误(sql_slave_skip_counter)后面还是会出现错误
set global sql_slave_skip_counter=1;
start slave;
  1. 避免自增列值冲突
    使用下列值来避免出现自增主键冲突
  • 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
        }   
    }   
}

标签: mysql, lvs

添加新评论