1.mycat文档:https://github.com/MyCATApache/Mycat-doc       官方网站:http://www.mycat.org.cn/ 2.mycat的优点

  • 配置简单,灵活
  • 可实现读写分离
  • 可利用多种规则实现分库分表
  • 心跳机制,自动踢出故障机组
  • 免费开源,长期维护,社区活跃

mycat的缺点:

  • 主要是分片之后有一些限制,如只能2表join

3.架构图:可实现读写分离,分库分表
4.所需软件,机器配置与ip地址

名称 版本 下载地址
mysql server mysql  Ver 14.14 Distrib 5.6.27, for Linux (x86_64) yum源安装,yum源地址:http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
mycat 1.3.0.3 https://github.com/MyCATApache/Mycat-download/blob/master/1.3.0.3-release/Mycat-server-1.3.0.3-release-20150527095523-linux.tar.gz
keepalived   http://www.keepalived.org/download.html
机器名  ip地址 配置 用途
mycat1 192.168.2.155/192.168.10.30 4G,4C mycat+keepalived (主)
mycat2 192.168.2.156/192.168.10.31 4G,4C mycat+keepalived (备)
db1 192.168.10.155 8G,4C mysql master1
db2 192.168.10.156 8G,4C mysql master2
db3 192.168.10.157 8G,4C mysql slave1

5.安装,配置mysql server

  • 获取官方yum源:  wget http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
  • 安装源:yum install mysql57-community-release-el6-7.noarch.rpm
  • 默认yum安装的是5.7,我们修改yum源,下载5.6的mysql server
  • 进入yum源配置文件:cd /etc/yum.repos.d/
  • 找到并编辑:vim mysql-community.repo
  • 找到下面这些内容:enabled=1就是可用,把[mysql56-community]段的enabled=0改为enabled=1,相应的把[mysql57-community]段的改为0,保存退出

# Enable to use MySQL 5.6                 [mysql56-community]                 name=MySQL 5.6 Community Server                 baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/6/$basearch/                 enabled=0                 gpgcheck=1                 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql                                  [mysql57-community]                 name=MySQL 5.7 Community Server                 baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/6/$basearch/                 enabled=1                 gpgcheck=1                 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

  • 查找安装包(会更新源,时间几分钟,看你的网速咯):yum list |grep mysql
  • 如果顺利就会看到这一行:mysql-community-server.x86_64              5.6.27-2.el6
  • 没错就是它,安装:yum install -y mysql-community-server.x86_6
  • 启动(这一步会自动初始化一些内容):service mysqld start
  • 修改root密码:mysqladmin -uroot --password ‘xxxxx’
  • 修改配置文件,我测试时候的配置文件:
  • db1:

[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock character_set_server = utf8
back_log=1024 max_connections = 10000 max_connect_errors = 1000 read_buffer_size = 4M query_cache_size = 64M key_buffer_size=400M max_allowed_packet=128M innodb_flush_log_at_trx_commit=0 innodb_log_file_size = 200M innodb_log_files_in_group = 3 innodb_buffer_pool_size = 2048M innodb_log_buffer_size = 16M query_cache_size = 0 #init_connect='SET autocommit=0' innodb_lock_wait_timeout = 50
# Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0
# Recommended in standard MySQL setup sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #replication setting server-id=1 log-bin=mysql-bin relay-log=mysql-relay-bin binlog-do-db=33hao binlog-do-db=jaydb binlog-do-db=sbtest binlog-do-db=shopnc binlog-ignore-db=mysql binlog-ignore-db=performance_schema binlog-ignore-db=information_schema log-slave-updates=1 master-info-repository=table relay-log-info-repository=table relay-log-recovery=1 #for mmm setting #read_only=1 #general log general_log=1 general_log_file=/var/log/mysql/mysql-row.log #no lower_case lower_case_table_names = 1 #slow log slow_query_log=1 slow_query_log_file=/var/log/mysql/mysql-slow.log long_query_time=2 log-queries-not-using-indexes #default timestamp explicit_defaults_for_timestamp=true
[mysqld_safe] log-error=/var/log/mysql/mysqld.log pid-file=/var/run/mysqld/mysqld.pid

  • db2:

[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock character_set_server = utf8
back_log=1024 max_connections = 10000 max_connect_errors = 1000 read_buffer_size = 4M query_cache_size = 64M key_buffer_size=400M max_allowed_packet=128M innodb_flush_log_at_trx_commit=0 innodb_log_file_size = 200M innodb_log_files_in_group = 3 innodb_buffer_pool_size = 2048M innodb_log_buffer_size = 16M query_cache_size = 0 #init_connect='SET autocommit=0' innodb_lock_wait_timeout = 50
# Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0
# Recommended in standard MySQL setup sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #replication setting server-id=2 log-bin=mysql-bin relay-log=mysql-relay-bin binlog-do-db=33hao binlog-do-db=jaydb binlog-do-db=sbtest binlog-do-db=shopnc binlog-ignore-db=mysql binlog-ignore-db=performance_schema binlog-ignore-db=information_schema log_slave_updates=1 master-info-repository=table relay-log-info-repository=table relay-log-recovery=1 #for mmm setting #read_only=1 #general log general_log=1 general_log_file=/var/log/mysql/mysql-row.log #no lower_case lower_case_table_names = 1 #slow log slow_query_log=1 slow_query_log_file=/var/log/mysql/mysql-slow.log long_query_time=2 log-queries-not-using-indexes #default timestamp explicit_defaults_for_timestamp=true
[mysqld_safe] log-error=/var/log/mysql/mysqld.log pid-file=/var/run/mysqld/mysqld.pid

  • db3:  

[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock character_set_server = utf8
back_log=1024 max_connections = 10000 max_connect_errors = 1000 read_buffer_size = 4M query_cache_size = 64M key_buffer_size=400M max_allowed_packet=128M innodb_flush_log_at_trx_commit=0 innodb_log_file_size = 200M innodb_log_files_in_group = 3 innodb_buffer_pool_size = 2048M innodb_log_buffer_size = 16M query_cache_size = 0 #init_connect='SET autocommit=0' innodb_lock_wait_timeout = 50
# Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0
# Recommended in standard MySQL setup sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES #replication setting server-id=3 #log-bin=mysql-bin relay-log=mysql-relay-bin binlog-do-db=33hao binlog-do-db=jaydb binlog-do-db=sbtest binlog-do-db=shopnc binlog-ignore-db=mysql binlog-ignore-db=performance_schema binlog-ignore-db=information_schema master-info-repository=table relay-log-info-repository=table relay-log-recovery=1 #for mmm setting #read_only=1 #general log general_log=1 general_log_file=/var/log/mysql/mysql-row.log #no lower_case lower_case_table_names = 1 #slow log slow_query_log=1 slow_query_log_file=/var/log/mysql/mysql-slow.log long_query_time=2 log-queries-not-using-indexes #default timestamp explicit_defaults_for_timestamp=true
[mysqld_safe] log-error=/var/log/mysql/mysqld.log pid-file=/var/run/mysqld/mysqld.pid

6.从最上面的架构图中可以看出,这里只有一个主主(db1,db2),一个主从(db1,db3),下面分别配置主主,主从

7.mysql主主复制配置

(1)分别编辑db1,db2配置文件,把第5步相应的内容复制到/etc/my.cnf中 (2)接下来手动同步数据 (3)mysql>FLUSH TABLES WITH READ LOCK (4)不要退出终端,另外开一个,用mysqldump工具导出所有数据库数据,到db2数据库中 (5)在db1(192.168.10.155)的mysql上授权:grant replication slave on *.* to 'repl_user'@'192.168.10.156' identified by 'repl_password'; (6)查看db1的master状态,设置从(db2机器的mysql)的时候需要

mysql> show master status;                 +------------------+----------+--------------+------------------+-------------------+                 | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |                 +------------------+----------+--------------+------------------+-------------------+                 | mysql-bin.000001 |      336 |              |                  |                   |                 +------------------+----------+--------------+------------------+-------------------+ (7)在db2中设置master参数,(master_log_file,master_log_pos,都来自上一步)                 mysql> change master to master_host='192.168.10.156', master_user='repl_user',master_password='repl_passwd',master_log_file='mysql-bin.000001',master_log_pos=336; (8)启动db2从的复制                 mysql>slave start; (9)查看从的状态                 mysql>show slave status\G;                 Slave_IO_Running: Yes                 Slave_SQL_Running: Yes                 Seconds_Behind_Master: 0                 看到这几行说明复制成功。 (10)把db1设置为db2的从                 方法同上,重复(5)-(9),只是把db1和db2,相应的IP地址互换即可,注意重复第(7)的时候master_log_file,master_log_pos是db2的master status了。

8.把db3(192.168.10.157)设置为db1的从

方法通与7步类似,重复其中的(1)-(7)步,只是把db2和192.168.10.156换成db3和192.168.10.157。

9.至此,mysql的设置全部完成。

10.下载,安装mycat

  • wget https://github.com/MyCATApache/Mycat-download/blob/master/1.3.0.3-release/Mycat-server-1.3.0.3-release-20150527095523-linux.tar.gz
  • tar -zxf Mycat-server-1.3.0.3-release-20150527095523-linux.tar.gz
  • 解压完成就可以使用,建议把解压后的文件夹放在/opt下,并建立mycat的软连接(ln -s “解压出来的文件夹” mycat),方便以后升级,维护。

11.配置mycat/conf/schema.xml

(1)在这里,我对33hao数据库实现读写分离 (2)对sbtest数据库所有表实现,读写不分离(当然,也可以针对某一张表,这种设置应对读写实时要求很高的情况,即单表或单库读写不分离) (3)对transdb数据库的表实现分片,users表不分片(type="global")提高join效率,orders表,用id通过mod-log规则分片(primaryKey="id" rule="mod-long")

<?xml version="1.0"?> < !DOCTYPE mycat:schema SYSTEM "schema.dtd"> < mycat:schema xmlns:mycat="http://org.opencloudb/">
    <schema name="33hao" checkSQLschema="false" dataNode="dn1">     </schema>     <schema name="sbtest" checkSQLschema="false" dataNode="dn2">     </schema>     <schema name="jaydb" checkSQLschema="false" dataNode="dn3">     </schema>     <schema name="transdb" checkSQLschema="false">         <table name="users" primaryKey="id" type="global" dataNode="dn4,dn5,dn6" />
                <!-- random sharding using mod sharind rule -->             <table name="orders" primaryKey="id" rule="mod-long" dataNode="dn4,dn5,dn6" />     </schema>     <schema name="shopnc" checkSQLschema="false" dataNode="dn7">     </schema>     <dataNode name="dn1" dataHost="localhost1" database="33hao" />     <dataNode name="dn2" dataHost="localhost2" database="sbtest" />     <dataNode name="dn3" dataHost="localhost1" database="jaydb" />     <dataNode name="dn4" dataHost="localhost4" database="transdb" />     <dataNode name="dn5" dataHost="localhost5" database="transdb" />     <dataNode name="dn6" dataHost="localhost6" database="transdb" />     <dataNode name="dn7" dataHost="localhost1" database="shopnc" />
    <dataHost name="localhost1" maxCon="100000" minCon="10" balance="1"         writeType="0" dbType="mysql" dbDriver="native">         <heartbeat>select user()</heartbeat>         <!-- can have multi write hosts -->         <writeHost host="hostM1" url="db1:3306" user="root"             password="123456">             <!-- can have multi read hosts -->             <readHost host="hostS1" url="db3:3306" user="root" password="123456"/>             <readHost host="hostS2" url="db2:3306" user="root" password="123456"/>         </writeHost>         <writeHost host="hostM2" url="db2:3306" user="root"             password="123456">             <!-- can have multi read hosts -->         </writeHost>         <!-- <writeHost host="hostM2" url="db2:3306" user="root" password="123456"/> -->     </dataHost>     <dataHost name="localhost2" maxCon="100000" minCon="10" balance="1"         writeType="0" dbType="mysql" dbDriver="native">         <heartbeat>select user()</heartbeat>         <!-- can have multi write hosts -->         <writeHost host="hostM1" url="db1:3306" user="root"             password="123456">         </writeHost>     </dataHost>     <dataHost name="localhost4" maxCon="100000" minCon="10" balance="0"         writeType="0" dbType="mysql" dbDriver="native">         <heartbeat>select user()</heartbeat>         <!-- can have multi write hosts -->         <writeHost host="hostM1" url="db1:3306" user="root" password="123456"></writeHost>     </dataHost>     <dataHost name="localhost5" maxCon="100000" minCon="10" balance="0"         writeType="0" dbType="mysql" dbDriver="native">         <heartbeat>select user()</heartbeat>         <!-- can have multi write hosts -->         <writeHost host="hostM2" url="db2:3306" user="root" password="123456"></writeHost>     </dataHost>     <dataHost name="localhost6" maxCon="100000" minCon="10" balance="0"         writeType="0" dbType="mysql" dbDriver="native">         <heartbeat>select user()</heartbeat>         <!-- can have multi write hosts -->         <writeHost host="hostS1" url="db3:3306" user="root" password="123456"></writeHost>     </dataHost>
12.设置mycat/conf/server.xml

  • 这里是针对mycat的设置,如外部访问mycat的端口,用户名,密码,mycat的数据库有哪些等

<?xml version="1.0" encoding="UTF-8"?> < !-- - - Licensed under the Apache License, Version 2.0 (the "License");         - you may not use this file except in compliance with the License. - You         may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0         - - Unless required by applicable law or agreed to in writing, software -         distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT         WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the         License for the specific language governing permissions and - limitations         under the License. --> < !DOCTYPE mycat:server SYSTEM "server.dtd"> < mycat:server xmlns:mycat="http://org.opencloudb/">         <system>         <property name="defaultSqlParser">druidparser</property>               <property name="processors">32</property>               <property name="processorExecutor">32</property>               <property name="serverPort">3306</property>               <property name="managerPort">9066</property>
        </system>         <user name="root">                 <property name="password">123456</property>                 <property name="schemas">33hao,sbtest,jaydb,transdb,shopnc</property>         </user> < /mycat:server> 13.启动mycat

  • /opt/mycat/bin/mycat start

14.连接mycat

  • 和连接mysql方法一样,如果连接不上,看看是否在没个节点上都授予了mycat机器通过root/123456(在schema.xml中配置的)的方式访问:
  • mysql -uroot -p123456 -h127.0.0.1 -P3306

15.测试mycat

  • 我开起了general_log,数据库任何操作都会被记录,依次打开三个db1 db2 db3的日志:tail -f /var/log/mysql/mysql-row.log
  • 透过mycat连接数据库 mysql -uroot -p123456 -h127.0.0.1 -P3306
  • 在相应的数据库中执行操作,并观察日志。
  • 比如对33hao的写总是在db1上,然后replication到db2,db3,如果db1宕机,写总是在db2上,db1恢复后,db2不会被抢占写的角色。读在db2,db3上随机执行。
  • 而transdb的orders表被均匀地复制到db1,db2,db3的transdb的orders表中,users则在所有mysql(这里为db1,db2,db3)中保存副本(因为在schema.xml中设置为:type="global")。

mycat+mysql集群:实现读写分离,分库分表的更多相关文章

  1. Mycat安装并实现mysql读写分离,分库分表

    Mycat安装并实现mysql读写分离,分库分表 一.安装Mycat 1.1 创建文件夹 1.2 下载 二.mycat具体配置 2.1 server.xml 2.2 schema.xml 2.3 se ...

  2. Docker安装Mycat并实现mysql读写分离,分库分表

    Docker安装Mycat并实现mysql读写分离,分库分表 一.拉取mycat镜像 二.准备挂载的配置文件 2.1 创建文件夹并添加配置文件 2.1.1 server.xml 2.1.2 serve ...

  3. Mycat 读写分离+分库分表

    上次进过GTID复制的学习记录,已经搭建好了主从复制的服务器,现在利用现有的主从复制环境,加上正在研究的Mycat,实现了主流分布式数据库的测试 Mycat就不用多介绍了,可以实现很多分布式数据库的功 ...

  4. SpringCloud微服务实战——搭建企业级开发框架(二十七):集成多数据源+Seata分布式事务+读写分离+分库分表

    读写分离:为了确保数据库产品的稳定性,很多数据库拥有双机热备功能.也就是,第一台数据库服务器,是对外提供增删改业务的生产服务器:第二台数据库服务器,主要进行读的操作. 目前有多种方式实现读写分离,一种 ...

  5. 读写分离&分库分表学习笔记

    读写分离 何为读写分离? 见名思意,根据读写分离的名字,我们就可以知道:读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上. 这样的话,就能够小幅提升写性能,大幅提升读性能. 我简单画了一 ...

  6. Django 数据库读写分离 分库分表

    多个数据库 配置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BA ...

  7. MySQL主从复制&读写分离&分库分表

    MySQL主从复制 MySQL的主从复制只能保证主机对外提供服务,从机是不提供服务的,只是在后台为主机进行备份数据 首先我们说说主从复制的原理,这个是必须要理解的玩意儿: 理解: MySQL之间的数据 ...

  8. Docker安装MySQL集群【读写分离】

    Centos7系统Docker安装 目录 Centos7系统Docker安装 目录 Centos7系统Docker安装 1.下载mysql镜像 2.创建Master实例并启动 参数说明 3.创建Sla ...

  9. atlas+mysql主主集群实现读写分离

     atlas+mysql主主集群实现读写分离 前言: 目前线上系统数据库采用的是主主架构.其中一台主仅在故障时切换使用,(仅单台服务器对外提供服务,当一台出现问题,切换至另一台).该结构很难支撑较大并 ...

随机推荐

  1. Debian社区群龙无首

    导读 前两天有过消息 Debian 包维护者 Michael Stapelberg 因对 Debian 社区的现状不满而宣布退出 Debian 的维护,该消息引发了人们对于 Debian 的担忧.11 ...

  2. BZOJ 2730 矿场搭建

    割点 割点以外的点坍塌不影响其他人逃生,因为假设我们任取两个个非割点s建立救援站,非割点的任意点坍塌,我们都可以从割点走到一个救援出口. 所以我们只考虑割点坍塌的情况. 我们可以先找出图中所有的割点. ...

  3. k8s集群Canal的网络控制 原

    1 简介 直接上干货 public class DispatcherServlet extends HttpServlet { private Properties contextConfigProp ...

  4. kubernetes 1.14安装部署metrics-server插件

    简单介绍: 如果使用kubernetes的自动扩容功能的话,那首先得有一个插件,然后该插件将收集到的信息(cpu.memory..)与自动扩容的设置的值进行比对,自动调整pod数量.关于该插件,在ku ...

  5. python7 数据类型的相互转化 字符编码

    复习 1.深浅拷贝    ls = [1, 'a', [10]]    值拷贝:直接赋值 ls1 = ls, ls中的任何值发生改变,ls1中的值都会随之改变    浅拷贝:通过copy()方法 ls ...

  6. I2C(四)linux3.4(写代码)

    title: I2C(四)linux3.4(写代码) date: 2019/1/29 17:18:42 toc: true --- I2C(四)linux3.4(写代码) 老师的参考代码 https: ...

  7. vue引入fastclick设置输入框type="number"报错Failed to execute 'setSelectionRange' on 'HTMLInputElement': The input element's type ('number') does not support selection.的解决办法

    将输入框type设为text,通过正则验证输入的值

  8. Laravel 5.7 使用 PHP artisan migrate 的问题

    这是由于Laravel 默认使用 utf8mb4 字符, 包括支持在数据库存储「 表情」 . 如果你正在运行的 MySQL release 版本低于5.7.7 或 MariaDB release版本低 ...

  9. java字符串转为Map类型:split()方法的应用

    方法一: package com.thinkgem.jeesite.modules.socketTest.demo2; import java.util.HashMap; import java.ut ...

  10. BZOJ 5093[Lydsy1711月赛]图的价值 线性做法

    博主曾更过一篇复杂度为$O( k· \log k)$的多项式做法在这里 惊闻本题有$ O(k)$的神仙做法,说起神仙我就想起了于是就去学习了一波 幂与第二类斯特林数 推导看这里 $$ x^k=\sum ...