mysql+proxysql+keepalived实现高可用的数据库读写分离

前言

为了降低一台数据库的IO,远程连接数据库的时候,可以实现读写分离进行调度。这里就出现了一个单点,所以必须要做一个高可用。当然数据库服务器也需要做主从复制。

实验结构

说明:上图的拓扑只是整个架构中的一个小部分,其余功能的实现此图并未规划出来。此拓扑实现的目的是利用proxysql实现数据读写分离,并对proxysql高可用。两台安装了Keepalived和proxysql虚拟成一个VIP对外提供服务。这两台mysql服务器做的半同步复制,192.168.32.111是主节点负责用户的写操作,192.168.32.112从节点负责用户的读操作。

实验步骤

1、安装数据库并配置半同步复制

主mysql:192.168.32.111

]#yum install mariadb -y                                       <===centos6为mysql
]#vim /etc/my.cnf.d/server.cnf
[server]
skip_name_resolve = ON
innodb_file_per_table = ON
max_connection = 2000

log_bin = master-log
server_id = 1
]#systemctl start mariadb
]#mysql
MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO ‘ma‘@‘192.168.32.%‘ IDENTIFIED BY ‘centos‘;    <===授权从节点复制的帐号
MariaDB [(none)]> SHOW MASTER LOGS;                           <===查看当前二进制日志文件
+-------------------+-----------+
| Log_name          |File_size |
+-------------------+-----------+
| master-log.000001 |      490 |
+-------------------+-----------+
MariaDB [(none)]> SHOW BINLOG EVENTS IN ‘master-log.000001‘;  <===查看日志内容保存点,从节点可以根据需要选择从哪开始复制,我们这里是测试环境,数据库为空,先从最开始复制。
+-------------------+-----+-------------+-----------+-------------+-------------------------------------------------------------------------------------------------+
| Log_name          | Pos |Event_type  | Server_id | End_log_pos |Info                                                                                           |
+-------------------+-----+-------------+-----------+-------------+-------------------------------------------------------------------------------------------------+
| master-log.000001 |  4 | Format_desc |         1 |         245 | Server ver: 5.5.52-MariaDB, Binlog ver: 4                                                      |
| master-log.000001 | 245 | Query       |        1 |         415 | grant replication slave,replication client on *.* to‘ma‘@‘192.168.32.%‘ identified by ‘centos‘ |
| master-log.000001 | 415 | Query       |        1 |         490 | flush privileges                                                                               |
+-------------------+-----+-------------+-----------+-------------+-------------------------------------------------------------------------------------------------+
MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME ‘semisync_master‘;  <===安装插件
MariaDB [(none)]> SHOW GLOBALVARIABLES LIKE ‘%rpl%‘;               <===安装完以后不代表开启。
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_recovery_rank                  | 0     |
| rpl_semi_sync_master_enabled       | OFF  |
| rpl_semi_sync_master_timeout       | 10000 |
| rpl_semi_sync_master_trace_level   | 32   |
| rpl_semi_sync_master_wait_no_slave | ON    |
+------------------------------------+-------+
MariaDB [(none)]> SHOW GLOBAL STATUS LIKE ‘%rpl%‘;                 <===查看复制各种状态
MariaDB [(none)]> SET  @@GLOBAL.rpl_semi_sync_master_enabled=ON;   <===开启插件
MariaDB [(none)]> FLUSH PRIVILEGES;

从mysql配置:192.168.32.112

]#yum install mariadb -y                                           <===centos6为mysql
]#vim /etc/my.cnf.d/server.cnf
[server]
skip_name_resolve = ON
innodb_file_per_table = ON
max_connection = 2000

relay_log = relay-log
server_id = 2
]#systemctl start mariadb
]#mysql
> CHANGE MASTER TO MASTER_HOST=‘192.168.32.111‘,MASTER_USER=‘ma‘,MASTER_PASSWORD=‘centos‘,MASTER_LOG_FILE=‘master-log.000001‘,MASTER_LOG_POS=245;
>START SLAVE;
> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
              Slave_IO_State: Waiting for master to send event
                 Master_Host: 192.168.32.111         <===主节点
                 Master_User: ma                     <===用户
                 Master_Port: 3306                   <===端口
               Connect_Retry: 60            
             Master_Log_File: master-log.000001      <===从哪个文件复制
         Read_Master_Log_Pos: 490                    <===哪个位置
              Relay_Log_File: relay-log.000002       <===复制到本地的中继日志
               Relay_Log_Pos: 775                    <===中继日志的位置
       Relay_Master_Log_File: master-log.000001
            Slave_IO_Running: Yes                    <===复制要靠IO线程
           Slave_SQL_Running: Yes                    <===重放要靠SQL线程
           …
