• 分库分表 3:主从复制 (从入门到精通)



    目录:分库分表 Sharding-JDBC从入门到精通

    主题 链接地址
    准备1: 在window安装虚拟机集群 分布式 虚拟机 linux 环境制作 GO
    准备2:在虚拟机的各个节点有 mysql centos mysql 笔记(内含vagrant mysql 镜像)GO
    分库分表 -Sharding-JDBC- 从入门到精通 1 Sharding-JDBC 分库、分表(入门实战) GO
    分库分表 -Sharding-JDBC- 从入门到精通 2 Sharding-JDBC 基础知识 GO
    分库分表 Sharding-JDBC 从入门到精通之 3 自定义主键、分布式雪花主键,原理与实战 GO
    分库分表 -Sharding-JDBC- 从入门到精通 4 MYSQL集群主从复制,原理与实战 GO
    分库分表 Sharding-JDBC 从入门到精通之 5 读写分离 实战 GO
    分库分表 Sharding-JDBC 从入门到精通之 6 Sharding-JDBC执行原理 GO
    分库分表 Sharding-JDBC 从入门到精通之源码 git仓库地址GO

    MYSQL主从复制配置

    1 练习的场景

    主从实战的数据库场景:

    建议有三虚拟机:cdh1、 cdh2、 cdh3(cdh3可以不开启)。

    cdh1 上的 user_db为主,cdh1 上的 user_db为从,仅仅开启这两个库的复制,其他的库如store,不开启主从复制。
    有关学习环境的快速搭建,请参考本系列博客的准备一: 在window安装虚拟机集群 。

    2 配置主数据库

    登录主库

    mysql  ‐uroot ‐p123456
    

    创建用于主从复制的账号

    set global validate_password_policy=0;
    set global validate_password_length=1;
    create user db_sync identified by '123456';
    

    创建库和表

    
    mysql> CREATE DATABASE user_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> use user_db;
    Database changed
    
    mysql> create table t_user_0( id bigint , name varchar(40) );
    Query OK, 0 rows affected (0.02 sec)
    
    

    授权主备复制专用账号

    GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%' IDENTIFIED BY 'db_sync'; 
    

    刷新权限

    FLUSH PRIVILEGES;
    

    修改 MySQL 配置文档 /etc/my.cnf,在 [mysqld] 段添加以下配置:

    [mysqld] 
    #开启日志,启用二进制日志
    log‐bin = mysql‐bin 
    
    #设置服务器标识ID,主从不能一致 ,每台服务器唯一
    server‐id = 1      
    
    #设置需要同步的数据库 
    binlog‐do‐db=user_db 
    
    #屏蔽不需要同步的数据库 
    binlog‐ignore‐db=mysql
    binlog‐ignore‐db=information_schema
    binlog‐ignore‐db=performance_schema
    binlog‐ignore‐db=dolphinscheduler
    binlog‐ignore‐db=sys
    binlog‐ignore‐db=store 
    

    参数说明:

    log-bin
      该参数只要配置就表示开启了MySQL的bin log日志功能,注意改参数的值是我们自定义的,我们自定义的值将作为bin log的名称的前缀信息哟,我们可以使用MySQL命令"show variables like '%log_bin%';"查看咱们的配置。

    server-id
      该参数可以指定数据库服务器的唯一标识。在同一个复制组下的所有实例的server_id都必须是唯一的,而且取值必须是正整数,取值范围是1~(232)−1

    可以通过show databases,查看所有的库,然后找出不需要同步的数据库

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | dolphinscheduler   |
    | mysql              |
    | performance_schema |
    | store              |
    | sys                |
    +--------------------+
    6 rows in set (0.01 sec)
    
    

    完整配置如下:

    [root@cdh1 ~]# cat /etc/my.cnf
    # For advice on how to change settings please see
    # http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
    
    [mysqld]
    log-bin=user-mysql-bin
    server-id=1
    
    binlog-do-db=user_db
    binlog-ignore-db=mysql
    binlog-ignore-db=information_schema
    binlog-ignore-db=performance_schema
    binlog-ignore-db=dolphinscheduler
    binlog-ignore-db=sys
    binlog-ignore-db=store
    
    skip-name-resolve
    character_set_server=utf8
    init_connect='SET NAMES utf8'
    lower_case_table_names=1
    #
    # Remove leading # and set to the amount of RAM for the most important data
    # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
    # innodb_buffer_pool_size = 128M
    #
    # Remove leading # to turn on a very important data integrity option: logging
    # changes to the binary log between backups.
    # log_bin
    #
    # Remove leading # to set options mainly useful for reporting servers.
    # The server defaults are faster for transactions and fast SELECTs.
    # Adjust sizes as needed, experiment to find the optimal values.
    # join_buffer_size = 128M
    # sort_buffer_size = 2M
    # read_rnd_buffer_size = 2M
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    
    log-error=/var/log/mysqld.log
    pid-file=/var/run/mysqld/mysqld.pid
    
    

    3 配置从服务器

    登录从库

    mysql  ‐uroot ‐p123456
    

    创建用于主从复制的账号

    set global validate_password_policy=0;
    set global validate_password_length=1;
    create user db_sync identified by '123456';
    

    创建库和表

    mysql> CREATE DATABASE user_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> use user_db;
    Database changed
    
    mysql> create table t_user_0( id bigint , name varchar(40) );
    Query OK, 0 rows affected (0.02 sec)
    
    

    授权主备复制专用账号

    GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%' IDENTIFIED BY '123456'; 
    

    刷新权限

    FLUSH PRIVILEGES;
    

    修改 MySQL 配置文档 /etc/my.cnf,在 [mysqld] 段添加以下配置:

    [mysqld] 
    
    log‐bin=mysql‐bin  #开启日志,启用二进制日志
    server‐id=2 #设置服务器标识ID,主从不能一致 ,每台服务器唯一
    
    #设置需要同步的数据库 
    replicate_wild_do_table=user_db.% 
    #屏蔽系统库同步 
    replicate_wild_ignore_table=mysql.%
    replicate_wild_ignore_table=information_schema.%
    replicate_wild_ignore_table=performance_schema.%
    replicate_wild_ignore_table=dolphinscheduler.%
    replicate_wild_ignore_table=sys.%
    replicate_wild_ignore_table=store.%
    

    重启数据库

    systemctl restart mysqld
    

    完整的配置文件如下:

    [root@cdh2 ~]# vim /etc/my.cnf
    # For advice on how to change settings please see
    # http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
    
    [mysqld]
    log-bin=user-mysql-bin
    server-id=101
    
    replicate_wild_do_table=user_db.%
    replicate_wild_ignore_table=mysql.%
    replicate_wild_ignore_table=information_schema.%
    replicate_wild_ignore_table=performance_schema.%
    replicate_wild_ignore_table=dolphinscheduler.%
    replicate_wild_ignore_table=sys.%
    replicate_wild_ignore_table=store.%
    
    skip-name-resolve
    character_set_server=utf8
    init_connect='SET NAMES utf8'
    lower_case_table_names=1
    #
    # Remove leading # and set to the amount of RAM for the most important data
    # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
    # innodb_buffer_pool_size = 128M
    #
    # Remove leading # to turn on a very important data integrity option: logging
    # changes to the binary log between backups.
    # log_bin
    #
    # Remove leading # to set options mainly useful for reporting servers.
    # The server defaults are faster for transactions and fast SELECTs.
    # Adjust sizes as needed, experiment to find the optimal values.
    # join_buffer_size = 128M
    # sort_buffer_size = 2M
    # read_rnd_buffer_size = 2M
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    
    

    4 主从复制的配置

    4.1 设置主库

    首先连接 master db,为从库的账号授予复制的权利

    GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%' IDENTIFIED BY '123456'; 
    

    如果权限不够,就执行一下下面的两句:

    set global validate_password_policy=0;
    set global validate_password_length=1;
    

    刷新权限

    FLUSH PRIVILEGES; 
    

    在主库查看同步的起点, 记录下文件名以及起点 位置

    show master status; 
    

    查看数据库状态:

    在这里插入图片描述

    记录 File 的值( user-mysql-bin.000001 )和 Position 的值(154),等会配置 slave 服务器的时候要用。

    4.2设置从库

    接下来在 slave db上,配置主从复制:

    先停止同步

    STOP SLAVE; 
    

    修改从库的master配置,指向到主库,配置过程中,需要使用上一步记录的文件名以及位点

    mysql>change master to
    master_host='cdh1',
    master_user='db_sync',
    master_log_file='user-mysql-bin.000001',
    master_log_pos=154,
    master_port=3306,
    master_password='123456';
    Query OK, 0 rows affected, 2 warnings (0.03 sec)
    mysql> start slave;
    Query OK, 0 rows affected (0.01 sec)
    

    解释下配置参数

    master_host='x.x.x.x' // 这里填 master 主机 ip
    master_log_file='user-mysql-bin.000001', // 这里填写 File 的值
    master_log_pos=154,// 这里填写 Position 的值。
    
    

    启动同步

    START SLAVE; 
    

    查看同步

    show slave statusG; 
    

    结果如下:

    mysql> show slave statusG;
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: cdh1
                      Master_User: db_sync
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: user-mysql-bin.000002
              Read_Master_Log_Pos: 154
                   Relay_Log_File: cdh2-relay-bin.000004
                    Relay_Log_Pos: 377
            Relay_Master_Log_File: user-mysql-bin.000002
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                  Replicate_Do_DB:
              Replicate_Ignore_DB:
               Replicate_Do_Table:
           Replicate_Ignore_Table:
          Replicate_Wild_Do_Table: user_db.%
      Replicate_Wild_Ignore_Table: mysql.%,information_schema.%,performance_schema.%,dolphinscheduler.%,sys.%,store.%
                       Last_Errno: 0
                       Last_Error:
                     Skip_Counter: 0
              Exec_Master_Log_Pos: 154
                  Relay_Log_Space: 2531
                  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: 1
                      Master_UUID: fb8d483c-47eb-11eb-ba17-0800276c3e95
                 Master_Info_File: /var/lib/mysql/master.info
                        SQL_Delay: 0
              SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
               Master_Retry_Count: 86400
                      Master_Bind:
          Last_IO_Error_Timestamp:
         Last_SQL_Error_Timestamp:
                   Master_SSL_Crl:
               Master_SSL_Crlpath:
               Retrieved_Gtid_Set:
                Executed_Gtid_Set:
                    Auto_Position: 0
             Replicate_Rewrite_DB:
                     Channel_Name:
               Master_TLS_Version:
    1 row in set (0.00 sec)
    

    查看Slave_IO_Runing和Slave_SQL_Runing字段值都为Yes,表示同步配置成功。如果不为Yes,请排
    查相关异常。

    如果不小心配置错, 输入 mysql> stop slave; 然后重新录入一遍就可以了。

    5 问题:

    问题1: 由于是克隆的虚拟机,所以mysql的uuid相同,报错如下:

    The slave I/O thread stops because master and slave have equal MySQL server UUID
    

    原因:主从复制的mysql实例的uuid不能相同。

    修改方法:在从库上,从my.cnf找到data目录,然后定位到auto.cnf目录,找到 auto.cnf文件,进行uuid的调整。

    具体如下:

    $ vim /var/lib/mysql/auto.cnf
    [auto]
    server-uuid=fb8d483c-47eb-11eb-ba17-0800276c3e96
    

    修改之后:

    [root@cdh2 ~]#  cat /var/lib/mysql/auto.cnf
    [auto]
    server-uuid=fb8d483c-47eb-11eb-ba17-0800276c3e96
    

    最终,确保两个mysql 实例的uuid不同。

    然后,重启改动过的实例。

    6 主从复制测试

    1 将主库的t_user_0表复制一份t_user_0_copy1,稍等一会,刷新从库,发现从库也有了一个t_user_0_copy1表,表明从库复制了主库的t_user_0_copy1表。

    在这里插入图片描述

    2 修改主库的t_user_0_copy1,名称为t_user_1,大约过去10s,刷新从库,从库的t_user_0_copy1名称改为t_user_1

    在这里插入图片描述

    Note: 这里只是演示,所以把数据表也同步过来了。一般情况下数据表是不同步的,先各自在 master 和 salve 创建好。 因为一般来说 master 和 slave 的表的存储引擎是不一样的,master 一般用的是 InnoDB,因为它要写数据比较多。 而 slave 表一般用的是 MyISAM 引擎,因为它是没有写数据操作,只有读,用 MyISAM 引擎能大大节省资源,速度也会快一些。

    回到◀疯狂创客圈

    疯狂创客圈 - Java高并发研习社群,为大家开启大厂之门

  • 相关阅读:
    Case study, about cnblogs
    《Windows用户态程序高效排错》
    为什么java+winform就那么慢呢
    Mixed DLL Loading analysis
    <a>标签无跳转
    各情景下元素宽高的获取
    在Asp.Net中使用FCKeditor的常用配置
    Small Program 1.0 发布
    微软会向开发者收费吗?
    BO入门实战
  • 原文地址:https://www.cnblogs.com/crazymakercircle/p/14208947.html
Copyright © 2020-2023  润新知