Mycat(1)—— Linux环境部署MyCAT数据库

使用 Vmware 11. 创建虚拟机

vm 机器的操作系统是CentOS 6.5

vm的具体参数如下:

注意修改虚拟机的时间:time zone

创建VM后先安装jdk 1.8

wget --no-check-certificate --no-cookie --header "Cookie: oraclelicense=accept-securebackup-cookie;" http://download.oracle.com/otn-pub/java/jdk/8u45-b14/jdk-8u45-linux-x64.rpm

 

之后 安装

rpm -ivh jdk-8u45-linux-x64.rpm

安装完毕后 java -version 检验安装

 

之后再这个虚拟机上安装mysql.(参考mysql on centOS, 和mysql 主从配置)

tar -xzvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

之后下载 mycat server for linux.

将mycat 放入 /urs/local/mycat 目录下

创建系统用户和组

 

groupadd mycat

adduser -r -g mycat mycat

chown -R mycat.mycat /usr/local/mycat  //修改mycat目录所属mycat用户

vi /etc/profile 加入:

MYCAT_HOME=/usr/local/mycat

执行source  /etc/profile命令,使环境变量生效

开放防火墙端口

添加需要监听的端口

/sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

保存设置

/etc/init.d/iptables save

查看状态

/etc/init.d/iptables status

配置环境变量:

cd /usr/local/mycat/

vim /usr/local/mycat/.bash_profile

输入:

export MYCAT_HOME=/usr/local/mycat

PATH=$PATH:$MYCAT_HOME/bin

之后 生效

source .bash_profile

验证配置:

启动mycat: /usr/local/mycat/bin/mycat start

查看mycat 是否正常开启 命令:

ps -ef |grep mycat

 

说明mycat 没有正常启动。

之后到

/usr/local/mycat/logs 下查看wrapper.log

vim /usr/local/mycat/logs/wrapper.log

看到:

之后看看配置文件中需要 配置的host name.

vim /usr/local/mycat/conf/schema.xml

需要修改hosts 文件

vim /etc/hosts

127.0.0.1 hostM1 hostS2

之后再次开启 /usr/local/mycat/bin/mycat start

 ps -ef |grep mycat  这次启动成功。

之后尝试连接 发现 密码不对 需要去 /usr/local/mycat/conf/server.xml

vim /usr/local/mycat/conf/server.xml

配置登录mycat mysql 的user password. (server.xml,和 schema.xml的配置会在后面进行详细的解释)

配置多个schema

修改 /usr/local/mycat/conf/server.xml

<user name="root">

<property name="password">123456</property>

<!--<property name="schemas">TESTDB</property>-->

<property name="schemas">imove,manage,imanage</property>

 

<!-- 表级 DML 权限设置 -->

<!--

<privileges check="false">

<schema name="TESTDB" dml="0110" >

<table name="tb01" dml="0000"></table>

<table name="tb02" dml="1111"></table>

</schema>

</privileges>

 -->

</user>

 

<user name="user">

<property name="password">user</property>

<property name="schemas">imove,manage,imanage</property>

<property name="readOnly">true</property>

