原创

Keepalived+LVS+MySQL主从复制实现读写分离及高可用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://wxy0327.blog.csdn.net/article/details/81045843

目录

一、架构设计

二、安装配置

1. 配置MySQL半同步复制

1.1半同步复制的基本概念

1.2半同步复制的潜在问题

1.3 半同步复制的安装部署

2. 下载安装LVS

3. 下载安装Keepalived

4. iptables配置

5. Keepalived配置

5. 编写RealServer的网络配置脚本

6. 启动RealServer和Keepalived

三、测试

参考:


        通过前面两个实验,已经基本了解了Keepalived及LVS的工作原理。本篇我们要进行一个有别于前面的新实验:使用Keepalived+LVS+MySQL主从复制实现读写分离及高可用。

一、架构设计

        具体架构如图1所示。

图1


        从图1中看到,使用两台主机做MySQL主从复制,实现读写分离,用于提高查询性能。采用MySQL 5.6.x的半同步实现数据复制和同步。使用Keepalived来监控MySQL,并提供读写VIP漂移。Keepalived在这里主要用作RealServer的健康状态检查以及LoadBalance主机和Backup主机之间failover的实现。任何一台主机宕机都不会影响对外提供服务(读写VIP可以漂移),保持MySQL数据库服务的高可用性。

        Keepalived基于VRRP协议来实现高可用解决方案,利用其避免单点故障。通常这个解决方案中,至少有2台服务器运行Keepalived,一台为Master,另一台为Backup,但对外表现为一个或一组VIP。Master会发送特定消息给Backup,当Backup收不到该消息时,则认为Master出现故障,Backup会接管VIP,继续提供服务,从而保证了高可用性。LVS在本例的作用是提供读负载均衡。整体架构的设计原理和异常处理可描述如下:

 

  1. RealServer A和B,配置为MySQL半同步复制的Master和Slave。
  2. 通过Keepalived启用两个虚IP:W-VIP/R-VIP,一个负责写入,一个负责读取,实现读写分离。
  3. A和B都存在时,LVS通过W-VIP将写请求转发至主机A,通过R-VIP将读请求转发给A和B,实现读负载均衡。
  4. 当主机A异常时,B接管服务,W-VIP/R-VIP此时都漂移到主机B上。
  5. 当主机B异常时,R-VIP会将B踢出,其它不变。

 

二、安装配置

        环境:
172.16.1.126:Keepalived + LVS Master + MySQL Semisync-Replication Master 
172.16.1.127:Keepalived + LVS Backup + MySQL Semisync-Replication Slave
172.16.1.100:R-VIP
172.16.1.210:W-VIP
 

1. 配置MySQL半同步复制

1.1半同步复制的基本概念

        从MySQL5.5开始,MySQL以插件的形式支持半同步复制。如何理解半同步呢?首先我们来看看MySQL中异步、全同步和半同步复制的概念。

  • 异步复制(Asynchronous replication):MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。
  • 全同步复制(Fully synchronous replication):指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。
  • 半同步复制(Semisynchronous replication):介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。

        图2是半同步复制的原理图:

图2

 

1.2半同步复制的潜在问题

        假设客户端事务在存储引擎层提交后,在得到从库确认的过程中,主库宕机了。此时,可能存在以下两种情况:

  • 事务还没发送到从库上:此时,客户端会收到事务提交失败的信息,客户端会重新提交该事务到新的主上,当宕机的主库重新启动后,以从库的身份重新加入到该主从结构中,会发现,该事务在从库中被提交了两次,一次是之前作为主的时候,一次是被新主同步过来的。
  • 事务已经发送到从库上:此时,从库已经收到并应用了该事务,但是客户端仍然会收到事务提交失败的信息,重新提交该事务到新的主上。

