这是去年做的一个项目的记录,如果大家有更好的解决方案,欢迎指出。

先说说项目需求,用户需要在两个地市部署两套应用系统和两套数据库,在一个地市主用,在另一个热备;数据要互备;而且如果主用地市流量很大,可以分流到备用地市。

再说说用户环境,用户所有地市之间的通信使用MPLS VPN,两个地市之间使用不同的网段(甲方的内网)。

应用系统的主备和负载均衡下次再说,这儿先主要讲讲数据库内容。

1.选择数据库

  现在有很多数据库可以满足主备和负载均衡的需求,有关系型数据库,也有NoSQL数据库。

  我们选择了MySQL,做项目嘛,首先考虑的是项目成本,在关系型数据库中,能满足需求而且成本低的也就是MySQL了。对NoSQL数据库,我们考虑过mongodb和Hadoop,而且对这两个数据库都做了前期的研究评估,但因为我们的应用系统改造的成本太大,就放弃了。

  采用了MySQL,那么就看使用它的什么技术了,我们需要两个地市的数据库都能访问,那么主备技术不能采用;两个地市的数据独立完整,而且在大多数情况下使用主用地市系统,备用地市只做数据同步,不参与应用计算,不消耗网络流量,MySQL Cluster也排除了。

  最终采用了MySQL的主主备份技术,来达到数据的备份和两个数据库系统都可以访问的目的。

2.选择负载均衡技术

  对MySQL的负载均衡技术,主要有HAPROXY和LVS等,由于我们的数据库要部署在两个不同地市的不同网段上,只有LVS的隧道模式能满足我们的需求。

3.架构图

4.安装LVS

  1).安装必须文件

    

yum install -y gcc gcc-c++ makepcre pcre-devel kernel-devel openssl-devel libnl-devel popt-devel

  2).建立内核软连接

    

ln -s /usr/src/kernels/2.6.-.el5-x86_64/ /usr/src/linux

  3).安装lvs程序

    

    modprobe -l|grep ipvs

    tar xvf  ipvsadm-1.24.tar.gz

       cd ipvsadm-1.24

    make

       make install

       /etc/init.d/ipvsadm save

       /etc/init.d/ipvsadm restart

    

  在真实机器上的配置脚本:

  

#!/bin/bash
# description: Config realserver lo and apply noarp SNS_VIP=192.168.1.1 /etc/rc.d/init.d/functions case "$1" in
start)
ifconfig tunl0 $SNS_VIP netmask 255.255.255.255 broadcast 192.168.2.255
/sbin/route add -host $SNS_VIP dev tunl0
echo "" >/proc/sys/net/ipv4/conf/tunl0/arp_ignore #主要是实现禁止响应对VIP的ARP请求
echo "" >/proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "" >/proc/sys/net/ipv4/conf/all/arp_announce
echo > /proc/sys/net/ipv4/conf/tunl0/rp_filter
echo > /proc/sys/net/ipv4/conf/tunl0/forwarding
echo > /proc/sys/net/ipv4/ip_forwarding
sysctl -p >/dev/null >&
echo "RealServer Start OK" ;;
stop)
ifconfig tunl0 down
route del $SNS_VIP >/dev/null >&
echo "" >/proc/sys/net/ipv4/conf/tunl0/arp_ignore
echo "" >/proc/sys/net/ipv4/conf/tunl0/arp_announce
echo "" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit
esac
exit

5.安装Keepalived

  

  tar xvf keepalived-1.1..tar.gz

  cd keepalived-1.1.

  ./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.-.el5-x86_64 --enable-lvs

  make

  make install

  cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

  cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

  mkdir -p /etc/keepalived

  /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived

  /usr/local/keepalived/sbin/keepalived /usr/sbin/

   chkconfig keepalived on

    keepalived.conf文件内容

    

! Configuration File for keepalived