</user>

 

 修改 /usr/local/mycat/conf/schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <!--<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>-->
    <schema name="imove" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>
    <schema name="manage" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"></schema>
    <schema name="imanage" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn3"></schema>
    <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
        /> -->
    <dataNode name="dn1" dataHost="localhost1" database="imove" />
    <dataNode name="dn2" dataHost="localhost1" database="manage" />
    <dataNode name="dn3" dataHost="localhost1" database="imanage" />
    <!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" />
     <dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" />
    <dataNode    name="jdbc_dn2" dataHost="jdbchost" database="db2" />
    <dataNode name="jdbc_dn3"     dataHost="jdbchost" database="db3" /> -->
    <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="localhost:3306" user="root"
                   password="123456">
            <!-- can have multi read hosts -->
            <!--<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />-->
            <readHost host="hostS2" url="localhost:3306" user="root" password="123456" />
        </writeHost>
        
        <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
    </dataHost>
    <!--
        <dataHost name="sequoiadb1" maxCon="1000" minCon="1" balance="0" dbType="sequoiadb" dbDriver="jdbc">
        <heartbeat>         </heartbeat>
         <writeHost host="hostM1" url="sequoiadb://1426587161.dbaas.sequoialab.net:11920/SAMPLE" user="jifeng"     password="jifeng"></writeHost>
         </dataHost>

      <dataHost name="oracle1" maxCon="1000" minCon="1" balance="0" writeType="0"     dbType="oracle" dbDriver="jdbc"> <heartbeat>select 1 from dual</heartbeat>
        <connectionInitSql>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'</connectionInitSql>
        <writeHost host="hostM1" url="jdbc:oracle:thin:@127.0.0.1:1521:nange" user="base"     password="123456" > </writeHost> </dataHost>

        <dataHost name="jdbchost" maxCon="1000"     minCon="1" balance="0" writeType="0" dbType="mongodb" dbDriver="jdbc">
        <heartbeat>select     user()</heartbeat>
        <writeHost host="hostM" url="mongodb://192.168.0.99/test" user="admin" password="123456" ></writeHost> </dataHost>

        <dataHost name="sparksql" maxCon="1000" minCon="1" balance="0" dbType="spark" dbDriver="jdbc">
        <heartbeat> </heartbeat>
         <writeHost host="hostM1" url="jdbc:hive2://feng01:10000" user="jifeng"     password="jifeng"></writeHost> </dataHost> -->

    <!-- <dataHost name="jdbchost" maxCon="1000" minCon="10" balance="0" dbType="mysql"
        dbDriver="jdbc"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1"
        url="jdbc:mysql://localhost:3306" user="root" password="123456"> </writeHost>
        </dataHost> -->
</mycat:schema>

另一种情况:三个数据库schema配置一个schema(利用切片规则  伪切片)

启动mycat

/usr/local/mycat/bin/mycat start

停止mycat

/usr/local/mycat/bin/mycat stop

修改 schema.xml 文件 mycat/conf/schema.xml

下面的配置中的 schema 节点。

 

验证schema配置成功:

mysql -uroot -p123456 -h127.0.0.1 -P8066 -Dimove

mysql -uroot -p123456 -h127.0.0.1 -P8066 -Dmanage

mysql -uroot -p123456 -h127.0.0.1 -P8066 -Dimanage

说明:

-u 用户名

-p 密码

-h IP地址

-P 端口号

-D 数据库实例schema

 

如果全局查询三个schema(不用指明-D):

mysql -uroot -p123456 -h127.0.0.1 -P8066

mysql> select * from manage.usersinfo

 

 

          mycat相关配置

1. scheme.xml配置文件

 

schema 等于在mycat里定义一个逻辑库

mycat可以有多个逻辑库。

schema标签的相关属性: 属性名

值

数量限制

dataNode

任意String

(0..1)

checkSQLschema

Boolean

(1)

sqlMaxLimit

Integer

(1)

 

dataNode: 

该属性用于绑定逻辑库到某个具体的database上,

checkSQLschema: 

如果设置为Yes,mycat 会对select * from TestDB.table1 自动改成 select * from table1 以(避免在mycat中查询数据库的时候需要ERROR 1146 (42S02):Table TestDB.table1 doesn’t exist)

sqlMaxLimit: 

对于没有limit的select语句会自动对sql语句添加limit

 

table 标签:

定义需要拆分的表的具体细节。

 

属性名

值

数量限制

name

String

(1)

dataNode

String

(1..*)

rule

String

(0..1)

ruleRequired

boolean

(0..1)

primaryKey

String

(1)

type

String

(0..1)

autoIncrement

boolean

(0..1)

subTables

String

(1)

needAddLimit

boolean

(0..1)

 

name: 

等于表名。

 

dataNode: 

这个表所属的dataNode。

 

primaryKey: 

该逻辑表对于真实表的主键

 

type: 

定义了表的类型:有global和普通表两种类型

 

dataNode 标签

 

 

dataNode:

 标签就是一个独立的数据分片。

 

name: 

与schema,table 标签中使用的dataNode相对应。

 

dataHost: 

这个dataNode对应数据库的host,

 

dataHost 标签

定义了具体的数据库实例、读写分离配置和心跳语句。

属性名

值

数量限制

name

String

(1)

maxCon

Integer

