mysql的复制集群,及读写分离

为什么要设置mysql集群?

为了减轻,mysql服务器的IO压力,设置多个其他mysql服务器帮他分担读写操作

1.mysql复制集群的类型

主从架构(从服务器只读,不可写)

    一主一从,

    一主多重

    主主架构

    2.复制原理

    1)若主服务器上的数据集较大,则需要我们将主服务器数据库所有内容做备份,然后发送给从服务器,随后获取二进制日志的文件,及其坐标用于后续的数据同步

    2)所谓同步,是主服务器上的二进制日志中的SQL语句,发送到从服务器上的中继日志文件中,然后把这些SQL语句重放实现同步

    3.与主从复制相关的线程

    从服务器上:IO线程:用来连接主服务器的,监控二进制日志的变化,并接受的

    SQL线程:监控,读取,并且重放中继日志中的SQL语句,并把数据写入服务器数据库中;

    主服务器上:DUMP线程:将slave请求的二进制日志发送过去

    4.主从复制的过程:

    1.主服务器数据发生修改,写入数据库中,并且记录二进制日志文件中

    2.slave的IO线程复制发生变化的二进制日志,并且记录到自己的中继日志中

    3.slave的SQL线程,将复制过来的中继日志做重放,保持和master上数据的一致;

    5.主从复制注意内容:

    1.保证每个服务器的server_id设置不同,(后面读写分离做测试方便)

    2.主服务器上开启二进制日志文件

    3.从服务器关闭二进制日志文件,开启中继日志文件,并且设置read_only=ON

    4.主服务器设置参数sync_binlog=1(每发生一次数据变化,就将变化内容写入二进制日志中)

    innodb_flush_log_at_trx_commit=1(没提交一个事务,就将事务日志保存到磁盘中)

    5.记得记录二进制日志的文件名和坐标

    6.在主服务器上授权一个可以用于主从复制的用户

    6.主从复制实例

    主服务器文件配置

    innodb_file_per_table=ON  //开启innodb的单独表空间
    skip_name_resolve=ON    //跳过主机名解析
    log_bin=binlog
    server_id=123
    sync_binlog=1
    innodb_flush_log_at_trx_commit=1

    从服务器文件配置

    innodb_file_per_table=ON
    skip_name_resolve=ON
    relay_log=slavelog
    server_id=7
    read_only=ON

    主服务器做数据备份并发给从服务器

    MariaDB [(none)]> show master status;  //记录此时二进制日志文件及坐标
    +---------------+----------+--------------+------------------+
    | File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +---------------+----------+--------------+------------------+
    | binlog.000015 |      617 |              |                  |
    +---------------+----------+--------------+------------------+
    1 row in set (0.00 sec)
    MariaDB [(none)]> grant replication slave on *.* to 'vuser'@'%' identified by '111111';  //授权一个用于主从复制的用户
    Query OK, 0 rows affected (0.02 sec)
    
    [[email protected] ~]# mysqldump --all-databases --lock-all-tables > gg.sql  //复制当前数据库并发给从服务器
    [[email protected] ~]# scp gg.sql [email protected]:/root

    从服务器上操作

    MariaDB [zz]> \. /root/gg.sql   //使用发送过来的数据库文件,初始化数据库
    建立主从连接:
    MariaDB [zz]> change master to master_host='172.16.0.156',master_user='vuser',master_password='111111',master_port=3306,master_log_file='binlog.000015',master_log_pos=617;
    
    MariaDB [zz]> start slave;  开启从服务器
    
    MariaDB [zz]> show slave status\G; 查看主从状态
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event   //若显示此行则配置成功
                      Master_Host: 172.16.0.156
                      Master_User: vuser
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: binlog.000015
              Read_Master_Log_Pos: 831
                   Relay_Log_File: slavelog.000002
                    Relay_Log_Pos: 740
            Relay_Master_Log_File: binlog.000015
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                  Replicate_Do_DB: 
              Replicate_Ignore_DB: 
               Replicate_Do_Table: 
           Replicate_Ignore_Table: 
          Replicate_Wild_Do_Table: 
      Replicate_Wild_Ignore_Table: 
                       Last_Errno: 0
                       Last_Error: 
                     Skip_Counter: 0
              Exec_Master_Log_Pos: 831
                  Relay_Log_Space: 1027
                  Until_Condition: None
                   Until_Log_File: 
                    Until_Log_Pos: 0
               Master_SSL_Allowed: No
               Master_SSL_CA_File: 
               Master_SSL_CA_Path: 
                  Master_SSL_Cert: 
                Master_SSL_Cipher: 
                   Master_SSL_Key: 
            Seconds_Behind_Master: 0
    Master_SSL_Verify_Server_Cert: No
                    Last_IO_Errno: 0
                    Last_IO_Error: 
                   Last_SQL_Errno: 0
                   Last_SQL_Error: 
      Replicate_Ignore_Server_Ids: 
                 Master_Server_Id: 123
    1 row in set (0.00 sec)

    若想关闭主从配置,需要在从服务器使用命令stop slave即可

    二.双主复制

    两个服务器,同时开启二进制日志文件和中继日志文件;并相互做change master to操作即可

    三.读写分离(前提:主从复制)

    mysqlrouter

    原理

    通过调用俩个不同的接口,将mysql语句分别调用

    安装:mysqlrouter,配置配置文件/etc/mysqlrouter/mysqlrouter.conf

    [routing:master]   添加俩个配置段//master 接口
    bind_address = 172.16.0.155:40001   //绑定的ip地址和端口号
    destinations = 172.16.0.156:3306   //后端的mysql服务
    mode = read-write            //模式(是否允许写)
    connect_time = 3        //连接时间
    [routing:slave]
    bind_address = 172.16.0.155:40002
    destinations = 172.16.0.155:3306
    mode = read-only
    connect_time = 1

    配置完成可以启动服务

    [[email protected] ~]# ss -tnl
    State       Recv-Q Send-Q                     Local Address:Port                                    Peer Address:Port              
    LISTEN      0      50                                     *:3306                                               *:*                  
    LISTEN      0      128                                    *:111                                                *:*                  
    LISTEN      0      5                          192.168.122.1:53                                                 *:*                  
    LISTEN      0      128                                    *:22                                                 *:*                  
    LISTEN      0      128                            127.0.0.1:631                                                *:*                  
    LISTEN      0      100                            127.0.0.1:25                                                 *:*                  
    LISTEN      0      128                         172.16.0.155:40001                                              *:*                  
    LISTEN      0      128                         172.16.0.155:40002

    mysqlrouter 测试实例:(因为mysqlrouter是调度到后端的,所以需要我们在master授权用户)

    MariaDB [(none)]> grant all on *.* to 'cccc'@'172.16.0.%' identified by '111111';
    Query OK, 0 rows affected (0.01 sec)
    
    [[email protected] ~]# mysql -ucccc -h172.16.0.151 -P40002 -p111111 -e 'select @@server_id;'
    +-------------+
    | @@server_id |
    +-------------+
    |           7 |
    +-------------+
    
    [[email protected] ~]# mysql -ucccc -h172.16.0.151 -P40001 -p111111 -e 'select @@server_id;'
    +-------------+
    | @@server_id |
    +-------------+
    |         123 |
    +-------------+

    四:proxysql实现读写分离

    1.安装proxysql

    2.启动ProxySQL服务

    3.进入proxysql的管理界面

    [[email protected] ~]# mysql -uadmin -padmin -h127.0.0.1 -P6032  //系统自己设定的用户密码,及端口号
    
    使用main数据库
    给mysql_servers表添加监控点:
    insert into mysql_servers(hostgroup_id,username,port) values(10,'172.16.0.156',3306),(10,'172.16.0.150',3306),(10,'172.16.0.151',3306),(10,'172.16.0.152',3306);
    
    在master服务器上创建监控用户
     MariaDB [(none)]> grant replication client,replication slave on *.* to 'proxyuser'@'172.16.0.%' identified by '111111';
     
     在proxysql上修改变量参数,设置相应的监控用户
     MySQL [main]> set mysql-monitor_username='proxyuser';  //实质上是修改了main数据中的global_variables表
     MySQL [main]> set mysql-monitor_password='111111';
    
     在proxysql服务器上修改mysql_replication_hostgroups,为表添加更明细的分组
     MySQL [main]> insert into mysql_replication_hostgroups (writer_hostgroup,reader_hostgroup) values (10,20);
     这里必须有一个ID和之前mysql_servers表中设置的相同,至于主从,会到后端服务器配置文件中读取read_only参数
     
     在master服务器设置管理用户
     MariaDB [(none)]> grant all on *.* to 'root'@'172.16.0.%' identified by  '111111';
    MariaDB [(none)]> grant all on *.* to 'sql'@'172.16.0.%' identified by  '111111';
    
    在proxysql也添加各个管理用户
     MySQL [main]> insert into mysql_users (username,password,default_hostgroup) values ('root','111111',10),('sql','111111',20);
    这样当使用root用户访问时,会访问主服务器,使用sql时,会访问从服务器
    
    在proxysql上同步刚刚配置的信息,同步到运行时环境,并且同步到磁盘上
        load mysql servers to runtime
        save mysql servers to disk
        load mysql variables to runtime
        save mysql variables to disk
        load mysql users to runtime
        save mysql users to disk
    
    最后使用调度端口访问mysql
    [[email protected] ~]# mysql -uroot -h172.16.0.154 -p111111 -P6033 -e "select @@server_id;"
    +-------------+
    | @@server_id |
    +-------------+
    |         123 |
    +-------------+
    [[email protected] ~]# mysql -usql -h172.16.0.154 -p111111 -P6033 -e "select @@server_id;"
    +-------------+
    | @@server_id |
    +-------------+
    |           2 |
    +-------------+
    [[email protected] ~]# mysql -usql -h172.16.0.154 -p111111 -P6033 -e "select @@server_id;"
    +-------------+
    | @@server_id |
    +-------------+
    |           3 |
    +-------------+
    [[email protected] ~]# mysql -usql -h172.16.0.154 -p111111 -P6033 -e "select @@server_id;"
    +-------------+
    | @@server_id |
    +-------------+
    |           6 |
    +-------------+

    注意:若主从连接不成功,尝试更改防火墙策略或用户授权

