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

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

再说说用户环境,用户所有地市之间的通信使用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. iOS打包(ipa包)

    1.打开XCode打开project文件.选择Product,再点击Archive. 2.鼠标右键点击Shoe In Finder 3.鼠标右键选择"显示包内容" 4.鼠标左键双击 ...

  2. Unity3D自定义编辑器简单实例

    MenuItem:在标题栏自定义菜单.需要在Editor文件夹内创建脚本,无需挂载.但是注意其下的函数必须为静态函数. using UnityEngine; using UnityEditor; pu ...

  3. go module

    前言 go 1.5 引进了vendor管理工程依赖包,但是vendor的存放路径是在GOPATH底下,另外每个依赖还可以有自己的vendor,通常会弄得很乱,尽管dep管理工具可以将vendor平级化 ...

  4. sql server单引号和双引号的区别

    --当 SET QUOTED_IDENTIFIER 为 ON 时,标识符可以由双引号分隔,而文字必须由单引号分隔--当 SET QUOTED_IDENTIFIER 为 OFF(默认值)时,表达式中的文 ...

  5. 使用SqlDependency监听MSSQL数据库表变化通知

    SqlDependency提供了这样一种机制,当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的. ...

  6. python中的raw字符串

    在正则表达式的字符串前面加上r表示这个是一个raw字符串,只以正则表达式的元字符进行解析,不用理会ascii的特殊字符.

  7. apache 301重定向到带www的二级域名

    Options +FollowSymlinks RewriteEngine on rewritecond %{http_host} ^nlike.cn [nc] rewriterule ^(.*)$ ...

  8. mysql系列之8.mysql高可用 (keepalived)

    环境: centos6.5_x64 准备: 两台mysql机器 主1 master:  192.168.32.130 主2 backup:  192.168.32.131 VIP: 192.168.3 ...

  9. Swift 学习笔记 (解决Swift闭包中循环引用的三种方法)

    话不多说 直接上代码 class SmartAirConditioner { var temperature:Int = //类引用了函数 var temperatureChange:((Int)-& ...

  10. win7怎么设置打印机共享

    一.设置好家庭组,让客户机加入家庭组 二.对服务机的打印机进行共享设置,如果保存不成功请在计算机服务那里打开防火墙 三.1.开启guest用户,具体操作:我的电脑右击---管理---本地用户和组--开 ...