global_defs {
notification_email {
  **********
}
notification_email_from *****
smtp_server 192.168.200.1
smtp_connect_timeout
router_id LVS_MASTER
} vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id
priority
advert_int
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
192.168.2.1
}
} virtual_server 192.168.2.1 {
delay_loop
lb_algo wrr
lb_kind TUN
nat_mask 255.255.255.0
persistence_timeout
protocol TCP
real_server 192.168.1.1 {
weight
TCP_CHECK {
connect_timeout
nb_get_retry
delay_before_retry
connect_port
} } real_server 192.168.3.1 {
weight
TCP_CHECK {
connect_timeout
nb_get_retry
delay_before_retry
connect_port
}
}
}

6.安装MySQL

  MySQL数据库的安装我就不记录了,主要记录一下主主备份的配置。

  1).在两台数据库上创建同步账户

    

grant replication slave on *.* to mysqldb1@'192.168.3.1' identified by '*****';

  2).修改数据库配置文件

    

[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8
server-id= #mysql5.5默认有
log-bin=mysql-bin #mysql5.5默认有
binlog-ignore-db=mysql #mysql库将不同步
auto_increment_offset= #是基数,两边不同server1设置1,server2设置2
auto_increment_increment= #大于等于复制集群中服务器的数量
[client]
default-character-set= utf8
[mysqld]
character-set-server= utf8
server-id= #将默认的1改为2,该值为两边不相同的任意数字
log-bin=mysql-bin #mysql5.5默认有
binlog-ignore-db=mysql #mysql库将不同步
auto_increment_offset= #是基数,两边不同server1设置1,server2设置2
auto_increment_increment= #大于等于复制集群中服务器的数量

  3).执行数据同步

  

  
 show master status\G

   结果:  
      File: binlog.000007
      Position: 107
      Binlog_Do_DB: test
      Binlog_Ignore_DB: mysql
      1 row in set (0.00 sec)
   依据结果,执行下面的语句
  
change master to master_host='192.168.1.2', master_user='xxx', master_password='*******', master_log_file='binlog.000007', master_log_pos=107;

7.注意事项

  1).数据库链接数要依据项目调整

  2).数据库链接的生命周期和LVS会话管理周期的调整    ipvsadm --set 120 20 100,如果时间过短,每次外部请求都会是一个新的链接,超过数据库最大链接数

  3).在真实机器上要配置隧道接口,并且要关闭VIP的ARP请求

  4).在lvs虚拟机上不手动配置隧道接口,用keepalived去自动管理,但在真实机上要手动创建(可以写开机脚本)

  5).在项目中lvs所在区域如果断网,则负载均衡也失效了,只能手动切换至备用系统

  搭建lvs,是个要十分细心的工作,很多细节要注意,就不一一说了。

