前言

  开心一刻

    和朋友去吃小龙虾,隔壁桌一个小女孩问妈妈:"妈妈,小龙虾回不了家,它妈妈会不会着急?" 她妈妈愣住了,我扒虾的手停下了,这么善良的问题,怎么下得了口。这是老板急忙过来解围:"不会的,不会的,它们全家都在这了。"

  路漫漫其修远兮,吾将上下而求索!

  github:https://github.com/youzhibing

  码云(gitee):https://gitee.com/youzhibing

前情回顾

  Mycat - 实现数据库的读写分离与高可用中我们实现了mysql的读写分离与高可用,有几个点我们回顾下

    1、数据的同步在mysql层面实现的,mycat不负责任何的数据同步,我们需要配置mysql的主从复制来实现数据的同步;

    2、数据库的读写分离是mycat最常用的场景之一,我们的应用代码只需要关注业务代码,而不需要处理数据库读写、分片问题,这些都由Mycat实现,简化了开发;

    3、读写分离往往伴随着高可用,而Mycat同时支持这两者;

  那是不是就完美无缺了呢? 显然还有点小瑕疵,此时我们的Mycat是单点部署的,如果Mycat服务挂了,那么整个数据库端就挂了,整个应用也就不能正常服务了,那怎么办了? 很明显,我们需要实现Mycat的高可用,具体实现我们往下看。

