Linux下mysql基于MyCat实现主从复制和读写分离

1.1 MyCat介绍及应用场景
MyCat介绍
MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。
MyCat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在MyCat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度

Mycat的应用场景
1.单纯的读写分离,此时配置最为简单,支持读写分离,主从切换;
2.分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片;
3.多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化;
4.表系统,借助于Mycat的分表能力,处理大规模报表的统计;
5.代替Hbase,分析大数据;
6.作为海量数据实时查询的一种简单有效方案,比如 1〇〇亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择;
7.单纯的MyCAT读写分离,配置最为简单,支持读写分离,主从切换分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片;
8.多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化;
9报表系统,借助于Mycat的分表能力,处理大规模报表的统计替代Hbase,分析大数据,作为海量数据实时查询的一种简单有效方案,比如100亿条频繁查询的记录需要在3秒内查询出来结果,
除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择。

MyCAT最新开源版本下载,项目主页:
https://github.com/MyCATApache/
MyCAT 二进制包下载:
http://dl.mycat.io
MyCAT 文档下载:
https://github.com/MyCATApache/Mycat-doc

1.2 搭建环境服务器规划说明
操作系统:CentOS Linux release 7.4.1708 (Core)
JDK版本:jdk1.8.0_161
MyCat版本:Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
MyCat节点IP:192.168.1.203
MySQL版本:mysql-5.6.39
Mycat的server和mysql的从库位于同一台服务器,centos7.3环境
Mycat:192.168.1.101 数据库中间件主机 主机名 mycat
Mysql1: 192.168.1.102 数据库主库Master 主机名mysql-master
Mysql2:192.168.1.103 数据库主库slave 主机名mysql-slave
Mysql3:192.168.1.101 数据库丛库Slave 主机名mycat
配置hosts文件
[[email protected] ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.101 mycat
192.168.1.102 mysql-master
192.168.1.103 mysql-slave

1.3 MySQL安装及配置主从
MySQL安装
Mysql yum安装(为了省时间,这里我们yum安装)
[[email protected] ~]# yum list installed | grep maria 卸载卸载自带mariadb
mariadb-libs.x86_64 1:5.5.52-1.el7 @base
[[email protected] ~]# yum -y remove mariadb-libs卸载
安装不能直接这样安装,不然你安装的还是mariadb
安装MYSQL5.6
CentOS 7之后的版本yum的默认源中使用MariaDB替代原先MySQL,因此安装方式较为以往有一些改变:
第一部分:CentOS 7安装MySQL 5.6
yum -y install http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm安装MySQL的yum源
yum -y install mysql mysql-devel mysql-server mysql-utilities安装MySQL
[[email protected] ~]# systemctl start mysqld.service 启动MySQL 启动MySQL服务
[[email protected] ~]# ss -tnlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 :22 : users:(("sshd",pid=1139,fd=3))
LISTEN 0 80 :::3306 :::
users:(("mysqld",pid=3279,fd=11))
LISTEN 0 128 :::22 :::* users:(("sshd",pid=1139,fd=4))
[[email protected] ~]# /usr/bin/mysql_secure_installation初始化数据库

MySQL主从搭建配置
192.168.1.102 mysql-master
192.168.1.103 mysql-slave
192.168.1.101 mysql-slave
1.首先要开启主数据库的binlog功能:(主库从库的server-id不能相同)
[[email protected] ~]##egrep "log_bin|server_id" /etc/my.cnf
server_id = 1
log_bin=mysql-bin

egrep "log_bin|server_id" /etc/my.cnf

server_id = 2
log_bin=mysql-bin
[[email protected] ~]## egrep "log_bin|server_id" /etc/my.cnf
server_id = 3
log_bin=mysql-bin
192.168.1.102服务器master主库3306已经开启binlog功能,192.168.1.103 192.168.1.101服务器从库slave 3306开启binlog功能
192.168.1.102服务器master主库操作
mysql> show variables like "server_id";
+---------------+----------+
| Variable_name | Value |
+---------------+----------+
| server_id | 1
+---------------+----------+
1 row in set (0.00 sec)

mysql> show variables like "log_bin";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)

