atlas+lvs+keepalived mysql多主复制负载均衡搭建

标签: atlas lvs keepalived | 发表时间:2014-08-29 19:30 | 作者:xmarker
出处:http://xmarker.blog.163.com
基于mysql的负载均衡有很多种方式,如haproxy,前面一篇博客有介绍,还可以用更高效lvs做负载均衡,下面是基于percona xtradb cluster的三个节点的多主复制+atlas的lvs负载均衡,其实这里是不需要用atlas的,因为atlas是用来做连接池和读写分离的,而多主架构是不需要读写分离的(如果是基于mysql replication的就需要atlas做负载均衡了),但为了测试atlas能不能用lvs做负载均衡,就顺便做了下实验。

1.节点规划
1.1 mysql数据节点:
db169
db172
db173
三个节点为xtradb cluster节点。
 
1.2 keepalived节点:
db162
db163
虚拟ip为192.168.1.201 
haproxy节点(仅为了对比lvs的性能才安装的):db169(部署在xtradb cluster的一个节点上)

1.3 atlas节点:和xtradb cluster节点部署在一起,也为三个节点
注意:atlas和mysql要部署在一个节点上,如果不在一个节点上则不能用lvs dr模式负载均衡

1.4 客户端测试节点:db55
ip地址为192.168.1.*  ,节点名为db+ip地址末位

2.安装lvs及keepavlied(db162、db163上)
2.1安装依赖包
yum -y install kernel-devel make gcc openssl-devel libnl*
下载并连接linux kernel文件,注意版本要一致(uname -a)
[root@db163 ~]# ln -s /usr/src/kernels/2.6.32-358.el6.x86_64/ /usr/src/linux
安装keepalived、lvs
[root@db162 ~]# yum install ipvsadm
[root@db162 ~]# yum install keepalived
[root@db163 ~]# yum install ipvsadm
[root@db163 ~]#  yum install keepalived

2.2.配置keepavlied,注意lvs不需要单独配置,在keepalived里配置就行了
[root@db162 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id MySQL_LB1
}

vrrp_sync_group VSG {
    group {
        MySQL_Loadblancing
    }
}

vrrp_instance MySQL_Loadblancing {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.1.201
    }
}

virtual_server 192.168.1.201 1234 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    # nat_mask 255.255.255.0
    #persistence_timeout 50
    protocol TCP

    real_server 192.168.1.169 1234 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 1234
        }
    }
    real_server 192.168.1.172 1234 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 1234
        }
    }
real_server 192.168.1.173 1234 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 1234
        }
    }
}
 
备机上的keepalived配置 
[root@db163 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id MySQL_LB2
}

vrrp_sync_group VSG {
    group {
        MySQL_Loadblancing
    }
}

vrrp_instance MySQL_Loadblancing {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.1.201
    }
}

virtual_server 192.168.1.201 1234 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    # nat_mask 255.255.255.0
    #persistence_timeout 50
    protocol TCP

    real_server 192.168.1.169 1234 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 1234
        }
    }
    real_server 192.168.1.172 1234 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 1234
        }
    }
real_server 192.168.1.173 1234 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 1234
        }
    }
}


3.realserver(数据节点)上的配置
分别在三个数据节点db169、db172、db173上安装如下脚本:
[root@db172 ~]# cat /etc/init.d/lvsdr.sh 
#!/bin/bash
VIP=192.168.1.201                     
. /etc/rc.d/init.d/functions                     
case "$1" in
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
    /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 up
    /sbin/route add -host $VIP dev lo:0  
    echo "LVS-DR real server starts successfully.\n"                    
    ;;    
stop)    
    /sbin/ifconfig lo:0 down    
    /sbin/route del $VIP >/dev/null 2>&1    
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore    
    echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce    
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore    
    echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce    
    echo "LVS-DR real server stopped." 
    ;;
status)
    isLoOn=`/sbin/ifconfig lo:0 | grep "$VIP"`
    isRoOn=`/bin/netstat -rn | grep "$VIP"`
    if [ "$isLoOn" == "" -a "$isRoOn" == "" ]; then
       echo "LVS-DR real server has to run yet."
    else
       echo "LVS-DR real server is running."
    fi
    exit 3
    ;;
*)    
    echo "Usage: $0 {start|stop|status}" 
    exit 1    
esac                     
exit 0
增加x权限:chmod +x /etc/init.d/lvsdr.sh 
增加开机自启动:echo "/etc/init.d/lvsdr.sh start" >> /etc/rc.local

