美文网首页
Linux配置主从和Mycat读写分离报错及解决方法总结

Linux配置主从和Mycat读写分离报错及解决方法总结

作者: 死海以东 | 来源:发表于2019-08-28 10:55 被阅读0次

    相信学过一些编程的同学在接触连接数据库的时候,配置环境和看文件都是让人头疼的事吧,不过,这些问题大多数到头来还是源自自己的粗心,你们觉得呢?

    让我们一起来配置一台主服务器,一台从服务器和一台Mycat服务器,步骤如下:

    准备了三台虚拟机,均装好了MySQL主服务器master及ip 从服务器slave及ip Mycat服务器及ip

    一、经典方式配置主从服务器

    配置主服务器:

    1.编辑主服务器的配置文件/etc/my.cnf,找到[mysqld]添加如下内容
    [mysqld]
    log-bin=/var/log/mysql/mysql-log
    server-id=111
    

    PS:server-id随意,但是不能省略或设置为默认值0,否则主服务器会拒绝来自从服务器的任何连接,导致出错。

    2.创建添加的日志文件目录并赋权,然后重启服务
    [root@master ~]# mkdir /var/log/mysql
    [root@master ~]# chown mysql.mysql /var/log/mysql
    [root@master ~]# systemctl restart mysqld
    
    3.创建一个专门用于复制数据的用户给从服务器连接主站
    mysql> CREATE USER 'Demo'@'%';
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> GRANT REPLICATION SLAVE ON *.*  TO  'Demo'@'%'  identified by '1';
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    
    4.到从服务器上测试是否可以连接上主服务器
    [root@slave ~]# mysql -uDemo -p1 -h192.168.86.139
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 3
    Server version: 5.7.25-log Source distribution
    
    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> 
    

    可见,我们的主服务器已经配置完成了,过程还是较为简单的。不过,还没完,为了后面不出错,我们必须保证主从服务器数据同步,实现同步方法很多。如果使用的是InnoDB,建议使用mysqldump。

    在主服务器上创建要复制的所有数据库的转储文件,并远程拷贝到从服务器上
    mysql> system mysqldump -uroot -p1 --all-databases --master-data=1 >dbdump.db
    mysqldump: [Warning] Using a password on the command line interface can be insecure.
    mysql> system scp dbdump.db 192.168.86.141:/root/dbdump.db
    The authenticity of host '192.168.86.141 (192.168.86.141)' can't be established.
    ECDSA key fingerprint is SHA256:A/qyMi4ec+7mgjT0CaTYi+/GJyjfjXFd6pksI32zSwA.
    ECDSA key fingerprint is MD5:1a:7c:be:7c:10:43:78:3f:74:b1:13:90:25:67:3a:a6.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '192.168.86.141' (ECDSA) to the list of known hosts.
    root@192.168.86.141's password: 
    dbdump.db                                                                                                                  100%  773KB  50.9MB/s   00:00    
    mysql> 
    
    在从服务器导入数据,实现主从同步
    mysql> source /root/dbdump.db
    

    到这才算是真正的完成主服务器的配置吧,接下来配置从服务器。

    从服务器配置:

    1.编辑从服务器的配置文件/etc/my.cnf,找到[mysqld]添加如下内容
    [root@slave ~]# vim /etc/my.cnf 
    
    [mysqld]
    server-id=222
    
    2.重启服务
    [root@slave ~]# service mysqld restart
    Shutting down MySQL.. SUCCESS! 
    Starting MySQL.. SUCCESS!
    
    3.登录从服务器,配置连接主服务器相关信息
    mysql> CHANGE MASTER TO
        -> MASTER_HOST='192.168.86.139', 
        -> MASTER_USER='Demo',
        -> MASTER_PASSWORD='1';
    Query OK, 0 rows affected, 2 warnings (0.01 sec)
    
    mysql> flush privileges;
    Query OK, 0 rows affected (0.01 sec)
    
    4.启动从服务器的复制线程并查看状态
    mysql> start slave;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> show slave status\G
    

    当看到Slave_IO_Running和Slave_SQL_Running状态都是Yes即为主从配置成功,否则则配置出错。以下为我在配置的时候常见的问题:

    常见问题

    1.UUID重复问题
    解决方法:

    1.退出数据库
    2.在命令行输入:find / -name 'auto.cnf'

    [root@slave ~]# find / -name 'auto.cnf'
    /usr/local/mysqld/data/auto.cnf
    

    3.找到后编辑,修改UUID,提供一个UUID给大家替换掉文件里的UUID:
    4f37a731-9b79-11e8-8013-000c29f0700f

    [root@slave ~]# vi /usr/local/mysqld/data/auto.cnf 
    [auto]
    server-uuid=4f37a731-9b79-11e8-8013-000c29f0700f
    

    4.重启服务器

    [root@slave ~]# service mysqld restart
    

    5.登录服务器启动slave,再查看状态即可。
    此方法不是一定正确,但是如果前面没有什么步骤出错的话,此方法都是适用的,当然为了保险起见也可以检查主从server_id是否不重复、主从状态是否一样等等。

    2.用户赋权问题
    解决方法:

    到主服务器删除用户,重新创建此用户或者其他用户都可以。具体步骤:
    主服务器上

    mysql> use mysql;
    mysql> delete from user where user='Demo';
    mysql> flush privileges;
    

    重新创建用户并授权:

    mysql> CREATE USER 'demo'@'%' IDENTIFIED BY '1';
    mysql> GRANT REPLICATION SLAVE ON *.* TO 'demo'@'%';
    mysql> flush privileges;
    

    测试登录

    [root@slave ~]# mysql -udemo -p1 -h192.168.86.139
    

    切换到从服务器数据库,

    mysql> stop slave;
    mysql> reset slave;
    mysql> CHANGE MASTER TO
        -> MASTER_HOST='192.168.86.139',
        -> MASTER_USER='demo',
        -> MASTER_PASSWORD='1',
    mysql> flush privileges;
    mysql> start slave;
    mysql> show slave status\G
    
    3.日志不同步问题
    解决方法:

    1.停止从服务器

    mysql> stop slave;
    

    2.重置slave

    mysql> reset slave;
    

    3.到主服务器上刷新日志后查看master状态,记下File和Position

    mysql> flush logs;
    mysql> show master status\G
    *************************** 1. row ***************************
                 File: mysqld-bin.000014
             Position: 154
         Binlog_Do_DB: 
     Binlog_Ignore_DB: 
    Executed_Gtid_Set: 
    1 row in set (0.00 sec)
    

    4.到从服务器上执行修改slave状态

    mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysqld-bin.000014',MASTER_LOG_POS=154;
    mysql> flush privileges;
    

    5.启动slave,查看状态

    mysql> start slave;
    mysql> show slave status\G
    

    以上是我在配置主从的时候见到的问题,基本上来来回回就这几个问题,只要静下心来啥都不是问题啦。

    配置Mycat

    配置Mycat相对于主从来说简单很多,不过配置Mycat是需要建立在主从配置成功的前提下,步骤如下:

    搭建环境

    MyCAT 是使用 JAVA 语言进行编写开发,使用前需要先安装 JAVA 运行环境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性,所以要求必须在 JDK7 以上的版本上运行。(以jdk-8u181为例)
    1.下载JDK包:官方下载比较麻烦,所以这是我收藏的一个包,有需要的也可以自己收藏起来。链接:https://pan.baidu.com/s/1QGTftvlyxfdVQVRPQnCyOg
    提取码:8dv7
    下载后上传到Linux虚拟机中


    2.解压包:
    [root@mycat src]# tar -xf jdk-8u211-linux-x64.tar.gz -C /usr/local/
    

    3.创建链接

    [root@mycat local]# mv jdk1.8.0_211 java
    [root@mycat ~]# ln -s /usr/local/jdk1.8.0_181/ /usr/local/java
    

    4.配置Java环境

    [root@mycat ~]# vim /etc/profile.d/java.sh
    export JAVA_HOME=/usr/local/java
    export PATH=$JAVA_HOME/bin:$PATH
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    

    5.使环境生效并检查环境

    [root@mycat ~]# source /etc/profile.d/java.sh
    [root@mycat ~]# java -version
    java version "1.8.0_211"
    Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
    Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
    

    下载解压Mycat

    [root@mycat ~]# wget http://dl.mycat.io/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
    解压
    [root@mycat ~]# tar xf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz -C /usr/local/
    
    配置Mycat配置文件

    修改配置文件的方式来定义逻辑库和相关配置:
    /usr/local/mycat/conf/server.xml 定义用户以及系统相关变量,如端口等。其中用户信息是前端应用程序连接 mycat 的用户信息。
    /usr/local/mycat/conf/schema.xml 定义逻辑库,表、分片节点等内容。

    1.修改server.xml文件,直接跳到93行,修改前截图: 修改后截图:

    2.修改shema.xml文件,这里我是直接删除里面的所有内容,(不是一定要这么做)

    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    # 逻辑库和分表设置
      <schema name="test_db"                           # 逻辑库名称,必须与server.xml的配置相对应
            checkSQLschema="false"                     # 不启用检查
            sqlMaxLimit="100"                          # 最大连接数
            dataNode="mycat_db">                       # 数据节点名称
       <!--这里定义的是分库分表的信息-->     
       </schema>
    # 数据节点
      <dataNode name="mycat_db"                        # 数据节点名称,必须与分表设置中的数据节点名称一致
              dataHost="localhost1"                    # 主机组
              database="mycat_demo" />                 # 真实的数据库名称,必须真实存在
    # 主机组        
      <dataHost name="localhost1"                      # 主机组
                maxCon="1000" minCon="10"              # 连接限制
                balance="0"                            # 负载均衡
                writeType="0"                          # 写模式配置
                dbType="mysql" dbDriver="native"       # 数据库配置
                switchType="1"  slaveThreshold="100">
     # 健康检查 
       <heartbeat>select user()</heartbeat>
     # 读写配置     
          <!-- can have multi write hosts -->
       <writeHost host="hostM1" url="192.168.86.139:3306"   # ip为主服务器IP
                  user="root"  password="1">
          <!-- can have multi read hosts -->
          <readHost host="hostS2" url="192.168.86.141:3306" # ip为从服务器IP
                    user="root" password="1" />
         </writeHost>
       </dataHost>
    </mycat:schema>
    

    3.在主服务器中创建数据库mycat_demo,并随意创建数据表,

    mysql> CREATE DATABASE mycat_demo;
    mysql> use mycat_demo
    Database changed
    mysql> create table demo (id int,saying varchar(50));
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> insert into demo values (1,'No pain no gain!');
    Query OK, 1 row affected (0.82 sec)
    mysql> select id,saying from demo;
    +------+------------------+
    | id   | saying           |
    +------+------------------+
    |    1 | No pain no gain! |
    +------+------------------+
    1 row in set (0.00 sec)
    

    4.启动Mycat服务

    [root@mycat conf]# /usr/local/mycat/bin/mycat start
    Starting Mycat-server...
    [root@mycat conf]# /usr/local/mycat/bin/mycat status
    Mycat-server is running (42057).
    

    启动成功。
    5.给用户授权

    mysql> grant all on mycat_demo.* to root@'%' identified by '1';
    Query OK, 0 rows affected, 1 warning (0.01 sec)
    
    mysql> flush privileges;
    Query OK, 0 rows affected (0.01 sec)
    

    PS:一定要记得刷新。
    6.测试登录
    测试登录主服务器

    [root@mycat conf]# mysql -uroot -p1 -h192.168.86.139
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 16
    Server version: 5.7.25-log Source distribution
    
    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql>
    

    测试登录从服务器

    [root@mycat conf]# mysql -uroot -p1 -h192.168.86.141
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 8
    Server version: 5.7.25-log Source distribution
    
    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql>
    

    测试登录Mycat服务器,用户为server.xml里创建的用户,IP是本机IP,端口是8066

    [root@mycat conf]# mysql -umycat -p1 -h192.168.86.142 -P8066
    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 2
    Server version: 5.6.29-mycat-1.6.5-release-20180122220033 MyCat Server (OpenCloundDB)
    
    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> 
    

    常见问题

    1.JVM启动超时导致报错

    [root@mycat ~]# tail -f /usr/local/mycat/conf/wrapper.log查看日志提示JVM启动失败,请求超时


    解决方法:

    在/usr/local/mycat/conf/wrapper.conf中添加wrapper.startup.timeout=240设置启动超时时间,再重启服务,多查看几次状态,稍等一下再登录即可,

    2.Java环境配置出错,重启电脑后Java未启动

    解决方法:

    1.不嫌麻烦可以每次开机后先执行命令:source /etc/profile.d/java.sh
    2.编辑/etc/bashrc,在最后面加上export PATH=$JAVA_HOME/bin:$PATH
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

    如下图, 执行source使配置生效
    [root@mycat conf]# source /etc/bashrc
    

    即可开机自启Java环境。

    3.其他基本都是抛出异常,在日志中都会给出原因,基本都是配置文件写错导致,解决方法就是按照Caused by后面的提示去找到错的地方改正即可,所以就不一一列举了。

    总结:

    走编程这条路,只要细心,很多错还是可以避免的。做运维的就不要怕遇见出错,只有多见这些报错,慢慢总结,找到规律,百炼成钢,最后一定可以“拨开云雾见青天”,加油!

    相关文章

      网友评论

          本文标题:Linux配置主从和Mycat读写分离报错及解决方法总结

          本文链接:https://www.haomeiwen.com/subject/naeyectx.html