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

2019-08-28  本文已影响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后面的提示去找到错的地方改正即可,所以就不一一列举了。

总结:

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

上一篇下一篇

猜你喜欢

热点阅读