4.分别在三个数据节点db169、db172、db173上安装atlas
下载atlas,并yum安装
yum install -y Atlas-2.1.el6.x86_64.rpm 
配置atlas
[root@db172 ~]# cat /usr/local/mysql-proxy/conf/test.cnf 
[mysql-proxy]

#带#号的为非必需的配置项目

#管理接口的用户名
admin-username = admin

#管理接口的密码
admin-password = 123456

#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
proxy-backend-addresses = 192.168.1.173:3306

#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
proxy-read-only-backend-addresses = 192.168.1.169:3306@1,192.168.1.172:3306@1

#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!
pwds = usr_test:/iZxz+0GRoA=, usr_test2:/iZxz+0GRoA= ,root:/iZxz+0GRoA=

#设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true
daemon = true

#设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为true
keepalive = true

#工作线程数,对Atlas的性能有很大影响,可根据情况适当设置
event-threads = 10

#日志级别,分为message、warning、critical、error、debug五个级别
log-level = message

#日志存放的路径
log-path = /usr/local/mysql-proxy/log

#SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,REALTIME代表记录SQL日志且实时写入磁盘,默认为OFF
#sql-log = OFF

#实例名称,用于同一台机器上多个Atlas实例间的区分
#instance = test

#Atlas监听的工作接口IP和端口
proxy-address = 0.0.0.0:1234

#Atlas监听的管理接口IP和端口
admin-address = 0.0.0.0:2345

#分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不需要设置该项
#tables = person.mt.id.3

#默认字符集,设置该项后客户端不再需要执行SET NAMES语句
#charset = utf8

#允许连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔,若不设置该项则允许所有IP连接,否则只允许列表中的IP连接
#client-ips = 127.0.0.1, 192.168.1

#Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置,否则可以不设置
#lvs-ips = 192.168.1.1

5.启动数据节点(分别在三个数据节点上db169、db172、db173)
5.1 启动mysql数据库
5.2 启动atlas :  /usr/local/mysql-proxy/bin/mysql-proxyd test start
5.3 启动lvs脚本: /etc/init/lvsdr.sh start

6.启动keepalived(db162、db163上)
/etc/init.d/keepalived start

7.验证:
启动keepalived后,主节点为db162,查看vip是不是启动了:
[root@db162 ~]# ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:1d:7d:a8:40:d9 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.162/24 brd 192.168.1.255 scope global eth0
    inet 192.168.1.201/32 scope global eth0
    inet6 fe80::21d:7dff:fea8:40d9/64 scope link 
       valid_lft forever preferred_lft forever
验证此节点没有1234端口监听:
[root@db162 ~]# netstat -anp|grep 1234
此处无输出

在192.168.1.55(db55)上连接192.168.1.201(注意此节点没有1234端口在监听,发来的连接会被路由到真正的数据节点)
[root@db55 ~]# mysql -h 192.168.1.201 -P1234 -uroot -p123456
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1871354501
Server version: 5.0.81-log Percona XtraDB Cluster binary (GPL) 5.6.19-25.6, Revision 824, wsrep_25.6.r4111

Copyright (c) 2000, 2014, 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> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| dd                 |
| mcldb              |
| mysql              |
| mysqlslap          |
| performance_schema |
| test               |
+--------------------+
7 rows in set (0.00 sec)
数据是正确的

8.监控lvs
使用sysbench压力测试,然后监控线程分布:
[root@topdb soft]# sysbench --test=oltp --num-threads=100 --max-requests=100000  --oltp-table-size=1000000 --oltp-test-mode=nontrx --db-driver=mysql --mysql-db=dd --mysql-host=192.168.1.201 --mysql-port=1234 --mysql-user=root --mysql-password=123456 --oltp-nontrx-mode=select --oltp-read-only=on --db-ps-mode=disable run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 100

Doing OLTP test.
Running non-transactional test
Doing read-only test
Using Special distribution (12 iterations,  1 pct of values are returned in 75 pct cases)
Using "BEGIN" for starting transactions
Using auto_inc on the id column
Maximum number of requests for OLTP test is limited to 100000
Threads started!
Done.

OLTP test statistics:
    queries performed:
        read:                            100033
        write:                           0
        other:                           0
        total:                           100033
    transactions:                        100033 (13416.81 per sec.)
    deadlocks:                           0      (0.00 per sec.)
    read/write requests:                 100033 (13416.81 per sec.)
    other operations:                    0      (0.00 per sec.)

Test execution summary:
    total time:                          7.4558s
    total number of events:              100033
    total time taken by event execution: 744.5136
    per-request statistics:
         min:                                  0.71ms
         avg:                                  7.44ms
         max:                                407.23ms
         approx.  95 percentile:              28.56ms