原文地址:http://blog.51cto.com/wangchaode/2156533

时间: 2024-11-08 09:14:52

mysql的复制集群,及读写分离的相关文章

Atlas+mysql主主集群实现读写分离

前言 目前线上系统数据库采用的是主主架构.其中一台主仅在故障时切换使用,(仅单台服务器对外提供服务,当一台出现问题,切换至另一台),该结构很难支撑较大并发,另外双主中的另外一台机在非故障时没得到有效利用. 结合以上情况,拟采用数据库中间件提供读写分离功能(一主读写,一主读).既可以提高读并发能力,又可以充分利用数据库服务器,后期可继续增加主主集群的从服务器扩充读并发性能.如下为具体架构图: Atlas官方链接: https://github.com/Qihoo360/Atlas/blob/mas

Mysql数据库优化一:集群(读写分离)之主从服务器的安装与配置

Mysql数据库的集群(读写分离),说白了就是将读操作和写操作分开在不同的服务器上实现,以达到提高效率的目的. 大致原理如下: 数据库中的所有操作都是有日志记录的(前提是要打开这个日志记录功能) 1.master,主服务器(进行写操作的服务器)的所有记录都保存到二进制日志(binary log)中,这些记录叫做二进制日志事件(binary log events): 2.slave,从服务器(进行读操作的服务器)将mater的binart log拷贝到自己的中继日志(relay log),然后根据

