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

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

再说说用户环境,用户所有地市之间的通信使用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,是个要十分细心的工作,很多细节要注意,就不一一说了。

最新文章

  1. SQL 常用操作
  2. 【康拓展开】及其在求全排列第k个数中的应用
  3. django 同步数据库
  4. 【架构】Google的大规模集群管理工具Borg
  5. phonegap 3.3教程 地理信息api教程
  6. 微信、qq时间格式模板
  7. win7里边使用telnet命令提示telnet不是内部或外部命令
  8. Oracle11g install Bbed
  9. 纠结的ARC
  10. html onclick 传参数
  11. [51nod1329]路径游戏
  12. [Swift]LeetCode464. 我能赢吗 | Can I Win
  13. 搞懂 JavaScript 继承原理
  14. php运行出现Call to undefined function curl_init()解决方法
  15. Windows + Apache + WSGI 部署Django
  16. shell 写的 jrottenberg/ffmpeg 转码
  17. gitlab提交代码
  18. Eclipse的Servers视图中无法添加Tomcat
  19. max导出模型插件
  20. 第一章 进入java的世界

热门文章

  1. 记一次Oracle数据故障排除过程
  2. kaptcha的和springboot一起使用的简单例子
  3. 多媒体开发之---h264中 的RTP PAYLOAD 格式
  4. ASP.NET动态网站制作(7)-- JS(2)
  5. linux jdk 安装另一种方法
  6. visual studio 2010 c++ 打印 Hello world
  7. spring事务和mysql的隔离级别
  8. N皇后问题算法
  9. computed 计算属性
  10. The Log-Structured Merge-Tree (LSM-Tree