Threads fairness:
    events (avg/stddev):           1000.3300/831.91
    execution time (avg/stddev):   7.4451/0.00
[root@db162 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.201:1234 rr
  -> 192.168.1.169:1234           Route   3      0          33        
  -> 192.168.1.172:1234           Route   3      0          34        
  -> 192.168.1.173:1234           Route   3      0          34        
    
可以看出负载均衡在了三个节点。
另外可以自己关机测试下keepalived的故障转移。

注意点:
1.atlas和mysql数据节点要放在一台机器上,如果atlas在别处搭建,则lvs会无法使用。
2.keepavlied最好和数据节点不在同一台机器上,否则可能会有问题。
3.最好有真机测试,虚拟机上之前一直没捣鼓好。
4.keepalived配置最好根据示例文件修改,如果有空格、tab键不规范,可能造成无法争取读取配置,并且不给出错误提示。
  

相关 [atlas lvs keepalived] 推荐:

atlas+lvs+keepalived mysql多主复制负载均衡搭建

- - x-marker的博客
1.1 mysql数据节点:. 三个节点为xtradb cluster节点. 1.2 keepalived节点:. 虚拟ip为192.168.1.201 . haproxy节点(仅为了对比lvs的性能才安装的):db169(部署在xtradb cluster的一个节点上). 1.3 atlas节点:和xtradb cluster节点部署在一起,也为三个节点.

配置LVS+Keepalived

- -
lvs说明:目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR);. 八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh). 在调度器的实现技术中,IP负载均衡技术是效率最高的. 在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出通过IP隧道实现虚拟服务器的方法VS/TUN (Virtual Server via IP Tunneling),和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提高系统的伸缩性.

lvs+keepalived 负载均衡

- - CSDN博客系统运维推荐文章
LVS是一个开源的软件,可以实现LINUX平台下的简单负载均衡. LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器. 目前有三种IP负 载均衡技术(VS/NAT、VS/TUN和VS/DR);八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh).

LVS+Keepalived实现高可用集群(转)

- - 行业应用 - ITeye博客
操作系统平台:CentOS5.2. 软件:LVS+keepalived. LVS+Keepalived 介绍. LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统. 本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项 目之一.

lvs 问题

- - 操作系统 - ITeye博客
1: LVS连接的持久时间. 1)同一个ip发来请求到同一台RS的持久超时时间. ipvsadm -A -t 192.168.169.100:80 -s rr -p 120     #该客户的请求120秒内被分配给同一台web.  2)一个链接创建后空闲时的超时时间(分别是:tcp的空闲超时时间、lvs收到客户端tcp fin的超时时间、udp的超时时间).

Keepalived安装

- - CSDN博客架构设计推荐文章
Keepalived 是一种高性能的服务器高可用或热备解决方案,Keepalived可以用来防止服务器单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生,通过配合Nginx可以实现web前端服务的高可用. 安装Keeplived依赖. 安装 openssl. #通知email,根据实际情况配置 { [email protected] } notification_email_from [email protected] smtp_server 127.0.0.1 stmp_connect_timeout 30 router_id node1.

LVS调度算法

- - CSDN博客推荐文章
rr 轮询调度(Round-Robin). 它将请求一次分配不同的RS,也就是在RS中均摊请求,算法简单,但是只适合于RS处理性能相差不大的情况(多个服务器硬件配置差不多). wrr加权轮询调度(Weighted Round-Robin). 它根据RS不同的权值分配任务,权值高的RS优先获得请求,分配到的连接数将比权值低的RS更多,权值相同的RS得到的连接数数目相同.

LVS快速搭建教程

- - 博客园_首页
     1、使用VS/NAT调度.      2、使用VS/TUN调度.      3、使用VS/DR调度.     相信专程来读此文的读者对LVS必然有一定的了解,首先看图:. 毋庸置疑,Load Balancer是负载调度器,由它将网络请求无缝隙调度到真实服务器,至于此集群使用的是哪一种IP负载均衡技术(LVS有三种负载均衡技术,分别是VS/NAT、VS/TUN和VS/DR),暂时不用理会.

负载均衡之LVS

- - 标点符
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统. 是由章文嵩博士发起的自由软件项目. LVS主要用于多服务器的负载均衡. 它工作在网络层,可以实现高性能,高可用的服务器集群技术. 它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器.

【MySQL数据库之Atlas介绍】

- - ITeye博客
Atlas is a MySQL protocol-based database middleware project developed and maintained by infrastructure team of the Web platform Department in QIHU 360 SOFTWARE CO.