Linux下mysql基于MyCat实现主从复制和读写分离
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)
- 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; -
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 - 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; - 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/
- 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/">
<dataNode name="dn1" dataHost="localhost1" database="mycat_test"> </dataNode>
<dataNode name="dn2" dataHost="localhost1" database="mysql_test"> </dataNode>
以上是关于Linux下mysql基于MyCat实现主从复制和读写分离的主要内容,如果未能解决你的问题,请参考以下文章
Linux 使用Mycat实现读写分离(基于Mysql的读写分离)