> INSTALL PLUGIN rpl_semi_sync_slave SONAME ‘semisync_slave‘;
> SET  @@GLOBAL.rpl_semi_sync_slave_enabled=ON;
> SHOW GLOBAL VARIABLES LIKE ‘%rpl%‘;                <===查看变量里已经开启了
+---------------------------------+-------+
| Variable_name                  | Value |
+---------------------------------+-------+
| rpl_recovery_rank              | 0     |
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
> SHOW GLOBAL STATUS LIKE ‘%rpl%‘;                   <===但是,这个时候看状态依然是关闭的!
+----------------------------+-------------+
| Variable_name             | Value       |
+----------------------------+-------------+
| Rpl_semi_sync_slave_status | OFF         |
| Rpl_status                | AUTH_MASTER |
+----------------------------+-------------+
> STOP SLAVE IO_THREAD;
> START SLAVEIO_THREAD;                               <===需要重启下复制线程

总结:到这里我们已经实现了数据库的半同步复制,如果在主节点上创建数据从节点能同步到,证明实验第一步成功了。为了后面读写分离可以看到效果,可以考虑在从节点上加个过滤器,某一个数据库中数据不

同步到从节点上。过滤机制有两种方法:1、主节点二进制日志中进行过滤;2、在从节点的中继日志中进行过滤。这里我们使用第二种方法。

SET @@GLOBAL.replicate_ignore_DB=hidb;               <===在从节点上设置过滤hidb的库

2、配置proxysql:192.168.32.104

]#yum install -y \.proxysql-1.4.2-1-centos7.x86_64.rpm    <===我是下载好上传到本地的,安装包见附件。不排除有依赖关系,所以用yum安装。
]#rpm -ql proxysql                                       <===包组很少
/etc/init.d/proxysql
/etc/proxysql.cnf
/usr/bin/proxysql
/usr/share/proxysql/tools/proxysql_galera_checker.sh
/usr/share/proxysql/tools/proxysql_galera_writer.pl
]# vim /etc/proxysql.cnf
admin_variables=                             <===管理接口的用户和账户:mysql -S /tmp/proxysql_admin.sock -uadmin -padmin.安全起见,建议更改
{
        admin_credentials="admin:admin"
        mysql_ifaces="127.0.0.1:6032;/tmp/proxysql_admin.sock"
}
mysql_variables=
{
        threads=4
        max_connections=2048
        default_query_delay=0
        default_query_timeout=36000000
        have_compress=true
        poll_timeout=2000
        interfaces="0.0.0.0:3306;/tmp/mysql.sock"
        default_schema="information_schema"
        stacksize=1048576
        server_version="5.5.30"
        connect_timeout_server=3000
        monitor_username="monitor"
        monitor_password="monitor"
        monitor_history=600000
        monitor_connect_interval=60000
        monitor_ping_interval=10000
        monitor_read_only_interval=1500
        monitor_read_only_timeout=500
        ping_interval_server_msec=120000
        ping_timeout_server=500
        commands_stats=true
        sessions_sort=true
        connect_retries_on_failure=10
}
mysql_servers =                         <===定义两个mysql服务器地址、端口、属于哪个组(下面有定义)、是否压缩、权重    
(
        {
                address = "192.168.32.111"
                port = 3306
                hostgroup = 0 
                status = "ONLINE"
                weight = 1 
                compression = 0 
        },
        {
                address = "192.168.32.112"
                port = 3306
                hostgroup = 1 
                status = "ONLINE"
                weight = 1 
                compression = 0 
        }
)
mysql_users:                            <===连接数据库的用户和账户,和之前授权复制主从的一致
(
        {
                username = "dbadmin" 
                password = "centos" 
                default_hostgroup = 0 
                active = 1            
        }
)
mysql_query_rules:                       <===数据查询规则定义
(
        {
                rule_id=1
                active=1
                match_pattern="^SELECT .* FOR UPDATE$"
                destination_hostgroup=0
                apply=1
        },
        {
                rule_id=2
                active=1
                match_pattern="^SELECT"
                destination_hostgroup=1
                apply=1
        }
)
mysql_replication_hostgroups=
(
        {
                writer_hostgroup=0        <===0组为写
                reader_hostgroup=1        <===1组为读
                comment="test repl 1"     <===描述信息
       }
)
]#service proxysql start 
]# mysql -udbadmin -pcentos -h172.18.32.104    <===通过本地访问数据库
>INSERT INTO hidb.tal1 VALUES (4,‘li‘);        <===插入一个数据,写入主节点
>SELECT * FROM hidb.tal1;                      <===读数据是从从点读,而从节点做了hidb的过滤,因此是读不到插入的这一行数据。实现了读写分离。