2.在192.168.1.102主库给192.168.1.103 192.168.1.101从库授权主从复制账户
mysql> grant replication slave on . to ‘rep‘@‘192.168.1.%‘ identified by ‘123456‘;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for [email protected]‘192.168.1.%‘;;查看rep用户权限
+--------------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]% |
+--------------------------------------------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON . TO ‘rep‘@‘192.168.1.%‘ IDENTIFIED BY PASSWORD ‘*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9‘ |
+--------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

3.主库记录pos位置点:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 564| | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

  1. 192.168.101从库配置连接主库
    mysql>
    change master to master_host=‘192.168.1.102‘,master_user=‘rep‘,master_password=‘123456‘, master_log_file=‘mysql-bin.000002‘,master_log_pos=564;
  2. 192.168.101从库开启同步开关:
    start slave;
    Query OK, 0 rows affected (0.03 sec)
    192.168.101从库查看slave状态:验证主从同步是否正常(正常应该为两个yes)
    [[email protected] ~]# mysql -uroot -p123456 -e "show slave status\G"|egrep "Yes|Behind"
    Warning: Using a password on the command line interface can be insecure.
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    Seconds_Behind_Master: 0
  3. 192.168.1.103从库配置连接主库
    mysql>
    change master to master_host=‘192.168.1.102‘,master_user=‘rep‘,master_password=‘123456‘, master_log_file=‘mysql-bin.000002‘,master_log_pos=564;
  4. 192.168.1.103从库开启同步开关:
    start slave;
    Query OK, 0 rows affected (0.03 sec)
    192.168.1.103从库查看slave状态:验证主从同步是否正常(正常应该为两个yes)
    [[email protected] ~]# mysql -uroot -p123456 -e "show slave status\G"|egrep "Yes|Behind"
    Warning: Using a password on the command line interface can be insecure.
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    Seconds_Behind_Master: 0

MYSQL主库从库实时同步测试
在192.168.1.102主库创建mycat_test mysql_test数据库
在MYSQL1主库上创建两个数据库
mysql> create database mycat_test;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mycat_test |
| mysql |
| mysql_test |
| performance_schema |
+--------------------+
5 rows in set (0.01 sec)

在在192.168.1.102从库查看是否有mycat_test mysql_test数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mycat_test |
| mysql |
| mysql_test |
| performance_schema |
+--------------------+
5 rows in set (0.01 sec)
在在192.168.1.102从库查看是否有mycat_test mysql_test数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mycat_test |
| mysql |
| mysql_test |
| performance_schema |
+--------------------+
5 rows in set (0.01 sec)
在在192.168.1.102主库主库上创建mycat_test mysql_test两个数据库作为分片数据库
准备Mycat所需要的用户
mycat需要两个用户用来执行用户通过mycat执行的操作,当程序需要对表进行查询操作时,mycat将会使用mycat_r进行执行查询,当然你肯定很疑惑,明明用mycat_w进行查询不是更好吗,先不要急,慢慢往下看
用户名(名字可以DIY) 权限 作用
mycat_r SELECT,EXECUTE mycat用来执行查询数据
mycat_w CREATE,DELECT,INSERT,SELECT,UPDATE,DROP mycat用来执行增删改查

mysql> GRANT CREATE,DELETE,INSERT,SELECT,UPDATE,DROP ON . TO ‘mycat_w‘@‘%‘ IDENTIFIED BY ‘mycat_w‘;
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT SELECT ON . TO ‘mycat_r‘@‘%‘ IDENTIFIED BY ‘mycat_r‘;
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