keepalived实现Mycat高可用

  centos7_1 (192.168.1.110)上搭建mycat

    上篇博文中,我们搭建的读写分离各组件关系如下

    此时还是单节点的mycat,我们还需要搭建一个mycat,搭建过程可以参考192.168.1.212上mycat的搭建,具体我就不演示了,搭建好之后各组件关系如下

    昨天我们测试了master mysql宕机的情况,后续的DML SQL与Select SQL都是走的slave mysql,所以此时mysql的主从复制已经被破环、mycat的writeHost也切换到了192.168.1.211,我们需要重新配置mysql的主从复制,192.168.1.210仍是主,192.168.1.211回退为slave,并将192.168.1.212上mycat的writeHost进行还原(只需要将mycat/conf/dnindex.properties文件删了即可);生产环境不要这么处理,按上篇说的处理。

    我们来看下测试结果

    可以看到,192.168.1.110上的mycat与192.168.1.212上的mycat具有完全一样的功能,但此时两者还没有任何联系,彼此也互不影响。我们可以在应用代码中集成两个mycat,由代码控制mycat的高可用,这种方式可行但不可取,代码应该更多的关注业务层,而不是处理数据库层面的高可用问题。mycat的高可用应该就由更专业的组件来处理。

  keepalived实现vip对外提供服务

    VIP:192.168.1.200、master:192.168.1.212、backup:192.168.1.110

    keepalived的搭建过程可参考:主从热备+负载均衡(LVS + keepalived),这里就不做详细的演示了。

    192.168.1.212(master)上keepalived.conf

  1. global_defs {
  2. notification_email {
  3. 997914490@qq.com
  4. }
  5. notification_email_from sns-lvs@gmail.com
  6. #smtp_server smtp.hysec.com
  7. #smtp_connection_timeout 30
  8. router_id mycat_master # 设置mycat master的id,在一个网络应该是唯一的
  9. }
  10. vrrp_script chk_mycat_alive {
  11. script "/usr/local/src/mycat/check_pid.sh" # 返回状态码为0表示正常,检测脚本为true;返回状态码非0表示异常,检测脚本为false
  12. interval 2 # 检测脚本执行的间隔,单位是秒
  13. weight 20
  14. }
  15. vrrp_instance VI_1 {
  16. state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备
  17. interface eth0 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
  18. virtual_router_id 66 # 虚拟路由编号,同集群,主备必须一致
  19. priority 100 # 优先级,数值越大,获取处理请求的优先级越高
  20. advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
  21. authentication {
  22. auth_type PASS
  23. auth_pass 1111
  24. }
  25. track_script {
  26. chk_mycat_alive # 调用检测脚本
  27. }
  28. virtual_ipaddress {
  29. 192.168.1.200 # 定义虚拟ip(VIP),可多设,每行一个
  30. }
  31. }

    192.168.1.110(backup)上keepalived.conf

  1. global_defs {
  2. notification_email {
  3. 997914490@qq.com
  4. }
  5. notification_email_from sns-lvs@gmail.com
  6. #smtp_server smtp.hysec.com
  7. #smtp_connection_timeout 30
  8. router_id mycat_backup # 设置mycat backup的id,在一个网络应该是唯一的
  9. }
  10. vrrp_script chk_mycat_alive {
  11. script "/usr/local/src/mycat/check_pid.sh" #mycat检测脚本
  12. interval 2 #(检测脚本执行的间隔,单位是秒)
  13. weight 20
  14. }
  15. vrrp_instance VI_1 {
  16. state BACKUP # 指定keepalived的角色,MASTER为主,BACKUP为备
  17. interface enp0s3 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
  18. virtual_router_id 66 # 虚拟路由编号,同集群,主备必须一致
  19. priority 90 # 优先级,数值越大,获取处理请求的优先级越高
  20. advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
  21. authentication {
  22. auth_type PASS
  23. auth_pass 1111
  24. }
  25. track_script {
  26. chk_mycat_alive #(调用检测脚本)
  27. }
  28. virtual_ipaddress {
  29. 192.168.1.200 # 定义虚拟ip(VIP),可多设,每行一个
  30. }
  31. }

    mycat存活检测脚本check_pid.sh

  1. #!/bin/bash
  2. count=`/usr/local/mycat/bin/mycat status |grep 'Mycat-server is running' | wc -l`
  3. time=$(date "+%Y-%m-%d %H:%M:%S")
  4. if [ $count = 0 ]; then
  5. echo "$time : count=$count, mycat is not running..." >> /var/log/keepalived_check.log
  6. exit 1 # 返回1说明脚本非正常执行,mycat不在运行中
  7. else
  8. echo "$time : count=$count, mycat is running..." >> /var/log/keepalived_check.log
  9. exit 0 # 返回0说明脚本正常执行,mycat正在运行中
  10. fi

      脚本目录:/usr/local/src/mycat/,给脚本可执行权限:[root@centos7-01 src]# chmod -R 755 mycat/check_pid.sh

    各组件关系图如下

    如上图所示,外部应用向192.168.1.200发送sql请求,keepalived完成VIP到ip的映射,请求会落到具体的某个mycat上,再由mycat转发到具体的mysql上。同一时刻只会有一个keepavlied处理VIP,一般而言是优先级高的keepalived会成为master,负责VIP的映射。各组件配置好之后,我们来看看测试结果

    1、vip的正常绑定与切换

      一开始212和110都没有启动mycat,优先级分别是100,90,所以vip在212上,212成为master,110成为backup;接着我们启动了110上的mycat,检测脚本返回0,vrrp_script中script为true,此时110的权重=90+20,大于212的100,110抢占vip成为master,而212则降级成为backup;然后我们启动了212上的mycat,212的权重=100+20,大于110的110,vip漂浮到212上,212成为master,110成为backup;最后我们停了212上的mycat,权重=100,vip又漂到了110上。如果我们接着停了110上的mycat,则vip又会漂到212上。

      权重 = priority + weight * script的结果(脚本执行返回0,script则为true,否则script为false),权重大的抢占到vip,成为master;杀掉keepalived进程,vip也会进行正确的转移,具体我就不展示测试结果,大家可以自行去测试。

    2、mycat高可用

      我们通过vip可以进行正常的sql请求,当212上的mycat停了,vip漂到了110上,通过vip仍然可以进行sql请求,应用端根本感知不到后端vip的漂移、mycat的切换,实现了mycat的高可用。

  这种方案已经可以满足大多数的应用场景了,master上的mycat对外服务,backup上的mycat仅作为备用以防master宕机,backup上的mycat基本上不提供服务,就是起到一个以防万一的作用,并发量不高的应用采用此种方案就可以了。如果并发量高了,master上的mycat压力太大,那我们就需要考虑将backup上的mycat也利用起来了,并做一个负载均衡,减轻master上的mycat压力,并充分利用backup上的mycat,具体实现请往下看。