总结:到这里我们是已经实现了数据库的读写分离。下面我们还需要对proxysql做高可用。

3、在另外一台主机192.168.32.105上配置proxysql,具体配置和上面相同。

4、电脑配置有限,这里就在proxysql服务器上配置Keepalived。

keepalived:192.168.32.104

]# yum install -y keepalived
]# vim /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id node1                            <===添加
   vrrp_mcast_group4 224.100.100.100          <===组播地址
}
vrrp_script chk_nginx {                       <===检测服务的脚本
        script "killall -0 proxysql &> /dev/null && exit 0 || exit 1"
        interval 1
        weight -30
        fall 3 
        rise 3
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 22
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.32.99/24      <===虚拟一个VIP对外提供服务
    }
    track_script {            <===调用上面的脚本
        chk_nginx
         }
}
]#systemctl start keepalived

keepalived:192.168.32.104

]# yum install -y keepalived
]# vim /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id node2
   vrrp_mcast_group4 224.100.100.100
}
vrrp_script chk_nginx {
        script "killall -0 proxysql &> /dev/null && exit 0 || exit 1"
        interval 1
        weight -10
        fall 3 
        rise 3
}
vrrp_instance VI_1 {
    state backup
    interface ens33
    virtual_router_id 22
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.32.99/24
    }
    track_script {
        chk_nginx
         }
}
]#systemctl start keepalived

5、测试

]#tcpdump -i ens33 -nn host 224.100.100.100        <===对广播地址进行抓包

在客户端使用VIP使用,实现效果:当主proxysql服务down掉以后,从proxysql服务器拿到VIP开始提供服务。实现了高可用

]# mysql -udbadmin -pcentos -h192.168.32.99

6、补充

我们可以在proxysql服务器上使用管理接口登录上去看看状态

]# mysql -S /tmp/proxysql_admin.sock -uadmin -padmin
> SHOW DATABASES;
+-----+---------+-------------------------------+
| seq | name    | file                          |
+-----+---------+-------------------------------+
| 0   | main    |                               |
| 2   | disk    | /var/lib/proxysql/proxysql.db |
| 3   | stats   |                               |
| 4   | monitor |                               |
+-----+---------+-------------------------------+
> SELECT * FROM mysql_servers;
+--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname       | port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| 0            | 192.168.32.111 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
| 1            | 192.168.32.112 | 3306 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |         |
+--------------+----------------+------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+

总结:还有很多表就不一一展示了。这里通过proxysql+keepalived实现了数据库简单的读写分离,简单的高可用。实际应用中比这复杂的多,并不是一个人能完成的。

时间: 2024-08-28 17:36:01

mysql+proxysql+keepalived实现高可用的数据库读写分离的相关文章

MySql:利用keepalived构建高可用MySQL-HA

关于MySQL-HA,目前有多种解决方案,比如heartbeat.drbd.mmm.共享存储,但是它们各有优缺点.heartbeat.drbd配置较为复杂,需要自己写脚本才能实现MySQL自动切换,对于不会脚本语言的人来说,这无疑是一种脑裂问题:对于mmm,生产环境中很少有人用,且mmm 管理端需要单独运行一台服务器上,要是想实现高可用,就得对mmm管理端做HA,这样无疑又增加了硬件开支:对于共享存储,个人觉得MySQL数据还是放在本地较为安全,存储设备毕竟存在单点隐患.使用MySQL双mast

MySQL-高可用MHA+Atlas读写分离

