LVS为MySQL读提供负载均衡配置笔记

数据库在整体平台设计中都有很重要的作用,由此也衍生出了很多骚操作。波波不去一一列举为解决业务场景所使用的各种骚操作,本篇笔记主要记录LVS为MySQL读提供负载均衡配置过程。不见得适合所有的人,大家看看就行。

mysql数据库的读写分离

一、YUM安装LVS和Keepalived

1、配置阿里云的YUM源

  1. #clean OS default repo
  2. mkdir /etc/yum.repos.d/old && mv /etc/yum.repos.d/C* /etc/yum.repos.d/old/
  3. #add local repo
  4. wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
  5. wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

2、安装

  1. yum install ipvsadm keepalived

二、配置Keepalived

备注:keepalived配置文件目录/etc/keepalived,从库状态检查脚本目录/etc/keepalived。

  1. ! Configuration File for keepalived
  2. global_defs {
  3.    router_id MHA-A
  4. }
  5. # db Read
  6. vrrp_instance VI_1 {
  7.     state MASTER
  8.     interface eth0
  9.     virtual_router_id 51
  10.     priority 150
  11.     advert_int 6
  12.     authentication {
  13.         auth_type PASS
  14.         auth_pass 123qwe
  15.     }
  16.     virtual_ipaddress {
  17.         192.168.0.21/24
  18.     }
  19. }
  20. # VIP 192.168.0.21
  21. virtual_server 192.168.0.21 3306 {
  22.     delay_loop 10
  23.     lb_algo rr
  24.     lb_kind DR
  25.     nat_mask 255.255.255.0
  26.     protocol TCP
  27.     #sorry_server 192.168.0.235 3306
  28.     real_server 192.168.0.235 3306 {
  29.         weight 1
  30.         TCP_CHECK {
  31.           connect_port 3306
  32.           connect_timeout 10
  33.           nb_get_retry 3
  34.           delay_before_retry 5
  35.         }
  36.         MISC_CHECK {
  37.           misc_path "/etc/keepalived/check_slave.pl 192.168.0.235 3306"
  38.           misc_dynamic
  39.         }
  40.     }
  41.         real_server 192.168.0.236 3306 {
  42.         weight 1
  43.         TCP_CHECK {
  44.           connect_port 3306
  45.           connect_timeout 10
  46.           nb_get_retry 3
  47.           delay_before_retry 5
  48.         }
  49.         MISC_CHECK {
  50.           misc_path "/etc/keepalived/check_slave.pl 192.168.0.236 3306"
  51.           misc_dynamic
  52.         }
  53.     }
  54. }

三、所有从库绑定读VIP

编写脚本/app/scripts/lvs-start-client-read.sh

  1. #!/bin/bash
  2. #real_server.sh
  3. vip=192.168.0.21
  4. open() {
  5.         sudo ifconfig lo:Rvip ${vip}/32 up
  6.         sudo sysctl -w net.ipv4.conf.lo.arp_announce=2
  7.         sudo sysctl -w net.ipv4.conf.lo.arp_ignore=1
  8.         sudo sysctl -w net.ipv4.conf.all.arp_announce=2
  9.         sudo sysctl -w net.ipv4.conf.all.arp_ignore=1
  10. }
  11. close() {
  12.         sudo ifconfig lo:Rvip down
  13.         sudo sysctl -w net.ipv4.conf.lo.arp_announce=0
  14.         sudo sysctl -w net.ipv4.conf.lo.arp_ignore=0
  15.         sudo sysctl -w net.ipv4.conf.all.arp_announce=0
  16.         sudo sysctl -w net.ipv4.conf.all.arp_ignore=0
  17. }
  18. case $1 in
  19. start)
  20.         open
  21. ;;
  22. stop)
  23.         close
  24. ;;
  25. *)
  26.         echo "Usage: $0 need argument  [start|stop]"
  27. ;;
  28. esac

启动Keepalived,观察连接情况。

四、查看LVS状态

  1. watch -n1 ipvsadmin -Ln

上传 /etc/keepalived/check_slave.pl 内容如下:

  1. #!/usr/bin/perl -w
  2. use DBI;
  3. use DBD::mysql;
  4. # CONFIG VARIABLES
  5. $SBM = 200;
  6. $db = "information_schema";
  7. $host = $ARGV[0];
  8. $port = $ARGV[1];
  9. $user = "repl";
  10. $pw = "replpassword";
  11. # SQL query
  12. $query = "show slave status";
  13. $dbh = DBI->connect("DBI:mysql:$db:$host:$port", $user, $pw, { RaiseError => 0,PrintError => 0 });
  14. #print "$db, $host , $port , $user, $pw";
  15. if (!defined($dbh)) {
  16.     #print "connect fail.";
  17.     exit 1;
  18. }
  19. $sqlQuery = $dbh->prepare($query);
  20. $sqlQuery->execute;
  21. $Slave_IO_Running =  "";
  22. $Slave_SQL_Running = "";
  23. $Seconds_Behind_Master = "";
  24. while (my $ref = $sqlQuery->fetchrow_hashref()) {
  25.     $Slave_IO_Running = $ref->{'Slave_IO_Running'};
  26.     $Slave_SQL_Running = $ref->{'Slave_SQL_Running'};
  27.     $Seconds_Behind_Master = $ref->{'Seconds_Behind_Master'};
  28. }
  29. #print "Slave_IO_Running = $Slave_IO_Running\n";
  30. #print "Slave_SQL_Running = $Slave_SQL_Running\n";
  31. #print "Seconds_Behind_Master = $Seconds_Behind_Master\n";
  32. $sqlQuery->finish;
  33. $dbh->disconnect();
  34. if ( $Slave_IO_Running eq "No" || $Slave_SQL_Running eq "No" || $Slave_IO_Running eq "" || $Slave_SQL_Running eq "" ||  $Seconds_Behind_Master eq "NULL" || $Seconds_Behind_Master eq "" ) {
  35. #print "Slave_IO_Running = $Slave_IO_Running\n";
  36. #print "Slave_SQL_Running = $Slave_SQL_Running\n";
  37. #print "Seconds_Behind_Master = $Seconds_Behind_Master\n";
  38.     exit 1;
  39. else {
  40.     if ( $Seconds_Behind_Master > $SBM ) {
  41.         #print "Seconds_Behind_Master > SBM";
  42.     exit 1;
  43.     } else {
  44.         #print "Seconds_Behind_Master < SBM";
  45.         exit 0;
  46.     }
  47. }

 

你想把广告放到这里吗?

发表评论

您必须 登录 才能发表留言!