Linux配置主从和Mycat读写分离报错及解决方法总结
相信学过一些编程的同学在接触连接数据库的时候,配置环境和看文件都是让人头疼的事吧,不过,这些问题大多数到头来还是源自自己的粗心,你们觉得呢?
让我们一起来配置一台主服务器,一台从服务器和一台Mycat服务器,步骤如下:
一、经典方式配置主从服务器
配置主服务器:
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 定义逻辑库,表、分片节点等内容。
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
[root@mycat conf]# source /etc/bashrc
即可开机自启Java环境。
3.其他基本都是抛出异常,在日志中都会给出原因,基本都是配置文件写错导致,解决方法就是按照Caused by后面的提示去找到错的地方改正即可,所以就不一一列举了。
总结:
走编程这条路,只要细心,很多错还是可以避免的。做运维的就不要怕遇见出错,只有多见这些报错,慢慢总结,找到规律,百炼成钢,最后一定可以“拨开云雾见青天”,加油!