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

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

让我们一起来配置一台主服务器,一台从服务器和一台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后面的提示去找到错的地方改正即可,所以就不一一列举了。

总结:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容