(1)

minCon

Integer

(1)

balance

Integer

(1)

writeType

Integer

(1)

dbType

String

(1)

dbDriver

String

(1)

 

name:

 datahost 的唯一标示,在其他标签中需要dataHost属性的时候便使用这个属性做引用。

maxCon: 

连接池的最大连接数。

minCon:

 连接池的最小连接数。用了初始化连接池

 

balance:

1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。

2. balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。

3. balance="2",所有读操作都随机的在writeHost、readhost上分发。

4. balance="3",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力,注意balance=3只在1.4及其以后版本有,1.3没有。

 

writeType:

负载均衡类型,目前的取值有3种:

1. writeType="0", 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .

2. writeType="1",所有写操作都随机的发送到配置的writeHost,1.5以后废弃不推荐。switchType属性

- -1 表示不自动切换

- 1 默认值,自动切换

- 2 基于MySQL主从同步的状态决定是否切换

 

dbType: 使用数据库的类型,支持二进制的mysql协议,还有其他JDBC连接的数据库。如:

mongodb, oracle, spark, sqlserver等。

 

dbDriver:

指定连接后端数据库使用的Driver,目前可选的值有native和JDBC。使用native的话,因为这个值执行的是二进制的mysql协议,所以可以使用mysql和maridb。其他类型的数据库则需要使用JDBC驱动来支持。

从1.6版本开始支持postgresql的native原始协议。

如果使用JDBC的话需要将符合JDBC 4标准的驱动JAR包放到MYCAT\lib目录下,并检查驱动JAR包中包括如下目录结构的文件:META-INF\services\java.sql.Driver。在这个文件内写上具体的Driver类名,例如:com.mysql.jdbc.Driver。

 

switchType:

-1 表示不自动切换

1 默认值,自动切换

2 基于MySQL主从同步的状态决定是否切换

心跳语句为 show slave status

3 基于MySQL galary cluster的切换机制(适合集群)(1.4.1)

心跳语句为 show status like ‘wsrep%’.

 

heartbeat标签

用于指明和后端数据库进行心跳检查的语句。例如:mysql select user(), oracle 使用select 1 from dual.

 

writeHost 标签、readHost标签

这两个标签都是用于配置mysql实例。每个标签都可以指定一个后端的数据库。

writeHost指定写实例、readHost指定读实例。

一个dataHost内可以有多个writeHost、readHost标签。

属性名

值

数量限制

host

String

(1)

url

String

(1)

password

String

(1)

user

String

(1)

weight

String

(0-1)

usingDecrypt

String

(0-1)

 

host:

用于标示不同实例。

 

url:

如果是native的dbDriver 可以配置为 address:port。用JDBC或者其他dbDriver,则需要特殊指定。如:jdbc:mysql://localhost:3306/

 

password:

实际数据库的登录密码。

 

user:

实际数据库的用户

 

weight:

权重 配置在readhost 中作为读节点的权重(1.4以后)

 

usingDecrypt:

是否对密码加密默认0 否 如需要开启配置1,同时使用加密程序对密码加密,加密命令为:

 

执行mycat jar 程序(1.4.1以后):

 java -cp Mycat-server-1.4.1-dev.jar org.opencloudb.util.DecryptUtil 1:host:user:password

Mycat-server-1.4.1-dev.jar 为mycat download 下载目录的jar

 1:host:user:password 中 1 为db端加密标志,host为dataHost 的host 名称

 

2. server.xml 配置文件

这里面包含所有mycat 的配置信息。

user标签

这个标签用于定义登录mycat的用户和权限。

 

 

 

对于mysql版本5.1以后的版本,可以通过以下方式启动日志记录。能够记录下包括应用程序执行的sql语句。

MariaDB [(none)]> SET GLOBAL log_output = 'TABLE';

Query OK, 0 rows affected (0.02 sec)

MariaDB [(none)]> SET GLOBAL general_log = 'ON';

Query OK, 0 rows affected (0.00 sec)

 

show databases;

 

use mysql

 select * from general_log  order by event_time desc limit 50;

 

关闭命令:  service iptables stop

        永久关闭防火墙:chkconfig iptables off

 

 

 