创建完毕后查询权限:
mysql> show grants for [email protected]‘%‘;
+---------------------------------------------------------------------------------------------------------+
| Grants for [email protected]% |
+---------------------------------------------------------------------------------------------------------+
| GRANT SELECT ON . TO ‘mycat_r‘@‘%‘ IDENTIFIED BY PASSWORD ‘*D725A7BAA54B53033B1ECB9C72130E1F1B9CFFBA‘ |
+---------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show grants for [email protected]‘%‘;
+-----------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]% |
+-----------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON . TO ‘mycat_w‘@‘%‘ IDENTIFIED BY PASSWORD ‘*081A240A9BF3E6235C18EE43622D0FE948D4240F‘ |
+-----------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
检查Mysql2 Mysql3从库这个用户有没有同步过来:
[[email protected] ~]# mysql -uroot -p123456 -e "select user,host from mysql.user;"
Warning: Using a password on the command line interface can be insecure.
+---------+-------------+
| user | host |
+---------+-------------+
| mycat_r | % |
| mycat_w | % |
| root | 127.0.0.1 |
| rep | 192.168.1.% |
| root | 192.168.1.% |
| root | ::1 |
| root | localhost |
+---------+-------------+
[[email protected] conf]# mysql -uroot -p123456 -e "select user,host from mysql.user;"
Warning: Using a password on the command line interface can be insecure.
+---------+-------------+
| user | host |
+---------+-------------+
| mycat_r | % |
| mycat_w | % |
| root | % |
| root | 127.0.0.1 |
| rep | 192.168.1.% |
| root | 192.168.1.% |
| root | ::1 |
| root | localhost |
+---------+-------------+
1.4 MyCat安装
mycat是使用java语言开发的,需要先安装java运行环境,由于mycat中使用了JDK7中的一些特性,所以要求JDK7以上的版本才能运行。
JDK下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
MyCAT最新开源版本下载,项目主页:
https://github.com/MyCATApache/
MyCAT 二进制包下载:
http://dl.mycat.io
MyCAT 文档下载:
https://github.com/MyCATApache/Mycat-doc

1.JDK安装
#wget http://download.oracle.com/otn-pub/java/jdk/8u161-b12/2f38c3b165be4555a1fa6e98c45e0808/jdk-8u161-linux-x64.rpm
[[email protected] ~]# rpm -ivh jdk-8u161-linux-x64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:jdk1.8-2000:1.8.0_161-fcs ################################# [100%]
2.JDK配置环境变量

vi /etc/profile

#JDK Environment Variables
export JAVA_HOME=/usr/java/1.8.0_161
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$PATH:$JRE_HOME/bin
exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
使配置生效

source /etc/profile

测试JDK
[[email protected] ~]# java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

3.创建MyCAT用户及组
创建一个新的group
groupadd mycat
创建一个新的用户,并加入group
useradd -g mycat mycat
给新用户设置密码,
passwd mycat
Changing password for user mycat.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
chown -R mycat.mycat /usr/local/mycat/

  1. MyCAT安装
    获取MyCAT的最新开源版本,项目主页http://dl.mycat.io/
    目前最新MyCAT二进制包下载地址:
    http://dl.mycat.io/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
    MySQL 下载:
    http://dev.mysql.com/downloads/mysql/5.6.html#downloads
    (注:MyCAT支持多种数据库接入,如:MySQL、SQL Server、Oracle、MongoDB等. 推荐使用MySQL做集群.)
    环境安装与配置
    如果是第一次刚接触MyCat建议下载源码在本地通过eclipse等工具进行配置和运行,便于深入了解和调试程序运行逻辑。

在Linux(Unix)下,建议放在/usr/local/mycat目录下,如下面类似的:
[[email protected] ~]# tar xf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz -C /usr/local/
[[email protected] ~]# ll /usr/local/mycat/
total 12
drwxr-xr-x 2 root root 190 Mar 11 02:19 bin
drwxrwxrwx 2 root root 6 Mar 1 2016 catlet
drwxrwxrwx 4 root root 4096 Mar 11 02:19 conf
drwxr-xr-x 2 root root 4096 Mar 11 02:19 lib
drwxrwxrwx 2 root root 6 Jan 22 22:01 logs
-rwxrwxrwx 1 root root 219 Jan 22 22:00 version.txt

5.设置mycat环境变量
vim /home/mycat/.bash_profile
export MYCAT_HOME=/usr/local/mycat
PATH=$PATH:$MYCAT_HOME/bin
令修改生效
[[email protected] ~]$ source .bash_profile
测试是否配置成功
[[email protected] ~]$ echo $MYCAT_HOME