1.3 半同步复制的安装部署

        1. 先决条件
        要想使用半同步复制,必须满足以下几个条件:

  • MySQL 5.5及以上版本
  • 变量have_dynamic_loading为YES
  • 异步复制已经存在

        2. 加载插件
        因用户需执行INSTALL PLUGIN, SET GLOBAL, STOP SLAVE和START SLAVE操作,所以用户需有SUPER权限。在172.16.1.126和172.16.1.127上执行:

install plugin rpl_semi_sync_master soname 'semisync_master.so';
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

        这里考虑到以后修复问题后主从可能角色互换,所以在两个MySQL主机上都加载了半同步的两个插件。查看插件是否加载成功:

mysql> select plugin_name, plugin_status from information_schema.plugins  where plugin_name like '%semi%';
+----------------------+---------------+
| plugin_name          | plugin_status |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE        |
| rpl_semi_sync_slave  | ACTIVE        |
+----------------------+---------------+
2 rows in set (0.00 sec)

        3. 启动半同步复制
        (1)准备配置文件
        172.16.1.126(master)上的my.cnf文件内容如下:

[mysqld]
basedir = /home/mysql/mysql-5.6.14
datadir=/data
skip-name-resolve 
user=mysql
binlog_format=row
default-storage-engine=InnoDB
transaction_isolation = READ-COMMITTED
log-bin=/data/mysql-bin
log-bin-index = /data/mysql-bin.index 
tmpdir = /data
server-id = 126
innodb_data_home_dir = /data
innodb_log_group_home_dir=/data

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 

plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1

        172.16.1.127(slave)上的my.cnf文件内容如下:

[mysqld]
basedir = /home/mysql/mysql-5.6.14
datadir=/data
skip-name-resolve 
user=mysql
binlog_format=row
default-storage-engine=InnoDB
transaction_isolation = READ-COMMITTED
log-bin=/data/mysql-bin
log-bin-index = /data/mysql-bin.index 
tmpdir = /data
server-id = 127
innodb_data_home_dir = /data
innodb_log_group_home_dir=/data

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 

plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
read-only  # 设为只读模式,只能从master同步,不能直接写入

        (2)重启主、从库

service mysql restart

        (3)在主库上授权

grant replication slave on *.* to 'repl'@'%' identified by '123456';
reset master;
show master status;

        (4)在从库上启动复制

change master to
master_host='172.16.1.126',
master_port=3306,
master_user='repl',
master_password='123456',
master_log_file='mysql-bin.000001',
master_log_pos=120;

start slave;
show slave status \G

        (5)测试
        在主上建立测试表,插入数据。

mysql> use test;
Database changed
mysql> create table t1 (a int);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t1 values (1),(2),(3);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

        在从上查询。

mysql> select * from test.t1;
+------+
| a    |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)

        在从上执行数据更新则报错。

mysql> delete from test.t1;
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement

        至此半同步复制配置完成。
 

2. 下载安装LVS

        在172.16.1.126和172.16.1.127上用root用户执行以下命令:

yum -y install ipvsadm

3. 下载安装Keepalived

        在172.16.1.126和172.16.1.127上安装Keepalived,详细步骤参见“使用Keepalived实现MySQL主从高可用”。
 

4. iptables配置

        在本架构中,由于要实现MySQL读写主机VIP的漂移,Keepalived、LVS和MySQL需要部署到相同主机上。当LVS架构中的director与realserver是同一台机器时,会出现两台director无限循环转发请求的情况。具体分析如下:

  1. director1收到目的地址为VIP数据包。
  2. director1经过ip_vs对数据包做负载均衡,部分包转发给realserver2(director2)。
  3. director2收到的转发包,目的地址也是VIP,再经过ip_vs做负载均衡,部分包转发给realserver1(director1)。

        解决办法是,director使用iptables,对数据包做标记,LVS对fwm转发而不是直接转发TCP。在每台director上,对非其它director发送的数据包,做标记,ip_vs转发这些被标记的包。亦即其它director发送的数据包,不再做ip_vs转发,直接交给上层监听程序。

        在172.16.1.126(主库)上执行:

iptables -t mangle -I PREROUTING -d 172.16.1.100 -p tcp -m tcp --dport 3306 -m mac ! --mac-source 00:50:56:a5:49:7f -j MARK --set-mark 0x1

        在172.16.1.127(备库)上执行:

iptables -t mangle -I PREROUTING -d 172.16.1.100 -p tcp -m tcp --dport 3306 -m mac ! --mac-source 00:50:56:a5:0f:77 -j MARK --set-mark 0x2

        其中172.16.1.100是读VIP,3306是VPORT,00:50:56:a5:49:7f是172.16.1.127主机网卡的MAC地址,00:50:56:a5:0f:77是172.16.1.126主机网卡的MAC地址。
 

5. Keepalived配置

        172.16.1.126初始为keepalived的Master,其上的keepalived配置文件如下:

[root@hdp3~]#more /etc/keepalived/keepalived.conf 
global_defs {
   router_id LVS_DEVEL
} 
 
vrrp_sync_group VG1 {
group {
VI_1
}
}
 
vrrp_instance VI_1 {
    state BACKUP
    interface ens32 
    virtual_router_id 51
    priority 100  
    notify_master "/home/mysql/remove_slave.sh"
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        172.16.1.100
	172.16.1.210
    }
}

# 写VIP virtual_server,只配置本地机器
virtual_server 172.16.1.210 3306 {# 定义虚拟服务器,地址与上面的virtual_ipaddress相同
    delay_loop 3		  # 健康检查时间间隔,3秒
    lb_algo rr			  # 负载均衡调度算法:rr|wrr|lc|wlc|sh|dh|lblc
    lb_kind DR			  # 负载均衡转发规则:NAT|DR|TUN
    # persistence_timeout 5	  # 会话保持时间5秒,动态服务建议开启
    protocol TCP		  # 转发协议protocol,一般有tcp和udp两种
    
	real_server 172.16.1.126 3306 {
        weight 1		  # 权重越大负载分越大,0表示失效
        notify_down /home/mysql/mysql_down.sh
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }
}

# 读VIP virtual_server,配置fwmark转发
virtual_server fwmark 1 {	
    delay_loop 3			       
    lb_algo rr				       
    lb_kind DR				       
    # persistence_timeout 5	       
    protocol TCP			      
 
    real_server 172.16.1.126 3306 {
        weight 1			        
	    notify_down /home/mysql/mysql_down.sh
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }
    real_server 172.16.1.127 3306 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }
}
 
[root@hdp1~]#

        R-VIP绑定172.16.1.126、172.16.1.127,W-VIP绑定172.16.1.126。

        172.16.1.127初始为keepalived的Backup,其上的keepalived配置文件如下:

[root@hdp4~]#more /etc/keepalived/keepalived.conf
global_defs {
   router_id LVS_DEVEL
} 
 
vrrp_sync_group VG1 {
group {
VI_1
}
}
 
vrrp_instance VI_1 {
    state BACKUP
    interface ens160 
    virtual_router_id 51
    priority 90  
    notify_master "/home/mysql/remove_slave.sh"
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        172.16.1.100
	172.16.1.210
    }
}

# 写VIP virtual_server,只配置本地机器
virtual_server 172.16.1.210 3306 {# 定义虚拟服务器,地址与上面的virtual_ipaddress相同
    delay_loop 3		  # 健康检查时间间隔,3秒
    lb_algo rr			  # 负载均衡调度算法:rr|wrr|lc|wlc|sh|dh|lblc
    lb_kind DR			  # 负载均衡转发规则:NAT|DR|TUN
    # persistence_timeout 5	  # 会话保持时间5秒,动态服务建议开启
    protocol TCP		  # 转发协议protocol,一般有tcp和udp两种
    
	real_server 172.16.1.127 3306 {
        weight 1		  # 权重越大负载分越大,0表示失效
	    notify_down /home/mysql/mysql_down.sh
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }
}