公司最近为新的MySQL架构进行调整,要求给出方案,我这边提出使用MHA+Atlas做高可用集群读写分离架构,就多方讨论最终确认方案,进行实施: 一.简单说下MHA的工作原理 1个管理节点可以管理多套mysql架构,可以不装在mysql主机上 通过管理节点,来对其它数据节点上的mysql做监控,会每隔几秒做心跳检测 二.MHA的简单架构图 三.部署MHA 1,环境准备(依赖包.软件包.创建存放目录等)所有节点进行 #安装依赖包 [[email protected] ~]#yum install 

MySQL双主+keepalived实现高可用

mysql+keepalived实现高可用+主主复制模式 为了解决mysql的单点故障问题,衍生出很多mysql的高可用方案: keepalived+双主.MHA.PXC.MMM.Hearbeat+DRBD等,比较常用的一般是keepalived+双主,MHA和PXC 在此搭建实验环境,实现keepalived+mysql双主模式. 实验思路: 两台MySQL互为主从关系(双主),通过keepalived配置虚拟vip,实现当其中的一台MySQL数据库宕机后,应用能自动切换到另外一台MySQL数

MyCAT+MySQL 搭建高可用企业级数据库集群

第1章 课程介绍课程介绍1-1 MyCAT导学 试看1-2 课程介绍 第2章 MyCAT入门这一章中,我们将回顾了垂直切分,水平切分,分库分表等基础概念,然后快速回如何安装和启动MyCAT的,介绍如何以打包好的可执行程序的方式来启动MyCAT.以及如何对其相关的启动配置文件进行配置.2-1 章节综述2-2 什么是MyCAT2-3 什么是数据库中间层2-4 MyCAT的主要作用2-5 MyCAT基本元素2-6 MyCAT安装 第3章 MYCAT核心配置详解本章将对MyCAT的常用核心配置文件ser

MySQL主主+Keepalived实现高可用

在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主主方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要作改动.因此,如果是双主或者多主,就会增加mysql入口,增加高可用.不过多主需要考虑自增长ID问题,这个需要特别设置配置文件,比如双主,可以使用奇偶,总之,主之间设置自增长ID相互不冲突就能完美解决自增长ID冲突问题 主主方案实现思路 1. 两台mysql都可读写,互为主备.默认只使用一台masterA负责数据的写入,另一台masterB备用处于备用

mysql主主复制+keepalived实现高可用

mysql最简单的高可用 2台pc机 mysql主主复制实现数据的同步 keepalive实现双机热备,保证服务的正常运行 1.环境 Master1  10.0.0.201 Master2 10.0.0.202 2.Master1操作授权 mysql>grant replication slave on *.* to'admin'@'10.0.0.202' identified by '123456';///授权 mysql>show master status\G; 3.Master2操作授

Linux集群(keepalived介绍,Keepalived配置高可用集群,Keepa+mysql

一.Linux集群概述 根据功能划分为两大类:高可用和负载均衡 (1)高可用集群通常为两台服务器,台工作,另外一台作为准备,当提供服务的机器宕机,另外一台将接替继续提供服务. 实现高可用的开源软件有:heartbeat,keepalived (2)负载均衡集群:需要有一台服务器作为分发器,它负责吧用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外,就是给用户提供服务的服务器了,这些服务器数量最少为2 实现负载均衡的开源软件有LVS,keepalived,haproxy,nginx,商业

MySQL中mmm实现高可用群集

介绍 MMM(Master-Master replication manager for MySQL)是一套支持双主故障切换和双主日常管理的脚本程序.MMM使用Perl语言开发,主要用来监控和管理MySQL Master-Master(双主)复制,可以说是mysql主主复制管理器.虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时刻备选主的预热,可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多个

Centos 7部署docker+nginx+keepalived实现高可用web集群

一.体系架构 在Keepalived + Nginx高可用负载均衡架构中,keepalived负责实现High-availability (HA) 功能控制前端机VIP(虚拟网络地址),当有设备发生故障时,热备服务器可以瞬间将VIP自动切换过来,实际运行中体验只有2秒钟切换时间,DNS服务可以负责前端VIP的负载均衡.nginx负责控制后端web服务器的负载均衡,将客户端的请求按照一定的算法转发给后端Real Server处理,而Real Server将响应直接返回给客户端. 二.简单原理 NG