Mycat的相关的配置文件:
/usr/local/mycat/
├── bin
│ ├── mycat ##mycat的启动文件,mycat {stop,start,restart,console}
│ ├── ...
├── catlet
├── conf
│ ├── log4j2.xml ##这个配置文件用来配置mycat日志打印级别
│ ├── schema.xml ##读写分离和切片需要配置的主要文件
│ ├── schema.xml.bk ##备份
│ ├── server.xml ##定义了读写分离时mycat的user,共包括两个标签:user,system
│ ├── server.xml.bk ##备份
│ ├── ...
├── lib ##这里是java部分,不懂java略过
│ ├── asm-4.0.jar
│ ├── commons-collections-3.2.1.jar
│ ├── commons-lang-2.6.jar
│ ├── ...
├── logs
│ ├── mycat.log ##mycat的执行过程日志
│ ├── mycat.pid ##PID文件
│ └── wrapper.log ##启动日志,报错信息
└── version.txt

配置文件解释:

--bin 启动目录
--conf 配置文件存放配置文件:
--server.xml:是Mycat服务器参数调整和用户授权的配置文
--schema.xml:是逻辑库定义和表以及分片定义的配置文件。
--rule.xml: 是分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件,也在这个目录下,配置文件修改需要重启MyCAT。
--log4j.xml: 日志存放在logs/log中,每天一个文件,日志的配置是在conf/log4j.xml中,根据自己的需要可以调整输出级别为debug
debug级别下,会输出更多的信息,方便排查问题。
--autopartition-long.txt,partition-hash-int.txt,sequence_conf.properties, sequence_db_conf.properties 分片相关的id分片规则配置文件
--lib MyCAT自身的jar包或依赖的jar包的存放目录。
--logs MyCAT日志的存放目录。日志存放在logs/log中,每天一个文件
1.5 MyCat配置
Mycat的相关的配置文件:
/usr/local/mycat/
├── bin
│ ├── mycat ##mycat的启动文件,mycat {stop,start,restart,console}
│ ├── ...
├── catlet
├── conf
│ ├── log4j2.xml ##这个配置文件用来配置mycat日志打印级别
│ ├── schema.xml ##读写分离和切片需要配置的主要文件
│ ├── schema.xml.bk ##备份
│ ├── server.xml ##定义了读写分离时mycat的user,共包括两个标签:user,system
│ ├── server.xml.bk ##备份
│ ├── ...
├── lib ##这里是java部分,不懂java略过
│ ├── asm-4.0.jar
│ ├── commons-collections-3.2.1.jar
│ ├── commons-lang-2.6.jar
│ ├── ...
├── logs
│ ├── mycat.log ##mycat的执行过程日志
│ ├── mycat.pid ##PID文件
│ └── wrapper.log ##启动日志,报错信息
└── version.txt

配置文件解释:

--bin 启动目录
--conf 配置文件存放配置文件:
--server.xml:是Mycat服务器参数调整和用户授权的配置文
--schema.xml:是逻辑库定义和表以及分片定义的配置文件。
--rule.xml: 是分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件,也在这个目录下,配置文件修改需要重启MyCAT。
--log4j.xml: 日志存放在logs/log中,每天一个文件,日志的配置是在conf/log4j.xml中,根据自己的需要可以调整输出级别为debug
debug级别下,会输出更多的信息,方便排查问题。
--autopartition-long.txt,partition-hash-int.txt,sequence_conf.properties, sequence_db_conf.properties 分片相关的id分片规则配置文件
--lib MyCAT自身的jar包或依赖的jar包的存放目录。
--logs MyCAT日志的存放目录。日志存放在logs/log中,每天一个文件

server.xml 包含了mycat的系统配置信息,分别两个标签user,system,是mycat的调优关键
schema.xml 涵盖了Mycat的逻辑库,表,分片规则,分片节点及数据源

首先配置mycat读写分离时你需要清楚添加mycat结构后是一个什么样的结构,也就是本来没使用Mycat之前你的结构是nginx或者Apache直接访问,之前是做mysql的用户验证,但是现在不同的是你现在需要找Mycat这哥们去做认证了,也就是你刚才创建的mysql_r还有w都是在给mycat打工,那么这个时候我们需要在mycat上配置一个用户供nginx等程序连接