想玩集群?读写分离?你要先懂这个!

答案是:Mysql主从同步,集群,读写分离,都会涉及数据的数据同步,所以想玩哪些东西,我们还是要把这个数据同步的基础学会之后我们才能玩其他的,今天呢思梦PHP就给大家带来了这个小案例,亲测,没毛病! 以下案例是测试案例,当然你线上服务器也是一样的!首先你要保证的你的操作系统的统一,数据库的版本的统一你才能开启数据同步的大门!下面就上步骤了! 1:首先你需要一个虚拟机,然后上面配置两个系统,当然你的mysql的版本要保持一致 2:你在你主的mysql里面创建一个你要同步的mysql数据库 3:Li

mysql与mycat搭建实现集群与读写分离

数据库性能优化普遍采用集群方式,oracle集群软硬件投入昂贵,今天花了一天时间搭建基于mysql的集群环境. 主要思路 简单说,实现mysql主备复制-->利用mycat实现负载均衡. 比较了常用的读写分离方式,推荐mycat,社区活跃,性能稳定. 测试环境 MYSQL版本:Server version: 5.5.53,到官网可以下载WINDWOS安装包. 注意:确保mysql版本为5.5以后,以前版本主备同步配置方式不同. linux实现思路类似,修改my.cnf即可. A主mysql.19

