使用haproxy+keepalived来实现mariadb galera cluster的高可用架构

        在上篇mariadb galera cluster博文中,实现了数据库之间的多主复制,数据库对外提供了好几个IP地址,我们在这里通过haproxy的虚拟IP(就如mysql-proxy一样),来对外提供一个IP地址来实现数据库的负载均衡,通过keepalived来判断haproxy的存活情况。

一.Haproxy和keepalived的概述:
    haproxy是一款免费的提供高可用性,负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,借助haproxy可以快速并且可靠的提供基于TCP和HTTP应用的代理解决方案.
    keepalived主要作用是LoadBalance master和LoadBalance backup之间的健康检查,实现故障转换.
    haproxy官方网站:http://haproxy.1wt.eu/
    keepalived官方网站:http://www.keepalived.org/
二.haproxy的特点和算法:
1.haproxy的特点是:
   (1).免费开源,稳定性也是非常好
   (2).能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作
   (3).支持虚拟主机
   (4).是一款负载均衡软件,单纯从效率上来讲HAProxy比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的
   (5).可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡[这点是我门dba需要关注的重点]
2.haproxy的算法现在也越来越多了,具体有如下8种:
   (1).roundrobin:表示简单的轮询[数据库负载的话,建议使用此方式,使用source的话,后端数据库宕掉的话,会有一个连接出错]
   (2).static-rr:表示根据权重
   (3).leastconn:表示最少连接者先处理
   (4).source:表示根据请求源IP,这个跟Nginx的IP_hash机制类似,我们用其作为解决session问题的一种方法[此方法针对数据库待定]
   (5).ri:表示根据请求的URI
   (6).rl_param:表示根据请求的URl参数’balance url_param’ requires an URL parameter name
   (7).hdr(name):表示根据HTTP请求头来锁定每一次HTTP请求
   (8).rdp-cookie(name):表示根据cookie(name)来锁定并哈希每一次TCP请求
三.haproxy+keepalived+mariadb galera cluster高可用负载搭建演示:
# 这里配置的主要目的其实是针对mariadb galera cluster来实现数据库的负载均衡,但这里为了方便演示,使用mysql数据库来替代galera cluster(mysql数据库不配置主从,方便显示效果)
# 再次声明:如果仅仅是mysql数据库读写负载,是不需要此架构的,这个架构仅针对mariadb galera cluster
1.环境:
    os:red hat linux 6(64位,2.6内核)
    haproxy1/keepalived1:192.168.1.100 (master)
    haproxy2/keepalived2:192.168.1.101 (backup)
    mysql1:192.168.1.102
    mysql2:192.168.1.103
    haproxy vip:192.168.1.220
2.配置实现图:
haproxy+keepalived+galera cluster
3.详细配置步骤如下:

(1).在192.168.1.100上安装配置haproxy

  1. [root@client100 ~]# tar -xf haproxy-1.4.24.tar.gz  
  2. [root@client100 ~]# cd haproxy-1.4.24  
  3. # 注意下面的TARGET必须大写,不然会报错(如果报gcc错误,安装gcc软件)  
  4. [root@client100 haproxy-1.4.24]# make TARGET=linux26 prefix=/usr/local/haproxy  
  5. [root@client100 haproxy-1.4.24]# make install PREFIX=/usr/local/haproxy  
  6. [root@client100 haproxy-1.4.24]# cd /usr/local/haproxy/  
  7. # conf目录如果不存在,请先建立该目录[下面这步复制配置的模板文件可以忽略]  
  8. [root@client100 haproxy-1.4.24]# cp examples/haproxy.cfg  /usr/local/haproxy/conf/haproxy.conf   
  9. # 在当前目录下,建立两个目录conf logs(分别存放HAproxy的配置文件,PID文件和日志文件)  
  10. [root@client100 haproxy]# mkdir conf logs  
  11. [root@client100 haproxy]# vim conf/haproxy.conf  
  12. # 以下有部分参数其实是不需要设置的  
  13. global  
  14.         log 127.0.0.1   local0  
  15.         maxconn 4096                   # 最大连接数  
  16.         chroot /usr/local/haproxy    # 安装路径  
  17.         uid 99                               # 所属用户id  
  18.         gid 99                               # 所属用户组id[用户和组可以自己创建的]  
  19.         daemon                            # 后台运行  
  20.         quiet  
  21.         nbproc 1                           # 进程数,可以同时开启多个  
  22.         pidfile /usr/local/haproxy/logs/haproxy.pid  
  23.   
  24. defaults  
  25.         log global  
  26.         mode http                        # 所处理的类别[7层:http;4层:tcp]  
  27.         retries 3                          # 3次连接失败就认为服务不可用  
  28.         option httplog                  # 日志类别http日志格式  
  29.         option dontlognull            # 不记录健康检查的日志信息  
  30.         option redispatch            # serverid对应服务器宕掉后,强制定向到其他健康的服务器  
  31.         option abortonclose         #当服务器负载很高的话,自动结束到当前处理比较久的连接  
  32.         maxconn 4096                # 最大连接数  
  33.         contimeout 50000           # 连接超时  
  34.         clitimeout 50000             # 客户端连接超时  
  35.         srvtimeout 50000            # 心跳检测超时  
  36.   
  37. listen mysql_proxy 0.0.0.0:3306  
  38.         mode tcp                       # 监听4层 模式   
  39.         balance roundrobin        # 负载均衡方式为轮询  
  40.     #  balance source              # 此负载方式数据库负载不建议使用,http可以使用   
  41.         option tcpka  
  42.         option httpchk               # 心跳检测  
  43.     #  option mysql-check user haproxy  
  44.         server mysql1 192.168.1.102:3306 weight 1    # 后端真是数据库ip地址和端口,权重  
  45.         server mysql2 192.168.1.103:3306 weight 1    # 后端真是数据库ip地址和端口,权重  
  46. # 启动测试,看haproxy启动是否正常  
  47. [root@client100 haproxy]# /usr/local/haproxy/sbin/haproxy -f haproxy.conf  
  48. [root@client100 haproxy]# ps -ef |grep haproxy  
  49. # 编写haproxy启动脚本[可编写也可以不编写,建议编写]  
  50. [root@client100 haproxy]# vim /etc/init.d/haproxy   
  51. #!/bin/bash  
  52. BASE_DIR=”/usr/local/haproxy”  
  53. ARGV=”$@”  
  54. start()  
  55. {  
  56. echo “START HAPoxy SERVERS”  
  57. $BASE_DIR/sbin/haproxy -f $BASE_DIR/conf/haproxy.conf  
  58. }  
  59. stop()  
  60. {  
  61. echo “STOP HAPoxy Listen”  
  62. kill -TTOU $(cat $BASE_DIR/logs/haproxy.pid)  
  63. echo “STOP HAPoxy process”  
  64. kill -USR1 $(cat $BASE_DIR/logs/haproxy.pid)  
  65. }  
  66. case $ARGV in  
  67. start)  
  68. start  
  69. ERROR=$?  
  70. ;;  
  71. stop)  
  72. stop  
  73. ERROR=$?  
  74. ;;  
  75. restart)  
  76. stop  
  77. start  
  78. ERROR=$?  
  79. ;;  
  80. *)  
  81. echo “hactl.sh [start|restart|stop]”  
  82. esac  
  83. exit $ERROR  
  84. # 赋予脚本可执行权限  
  85. [root@client100 haproxy]# chmod +x /etc/init.d/haproxy  