一次LVS+MySQL的主主负载均衡实战的更多相关文章

  1. (转载)Nginx/LVS/HAProxy三种主流负载均衡软件的对比

    原地址:http://www.ha97.com/5646.html PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些 ...

  2. LVS+Keepalived 实现高可用负载均衡

    前言 在业务量达到一定量的时候,往往单机的服务是会出现瓶颈的.此时最常见的方式就是通过负载均衡来进行横向扩展.其中我们最常用的软件就是 Nginx.通过其反向代理的能力能够轻松实现负载均衡,当有服务出 ...

  3. Windows+IIS结合LVS+Keepalived是实现Linux负载均衡软件

    在Discuz!NT的最新版本(企业版)中,支持目前主流LINUX平台上的负载均衡解决方案,比如NGINX,HAPROXY,LVS等.本文与其说是解决方案,倒不如说是介绍如何搭建Discuz!NT负载 ...

  4. LVS基于NAT模式搭建负载均衡群集

    LVS的基本架构图 负载均衡群集中,包括三个层次的组件: 1.第一层,负载调度器(BL) 前段至少有一个负载调度器(Load Balancer 或称为Director)负责响应并分发来自客户端的访问请 ...

  5. 【Nginx】(主从热备)LVS+Keepalived+Nginx实现高性能负载均衡集群

    一.LVS 1.1 概述 1.2 Nginx与LVS区别什么 二.Keepalived 2.1 概述 2.2 keepalived和其工作原理 三.LVS+Keepalived+Nginx 搭建双机主 ...

  6. LVS+Keepalived 实现高可用负载均衡集群

    LVS+Keepalived  实现高可用负载均衡集群     随着网站业务量的增长,网站的服务器压力越来越大?需要负载均衡方案!商业的硬件如 F5 ,Array又太贵,你们又是创业型互联公司如何有效 ...

  7. LVS+Keepalived实现高可用负载均衡(转)

    LVS+Keepalived实现高可用负载均衡   一.原理         1.概要介绍         如果将TCP/IP划分为5层,则Keepalived就是一个类似于3~5层交换机制的软件,具 ...

  8. lvs+keepalived+nginx实现高性能负载均衡集群【转】

    转自 lvs+keepalived+nginx实现高性能负载均衡集群 - 青衫lys - 博客园http://www.cnblogs.com/liuyisai/p/5990645.html 一.为什么 ...

  9. 【架构师之路】 LVS+Keepalived实现高可用负载均衡

    一.原理        1.概要介绍        如果将TCP/IP划分为5层,则Keepalived就是一个类似于3~5层交换机制的软件,具有3~5层交换功能,其主要作用是检测web服务器的状态, ...

  10. centos7使用haproxy1.7.5实现反向代理负载均衡实战

    使用haproxy实现反向代理负载均衡实战环境准备:两台虚拟机 # yum install -y gcc glibc gcc-c++ make screen tree lrzsz node1源码编译安 ...

随机推荐

  1. 关于海康视频采集卡的简介---基于pci的插潮采集卡

    vga 640x480 qvga vga的1/4,宽高分别是vga的一半 (1)采集类型 海康威视 DS-2CE16A2P-IT3P 700TVL 1/3" DIS ICR 红外防水筒型摄像 ...

  2. 获取网站的BaseURL

    //get base URL            var _urlstr = window.location.href;            if (_urlstr.indexOf("? ...

  3. 一步一步学ios UITextView(多行文本框)控件的用法详解(五5.8)

    本文转载至 http://wuchaorang.2008.blog.163.com/blog/static/48891852201232014813990/     1.创建并初始化 创建UIText ...

  4. python 基础 1.5 python 数据类型(一)--整型 浮点型 布尔型及字符串和常用方法

    一.python 数据类型:数值,字符串,列表,元组,字典.以下操作是在linux 下 ipython中进行 1.数值 1>123  与  “123”的区别 答:123为数值,“123”在pyt ...

  5. memcached系列

    memcached系列:http://blog.csdn.net/xingxing513234072/article/category/2462865

  6. squid代理缓存服务器

    参考文章 http://www.cnblogs.com/mchina/p/3812190.html ;

  7. iOS 流布局 UICollectionView使用(UICollectionVIew的代理方法)

    UICollectionViewDataSource协议 这个协议主要用于collectionView相关数据的处理,包含方法如下: 设置分区数(这个是可选实现的) - (NSInteger)numb ...

  8. main方法的参数

    敲例子的时候无意中把主方法的参数给落下了,当时没有发现,保存之后就去编译,运行了,通常情况下编译没有错误那胜利就在掌握之中了,没想到这次我竟然在"不一般"的行列中,编译无误,运行出 ...

  9. HTML——input

    一个简单的HTML表单,包含两个文本输出框和一个提交按钮: <form action="form_action.asp" method="get"> ...

  10. ceph分布式存储系统初探

    前言 由于公司的业务调整,现在我又要接触ceph这个东西,由于我接手的是一个网盘类项目,所以分布式存储系统ceph就是我必须要学的了.现在压力还是比较大的,从业务直接到后台核心. 大概在这几天,我将c ...