zoukankan      html  css  js  c++  java
  • 什么?你们项目没用过主从复制和读写分离?

    温馨提示:大概需要半小时到一小时安装成功。

    目录

    前言

    一、主从复制搭建

    1、Master库搭建(主库搭建和从库搭建一毛一样)

    2、Slave库搭建(参考主库搭建 ↑)

    3、绑定主从关系(这一步主要是修改一些配置文件)

    4、测试主从复制效果

    二、读写分离配置

    1.初始化一个SpringBoot工程,并添加Sharding-jdbc依赖

    2.测试读写分离效果


    前言

    提示:随着项目数据量的增大,我们不得不开始考虑主从复制和读写分离。

    一、主从复制搭建

    1、Master库搭建(主库搭建和从库搭建一毛一样)

    这里我只准备了一台服务器进行搭建测试,遂主库和从库均在一台服务器上,只不过是访问端口不一样而已

    第一步:检查用户组

    cat /etc/group | grep mysql
    cat /etc/passwd |grep mysql
    #没有任何输出,说明没有则创建该用户组
    #若存在mysql用户组,可以执行删除指令
    userdel mysql
    #创建用户组
    groupadd mysql
    useradd -r -g mysql mysql

     

    第二步:下载mysql包

    这边提供了永久网盘资源,失效评论区找我,我会第一时间提供。
    我们下面的安装均使用该版本进行安装。
    
    链接:https://pan.baidu.com/s/1nlCjsIPmKH3PQhU8g9MVGw 
    提取码:3mcg 

    使用xftp软件上传至服务器

    #解压
    tar xzvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
    

    第三步:创建存储数据目录并赋权

    mkdir /usr/local/mysql/data
    chown -R mysql:mysql /usr/local/mysql
    chmod -R 755 /usr/local/mysql

    目录切换到/home/mysql下,所有解压文件移动到usr/local/mysql下面

    mv mysql-5.7.24-linux-glibc2.12-x86_64 /usr/local/mysql

    第四步 编辑my.cnf,做一些简单配置

    
    basedir=/usr/local/mysql/mysql-5.7.24-linux-glibc2.12-x86_64
    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
    #跳过密码验证
    skip-grant-tables
    server-id=2
    log-bin=mysql-bin
    
    [mysqld]
    datadir=/usr/local/mysql/data
    port = 3306
    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
    symbolic-links=0
    max_connections=400
    innodb_file_per_table=1
    #表名大小写不明感,敏感为
    lower_case_table_names=1

    第五步启动服务

    /usr/local/mysql/mysql-5.7.24-linux-glibc2.12-x86_64/support-files/mysql.server start
    
    #执行该命令,可能会报如下错误,大多是由于权限问题,找到mysql的文件进行赋权即可(不报错直接命令行登录测试,然后跳到第六步)
    
    [root@VM-0-10-centos mysql]# /usr/local/mysql/mysql-5.7.24-linux-glibc2.12-x86_64/support-files/mysql.server start
    Starting MySQL............ ERROR! The server quit without updating PID file (/var/run/mysqld/mysqld.pid).

     

    这边我们提供一个解决方案的链接:解決方案鏈接

     

    还可能会出现:

    #还可能会出现
    Can 't connect to local MySQL server through socket '/tmp/mysql.sock '(2) ";
    

     

    这边提供另一个解决方案:解决方案链接

    重启服务:

    [root@VM-0-10-centos bin]# /usr/local/mysql/mysql-5.7.24-linux-glibc2.12-x86_64/support-files/mysql.server start
    Starting MySQL SUCCESS! 
    
    
    #测试下命令行登录
    [root@VM-0-10-centos bin]# mysql -u root -p
    Enter password:
    #到这一步直接回车,不比输入密码,因为刚才已经跳过密码验证了
    
    MySQL [(none)]> exit;
    Bye
    [root@VM-0-10-centos bin]# 
    

     

    第五步添加软连接,方便重启

    ln -s /usr/local/mysql/mysql-5.7.24-linux-glibc2.12-x86_64/bin/mysql /usr/bin/mysql
    ln -s /usr/local/mysql/mysql-5.7.24-linux-glibc2.12-x86_64/bin/mysql /usr/bin/mysql
    
    
    #添加完软连接就可以在任意目录下愉快地重启了
    [root@VM-0-10-centos bin]# service mysql restart
    Shutting down MySQL.... SUCCESS! 
    Starting MySQL.......... SUCCESS! 
    

     

    第七步:登录mysql,修改密码

    #编辑my.cnf
    vim /etc/my.cnf
    #注释掉
    
      #skip-grant-tables
    
    #重启mysql
    service mysql restart
    
    
    mysql -u root -p
    mysql> use mysql;#使用数据库
    mysql> set password for root@localhost = password('mysql123');#修改数据库密码为mysql123
    mysql> update user set user.Host='%' where user.User='root';#开放远程连接
    mysql>flush privileges;

     

    第七步:设置开机启动

    1、将服务文件拷贝到init.d下,并重命名为mysql
    [root@localhost /]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
    2、赋予可执行权限
    [root@localhost /]# chmod +x /etc/init.d/mysqld
    3、添加服务
    [root@localhost /]# chkconfig --add mysqld

     

    验证navicat远程连接

    2、Slave库搭建(参考主库搭建

    3、绑定主从关系(这一步主要是修改一些配置文件)

    (1)开启master的二进制日志

            ①配置my.cnf配置文件

    vi /etc/my.cnf

            ②添加二进制日志配置,开启二进制(mysql-bin只是二进制日志名称,可以自行指定)

    server-id=1             #id是一定要指定的,是唯一的标识(master数据库要比slave数据库的id优先级高才行)
    log-bin=mysql-bin       #开启二进制日志
    
    

           ③授权 :登录数据库,需要给slave数据库配置一个用户/密码的权限

                           (允许某个ip地址的某个用户以某个密码对当前数据库的所有库和表进行复制操作配置之后需要刷新权限)

    mysql> grant replication slave on *.* to 'root'@'slave数据库ip' identified by '密码';
    mysql> flush privileges;

       

       ④修改完重启服务,查询master状态

    [root@VM_0_10_centos ~]# service mysqld restart
    

    登录数据库,查询master状态,如下图所示:

    mysql> show master status;

    file:是日志文件名称

    position:日志所在位置

    (2) 开启slave的二进制日志

        ①修改my.cnf

     vi /etc/my.cnf

      添加slave二进制日志配置,开启二进制(mysql-bin只是二进制日志名称,可以自行指定)

    server-id=2
    log-bin=mysql-bin

    注意:每一台指定唯一的一个server-id标识

    修改完配置服务需重启服务

    [root@VM_0_16_centos ~]# service mysqld restart

       ②配置slave指向master,登录数据库

    mysql> change master to master_host='10.0.33.18',master_port=3306,master_user='root',master_password='mysql123',master_log_file='mysql-bin.000002',master_log_pos=154;
    
    mysql>flush privileges;
    
    mysql>start slave;
    
    mysql> show slave statusG;
    
    *************************** 1. row ***************************
                   Slave_IO_State: 
                      Master_Host: 10.0.3x.xx
                      Master_User: root
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000002
              Read_Master_Log_Pos: 154
                   Relay_Log_File: localhost-relay-bin.000002
                    Relay_Log_Pos: 4
            Relay_Master_Log_File: 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: 
      Replicate_Wild_Ignore_Table: 
                       Last_Errno: 0
                       Last_Error: 
                     Skip_Counter: 0
              Exec_Master_Log_Pos: 154
                  Relay_Log_Space: 154
                  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: NULL
    Master_SSL_Verify_Server_Cert: No
                    Last_IO_Errno: 2003
                    Last_IO_Error: error connecting to master 'root@10.0.33.18:3306' - retry-time: 60  retries: 9
                   Last_SQL_Errno: 0
                   Last_SQL_Error: 
      Replicate_Ignore_Server_Ids: 
                 Master_Server_Id: 0
                      Master_UUID: 
                 Master_Info_File: /usr/local/mysql/data/master.info
                        SQL_Delay: 0
              SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State: 
               Master_Retry_Count: 86400
                      Master_Bind: 
          Last_IO_Error_Timestamp: 210419 15:17:11
         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)
    

    主要看这俩进程是否YES:

    OK,主从复制配置文件到此修改完成。

    提示:若主从挂调,可以优先在这里查看报错信息。

    4、测试主从复制效果

    二、读写分离配置

    1.初始化一个SpringBoot工程,并添加Sharding-jdbc依赖

    数据源配置代码如下:

    sharding.jdbc.datasource.names=master,slave
    
    # 主数据源
    sharding.jdbc.datasource.master.type=com.alibaba.druid.pool.DruidDataSource
    sharding.jdbc.datasource.master.driver-class-name=com.mysql.jdbc.Driver
    sharding.jdbc.datasource.master.url=jdbc:mysql://10.0.33.18:3308/sharding?useUnicode=true&characterEncoding=utf-8&useSSL=false
    sharding.jdbc.datasource.master.username=root
    sharding.jdbc.datasource.master.password=mysql123
    
    # 从数据源
    sharding.jdbc.datasource.slave.type=com.alibaba.druid.pool.DruidDataSource
    sharding.jdbc.datasource.slave.driver-class-name=com.mysql.jdbc.Driver
    sharding.jdbc.datasource.slave.url=jdbc:mysql://10.0.33.19:3306/sharding?useUnicode=true&characterEncoding=utf-8&useSSL=false
    sharding.jdbc.datasource.slave.username=root
    sharding.jdbc.datasource.slave.password=mysql123
    
    # 读写分离配置
    sharding.jdbc.config.masterslave.load-balance-algorithm-type=round_robin
    sharding.jdbc.config.masterslave.name=dataSource
    sharding.jdbc.config.masterslave.master-data-source-name=master
    sharding.jdbc.config.masterslave.slave-data-source-names=slave

    2.测试读写分离效果

    如下,在mysql-master 容器中,查看sql日志,可以看到插入的sql在主数据库执行:

    如下,查看mysql-slave的sql日志,读取列表数据在从数据库执行,说明我们配置的读写分离是成功的。

  • 相关阅读:
    python-Beautiful rose
    python-and和 or用法
    myspl数据库基础
    python 协程
    python-os 模块
    python-logging模块
    异常处理
    面向对象-类中的三个装饰器
    Flask初见
    django中的ContentType使用
  • 原文地址:https://www.cnblogs.com/dk1024/p/14703463.html
Copyright © 2011-2022 走看看