(2).在192.168.1.101上安装配置haproxy

  1. [root@client101 ~]# tar -xf haproxy-1.4.24.tar.gz  
  2. [root@client101 ~]# cd haproxy-1.4.24  
  3. [root@client101 haproxy-1.4.24]# make TARGET=linux26 prefix=/usr/local/haproxy  
  4. [root@client101 haproxy-1.4.24]# make install PREFIX=/usr/local/haproxy  
  5. [root@client101 haproxy-1.4.24]# cd /usr/local/haproxy/  
  6. [root@client101 haproxy]# mkdir conf logs  
  7. [root@client101 haproxy]# vim conf/haproxy.conf  
  8. global  
  9.         log 127.0.0.1   local0  
  10.         maxconn 4096  
  11.         chroot /usr/local/haproxy  
  12.         uid 99  
  13.         gid 99  
  14.         daemon  
  15.         quiet  
  16.         nbproc 1  
  17.         pidfile /usr/local/haproxy/logs/haproxy.pid  
  18.   
  19. defaults  
  20.         log global  
  21.         mode http  
  22.         retries 3  
  23.         option httplog  
  24.         option dontlognull  
  25.         option redispatch  
  26.         option abortonclose  
  27.         maxconn 4096  
  28.         contimeout 50000  
  29.         clitimeout 50000  
  30.         srvtimeout 50000  
  31.   
  32. listen mysql_proxy 0.0.0.0:3306  
  33.         mode tcp  
  34.         balance roundrobin  
  35.     #  balance source  
  36.         option tcpka  
  37.         option httpchk  
  38.     #  option mysql-check user haproxy  
  39.         server mysql1 192.168.1.102:3306 weight 1  
  40.         server mysql2 192.168.1.103:3306 weight 1  
  41. [root@client100 haproxy]# /usr/local/haproxy/sbin/haproxy -f haproxy.conf  
  42. [root@client100 haproxy]# ps -ef |grep haproxy  
  43. # 编写haproxy启动脚本[可编写也可以不编写,建议编写]  
  44. [root@client100 haproxy]# vim /etc/init.d/haproxy   
  45. #!/bin/bash  
  46. BASE_DIR=”/usr/local/haproxy”  
  47. ARGV=”$@”  
  48. start()  
  49. {  
  50. echo “START HAPoxy SERVERS”  
  51. $BASE_DIR/sbin/haproxy -f $BASE_DIR/conf/haproxy.conf  
  52. }  
  53. stop()  
  54. {  
  55. echo “STOP HAPoxy Listen”  
  56. kill -TTOU $(cat $BASE_DIR/logs/haproxy.pid)  
  57. echo “STOP HAPoxy process”  
  58. kill -USR1 $(cat $BASE_DIR/logs/haproxy.pid)  
  59. }  
  60. case $ARGV in  
  61. start)  
  62. start  
  63. ERROR=$?  
  64. ;;  
  65. stop)  
  66. stop  
  67. ERROR=$?  
  68. ;;  
  69. restart)  
  70. stop  
  71. start  
  72. ERROR=$?  
  73. ;;  
  74. *)  
  75. echo “hactl.sh [start|restart|stop]”  
  76. esac  
  77. exit $ERROR  
  78. # 赋予脚本可执行权限  
  79. [root@client100 haproxy]# chmod +x /etc/init.d/haproxy  