配置认证用户server.xml
[[email protected] ~]## vim /usr/local/mycat/conf/server.xml
<user name="mycat_w"> ##这里我定义一个用户mycat_w,这个用户主要执行增删改查操作
<property name="password">mycat_w</property> ##他的密码我定义为和他名字相同
<property name="schemas"> mycat_test, mysql_test</property> ##和schema.xml里的schema对应,多个用schma用“,”隔开
</user>
<user name="mycat_r"> ##这里我定义一个用户mycat_r,对于连接到这个用户的人,只能执行查询操作
<property name="password">mycat_r</property> ##定义密码
<property name="schemas">mycat_test, mysql_test </property> ##和schema.xml里的schema对应
<property name="readOnly">true</property> ##只读
</user>

配置内存
使用最新JDK,比如JDK8
? system.xml中的processor参数设置为CPU核心数的2×4倍
? Linux主机的网络性能优化
? mycat所在服务器多网卡绑定,bond技术,增加网络吞吐量
? 合适的大内存,conf/wrapper.conf中修改
wrapper.java.additional.5=-XX:MaxDirectMemorySize=1G
wrapper.java.initmemory=1024
wrapper.java.maxmemory=1024

配置数据源schma.xml
认证用户配置完成后,配置schma.xml
这个配置文件里面对与读写分离来说需要配置的点有schema,dataNode,dataHost。
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"&gt;
<dataNode name="dn1" dataHost="localhost1" database="mycat_test"> </dataNode>
<dataNode name="dn2" dataHost="localhost1" database="mysql_test"> </dataNode>

基本的逻辑是这样的:
当用户认证mycat访问后,首先读取定义的schemas表里的mycat_test,而mycat_test只是mycat里的逻辑数据库名字,也就是你连上mycat后所看到的数据库名字,他不一定是真实数据库名字,因为pmycat_test来自schema.xml上的schema进行的定义,mycat_test应着DataNode里的dn1,dn1是上定义了后端数据库真实的数据库名和datahost。
到以上几部基本上请求通过mycat已经知道了他的真实数据库名字,但是似乎还不知道这些库在哪些主机上。是的你可能看到了DataNode上有datahost,我第一次配置的时候就以为这个东西是需要我写详细的主机IP,但是这里也是一个逻辑的地址,这里赐予他法号:locahost1,这里的localhost1代表一个数据库架构,他可能是一主多从,多主多从等等具体他是什么架构继续往下配置datahost标签:

select user()
name:这里的name对应DataNode1的datahost,唯一标示datahost,供上层标签使用
maxCon:指定每个读写实例连接池的最大连接数。内嵌writeHost、readHost,都会使用这个属性的值来实例化连接池的做大连接数
minCon:初始化最初连接池的大小
balance:负载均衡类型,目前有四种值
balance="0": 不开启读写分离机制,所有操作都发送到当前可用的writeHost上
balance="1": 全部的readHost与双主模式下备用writeHost都参与select语句的负载均衡,简而言之在双主双主双从模式下(M1->S1 M2->S2 M1和M2互为主备)时,M2、S1、S2都会参与select语句的负载均衡
balance="2" 所有的读操作都随机在writeHost和readHost上分发
balance="3" 所有的读请求都随机分发到writeHost对应的readHost上执行,writeHost不负担读压力,注意balance=3只在Mycat 1.4版本及以后中有
writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个 writeHost,重新启动后,不会再切回来,切换记录在配置文件中:dnindex.properties .
switchType 故障自动切换下台可用writeHost属性
switchType="-1" 表示不自动切换
switchType="1" 默认值,表示自动切换
switchType="2" 表示基于MySQL主从同步状态决定切换,心跳语句:show slave status
switchType="3" 表示基于MySQL Galary Cluster的切换机制,1.4.1以上支持 心跳语句:show status like ‘wsrep%‘
配置完上面负载均衡等策略之后开始正式配置具体数据库真实IP位置,以及一主多从或其他架构

到这一部基本上读写分离的配置就已经说完了,刚开始我理解的时候,也是很绕,但是当你理解了之后你可能就明白了,其实很简单。
现在待着需求去完整的看一下配置文件的内容吧(读写分离无关的无分片需求可以全部删掉,我的已经删掉)
总览配置文件理清思路
需求:
一主两从架构,基于主从复制。通过mycat去配置成通过mycat的用户www和rrr连接管理三个数据库“pcard,job,shop”,读请求全部交给两台从机来处理,写请求交给Master来处理。
[[email protected] conf]# cat /usr/local/mycat/conf/schema.xml