# 读VIP virtual_server,配置fwmark转发
virtual_server fwmark 2 {	
    delay_loop 3			       
    lb_algo rr				       
    lb_kind DR				       
    # persistence_timeout 5	       
    protocol TCP			      
 
    real_server 172.16.1.126 3306 {
        weight 1			        
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }
    real_server 172.16.1.127 3306 {
        weight 1
        notify_down /home/mysql/mysql_down.sh
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }
}

[root@hdp4~]#

        Master与Backup的keepalived配置文件中有以下四点不同:

  • priority设置不同,Master为100,Slave为90。
  • 写VIP 172.16.1.210绑定的是本机地址。
  • /home/mysql/mysql_down.sh脚本在本机地址下定义。
  • 根据iptables的配置,Master的fwmark标记为1,Backup的fwmark标记为2。

        配置文件中各段及其参数的配置说明参见“Keepalived+LVS+MySQL双主复制实现读写负载均衡及高可用”。

        /home/mysql/mysql_down.sh文件内容如下:

#!/bin/bash
/etc/init.d/keepalived stop

        当LVS检测到主库宕机,执行mysql_down.sh脚本,停止主库上的keepalived服务,从而使得VIP漂移到从库。

        /home/mysql/remove_slave.sh文件内容如下:

#!/bin/bash
. /home/mysql/.bashrc

user=root
password=123456
log=/home/mysql/remove_slave.log

echo "`date`" >> $log
mysql -u$user -p$password -e "set global read_only=OFF;stop slave;reset master;reset slave all;" >> $log
/bin/sed -i 's#read-only#\#read-only#' /home/mysql/mysql-5.6.14/my.cnf

        当主库宕机,172.16.1.127切换成为Master时执行remove_slave.sh脚本,停止复制,重置MySQL的master、slave状态,关闭read_only,将原来的主从复制中的slave变为master。
 

5. 编写RealServer的网络配置脚本

        在172.16.1.126和172.16.1.127上建立/etc/init.d/realserver文件,内容如下:

#!/bin/sh
RVIP=172.16.1.100
WVIP=172.16.1.210
. /etc/rc.d/init.d/functions
 
case "$1" in
# 禁用本地的ARP请求、绑定本地回环地址
start)
    /sbin/ifconfig lo down
    /sbin/ifconfig lo up
    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
    /sbin/sysctl -p >/dev/null 2>&1
	
    # 在回环地址上绑定VIP,设定掩码,与Direct Server上自身的IP保持通信
    /sbin/ifconfig lo:0 $RVIP netmask 255.255.255.255 up 
    /sbin/ifconfig lo:1 $WVIP netmask 255.255.255.255 up 
	
    /sbin/route add -host $RVIP dev lo:0
    /sbin/route add -host $WVIP dev lo:1
	
    echo "LVS-DR real server starts successfully.\n"
    ;;
stop)
    /sbin/ifconfig lo:0 down
    /sbin/ifconfig lo:1 down
    /sbin/route del $RVIP >/dev/null 2>&1
    /sbin/route del $WVIP >/dev/null 2>&1
	
    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
echo "LVS-DR real server stopped.\n"
    ;;
status)
    isLoOn=`/sbin/ifconfig lo:0 | grep "$RVIP"`
    isRoOn=`/bin/netstat -rn | grep "$RVIP"`
    if [ "$isLoON" == "" -a "$isRoOn" == "" ]; then
        echo "LVS-DR real server has run yet."
    else
        echo "LVS-DR real server is running."
    fi
    exit 3
    ;;
*)
    echo "Usage: $0 {start|stop|status}"
    exit 1
esac
exit 0

        执行下面的命令将该脚本加入开机自启动:

chmod +x /etc/init.d/realserver
echo "/etc/init.d/realserver" >> /etc/rc.d/rc.local

6. 启动RealServer和Keepalived

        在172.16.1.126和172.16.1.127上执行:

service realserver start
/etc/init.d/keepalived start

        命令执行后172.16.1.126和172.16.1.127上的IP地址分别如图3、4所示。

图3

 

图4


        可以看到172.16.1.126和172.16.1.127两个主机的回环地址都绑定了读写两个VIP,而只有172.16.1.126的本地IP绑定了读写两个VIP。此时从172.16.1.126查看LVS集群状态如下:

 

[root@hdp3~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.1.210:3306 rr
  -> 172.16.1.126:3306            Route   1      0          0         
FWM  1 rr
  -> 172.16.1.126:3306            Route   1      0          0         
  -> 172.16.1.127:3306            Route   1      0          0         
[root@hdp3~]#

三、测试

        1. 验证通过172.16.1.100连接的读负载均衡转发策略

C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.100 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 126   |
+---------------+-------+

C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.100 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 127   |
+---------------+-------+

C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.100 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 126   |
+---------------+-------+

C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.100 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 127   |
+---------------+-------+

        2. 验证通过172.16.1.210连接的读负载均衡转发策略

C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.210 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 126   |
+---------------+-------+

C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.210 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 126   |
+---------------+-------+

C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.210 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 126   |
+---------------+-------+

C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.210 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 126   |
+---------------+-------+

        3. 模拟从库的mysqld crash
        在172.16.1.127上执行以下命令:

pkill -9 mysqld

        4. 再次使用两个VIP连接,数据库服务正常。

C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.100 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 126   |
+---------------+-------+

C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.100 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 126   |
+---------------+-------+

C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.210 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 126   |
+---------------+-------+

C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.210 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 126   |
+---------------+-------+

        此时从172.16.1.127查看LVS集群状态如下,可以看到读取地址只有172.16.1.126。

[root@hdp4~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.1.210:3306 rr
  -> 172.16.1.126:3306            Route   1      0          0         
FWM  2 rr
  -> 172.16.1.126:3306            Route   1      0          0         
[root@hdp4~]#

        5. 重新启动从库的mysql服务
        在172.16.1.127上执行以下命令:

service mysql start

        6. 再次验证通过172.16.1.100连接的读负载均衡转发策略

C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.100 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 127   |
+---------------+-------+

C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.100 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 126   |
+---------------+-------+

C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.100 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 127   |
+---------------+-------+

C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.100 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 126   |
+---------------+-------+

        此时从172.16.1.127查看LVS集群状态如下,可以看到读取地址172.16.1.127被自动加回。

[root@hdp4~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.1.210:3306 rr
  -> 172.16.1.126:3306            Route   1      0          0         
FWM  2 rr
  -> 172.16.1.126:3306            Route   1      0          0         
  -> 172.16.1.127:3306            Route   1      0          0     

        7. 模拟主库的mysqld crash
        在172.16.1.126上执行以下命令:

pkill -9 mysqld

        8. 再次验证通过VIP连接的读负载均衡转发策略

C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.100 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 127   |
+---------------+-------+

C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.100 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 127   |
+---------------+-------+

C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.210 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 127   |
+---------------+-------+

C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.210 -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 127   |
+---------------+-------+

        此时查看172.16.1.127上绑定的IP如图5所示。

图5

        可以看到读写两个VIP已经漂移到172.16.1.127上。

        9. 验证切换后的新主库可读写。

C:\WINDOWS\system32>mysql -utest -p123456 -h172.16.1.210
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2104
Server version: 5.6.14-log Source distribution

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select * from test.t1;
+------+
| a    |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)

mysql> delete from test.t1;
Query OK, 3 rows affected (10.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql>

参考:

  1. MySQL半同步复制
  2. CentOS7安装iptables防火墙
  3. 利用LVS+Keepalived实现MySQL高可用(二)
  4. mysql高可用架构方案之二(keepalived+lvs+读写分离+负载均衡)
文章最后发布于: 2018-07-14 18:20:02
展开阅读全文
0 个人打赏
私信求帮助

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览