• mysql主从同步+读写分离详细教程


    前言:

           从装数据库开始到实现主从同步加读写分离,只要有点儿linux基础都能实现,but,此教程能够让你配置读写分离,但是更深层的技术还是得需要花更多的时间去看其他的技术文章。

    环境:

           系统:Centos7

           主库:172.16.100.69        mysql5.7     master

           从库:172.16.100.70        mysql5.7     slave

           中间件:172.16.100.71    mycat-1.6

           中间件环境:jdk1.8以上

    功能:

           主库与从库:主从同步

           中间件:读写分离

    步骤:

           1、安装主从mysql数据库

           2、配置主从mysql数据库

           3、安装mycat与JDK

           4、配置测试mycat

           5、mycat性能调优

    备注:

           安装前请在主库、从库、中间件服务器上执行以下命令,关闭防火墙以及壳机制。(当然,你也可以选择不关闭防火墙,但需要配置防火墙规则)

    [root@slave ~]# sed -i  s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config

    [root@slave ~]# systemctl stop firewalld

    [root@slave ~]# systemctl disable firewalld

    说实话,这俩b玩意儿一般都是关闭了的。

    1、安装mysql主从数据库。

    主库:172.16.100.69 、从库:172.16.100.70 上执行以下命令

    安装相关工具

    yum -y install epel-release wget git vim

    wget获取mysql-5.7 rpm安装包

    wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm

    yum安装mysql-5.7 rpm安装包

    yum -y install mysql57-community-release-el7-10.noarch.rpm

    yum安装mysql-5.7服务端

    yum -y install mysql-community-server

    启动mysql-5.7 服务端

    systemctl start  mysqld.service

    开机自动启动mysql-5.7 服务端

    systemctl enable  mysqld.service

    查看mysql-5.7 服务器运行状态

    systemctl status mysqld.service

    mysql主从同步+读写分离详细教程

    首次登录mysql,需要在mysql日志里面获取系统随机生成的root密码

    grep "password" /var/log/mysqld.log

    mysql主从同步+读写分离详细教程

    首次登录mysql,自动在mysql日志里面获取root密码  这里看不懂没关系可跳过此步骤

    mysql_password=$(cat /var/log/mysqld.log | grep "password is generated for root@localhost:" | awk -F ' ' '{print $NF}')

    mysql -uroot -p${mysql_password}

    进入mysq-5.7,注意,因为我获取到这个随机密码是带有特殊符号的所以必须在密码外面加单引号 'C&sqB_:Gr7F3'

    mysql -uroot -p'C&sqB_:Gr7F3'

    输入初始密码,此时不能做任何事情,因为MySQL默认必须修改密码之后才能操作数据库

    mysql> show databases;

    mysql主从同步+读写分离详细教程

    但是新密码设置的时候如果设置的过于简单会报错,所以我们先去修改一下安全机制,降低一下级别,让其可以接受简单密码

    mysql> set global validate_password_policy=0;

    mysql> set global validate_password_length=1;

    修改密码

    mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'lanyi123';

    上面条只能用于本地登录,继续设置让其远程可登录

    mysql> grant all on *.* to root@'%' identified by 'lanyi123';

    刷新以下配置,让其重启mysql后也生效

    mysql> flush privileges;

    mysql主从同步+读写分离详细教程

    但此时还有一个问题,就是因为安装了Yum Repository,以后每次yum操作都会自动更新,需要把这个卸载掉:

    yum -y remove mysql57-community-release-el7-10.noarch

    至此mysql安装完成。

    2、配置主从mysql数据库。

    2.1配置主数据库

    在/etc/my.cnf 文件中的[mysqld]下面加入以下几行

    [root@master ~]# vim /etc/my.cnf

    [mysqld]

    log_bin=master69

    server_id=69

    binlog_format="mixed"

    mysql主从同步+读写分离详细教程

    重启刷新配置文件

    [root@master ~]# systemctl restart mysqld

    mysql> show master statusG; #查看主库master状态,查看当前使用的binlog日志文件

    mysql主从同步+读写分离详细教程

    创建一个用户给从库做同步数据用 (我这里创建的是用户是 “ms” 密码为”ms100200”)

    mysql> grant replication slave on *.* to ms@'%' identified by 'ms100200'; 

    至此mysql主库配置完成。✔

    2.2配置从数据库与两端的连接

    在/etc/my.cnf 文件中的[mysqld]下面加入以下几行

    [root@slave ~]# vim /etc/my.cnf

    [mysqld]

    server_id=70

    mysql主从同步+读写分离详细教程

    重启刷新配置文件

    [root@slave ~]# systemctl restart mysqld

    进入mysql 配置从库连接信息

    mysql> change master to

        -> master_host='172.16.100.69',

        -> master_user='ms',

        -> master_password='ms100200',

        -> master_log_file='master69.000001',           #与主库binlog日志名相同

        -> master_log_pos=1567;                       #偏移量,与主库相同

    Query OK, 0 rows affected, 2 warnings (0.02 sec)

    注意:任意参数指定不对,io线程读取不了任何信息

    启动slave(io,sql线程)

    mysql> start slave;

    查看连接状态

    mysql> show slave statusG;

    *************************** 1. row ***************************

                   Slave_IO_State: Waiting for master to send event

                      Master_Host: 172.16.100.69

                      Master_User: ms

                      Master_Port: 3306

                    Connect_Retry: 60

                  Master_Log_File: master69.000001

              Read_Master_Log_Pos: 1567

                   Relay_Log_File: slave-relay-bin.000002

                    Relay_Log_Pos: 319

            Relay_Master_Log_File: master69.000001

                 Slave_IO_Running: Yes                       #看到yes就成功了

                Slave_SQL_Running: Yes                       #ok了

                  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: 1567

                  Relay_Log_Space: 526

                  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: 69

                      Master_UUID: 877926e5-3822-11ea-adcc-2eeb0209f909

                 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)

    查如果看到上面io与sql两个状态为yes的话就成功了

    接下来进行测试查看是否确实能够实现主从同步

    在master主库上操作创建一个名叫test的数据库

    mysql> create database test ;

    Query OK, 1 row affected (0.01 sec)

    接下来去slave从库上查看常见的test数据库是否有无被同步过来

    mysql> show databases ;

    +--------------------+

    | Database           |

    +--------------------+

    | information_schema |

    | mysql              |

    | performance_schema |

    | sys                |

    | test               |

    +--------------------+

    5 rows in set (0.00 sec)

    mysql主从同步+读写分离详细教程

    配置从数据库与两端的连接 ✔

    3、安装mycat与JDK

    以下命令在172.16.100.71 mycat服务器上执行

    以下命令在172.16.100.71 mycat服务器上执行

    以下命令

    3.1获取mycat1.6与jdk-1.8

    cd /opt

    wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

    获取 jdk 安装包,如果获取此安装包过慢,请前往官网下载(官网下载需要注册账户等比较麻烦)

    wget http://erge1998.cn/file/jdk-8u20-linux-x64.tar.gz

    解压安装包

    tar -zxvf /opt/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/

    mkdir -p /usr/java

    tar -zxvf /opt/jdk-8u20-linux-x64.tar.gz -C /usr/java/

    设置环境变量 (注意,如果你下载的jdk的版本跟我不一样的话,下面的位置你根据你的实际情况改一下,比如我下载的是jdk1.8.0_20版本,那么相应的位置我就应该填jdk1.8.0_20)

    echo "JAVA_HOME=/usr/java/jdk1.8.0_20  PATH=$JAVA_HOME/bin:$PATH CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar  export PATH JAVA_HOME CLASSPATH" >> /etc/profile

    echo "MYCAT_HOME=/usr/local/mycat PATH=$MYCAT_HOME/bin:$PATH" >> /etc/profile

    加载一下配置文件

    source /etc/profile

    检测java是否安装成功(为什么说是安装成功,因为JDK解压了就可以直接运行,我们这里只是为了方便设置环境变量 不用非要到jdk指定目录下才能运行)

    java -version

    mysql主从同步+读写分离详细教程

    检测mycat是否安装成功,使用netstat -unlpt命令来查看端口9066 与8066 是否开启

    netstat -unlpt

    mysql主从同步+读写分离详细教程

    至此mycat与jdk安装完成。✔

    3.1配置mycat读写分离

    进入mycat的配置目录,此文件下有很多配置文件

    cd /usr/local/mycat/conf

    ls

    mysql主从同步+读写分离详细教程

    目前我们实现简单的读写分离,只需配置schema.xml  server.xml 两个文件即可。

    配置mycat读写分离,养成良好习惯,配置之前先备份

    cp schema.xml schema.xml.bak

    cp server.xml server.xml.bak

    接下来会比较难,文字可能会不太好表达其含义,这里(这个需要去搜一下教学教学视频,51cto腾讯课堂上都去找找,主要是去理解这个配置文件的涵义。多插一句,这里并不是打广告,即使你去看了教学视频也不一定能配好,我这里只是整理了一条比较通畅的路)

    vim schema.xml

    将原来的server.xml清空,然后插入我这里的代码

    <?xml version="1.0"?>

    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">

    <mycat:schema xmlns:mycat="http://io.mycat/">

            <schema name="test" checkSQLschema="false" sqlMaxLimit="100" dataNode="logical_db1">

            </schema>

            <!--schema name="test" checkSQLschema="false" sqlMaxLimit="100" dataNode="logical_db1">

            <schema/> -->

            <dataNode name="logical_db1" dataHost="Mycat-node" database="test" />

            <dataHost name="Mycat-node" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

            <heartbeat>show slave status</heartbeat>

            <writeHost host="master" url="172.16.100.69:3306" user="root" password="lanyi123">

                 <readHost host="alave" url="172.16.100.70:3306" user="root" password="lanyi123">

                 </readHost>

            </writeHost>

        </dataHost> </mycat:schema>

    mysql主从同步+读写分离详细教程

    接下来改server.xml文件

    vim server.xml

    将此处的配置要与schema.xml中的所让用户看到的数据库名一致

    mysql主从同步+读写分离详细教程

    配置完成,重启mycat

    mycat restart

    mysql主从同步+读写分离详细教程mysql主从同步+读写分离详细教程

    至此mycat读写分离配置完成 ✔

  • 相关阅读:
    测试文档
    详细文档
    需求规格说明文档
    会议
    软工项目
    分组
    项目名
    google 常用的搜索关键词 (技术相关)
    Kafka 入门和 Spring Boot 集成
    用nginx实现分布式限流
  • 原文地址:https://www.cnblogs.com/laod/p/12917373.html
Copyright © 2020-2023  润新知