select user()

当前配置缺陷
目前这个配置,如果Master如果发生宕机,那么整个MySQL将不能读和写,你可能很疑惑,我写主机宕机,但是我从机是正常的啊。这个是mycat的一个定义,如果当前wirteHost内hostM1发生故障整个writeHost将全部失效,读和写都不能使用,为了防止这种现象,我们可以在当前内再添加一个writeHost,作为故障转移节点,当正在使用的出现故障后,立即切换到这个备用节点上,为了防止他读取都不行,我们设置从机备用节点的主,为了保证数据一致性,给予读取权限即可
配置完毕后启动mycat
[[email protected] mycat]# # ./mycat start
[[email protected] mycat]# # netstat -tunlp|grep 8066 ##数据端口,增删改查连接此端口
tcp 0 0 :::8066 :::* LISTEN 5308/java
[[email protected] bin]# netstat -tunlp|grep 9066 ##管理mycat连接该端口
tcp 0 0 :::9066 :::* LISTEN 5308/java
若启动不成功则查看错误日志,或者使用./mycat console查看报错
[[email protected] mycat]# # tail -f /usr/local/mycat/logs/wrapper.log ##方法一,看错误日志
[[email protected] mycat]# # ./mycat console #方法二,看错误被抛出
判断读写分离是否成功
可以分析mycat执行日志,首先将mycat的日志级别改为“debug”分析执行过程
[[email protected] mycat]# # cd /usr/local/mycat/conf
[[email protected] conf]# vim log4j2.xml +25
...