(3).在192.168.1.100上安装配置keepalived

  1. # keepalived需要openssl依赖包  
  2. [root@client100 ~]# yum -y install openssl* gcc make  
  3. # 建立keepalived安装目录  
  4. [root@client100 ~]# mkdir /usr/local/keepalived  
  5. [root@client100 ~]# tar -xf keepalived-1.2.9.tar.gz   
  6. [root@client100 ~]# cd keepalived-1.2.9  
  7. [root@client100 keepalived-1.2.9]#  ./configure  –prefix=/usr/local/keepalived && make && make install  
  8. # 复制相应文件到指定目录  
  9. [root@client100 keepalived-1.2.9]# cp /usr/local/keepalived/sbin/keepalived  /usr/sbin/  
  10. [root@client100 keepalived-1.2.9]# cp /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/  
  11. [root@client100 keepalived-1.2.9]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived  /etc/init.d/  
  12. [root@client100 keepalived-1.2.9]# mkdir /etc/keepalived  
  13. [root@client100 keepalived-1.2.9]# cd /etc/keepalived/  
  14. # 编辑配置文件  
  15. [root@client100 keepalived]# vim keepalived.conf  
  16. global_defs {  
  17.     notification_email {  
  18.     cloud_data@163.com            # e-mail地址  
  19.     }  
  20.     notification_email_from cloud_data@163.com  
  21.     smtp_server smtp.163.com   # 邮件服务器地址  
  22.     smtp_connect_timeout 30     # 连接超时时间  
  23.     router_id LVS_Master  
  24. }  
  25. vrrp_script chk_http_port {  
  26.     script  “/etc/keepalived/check_haproxy.sh”    # haproxy运行检测脚本[haproxy宕掉重启haproxy服务]  
  27.     interval        5                     # 脚本执行间隔  
  28.     weight         -5                    # 执行脚本后优先级变更:5表示优先级+5;-5则表示优先级-5  
  29. }  
  30. vrrp_instance VI_A {  
  31.     state MASTER                    # 主上此值为MASTER,从上为BACKUP  
  32.     interface eth0  
  33.     virtual_router_id 50            # 此值主从必须一致  
  34.     priority 100  
  35.     advert_int 1  
  36.     authentication {                  # authentication两个参数值,主从也必须一致  
  37.         auth_type PASS  
  38.         auth_pass kongzhong  
  39.     }  
  40. track_script {  
  41.     chk_http_port  
  42.     }  
  43.     virtual_ipaddress {  
  44.         192.168.1.220                # haproxy提供的虚拟IP地址  
  45.     }  
  46. }  
  47. #启动keepalived服务  
  48. [root@client100 keepalived]# /etc/init.d/keepalived start  
  49. # 编辑check_haproxy.sh脚本  
  50. [root@client100 keepalived]# vim /etc/keepalived/check_haproxy.sh  
  51. # 此脚本用来检测haproxy是否正常,不正常启动  
  52. #!/bin/bash  
  53. A=`ps -C haproxy –no-header |wc -l`  
  54. if [ $A -eq 0 ];then  
  55. /etc/init.d/haproxy restart  
  56. echo “Start haproxy” &> /dev/null  
  57. sleep 3  
  58. if [ `ps -C haproxy –no-header |wc -l` -eq 0 ];then  
  59. /etc/init.d/keepalived stop  
  60. echo “Stop keepalived” &> /dev/null  
  61. fi  
  62. fi  
  63. # 赋予脚本可执行权限  
  64. [root@client100 keepalived]#chmod +x /etc/keepalived/check_haproxy.sh  

