`

mysql负载均衡完美解决方案V1.0(1)

 
阅读更多

mysql负载均衡完美解决方案V1.0

1.环境:
mysql 5

ubuntu10.04 x86_64

 

mdb1        eth0    192.168.5.11
mdb2        eth0    192.168.5.12

sdb1        eth0    192.168.5.21
sdb2        eth0    192.168.5.22
sdb3        eth0    192.168.5.23
sdb4        eth0    192.168.5.24

haproxy
        eth0    192.168.5.10    (mdb  vip write)
        eth1    192.168.5.20    (sdb  vip read)

说明:mdb vip用于DB的写,sdb vip用于DB读,实现读写分离和负载均衡,带故障检测自动切换

 

2.架构图
        web1    web2    web3
         |              |          |
        —————————-
                    |
            haproxy(lb db write/read)
                    |
        ———————————-
        |                                |
        mdb1                     mdb2
          |                              |
        ————–             —————-
        |             |              |            |
        sdb1    sdb2        sdb3      sdb4

说明:
1)mdb1和mdb1配置成主-主模式,相互同步,通过haproxy提供一个lb的写ip
2)sdb1和sdb2配置为mdb1的从,sdb3和sdb4配置为mdb2的从
3)sdb1,sdb2,sdb3,sdb4这4台从库,通过haproxy提供一个lb的读ip
4) 当mdb2停止复制,mdb1为主库,haproxy停止发送请求到mdb2和sdb3,sdb4
5) 当mdb1停止复制,mdb2为主库,haproxy停止发送请求到mdb1和sdb1,sdb2
6) 当mdb1和mdb2同时停止复制,这时2台主库变成readonly模式,数据库不能写入
7)当mdb2 offline时,mdb1进入backup mode,停止发送请求到mdb2,sdb3,sdb4
8)当mdb1 offline时,mdb2进入backup mode,停止发送请求到mdb1,sdb1,sdb2
9) 当mdb1 mdb2同时offline,整个DB停止工作

 

 

3.安装mysql-server
登录mdb1,mdb2,sdb1,sdb2,sdb3,sdb4,输入以下命令进行安装:
apt-get install mysql-server -y

安装时会提示输入mysql root用户密码,输入gaojinbo.com

修改mysql配置,监听所有接口
vi /etc/mysql/my.cnf
修改为:
bind-address            = 0.0.0.0

重启mysql
/etc/init.d/mysql restart

 

 

4.配置mdb1,mdb2主-主同步
1)mdb1:
vi /etc/mysql/my.cnf
server-id               = 1
log_bin                 = mysql-bin

log-slave-updates                #很重要,从前一台机器上同步过来的数据才能同步到下一台机器
expire_logs_days        = 10
max_binlog_size         = 100M
auto_increment_offset    = 1
auto_increment_increment = 2

 

2)mdb2:
vi /etc/mysql/my.cnf
server-id               = 2
log_bin                 = mysql-bin

log-slave-updates                #很重要,从前一台机器上同步过来的数据才能同步到下一台机器
expire_logs_days        = 10
max_binlog_size         = 100M
auto_increment_offset    = 2
auto_increment_increment = 2

 

3)mdb1和mdb2:
重启mysql
/etc/init.d/mysql restart

添加复制用户
mysql -uroot -pgaojinbo.com
GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’192.168.5.%’ IDENTIFIED BY ‘gaojinbo’;

记录日志文件和pos
mysql -uroot -pgaojinbo.com
show master status\G

 

 

4)mdb1:
change master to master_host=’192.168.5.12′,master_port=3306,master_user=’repl’,master_password=’gaojinbo’,master_log_file=’mysql-bin.000003′,master_log_pos=106;
start slave;
show slave status\G
说明:mysql-bin.000003和106是主库配置第3)步记录的信息

出现以下内容,说明同步ok
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes

 

5)mdb2:
change master to master_host=’192.168.5.11′,master_port=3306,master_user=’repl’,master_password=’gaojinbo’,master_log_file=’mysql-bin.000001′,master_log_pos=249;
start slave;
show slave status\G
说明:mysql-bin.000001和249是主库配置第3)步记录的信息

出现以下内容,说明同步ok
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes

 

 

6)测试主-主同步
mdb1:
mysql -uroot -pgaojinbo.com
show databases;
create database gaojinbo;

mdb2:
mysql -uroot -pgaojinbo.com
show databases;
即可看到在mdb1上建立的数据库gaojinbo

 

至此mdb1,mdb2主-主配置完成!

 

 

5.4台从库配置
sdb1-4配置(注:server-id不能相同):
vi /etc/mysql/my.cnf
server-id               = 3
log_bin                 = mysql-bin

重启mysql
/etc/init.d/mysql restart

 

sdb1和sdb2配置成mdb1的从库:
mysql -uroot -pgaojinbo.com
change master to master_host=’192.168.5.11′,master_port=3306,master_user=’repl’,master_password=’gaojinbo’,master_log_file=’mysql-bin.000001′,master_log_pos=345;
start slave;
show slave status\G
说明:mysql-bin.000001和345是主库配置第3)步记录的信息

出现以下内容,说明同步ok
          Slave_IO_Running: Yes
          Slave_SQL_Running: Yes

 

sdb3和sdb4配置成mdb2的从库:
change master to master_host=’192.168.5.12′,master_port=3306,master_user=’repl’,master_password=’gaojinbo’,master_log_file=’mysql-bin.000003′,master_log_pos=106;
start slave;
show slave status\G
说明:mysql-bin.000003和106是主库配置第3)步记录的信息

出现以下内容,说明同步ok
          Slave_IO_Running: Yes
          Slave_SQL_Running: Yes

 

测试:
mdb1:
mysql -uroot -pgaojinbo.com
show databases;
create database eossc;

在其他DB上,这时会看到刚建立的数据库eossc

 

至此4台从数据库配置完成!

 

6.编写mysql检测脚本
1)mdb1和mdb2:
vi /etc/xinetd.d/mysqlchk
#
# /etc/xinetd.d/mysqlchk
#
service mysqlchk_write
{
        flags           = REUSE
        socket_type     = stream
        port            = 9200
        wait            = no
        user            = nobody
        server          = /opt/mysqlchk_status.sh
        log_on_failure  += USERID
        disable         = no
        only_from       = 192.168.5.0/24 # recommended to put the IPs that need
                                    # to connect exclusively (security purposes)
}
 
service mysqlchk_replication
{
        flags           = REUSE
        socket_type     = stream
        port            = 9201
        wait            = no
        user            = nobody
        server          = /opt/mysqlchk_replication.sh
        log_on_failure  += USERID
        disable         = no
        only_from       = 192.168.5.0/24 # recommended to put the IPs that need
                                    # to connect exclusively (security purposes)
}

添加服务端口
vi /etc/services
mysqlchk_write      9200/tcp                #mysqlchk_write
mysqlchk_replication    9201/tcp                #mysqlchk_replication

mdb1上操作:
vi /opt/mysqlchk_status.sh
#!/bin/bash

MYSQL_HOST="192.168.5.11"
MYSQL_PORT="3306"
MYSQL_USERNAME="root"
MYSQL_PASSWORD="gaojinbo.com"
 
 
ERROR_MSG=`/usr/bin/mysql –host=$MYSQL_HOST –port=$MYSQL_PORT –user=$MYSQL_USERNAME –password=$MYSQL_PASSWORD -e "show databases;" 2>/dev/null`
 
if [ "$ERROR_MSG" != "" ]
then
        # mysql is fine, return http 200
        /bin/echo -e "HTTP/1.1 200 OK\r\n"
        /bin/echo -e "Content-Type: Content-Type: text/plain\r\n"
        /bin/echo -e "\r\n"
        /bin/echo -e "MySQL is running.\r\n"
        /bin/echo -e "\r\n"
else
        # mysql is down, return http 503
        /bin/echo -e "HTTP/1.1 503 Service Unavailable\r\n"
        /bin/echo -e "Content-Type: Content-Type: text/plain\r\n"
        /bin/echo -e "\r\n"
        /bin/echo -e "MySQL is *down*.\r\n"
        /bin/echo -e "\r\n"
fi

vi /opt/mysqlchk_replication.sh
#!/bin/bash

MYSQL_HOST="192.168.5.11"
MYSQL_PORT="3306"
MYSQL_USERNAME="root"
MYSQL_PASSWORD="gaojinbo.com"
 
 
/usr/bin/mysql –host=$MYSQL_HOST –port=$MYSQL_PORT –user=$MYSQL_USERNAME –password=$MYSQL_PASSWORD -e "show slave status\G;" >/tmp/check_repl.txt

iostat=`grep "Slave_IO_Running" /tmp/check_repl.txt |awk ‘{print $2}’ `
sqlstat=`grep "Slave_SQL_Running" /tmp/check_repl.txt |awk ‘{print $2}’ `

#echo iostat:$iostat and sqlstat:$sqlstat

if [ "$iostat" = "No" ] || [ "$sqlstat" = "No" ];
then
        # mysql is down, return http 503
        /bin/echo -e "HTTP/1.1 503 Service Unavailable\r\n"
        /bin/echo -e "Content-Type: Content-Type: text/plain\r\n"
        /bin/echo -e "\r\n"
        /bin/echo -e "MySQL replication  is *down*.\r\n"
        /bin/echo -e "\r\n"
else
        # mysql is fine, return http 200
        /bin/echo -e "HTTP/1.1 200 OK\r\n"
        /bin/echo -e "Content-Type: Content-Type: text/plain\r\n"
        /bin/echo -e "\r\n"
        /bin/echo -e "MySQL replication is running.\r\n"
        /bin/echo -e "\r\n"
fi

测试同步检测脚本:
mysql -uroot -pgaojinbo.com
stop slave sql_thread; #或者  stop slave io_thread;

/opt/mysqlchk_replication.sh

mdb2上操作:
添加和mdb1一样的脚本,把
/opt/mysqlchk_status.sh        里面的192.168.5.11修改为192.168.5.12
/opt/mysqlchk_replication.sh    里面的192.168.5.11修改为192.168.5.12

 

2)sdb1,sdb2,sdb3,sdb4上操作:
vi /etc/xinetd.d/mysqlchk
#
# /etc/xinetd.d/mysqlchk
#
 
service mysqlchk_replication
{
        flags           = REUSE
        socket_type     = stream
        port            = 9201
        wait            = no
        user            = nobody
        server          = /opt/mysqlchk_replication.sh
        log_on_failure  += USERID
        disable         = no
        only_from       = 192.168.5.0/24 # recommended to put the IPs that need
                                    # to connect exclusively (security purposes)
}

vi /opt/mysqlchk_replication.sh
#!/bin/bash

MYSQL_HOST="192.168.5.21"
MYSQL_PORT="3306"
MYSQL_USERNAME="root"
MYSQL_PASSWORD="gaojinbo.com"
 
 
/usr/bin/mysql –host=$MYSQL_HOST –port=$MYSQL_PORT –user=$MYSQL_USERNAME –password=$MYSQL_PASSWORD -e "show slave status\G;" >/tmp/check_repl.txt

iostat=`grep "Slave_IO_Running" /tmp/check_repl.txt |awk ‘{print $2}’ `
sqlstat=`grep "Slave_SQL_Running" /tmp/check_repl.txt |awk ‘{print $2}’ `

#echo iostat:$iostat and sqlstat:$sqlstat

if [ "$iostat" = "No" ] || [ "$sqlstat" = "No" ];
then
        # mysql is down, return http 503
        /bin/echo -e "HTTP/1.1 503 Service Unavailable\r\n"
        /bin/echo -e "Content-Type: Content-Type: text/plain\r\n"
        /bin/echo -e "\r\n"
        /bin/echo -e "MySQL replication  is *down*.\r\n"
        /bin/echo -e "\r\n"
else
        # mysql is fine, return http 200
        /bin/echo -e "HTTP/1.1 200 OK\r\n"
        /bin/echo -e "Content-Type: Content-Type: text/plain\r\n"
        /bin/echo -e "\r\n"
        /bin/echo -e "MySQL replication is running.\r\n"
        /bin/echo -e "\r\n"
fi

注:脚本/opt/mysqlchk_replication.sh里面的ip
sdb1    MYSQL_HOST="192.168.5.21"
sdb2    MYSQL_HOST="192.168.5.22"
sdb3    MYSQL_HOST="192.168.5.23"
sdb4    MYSQL_HOST="192.168.5.24"

添加服务端口
vi /etc/services
mysqlchk_replication    9201/tcp                #mysqlchk_replication

 

3)所有DB上操作:
增加检测脚本执行权限
chmod +x /opt/mysql*.sh

重启系统
reboot

查看监听端口
netstat -antup|grep xinetd
tcp        0      0 0.0.0.0:9200            0.0.0.0:*               LISTEN      903/xinetd     
tcp        0      0 0.0.0.0:9201            0.0.0.0:*               LISTEN      903/xinetd

注:sdb只有9201监听

分享到:
评论

相关推荐

    JspShop网络购物系统 v1.0jspshopv1.0

    《JspShop网络购物系统 v1.0:构建高效电商解决方案》 JspShop网络购物系统 v1.0是一款基于Java技术开发的电子商务平台,它为商家提供了完整的网上销售和管理功能,支持用户进行在线浏览、选购商品、支付结算以及...

    Xweibo媒体微博解决方案 v1.0

    《Xweibo媒体微博解决方案 v1.0》是一款基于PHP编程语言开发的微博应用系统,专为媒体和社交网络提供高效、便捷的信息分享与互动平台。这个解决方案集成了博客日记的功能,使得用户不仅可以发布短小精悍的微博,还...

    lvs+keepalived+mha+mysql架构配置说明_V1.0.pdf

    本文将详细阐述一种基于LVS(Linux Virtual Server)、Keepalived、MHA(Master High Availability)和MySQL的高可用架构配置,旨在为IT专业人士提供一套稳定且高效的数据库集群解决方案。 **第一部分:MHA介绍** ...

    齐博B2B电子商务系统v1.0模板 php版 红色模板 v1.0.zip

    齐博B2B电子商务系统v1.0模板是一款基于PHP编程语言开发的电子商务平台解决方案,专为搭建B2B(Business-to-Business)网站而设计。这个红色模板是该系统的一个版本,旨在提供一个视觉上吸引人的用户界面,以促进...

    交易系统 v1.0

    系统的核心部分是其数据库管理系统,这里选择了MySQL作为数据存储解决方案。MySQL是一款开源、关系型数据库管理系统,以其高性能、高可用性和稳定性著称。在交易系统中,MySQL负责存储交易记录、用户信息、账户余额...

    FFS V1.0正式版.zip

    综上所述,FFS V1.0正式版——MFH即时文件存储系统,凭借其强大的PHP编程基础,提供了高效、安全的文件存储解决方案。它的即时性、可扩展性、安全性及易用性,使其成为各类网站和应用程序的理想选择。通过深入了解和...

    易致达_web_v1.0.rar

    在Web开发领域,这样的命名方式暗示了这是一个专门为Web平台设计的软件,可能包括前端用户界面、后端服务器逻辑以及可能的数据存储解决方案。 Web应用程序是由HTML、CSS、JavaScript等技术构建的,用于在Web浏览器...

    思诺购物系统 v1.0.zip

    11. **性能优化**:考虑到大型电商网站的高并发需求,系统可能采用缓存技术(如Redis),负载均衡和CDN服务来提升性能和响应速度。 12. **后台管理系统**:除了前端用户界面,系统还包括一个管理后台,用于管理员...

    Mycat高可用以及mycat实现mysql高可用以及mycat的mysql主从配置,负载均衡,读写分离,以及验证查询sql具体执行在主库还是从库上

    Mycat高可用是通过KP+HA实现的,KP(Keepalived+Pacemaker)是一种高可用解决方案,通过心跳机制来保证服务的高可用性。HA(High Availability)是高可用性的缩写,指的是系统或者服务的高可用性。 二、Mycat实现...

    [博客空间]FeasyBlog V1.0_feasyblog.zip

    FeasyBlog V1.0是该系统的首个正式版本,它包含了博客的基本功能,如文章管理、分类管理、评论系统以及自定义主题等,旨在为用户提供一个快速搭建个人博客的解决方案。 在FeasyBlog V1.0中,我们可以看到以下几个...

    Bty分销系统v1.0开源版源码.zip

    首先,"Bty分销系统v1.0开源版源码"是一个基于PHP编写的电子商务解决方案,其核心在于实现商品的多级分销模式。分销系统通常包含供应商管理、分销商管理、订单处理、佣金结算等多个模块,是电商运营的重要组成部分。...

    SOCUT投票系统.Net开源版 v1.0.zip

    总之,SOCUT投票系统.Net开源版 v1.0是一个基于.NET技术栈的开源投票解决方案,具备高度的定制性和可扩展性。开发者可以通过学习和修改源代码,进一步优化系统功能,满足特定场景下的投票需求。对于想深入了解.NET...

    龙腾网站订单系统XP V1.0

    综上所述,《龙腾网站订单系统XP V1.0》是一个全面的电子商务解决方案,结合先进的技术和人性化的用户体验,为电子购物领域提供了可靠的运营支持。无论是商家管理商品、处理订单,还是消费者选购商品、跟踪物流,都...

    商业源码-编程源码-08cms小说系统 v1.0.zip

    08cms小说系统 v1.0 是一款专...总结,08cms小说系统 v1.0是一款面向商业运营的全方位在线阅读平台解决方案,其功能强大且全面,从内容管理到用户交互,再到商业化运营,都考虑得十分周全,是搭建小说网站的理想选择。

    基于PHP的淘乐云点播 php版 v1.0.zip

    10. **性能优化**:通过缓存、负载均衡等技术,确保系统在高并发访问时仍能保持稳定运行。 总的来说,"基于PHP的淘乐云点播 php版 v1.0.zip"是一个集成了多种技术和功能的Web应用程序,旨在提供高效、便捷的在线...

    中小企业服务网投融资服务发布系统 v1.0

    总之,中小企业服务网投融资服务发布系统 v1.0 是一个综合性的解决方案,旨在简化中小企业的融资过程,同时为投资者提供高效的投资决策工具。其开源和可定制的特点,使得该系统在不同的商业环境中都能发挥出应有的...

    ASP源码—曲阳热线互联网新闻采集系统 v1.0.zip

    综上所述,"ASP源码—曲阳热线互联网新闻采集系统 v1.0.zip"包含了一个完整的新闻采集和发布解决方案,它利用ASP技术实现了从互联网上获取、处理和发布新闻的功能。对于开发者而言,深入研究这个源码可以帮助学习ASP...

    商业源码-编程源码-网钛商城系统 v1.0.zip

    《网钛商城系统 v1.0》是一款专为商业运营设计的在线购物平台源码,其核心在于提供了一个高效、安全、易用的电子商务解决方案。本文将深入探讨该系统的架构设计、功能特性、开发语言及数据库结构等关键知识点。 1. ...

    商业源码-编程源码-网络书店v1.0源码.zip

    【网络书店v1.0源码】是一款商业级的在线图书销售系统,它包含了完整的前端用户界面和后端管理系统,为用户提供了一套完整的网络书店运营解决方案。源码中涵盖了多种编程技术,包括但不限于Web开发、数据库管理、...

Global site tag (gtag.js) - Google Analytics