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)
    
    
    [root@bogon ~]# mysqldump --all-databases --lock-all-tables > gg.sql  //复制当前数据库并发给从服务器
    [root@bogon ~]# scp gg.sql root@172.16.0.155:/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

      原理

    图片.png

    通过调用俩个不同的接口,将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

    配置完成可以启动服务

    [root@bogon ~]# 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)
    
    [root@bogon ~]# mysql -ucccc -h172.16.0.151 -P40002 -p111111 -e 'select @@server_id;'
    +-------------+
    | @@server_id |
    +-------------+
    |           7 |
    +-------------+
    
    [root@bogon ~]# mysql -ucccc -h172.16.0.151 -P40001 -p111111 -e 'select @@server_id;'
    +-------------+
    | @@server_id |
    +-------------+
    |         123 |
    +-------------+

    四:proxysql实现读写分离

       1.安装proxysql

       2.启动ProxySQL服务

       3.进入proxysql的管理界面

    [root@bogon ~]# 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
    [root@bogon ~]# mysql -uroot -h172.16.0.154 -p111111 -P6033 -e "select @@server_id;"
    +-------------+
    | @@server_id |
    +-------------+
    |         123 |
    +-------------+
    [root@bogon ~]# mysql -usql -h172.16.0.154 -p111111 -P6033 -e "select @@server_id;"
    +-------------+
    | @@server_id |
    +-------------+
    |           2 |
    +-------------+
    [root@bogon ~]# mysql -usql -h172.16.0.154 -p111111 -P6033 -e "select @@server_id;"
    +-------------+
    | @@server_id |
    +-------------+
    |           3 |
    +-------------+
    [root@bogon ~]# mysql -usql -h172.16.0.154 -p111111 -P6033 -e "select @@server_id;"
    +-------------+
    | @@server_id |
    +-------------+
    |           6 |
    +-------------+

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

相关文章
相关标签/搜索