(4).在192.168.1.101上安装配置keepalived

  1. # keepalived需要openssl依赖包  
  2. [root@client101 ~]# yum -y install openssl* gcc make  
  3. # 建立keepalived安装目录  
  4. [root@client101 ~]# mkdir /usr/local/keepalived  
  5. [root@client101 ~]# cd keepalived-1.2.9  
  6. [root@client101 keepalived-1.2.9]# ./configure  –prefix=/usr/local/keepalived && make && make install  
  7. # 复制相应文件到指定目录  
  8. [root@client101 keepalived-1.2.9]# cp /usr/local/keepalived/sbin/keepalived  /usr/sbin/  
  9. [root@client101 keepalived-1.2.9]# cp /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/  
  10. [root@client101 keepalived-1.2.9]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived  /etc/init.d/  
  11. [root@client101 keepalived-1.2.9]# mkdir /etc/keepalived  
  12. [root@client101 keepalived-1.2.9]# cd /etc/keepalived/  
  13. # 编辑配置文件  
  14. [root@client101 keepalived]# vim keepalived.conf  
  15. global_defs {  
  16.     notification_email {  
  17.     cloud_data@163.com   
  18.     }  
  19.     notification_email_from cloud_data@163.com  
  20.     smtp_server smtp.163.com  
  21.     smtp_connect_timeout 30  
  22.     router_id LVS_Master  
  23. }  
  24. vrrp_script chk_http_port {  
  25.     script  “/etc/keepalived/check_haproxy.sh”  
  26.     interval        5  
  27.     weight         -5  
  28. }  
  29. vrrp_instance VI_A {  
  30.     state BACKUP  
  31.     interface eth0  
  32.     virtual_router_id 50  
  33.     priority 80  
  34.     advert_int 1  
  35.     authentication {  
  36.         auth_type PASS  
  37.         auth_pass kongzhong  
  38.     }  
  39. track_script {  
  40.     chk_http_port  
  41.     }  
  42.     virtual_ipaddress {  
  43.         192.168.1.220  
  44.     }  
  45. }  
  46. #启动keepalived服务  
  47. [root@client101 keepalived]# /etc/init.d/keepalived start  
  48. # 编辑check_haproxy.sh脚本  
  49. [root@client101 keepalived]# vim /etc/keepalived/check_haproxy.sh  
  50. # 此脚本用来检测haproxy是否正常,不正常启动  
  51. #!/bin/bash  
  52. A=`ps -C haproxy –no-header |wc -l`  
  53. if [ $A -eq 0 ];then  
  54. /etc/init.d/haproxy restart  
  55. echo “Start haproxy” &> /dev/null  
  56. sleep 3  
  57. if [ `ps -C haproxy –no-header |wc -l` -eq 0 ];then  
  58. /etc/init.d/keepalived stop  
  59. echo “Stop keepalived” &> /dev/null  
  60. fi  
  61. fi  
  62. # 赋予脚本可执行权限  
  63. [root@client101 keepalived]#chmod +x /etc/keepalived/check_haproxy.sh  

(5).192.168.1.102,192.168.1.103两台数据库启动

  1. [root@client102 ~]# /etc/init.d/mysqld start  
  2. [root@client103 ~]# /etc/init.d/mysqld start  
  3. # 两台数据库上分别建立kz数据库,创建允许登陆的用户  
  4. mysql> create database kz;  
  5. mysql> grant all privileges on kz.* to ‘kz’@’192.168.1.%’ identified by ‘kz’;  
  6. mysql> flush privileges  
  7. # 下面为了测试登陆到那台数据库服务器上  
  8. # 我们在192.168.1.102上建立kz102这张表  
  9. mysql> use kz  
  10. mysql> create table kz102(a int);  
  11. # 我们在192.168.1.103上建立kz103这张表  
  12. mysql> use kz  
  13. mysql> create table kz103(a int);  
4.下面就可以测试,这里就不演示详细内容,简要说明一下大概步骤
   (1).haproxy是否正常启动:ps -ef |grep haproxy
   (2).keepalived是否启动正常/IP是否可以正常切换:ip add|grep 192.168.1.220
   (3).使用kz登陆数据库,是否能正常登陆,登陆的是那一台数据库服务器
       mysql -ukz -pkz -h192.168.1.220
       use kz
       show tables
   (4).后端数据库宕掉1台,再次登陆看是否能正常登陆
到此,测试完毕,有问题欢迎反馈,拍砖.

 

Author: Michael

关注数据分析,挖掘数据金矿。

3 thoughts on “使用haproxy+keepalived来实现mariadb galera cluster的高可用架构”

  1. 博主,你这个还是用在从库上很不错,比如有后端有多台只读的数据库,可以做并发的读。读写分离用程序去控制。数据库高可用来说的话,我认为还是mha的方案最好,可惜不支持mariadb

Leave a Reply

Your email address will not be published. Required fields are marked *