lvs实现Mycat的负载均衡

  Mycat的高可用是实现了,但美中不足的是没有物尽其用,我们不难发现,Mycat的两个节点其实只有一个对外服务,另一个完全备用(以备基本不会发生的宕机),宕机的概率本来就小,备用机基本相当于没用了,那可不可以将备用机利用起来了? 我们可以将主备Mycat都利用起来,并进行负载均衡,减小主Mycat的压力,如果其中一个节点宕机了,则由另一个节点完全接管,继续正常提供服务。

  组件结构图如上所示,keepalived负责lvs的健康检测与高可用,lvs负责mycat的负载均衡与心跳检测。如果服务器不够,keepalived、lvs和mycat可以部署在一起,但不推荐,组件都部署在同一个服务器上,风险太大,分散部署,可以降低风险。keepalived + lvs的具体部署过程可参考主从热备+负载均衡(LVS + keepalived),具体配置文件如下

  192.168.1.214(master)上keepalived.conf

  1. global_defs {
  2. notification_email {
  3. 997914490@qq.com
  4. }
  5. notification_email_from sns-lvs@gmail.com
  6. #smtp_server smtp.hysec.com
  7. #smtp_connection_timeout 30
  8. router_id lvs_master # 设置lvs master的id,在一个网络应该是唯一的
  9. }
  10. vrrp_instance VI_1 {
  11. state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备
  12. interface eth0 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
  13. virtual_router_id 66 # 虚拟路由编号,主从要一致
  14. priority 100 # 优先级,数值越大,获取处理请求的优先级越高
  15. advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
  16. authentication {
  17. auth_type PASS
  18. auth_pass 1111
  19. }
  20. virtual_ipaddress {
  21. 192.168.1.200 # 定义虚拟ip(VIP),可多设,每行一个
  22. }
  23. }
  24. virtual_server 192.168.1.200 8066 { #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
  25. delay_loop 6 #设置运行情况检查时间,单位是秒
  26. lb_algo rr #设置负载调度算法,这里设置为rr,即轮询算法
  27. lb_kind DR #设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选
  28. nat_mask 255.255.255.0
  29. persistence_timeout 0 #会话保持时间,单位是秒;同一IP x秒内的请求都发到同个real server
  30. protocol TCP #指定转发协议类型,有TCP和UDP两种
  31.  
  32. real_server 192.168.1.212 8066 { #配置服务节点1,需要指定real server的真实IP地址和端口,IP与端口之间用空格隔开
  33. weight 3 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器
  34. TCP_CHECK { #realserver的状态检测设置部分
  35. connect_timeout 10 #表示10秒无响应超时
  36. nb_get_retry 3 #表示重试次数
  37. delay_before_retry 3 #表示重试间隔
  38. }
  39. }
  40. real_server 192.168.1.110 8066 {
  41. weight 3
  42. TCP_CHECK {
  43. connect_timeout 10
  44. nb_get_retry 3
  45. delay_before_retry 3
  46. }
  47. }
  48. }

  192.168.1.213(backup)上keepalived.conf

  1. global_defs {
  2. notification_email {
  3. 997914490@qq.com
  4. }
  5. notification_email_from sns-lvs@gmail.com
  6. #smtp_server smtp.hysec.com
  7. #smtp_connection_timeout 30
  8. router_id lvs_backup # 设置lvs backup的id,在一个网络应该是唯一的
  9. }
  10. vrrp_instance VI_1 {
  11. state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备
  12. interface eth0 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
  13. virtual_router_id 66 # 虚拟路由编号,主从要一致
  14. priority 100 # 优先级,数值越大,获取处理请求的优先级越高
  15. advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
  16. authentication {
  17. auth_type PASS
  18. auth_pass 1111
  19. }
  20. virtual_ipaddress {
  21. 192.168.1.200 # 定义虚拟ip(VIP),可多设,每行一个
  22. }
  23. }
  24. virtual_server 192.168.1.200 8066 { #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
  25. delay_loop 6 #设置运行情况检查时间,单位是秒
  26. lb_algo rr #设置负载调度算法,这里设置为rr,即轮询算法
  27. lb_kind DR #设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选
  28. nat_mask 255.255.255.0
  29. persistence_timeout 0 #会话保持时间,单位是秒;同一IP x秒内的请求都发到同个real server
  30. protocol TCP #指定转发协议类型,有TCP和UDP两种
  31.  
  32. real_server 192.168.1.212 8066 { #配置服务节点1,需要指定real server的真实IP地址和端口,IP与端口之间用空格隔开
  33. weight 3 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器
  34. TCP_CHECK { #realserver的状态检测设置部分
  35. connect_timeout 10 #表示10秒无响应超时
  36. nb_get_retry 3 #表示重试次数
  37. delay_before_retry 3 #表示重试间隔
  38. }
  39. }
  40. real_server 192.168.1.110 8066 {
  41. weight 3
  42. TCP_CHECK {
  43. connect_timeout 10
  44. nb_get_retry 3
  45. delay_before_retry 3
  46. }
  47. }
  48. }

  192.168.212、192.168.1.110上的realserver.sh内容一致

  1. #!/bin/bash
  2.  
  3. VIP=192.168.1.200
  4.  
  5. /etc/rc.d/init.d/functions
  6.  
  7. case "$1" in
  8. start)
  9. ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
  10. /sbin/route add -host $VIP dev lo:0
  11. echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
  12. echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
  13. echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
  14. echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
  15. sysctl -p >/dev/null 2>&1
  16. echo "RealServer Start OK"
  17. ;;
  18. stop)
  19. ifconfig lo:0 down
  20. route del $VIP >/dev/null 2>&1
  21. echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
  22. echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
  23. echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
  24. echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
  25. echo "RealServer Stoped"
  26. ;;
  27. *)
  28. echo "Usage: $0 {start|stop}"
  29. exit 1
  30. esac
  31.  
  32. exit 0

    在/usr/local/src/目录下,给脚本可执行权限:[root@centos212 ~]# chmod -R 755 /usr/local/src/realserver.sh

  按照上述结构图,从右往左逐个启动组件:先启动mysql,接着启动mycat,然后启动realserver.sh,再启动keepalived。我们来看下负载均衡效果

  负载均衡效果我们可以通过ipvsadm -l命令来查看,具体体现在ActiveConn和InActConn值,ActiveConn是活动连接数,也就是tcp连接状态的ESTABLISHED,而InActConn是指除了ESTABLISHED以外的,所有的其它状态的tcp连接。因为./mysql -h192.168.1.200 -P8066 -uroot -p123456 -DTESTDB  -e 'select @@hostname'是瞬时的,这个连接就归为InActConn,如果我们想测试ActiveConn,我们可以用./mysql -h192.168.1.200 -P8066 -uroot -p123456 -DTESTDB,其实与我们平时操作mysql是一样的。从上图中可以看出,是达到了负载均衡效果的,192.168.1.110:8066与192.168.1.212:8066轮着来处理。

  可能会有人对上图中./mysql -h192.168.1.200 -P8066 -uroot -p123456 -DTESTDB  -e 'select @@hostname'的返回值有疑问:为什么总是centos211? 这个sql其实就是查询mysql的主机名,注意是mysql服务器的主机名,不是mycat的主机名!sql最终的执行者是mysql! 而我们知道mycat对mysql做了读写分离,也就是说./mysql -h192.168.1.200 -P8066 -uroot -p123456 -DTESTDB  -e 'select @@hostname'始终会在mysql slave上执行,而我们的mysql slave的ip是192.168.1.211,其hostname是centos211,所以看到的hostname总是centos211。