...
[[email protected] mycat]#]# tail -f ../logs/mycat.log
1.6 MyCat读写分离
登录 mysql-master主库
mysql> use mycat_test; 切换到mycat_test库
创建Travelrecord表
mysql> create table travelrecord (id bigint not null primary key,user_id varchar(100),traveldate DATE, fee decimal,days int);
Query OK, 0 rows affected (0.09 sec)
插入数据
mysql> insert into travelrecord(id,user_id,traveldate,fee,days) values(1,@@hostname,20180312,00,27);
Query OK, 1 row affected, 1 warning (0.00 sec)
插入数据
mysql> insert into travelrecord(id,user_id,traveldate,fee,days) values(2,@@hostname,20180312,00,27);
Query OK, 1 row affected, 1 warning (0.00 sec)
[[email protected] conf]# mysql -umycat_w -pmycat_w -h192.168.1.101 -P9066显示数据源的信息,是否是读写节点等。
mysql> show datasource;
+----------+--------+-------+---------------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+--------+-------+---------------+------+------+--------+------+------+---------+-----------+------------+
| dn1 | hostM1 | mysql | 192.168.1.102 | 3306 | W | 0 | 11 | 1000 | 89 | 8 | 1 |
| dn1 | hostM2 | mysql | 192.168.1.102 | 3306 | W | 0 | 1 | 1000 | 69 | 0 | 0 |
| dn1 | hostS2 | mysql | 192.168.1.101 | 3306 | R | 0 | 0 | 1000 | 0 | 0 | 0 |
| dn1 | hostS3 | mysql | 192.168.1.103 | 3306 | R | 0 | 0 | 1000 | 0 | 0 | 0 |
| dn1 | hostS4 | mysql | 192.168.1.101 | 3306 | R | 0 | 0 | 1000 | 0 | 0 | 0 |
| dn2 | hostM1 | mysql | 192.168.1.102 | 3306 | W | 0 | 11 | 1000 | 89 | 8 | 1 |
| dn2 | hostM2 | mysql | 192.168.1.102 | 3306 | W | 0 | 1 | 1000 | 69 | 0 | 0 |
| dn2 | hostS2 | mysql | 192.168.1.101 | 3306 | R | 0 | 0 | 1000 | 0 | 0 | 0 |
| dn2 | hostS3 | mysql | 192.168.1.103 | 3306 | R | 0 | 0 | 1000 | 0 | 0 | 0 |
| dn2 | hostS4 | mysql | 192.168.1.101 | 3306 | R | 0 | 0 | 1000 | 0 | 0 | 0 |
+----------+--------+-------+---------------+------+------+--------+------+------+---------+-----------+------------+
10 rows in set (0.01 sec)
mysql> show datanode; 显示数据节点的访问情况,包括每个数据节点当前活动连接数(active),空闲连接数(idle)以及最大连接数(maxCon) size,EXECUTE参数表示从该节点获取连接的次数,次数越多,说明访问该节点越多。
+------+-----------------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| NAME | DATHOST | INDEX | TYPE | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME |
+------+-----------------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| dn1 | localhost1/mycat_test | 0 | mysql | 0 | 3 | 1000 | 35 | 0 | 0 | 0 | -1 |
| dn2 | localhost1/mysql_test | 0 | mysql | 0 | 7 | 1000 | 237 | 0 | 0 | 0 | -1 |
+------+-----------------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
2 rows in set (0.00 sec)
验证Mycat读功能
通过MYCAT去读取mysql-master服务器mysql_test库下travelrecord表里的数据
[[email protected] conf]# mysql -umycat_r -pmycat_r -h192.168.1.101 -P8066 以mycat_r用户登录测试mycat读取数据功能
mysql> use mysql_test;
Database changed
mysql> select * from travelrecord;
+----+--------------+------------+------+------+
| id | user_id | traveldate | fee | days |
+----+--------------+------------+------+------+
| 1 | mysql-master | 2018-03-12 | 0 | 27 |
| 2 | mysql-master | 2018-03-12 | 0 | 27 |
+----+--------------+------------+------+------+
2 rows in set (0.00 sec)
测试插入新数据
mysql> insert into travelrecord(id,user_id,traveldate,fee,days) values(2,@@hostname,20180312,00,36);
ERROR 1495 (HY000): User readonly 不能执行只能读取数据
验证Mycat数据写入
[[email protected] conf]# mysql -umycat_w -pmycat_w -h192.168.1.101 -P8066以mycat_w用户登录插入新数据
mysql> use mycat_test;
Database changed
插入新数据
mysql> insert into travelrecord(id,user_id,traveldate,fee,days) values(2,@@hostname,20180312,00,41);
Query OK, 1 row affected, 1 warning (0.31 sec)
插入新数据
mysql> insert into travelrecord(id,user_id,traveldate,fee,days) values(2,@@hostname,20180312,00,45);
ERROR 1062 (23000): Duplicate entry ‘2‘ for key ‘PRIMARY‘
[[email protected] conf]# mysql -umycat_r -pmycat_r -h192.168.1.101 -P8066 以mycat_r用户登录测试mycat读取数据功能
mysql> use mycat_test;
Database changed
mysql> select * from travelrecord;
+----------+--------------+------------+------+------+
| id | user_id | traveldate | fee | days |
+----------+--------------+------------+------+------+
| 1 | mysql-master | 2016-01-01 | 100 | 10 |
| 2 | mysql-master | 2018-03-12 | 0 | 41 |
| 5000001 | mysql-master | 2016-01-02 | 100 | 10 |
| 10000001 | mysql-master | 2016-01-03 | 100 | 10 |
+----------+--------------+------------+------+------+
4 rows in set (0.00 sec)
1.7 MyCAT 命令行监控
9066端口 ,用mysql命令行连接
mysql -umycat_w -pmycat_w -h192.168.1.101 -P9066
show @@help 可显示所有相关管理命令

原文地址:http://blog.51cto.com/rw2016/2086904

时间: 2024-10-28 04:49:28

Linux下mysql基于MyCat实现主从复制和读写分离的相关文章

linux下mysql基于mycat做主从复制和读写分离之基础篇

Linux下mysql基于mycat实现主从复制和读写分离1.基础设施 两台虚拟机:172.20.79.232(主) 172.20.79.233(从) 1.1软件设施 mysql5.6.39 , mycat1.6-RELEASE jdk1.7及其以上版本2.实现步骤一(mycat实现读写分离) 1.首先在两台服务器安装mysql 1.下载mysql的repo源 $ wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rp

利用mycat实现基于mysql5.5主从复制的读写分离

