Mysql读写分离之Mycat

Mycat 是一个开源的分布式数据库系统,是一个实现了 Mysql 协议的服务器,前端用户可以把它看作是一个数据库代理,用 Mysql Mysql 客户端工具和命令行访问,而其后端可以用原生协议与个 Mysql 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端 Mysql 服务器里或者其他数据库里。

  • Mycat端口:
    • 数据端口 8066
    • 管理端口 9066

部署Mycat


环境准备

## 用 hostnamectl set-hostname 根据角色更改主机名
## 关闭防火墙和selinux
[root@mycat ~]# systemctl stop firewalld
[root@mycat ~]# systemctl disable firewalld
[root@mycat ~]# setenforce 0
## 更改 /etc/hosts 文件
[root@mycat ~]# cat >/etc/hosts << EOF
192.168.1.1 mycat
192.168.1.2 master
192.168.1.3 slave1
192.168.1.4 slave2
EOF
## 分发到其他服务器上
[root@mycat ~]# scp /etc/hosts root@master:/etc/hosts
[root@mycat ~]# scp /etc/hosts root@slave1:/etc/hosts
[root@mycat ~]# scp /etc/hosts root@slave2:/etc/hosts
## 在 master、slave1和slave2做Mysql一主双从复制(M-S-S)

安装Mycat
Mycat官方

## Mycat依赖于Java环境
[root@mycat ~]# yum install java -y
[root@mycat ~]# java -version
openjdk version "1.8.0_201"
OpenJDK Runtime Environment (build 1.8.0_201-b09)
OpenJDK 64-Bit Server VM (build 25.201-b09, mixed mode)
## 下载Mycat
[root@mycat ~]# wget http://dl.mycat.io/1.6.6.1/Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz
[root@mycat ~]# mkdir /soft/
[root@mycat ~]# tar xf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz -C /soft/

配置应用程序连接 Mycat 账户密码

## 在配置文件最低下有 Mycat 账号密码和对应的权限配置
[root@mycat ~]# vim /soft/mycat/conf/server.xml

        <!-- 应用连接 mycat 账户(defaultAccount默认连接用户,false=否,true=是) -->
        <user name="test" defaultAccount="true">
                <!-- 应用连接 mycat 密码 -->
                <property name="password">123456</property>
                <!-- 针对哪个库进行授权,多库用逗号隔开 -->
                <property name="schemas">test,www</property>

                <!-- 表级 DML 权限设置(check是否开启,false=否,true=是) -->
                <privileges check="false">
                        <!-- 针对数据下的所有表授权(1=有,0=没有,分别对应:insert,update,select,delete) -->
                        <schema name="TEST" dml="0110" >
                                <!-- 针对数据下的单个表授权 -->
                                <table name="t1" dml="0000"></table>
                                <table name="t2" dml="1111"></table>
                        </schema>
                </privileges>
        </user>

        <user name="www">
                <property name="password">123456</property>
                <property name="schemas">www</property>
                <!-- 是否只读 -->
                <property name="readOnly">false</property>
        </user>

配置 Mycat 连接后端数据库

  • balance 负载均衡轮询
    • balance="0" 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
    • balance="1" 所有的主机都参与 select 语句的负载均衡, 但写语句还是由 writeHost
    • balance="2" 所有读操作都随机的在 writeHost、readhost 上分发。
  • writeType 负载均衡状态
    • writeType="0" 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个
    • writeType="1" 所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。

作者:Johnny_Kam
链接:https://www.jianshu.com/p/4e15cad5ce6a
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

[root@mycat ~]# vim /soft/mycat/conf/schema.xml 
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
     <!-- 定义逻辑库(逻辑库名、是否分片、返回最大行数、数据节点) -->
     <schema name="test" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> </schema>
     <schema name="www" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"> </schema>
    <!-- 定义数据节点(数据节点名、数据库实例、真实数据库名) -->
    <dataNode name="dn1" dataHost="dn1pool" database="test" />
    <dataNode name="dn2" dataHost="dn2pool" database="www" />
    <!-- 定义 test 数据库实例(实例名、最大连接数、最初连接数、负载均衡轮询、负载均衡状态、数据库类型、连接类型、是否自动切换、) -->
    <dataHost name="dn1pool" maxCon="1000" minCon="10" balance="1"
        writeType="0" dbType="mysql" dbDriver="native" switchType="1">
        <!-- 健康检查 -->
        <heartbeat>select user()</heartbeat>
        <!-- 定义读写主机 , 可以定义多个 -->
        <writeHost host="master" url="master:3306" user="test" password="Sgy123.com">
            <readHost host="slave1" url="slave1:3306" user="test" password="Sgy123.com" />
            <readHost host="slave2" url="slave2:3306" user="test" password="Sgy123.com" />
        </writeHost>
     </dataHost>
     <dataHost name="dn2pool" maxCon="1000" minCon="10" balance="1"
         writeType="0" dbType="mysql" dbDriver="native" switchType="1">
        <!-- 健康检查 -->
        <heartbeat>select user()</heartbeat>
            <writeHost host="master" url="master:3306" user="www" password="Sgy123.com">
                <readHost host="slave1" url="slave1:3306" user="www" password="Sgy123.com" />
                <readHost host="slave2" url="slave2:3306" user="www" password="Sgy123.com" />
            </writeHost>
    </dataHost>
</mycat:schema>

配置 master 上添加相应的用户和数据库和模拟数据

## 模拟数据省略。。。
mysql> create databse test;
mysql> create databse www;
## 模拟数据省略。。。
mysql> grant all on *.* to test@'192.168.1.%' identified by 'Sgy123.com';
mysql> grant all on www.* to www@'192.168.1.%' identified by 'Sgy123.com';

启动 Mycat 中间件

[root@mycat conf]# /soft/mycat/bin/mycat start
Starting Mycat-server...
[root@mycat logs]# lsof -i :8066
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 7905 root 81u IPv6 107719 0t0 TCP *:8066 (LISTEN)
[root@mycat logs]# lsof -i :9066
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 7905 root 77u IPv6 107717 0t0 TCP *:9066 (LISTEN)

连接 Mycat 中间件

[root@mycat ~]# mysql -P8066 -utest -p'123456' -h127.0.0.1
[root@mycat ~]# mysql -P9066 -utest -p'123456' -h127.0.0.1

[root@mycat ~]# mysql -P8066 -uwww -p'123456' -h127.0.0.1
[root@mycat ~]# mysql -P9066 -uwww -p'123456' -h127.0.0.1

猜你喜欢

转载自www.cnblogs.com/songguoyou/p/11883870.html