总结

  1、很多时候我们都只需要实现mycat的高可用,而不需要实现mycat的负载均衡;组件越多,越容易出错,也更难以维护;没有一成不变的最优方案,只有在合适时机的最佳方案;

  2、keepalived的作用,有没有lvs,keepalived启动的作用是有所区别的。没有lvs时,keepalived负责vip的映射与转移、mycat的存活检测;有lvs时,Keepalived负责vip的映射与转移、RealServer的健康状态检查。不管有没有lvs,keepalived都会负责VIP的映射与转移,实现master和slave主机之间failover,达到高可用目的;

  3、各个组件的职责都很明显,mysql负责sql的执行,mycat负责mysql的读写分离与高可用,lvs负责mycat的负载均衡与高可用,keepalived负责vip相关工作以及lvs的高可用。各个组件的角色弄清楚了,搭建起来也就不难了;

  4、《Mycat权威指南》中采用haproxy + keepalived实现mycat的高可用和负载均衡,我就不再重复讲了,有兴趣的可以去实践一把;另外留个疑问:nginx可不可实现mycat的负载均衡?

  5、关于搭建过程中遇到的问题,包括keepalived的“脑裂”问题,以及一些其他大家在搭建过程中可能会遇到的问题,可查看:keepalived实现mycat高可用问题排查;道路坎坷,布满荆棘,定让你大吃一惊!

参考

  《Mycat权威指南》

  LVS+Keepalived搭建MyCAT高可用负载均衡集群