通过MMM构建MYSQL高可用集群系统

本文为南非蚂蚁的书籍<循序渐进linux-第二版>-8.4的读笔记 MMM集群套件(MYSQL主主复制管理器) MMM套件主要的功能是通过下面三个脚本实现的 1)mmm_mond 这是一个监控进程,运行在管理节点上,主要负责都所有数据库的监控工作,同时决定和处理所有节点的角色切换 2)mmm_agentd 这是一个代理进程,运行在每个MYSQL服务器上,主要完成监控的测试工作以及执行简单的远端服务设置 3)mmm_control 简单的管理脚本,用来查看和管理集群运行状态,同事管理mmm_mo

mysql高可用集群方案

这里有一篇关于Mysql高可用方案的干货文章:[干货分享] 一文了解数据库高可用容灾方案的设计与实现 网友们公司中的使用方案讨论:想问各位大大 MySQL 是怎么做高可用的? 一.Mysql高可用解决方案 方案一:共享存储 一般共享存储采用比较多的是 SAN/NAS 方案. 方案二:操作系统实时数据块复制 这个方案的典型场景是 DRBD,DRBD架构(MySQL+DRBD+Heartbeat) 方案三:主从复制架构 主从复制(一主多从) MMM架构(双主多从) MHA架构(多主多从) 方案四:数

转:讲讲Mysql的三高集群架构,所谓三高,就是“高可用”、“高负载”、“高性能”的架构方案。

from:https://www.toutiao.com/i6717521873397088780/?timestamp=1569389190&app=news_article&group_id=6717521873397088780&req_id=2019092513263001002607901724F149F2 目录 前言 主从架构 MHA架构 PXC方案 MHA与PXC 最终推荐方案 总结 前言 小伙伴们在项目开发中,无法避免的要跟数据库打交道,一般在互联网公司所采用的数据

# IT明星不是梦 # MySQL高可用集群之MMM

MySQL高可用集群之MMM 一.MMM简介 MMM即Multi-Master Replication Manager for MySQL(mysql多主复制管理器),基于perl实现,关于mysql主主复制配置的监控.故障转移和管理的一套可伸缩的脚本套件(在任何时候只有一个节点可以被写入),MMM也能对从服务器进行读负载均衡,所以可以用它来在一组用于复制的服务器启动虚拟IP,除此之外,它还有实现数据备份.节点之间重新同步功能的脚本.MySQL本身没有提供replication failover

corosync+pacemaker and drbd实现mysql高可用集群

DRBD:Distributed Replicated Block Device 分布式复制块设备,原理图如下 DRBD 有主双架构和双主架构的,当处于主从架构时,这个设备一定只有一个节点是可以读写的,另外的节点是不可读的,连挂载都不可能,只有一个节点是主的,其它节 点都是从的.当做为主主架构时,需要达到几个条件,1.在高可用集群中启用DRBD;  2. 启用分布式文件锁功能,即需要把磁盘格式化为集群文件系统(如GFS2,OCFS2等):3. 把DRBD做成资源. 数据的存储过程: 当某个进程存