为了可以查看读写分离的效果去 mycat 修改log4j的logger level 从 info改成 debug

 

 

备选方案:

Atlas: 下载地址:

https://github.com/Qihoo360/Atlas/releases 

 

sudo rpm -i Atlas-XX.el6.x86_64.rpm

修改配置文件:

/usr/local/mysql-proxy/conf/test.cnf

4. 配置例子

[mysql-proxy]

 

#必须 ,管理端口使用的用户名

admin-username = user

#必须 ,管理端口使用的密码

admin-password = pwd

#必须 ,主数据库的地址:

proxy-backend-addresses = 192.168.0.12:3306

 

# 非必须 ,从数据库的地址:

# The number behind '@'represents the weight used by load balance for reading,

# the default weight is 1. If you want the master backend also can process the read requests,

# add its ip:port to this configuration option.

proxy-read-only-backend-addresses = 192.168.0.13:3306@2

 

# (必须) 设置用了登录主、从数据库的用户名和密码

# 密码不是明文 需要使用 /usr/loca/mysql-proxy/bin/encrypt. 进行加密。

# For example, the username is: myuser, and the password is:mypwd (encrypted ciphertext is:HJBoxfRsjeI=).

pwds = myuser:HJBoxfRsjeI=,myuser2:RePBqJ+5gI4=

 

# (必须) 如果是true , atlas 就用daemon模式启动.

daemon = true

 

# (必须) Atlas will start two processes when the value set true,

# one is monitor process, another is the work process. The monitor process will restart the work process

# automatically when the work process crash unexpectedly.

# If the value set false, Atlas will only start the work process.

keepalive = true

 

# (必须,按照实际情况进行配置) The count of work threads in work process.

# set the value equal to twice of cpu cores

event-threads = 4

 

# (必须, 使用默认值就可以) Log level: message, warning, critical, error, debug

log-level = message

 

# (必须, 使用默认值就可以) Log file path

log-path = /usr/local/mysql-proxy/log

 

# (必须) sql 日志的配置.

#     ON          : log the sql to the log file with buffer.

#     OFF         : not log the sql.

#     REALTIME    : log the sql to the log file without buffer.

sql-log = REALTIME

 

# (必须, 按照实际情况进行配置) 日志里慢速sql的设置.

# 当设置了这个参数的时候日志里只显示运行时间超过设置的sql.

# 否则会显示所有sql

#sql-log-slow = 10

 

# (必须, 按照实际情况进行配置) 关闭和客户端的连接,

# 在设置的时间“wait-timeout”之后

wait-timeout =  10

 

# (必须, 使用默认值就可以) Atlas的端口

proxy-address = 0.0.0.0:1234

 

# (必须, 使用默认值就可以) Atlas 管理端口

admin-address = 0.0.0.0:2345

 

# (非必须, 按照实际情况进行配置) Shard table setting.

# In this case, person is the database name, mt is the table name, id is the shard key,

# the shard table count is 3,and you should create table mt_0, mt_1, mt_2 in mysql manually.

# If you have more shard table,you can set them and separated by commas.

#tables = person.mt.id.3

 

# (非必须,按照实际情况进行配置)字符集,

# 如果不设置 字符集为:latin1.

charset = utf8

 

# (非必须) 允许连接Atlas 的客户端地址

# 如果没有就默认允许所有的IP访问

#client-ips = 127.0.0.1, 192.168.1

 

# (非必须,不要设置这个参数) 如果你使用了client-ips 设置,

#并且客户端是通过LVS 连接Atlas的,

#那你才需要设置lvs-ips, 把LVS的真实IP放在这里.

#lvs-ips = 192.168.1.1

Tips:

 

修改完配置文件后,运行下面的命令开启 atlas:

/usr/local/mysql-proxy/bin/mysql-proxyd test start

使用下面的命令登录atlas, 然后可以像使用MySQL那样进行 sql 查询

mysql -h127.0.0.1 -umyuser -pmypwd -P1234;

使用下面的命令登录atlas管理

mysql -h127.0.0.1 -uuser -ppwd -P2345;

管理接口支持的命令可以通过下面的sql 查询

select * from help;

 

posted @ 2017-03-26 18:29  xu_shuyi  阅读(377)  评论(0)    收藏  举报