Mycat - 高可用与负载均衡实现,满满的干货!的更多相关文章

  1. haproxy + keepalived + mycat 高可用与负载均衡集群配置 centos7

    架构如上,但是其实keepalived.haproxy.Mycat都可以多台(比如keepalived.haproxy.Mycat各3台,3台keepalived抢占vip,然后抢到vip的hapro ...

  2. 高可用与负载均衡(7)之聊聊Lvs-DR+Keepalived的解决方案

    今天直接开门见山了,直接说配置吧.首先介绍下我这的环境 如有问题,请联系我18500777133@sina.cn IP 安装软件 192.168.1.7 lvs1+keepalived master角 ...

  3. Keepalived+HAProxy实现RabbtiMQ高可用的负载均衡

    HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案,包括Twitter,Reddit,StackOverflow,GitHub在 ...

  4. PostgreSQL 9.5 高可用、负载均衡和复制

    高可用.负载均衡和复制 1. 不同方案的比较 共享磁盘故障转移 共享磁盘故障转移避免了只使用一份数据库拷贝带来的同步开销. 它使用一个由多个服务器共享的单一磁盘阵列.文件系统(块设备)复制 DRBD是 ...

  5. Mysql读写分离 及高可用高性能负载均衡实现

    什么是读写分离,说白了就是mysql服务器读的操作和写的操作是分开的,当然这个需要两台服务器,master负责写,slave负责读,当然我们可以使用多个slave,这样我们也实现了简单意义上的高可用和 ...

  6. 搭建Keepalived+LNMP架构web动态博客 实现高可用与负载均衡

    环境准备: 192.168.193.80  node1 192.168.193.81 node2 关闭防火墙 [root@node1 ~]# systemctl stop firewalld #两台都 ...

  7. Dubbo入门到精通学习笔记(十六):Keepalived+Nginx实现高可用Web负载均衡

    文章目录 Keepalived+Nginx实现高可用Web负载均衡 Keepalived+Nginx实现高可用Web负载均衡 高可用架构篇 Keepalived + Nginx 实现高可用 Web 负 ...

  8. EMQ集群搭建实现高可用和负载均衡(百万级设备连接)

    一.EMQ集群搭建实现高可用和负载均衡 架构服务器规划 服务器IP 部署业务 作用 192.168.81.13 EMQTTD EMQ集群 192.168.81.22 EMQTTD EMQ集群 192. ...

  9. Keepalived + Nginx 实现高可用 Web 负载均衡

    一.Keepalived 简要介绍 Keepalived 是一种高性能的服务器高可用或热备解决方案, Keepalived 可以用来防止服务器单点故障的发生,通过配合 Nginx 可以实现 web 前 ...

随机推荐

  1. Maven捆绑TestNG实现测试自动化执行、部署和调度

    一. 需求介绍 自动化测试,尤其是接口测试时,要写大量的测试用例,这些测试用例我们当然首选使用TesteNG编写,用例数量大,还涉及各种依赖包之类的问题,因此用Maven管理也是最方便最易实现的. 面 ...

  2. 注入Shellcode并运行攻击

    注入Shellcode并运行攻击 一.实验步骤 1.安装execstack并修改设置 安装execstack apt-get install execstack 设置堆栈可执行 execstack - ...

  3. Ubuntu14.04打开cheese却黑屏的问题

    1.安装cheese 2.如发现cheese打开后,摄像头的灯亮了,但是没有图像,黑屏,且按钮都是不可操作状态,这时需要进行一下检测: a.lsusb,看是否有摄像头设备 b.ls /dev/vide ...

  4. Solr Cloud

    bin/solr start -cloud -s example/cloud/node1/solr -p 8983 -z node13:2181,node14:2181,node15:2181/usr ...

  5. python+pycharm环境搭建

    1.下载python安装包 https://www.python.org/downloads/ 2.下载pycharm安装包. https://www.jetbrains.com/pycharm/do ...

  6. 基于MFC的socket编程

    网络编程 1.windows 套接字编程(开放的网络编程接口)添加头文件#include<windows.h> 2.套接字及其分类 socket分为两种:(1)数据报socket:无连接套 ...

  7. 初见SDN

    软件定义网络(Software Defined Network, SDN ),是一种新型网络架构. SDN=OpenFlow:因为Openflow是大多数人唯一看得到的具体化的SDN的实现形式(实际上 ...

  8. Android开发者的Anko使用指南(三)之资源

    添加依赖 dependencies { compile "org.jetbrains.anko:anko-commons:$anko_version" } Color 0xff00 ...

  9. Linux 常用分区方式

    1 分两个区 主目录:/ 交换分区:swap 2 常用分区方式,以使用100G空间安装linux为例 引导分区: 挂载点/boot,分区格式ext4,500M以内即可 交换分区: 无挂载点,分区格式选 ...

  10. 弹性盒子模型属性之flex-grow

    在学习弹性盒子模型的时候,有几个属性常常让同学们感觉头痛, 不知到最后得到的效果数值到底是怎样计算得来的,那么不要慌,稳住,我们能赢 !!!今天就让我们先来看看flex-grow这个属性 flex-g ...