整体步骤: 1.准备好两台服务器,一台作为主数据库服务器,一台作为从服务器,并安装好mysql数据库,此处略 2.配置好主从同步 3.下载JDK配置mycat依赖的JAVA环境,mycat采用java语言开发运行依赖jre 4.配置mycat的相关文件 5.测试 一.配置mysql主从环境 MYSQL主从同步的作用 (1) 数据分布 (2) 负载平衡(load balancing) (3) 备份 (4) 高可用性(high availability)和容错 MYSQL主从同步的原理 关于MYSQ

mysql Replication(mysql5.7主从复制以及读写分离)

Replication: 即在多个数据库服务器之间实现数据的自动复制. 策略一:基于binary log file(二进制日志文)件的方法 实现机制: 1.The master server 数据库所有的 写入.更新 操作都以"事件"的形式记录到bin log file. 2.The slave servers  从master上读取bin log file的内容,并在 slave server本地执行bin log file中记录的事件. slave server会接收 bin lo

重新学习Mysql数据13:Mysql主从复制,读写分离,分表分库策略与实践

一.MySQL扩展具体的实现方式 随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量. 关于数据库的扩展主要包括:业务拆分.主从复制.读写分离.数据库分库与分表等.这篇文章主要讲述数据库分库与分表 (1)业务拆分 在?大型网站应用之海量数据和高并发解决方案总结一二?一篇文章中也具体讲述了为什么要对业务进行拆分. 业务起步初始,为了加快应用上线和快速迭代,很多应用都采用集中式的架构.随着业务系统的扩大,系统变得越来越复杂,越来越难以维护,开发效率变得越

linux下mysql主从复制(第二篇读写分离) mycat 中间件

linux下mysql主从复制(第二篇读写分离) mycat 中间件 接着上篇文档补全,mysql 读写分离,在上篇文章案例下准备好Mycat-server-1.4-release-20151019230038-win.tar.gz 解压包 1.解压后的文件如下: 1.1 接下来进入到conf 目录下配置四个文件server.xml.schema.xml.rule.xml.log4j.xml 下面一一介绍 1.2 首先在我们主服务上面test 库下新建两张表如下: CREATETABLE`t_u

Linux下Mysql主从复制

一.前言:为什么MySQL要做主从复制(读写分离)?通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低.为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来减轻主数据库的负载.而且如果主数据库宕机,可快速将业务系统切换到从数据库上,可避免数据丢失. 二.MySQL主从复制(读写分离)和集群的区别:我对MySQL也是刚开始研究,不是很专业.我的理解是:1.主从复制(读写分离):一般需要两台及以上数据库服务器即可(一台用于写入数据,一台用于同步主的数据并用

基于Mysql-Proxy实现Mysql的主从复制以及读写分离(下)

基于Mysql-Proxy实现Mysql的主从复制以及读写分离(下) 昨天谈到了Mysql实现主从复制,但由于时间原因并未讲有关读写分离的实现,之所以有读写分离,是为了使数据库拥有双机热备功能,至于双机热备,特指基于高可用系统中的两台服务器的热备(或高可用),因两机高可用在国内使用较多,故得名双机热备,双机高可用按工作中的切换方式分为:主-备方式(Active-Standby方式)和双主机方式(Active-Active方式),主-备方式即指的是一台服务器处于某种业务的激活状态(即Active状

mysql学习(3)-linux下mysql主从复制

前言:为什么MySQL要做主从复制(读写分离)?通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低.为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来减轻主数据库的负载.而且如果主数据库宕机,可快速将业务系统切换到从数据库上,可避免数据丢失. MySQL主从复制(读写分离)和集群的区别: 1.主从复制(读写分离):一般需要两台及以上数据库服务器即可(一台用于写入数据,一台用于同步主的数据并用于数据查询操作).局限性:(1)配置好主从复制之后,同一张表

【MySQL】Linux下MySQL 5.5、5.6和5.7的RPM、二进制和源码安装

  [MySQL]Linux下MySQL 5.5.5.6和5.7的RPM.二进制和源码安装 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① MySQL的二进制安装过程(重点) ② MySQL多实例管理(mysqld_multi) ③ MySQL的源码编译安装过程 ④ Linux的逻辑卷的使用 ⑤ 文件的MD5值 ⑥ 访问MySQL的几种客户端工具(Nav