1、mysql主从复制。
服务器信息如下:
服务器主机名 | ip | 说明 |
---|---|---|
mycat-node | 192.168.1.73 | mycat服务器,连接时使用该服务器 |
mycat-jessie | 192.168.1.73 | 物理数据库1,作为主库master |
mycat-jyp | 192.168.1.52 | 物理数据库2,作为从库slave |
备注:实验时,务必关闭关闭机器的iptables防火墙和selinux。
a) 安装ysql,请自行安装。
安装过程此处略...
b) mysql主从复制。
sql1: 登录用户名和密码:root/root
sql2: 登录用户名和密码:root/123456
1.1 主库master的配置
1)、找到数据库的配置文件
(my.cnf Linux系统)或者(my.ini win系统)
C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
2)、master配置:
找到mysqld部分,插入如下内容:
# 配置主从:
# 唯一,要与slave的不同。
server-id=1
skip-grant-tables
#(mysql路径)
basedir = C:\ProgramData\MySQL\MySQL Server 5.7\
#(data路径,存放日志文件)
datadir = C:\ProgramData\MySQL\MySQL Server 5.7\Data\
# 开启二进制日志
log-bin = mysql-bin
# 需要同步的数据库。如果是多个同步库,就以此格式另写几行即可。如果不指明对某个具体库同步,就去掉此行,表示同步所有库(除了ignore忽略的库)
binlog-do-db=db_img_0
binlog-do-db=db_img_1
binlog-do-db=db_info_0
binlog-do-db=db_info_1
binlog-do-db=role
binlog-do-db=role_user
binlog-do-db=user
# 表示不需要备份的数据库为mysql
binlog-ignore-db=mysql
3)、配置:
a) 首先重启mysql服务,
右键计算机管理---服务---mysql停止/启动。
b) 创建用户:
// CREATE USER ' 使用名 '@' 从库 IP 地址 ' IDENTIFIED BY ' 密码 ';
mysql>create user 'ir'@'192.168.1.52' identified by '123456';
c) 分配权限:
// GRANT REPLICATION SLAVE ON . TO ' 使用名 '@' 备机 IP 地址 ';
grant replication slave on *.* to 'ir'@'192.168.1.52';
d) 刷新权限:
mysql> flush privileges;
e) 查看master状态:
File 的值为: mysql-bin.000013;
Position 的值为: 154;
Binlog_Do_DB 的值为: test;
Binlog_Ignore_DB 的值为: manual,mysql ;
记下 File 、 Position 的值,配置从库要用到。
1.2 主库master的配置
1)、master配置:
找到mysqld部分,插入如下内容:
# 配置主从:
# 与主库不同,
server-id=2
skip-grant-tables
#(mysql文件夹路径)
basedir = C:\ProgramData\MySQL\MySQL Server 5.7\
#(data路径,存放日志文件)
datadir = C:\ProgramData\MySQL\MySQL Server 5.7\Data\
# 开启二进制日志
log-bin = mysql-bin
# 需要同步的数据库。
binlog-do-db=db_img_0
binlog-do-db=db_img_1
binlog-do-db=db_info_0
binlog-do-db=db_info_1
binlog-do-db=role
binlog-do-db=role_user
binlog-do-db=user
# 表示不需要备份的数据库为mysql
binlog-ignore-db=mysql
2)、配置:
a) 首先重启mysql服务,
右键计算机管理---服务---mysql停止/启动。
b)、登录上Slave数据库。
用户名改和密码:"root 123456"
c)、停止同步。
输入 "stop slave;"。
d)、重置同步。
输入"reset slave;"。
e)、更改位置。(与Master查看的日志位置保持一致)
CHANGE MASTER TO
MASTER_HOST='192.168.1.73', # 主机的IP
MASTER_USER='ir', # 之前创建的用户名
MASTER_PASSWORD='123456', # 之前创建的密码
MASTER_LOG_FILE='mysql-bin.000013', # 主库中show master status---File下的那个值
MASTER_LOG_POS=154; # 主库中show master status---Position下的那个值
f)、启动同步。
输入" start slave; "。
g)、查看是否同步成功。
输入" show slave status\G; "
结果如下表格所示:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
二者均为Yes表示成功啦!
如果slave_SQL_Running提示为NO,请等待10-20分钟后再次输入"show slave status\G;"
查看是否同步成功;若仍不成功,请检查之前操作是否存在问题。
输出结果如下:
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.73
Master_User: ir
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 154
Relay_Log_File: DESKTOP-6BJDELI-relay-bin.000004
Relay_Log_Pos: 147655155
Relay_Master_Log_File: mysql-bin.000013
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
至此,mysql主从复制,配置完成啦!!!
2、mycat的安装与使用。
2.1.1 安装jdk
因为 MyCat 是用 Java 开发的,因此 MyCat 运行需要安装 JDK(准确来说是 JRE 就够了),并且需要 JDK1.7 或以上版本。
新建JAVA_HOME
变量值为:C:\Program Files\Java\jdk1.8.0_121
新建classpath
值为:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
编辑path
后追加:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
命令行输入:java -version
C:\Users\sprivacy>java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
安装成功!!!
2.1.2 安装mycat
官网下载地址: http://www.mycat.io/
本文下载版本为1.6
安装目录为:
D:\soooooft\mycat\Mycat-server-1.6-RELEASE-20161028204710-win\mycat\
设置环境变量:
第一步:
新建MYCAT_HOME
变量值为:D:\soooooft\mycat\Mycat-server-1.6-RELEASE-20161028204710-win\mycat(mycat解压路径)
第二步:
编辑path
后面追加" %MYCAT_HOME%\bin "
进入mycat---bin目录下: .\mycat.bat start
PS D:\soooooft\mycat\Mycat-server-1.6-RELEASE-20161028204710-win\mycat\bin> .\mycat.bat start
wrapper | Starting the Mycat-server service...
wrapper | Mycat-server started.
安装成功。
2.2 配置
2.2.1 修改schema.xml
数据库设置,name与server.xml中schema对应
<schema name="db_im" checkSQLschema="false" sqlMaxLimit="100">
<!-- 拆分写法 -->
<table name="db_img" dataNode="dn11,dn21,dn31,dn41,dn51,dn61,dn71,dn81,dn91,dn101" rule="mod-long1" />
<table name="db_info" dataNode="dn1,dn2,dn3,dn4,dn5,dn6,dn7,dn8,dn9,dn10" rule="mod-long1" />
<table name="role_user" primaryKey="id" type="gloab" dataNode="dn11"/>
<table name="role" primaryKey="id" type="gloab" dataNode="dn11">
<!-- <childTable name="role_user" joinKey="role_id" parentKey="id"/> -->
</table>
<!-- 不拆分写法 -->
<table name="user" primaryKey="id" type="gloab" dataNode="dn11"/>
</schema>
分片信息,分库相关配置
<dataNode name="dn1" dataHost="localhost1" database="db_info_0" />
<dataNode name="dn2" dataHost="localhost1" database="db_info_1" />
<dataNode name="dn3" dataHost="localhost1" database="db_img_0" />
<dataNode name="dn4" dataHost="localhost1" database="db_img_1" />
物理数据库,真正存储数据的数据库,读写分离配置:
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.1.73:3306" user="root"
password="root">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.1.52:3306" user="root" password="123456" />
</writeHost>
<!-- <writeHost host="hostS1" url="localhost:3316" user="root"
password="123456" /> -->
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
备注: schema.xml文件中有三点需要注意:balance="1",writeType="0" ,switchType="1"
balance=1:readHost及备用的writeHost参与select的负载均衡。
switchType=2:基于mysql主从同步的状态决定是否切换。
hearHbeat:主从切换的心跳语句必须为show slave status;
mycat主从分离只是在读的时候做了处理,写入数据的时候,只会写入到writeHost,需要通过mycat的主从复制将数据复制到readHost。
如果mysql没有主从复制配置,mycat在读写分离后,数据写入writeHost后,readHost一直没有数据。
2.2.2 修改rule.xml
分库分表配置还需要配置rule文件:
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
// 此处需要修改,根据db_id取mod;如果还有分片的。复制此段代码继续添加。
<tableRule name="mod-long1">
<rule>
<columns>db_id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
// 分片的规则为字符串时:
<tableRule name="mod-long2">
<rule>
<columns>authentication_id</columns>
<algorithm>partition-by-string-hash-function</algorithm>
</rule>
</tableRule>
分片数量:
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">4</property>
</function>
分片规则为字符串时:
<tableRule name="mod-long3">
<rule>
<columns>client_id</columns>
<algorithm>partition-by-string-hash-function</algorithm>
</rule>
</tableRule>
<tableRule name="mod-long4">
<rule>
<columns>token_id</columns>
<algorithm>partition-by-string-hash-function</algorithm>
</rule>
</tableRule>
规则为字符串时,需要指定:
<function name="partition-by-string-hash-function" class="io.mycat.route.function.PartitionByString">
<property name="partitionLength">512</property> <!--求模基数 zero-based -->
<property name="partitionCount">2</property> <!-- 分片数量 -->
<property name="hashSlice">0:6</property> <!-- hash预算位 -->
</function>
2.2.3 修改server.xml
server 文件跟读写分离关系不大,但是在这里需要该文件配置来连接mycat的用户及权限。
<user name="root">
<property name="password">root</property>
<property name="schemas">db_im</property>
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="db_im" 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">db_im</property>
<property name="readOnly">true</property>
</user>
备注:
server文件里mycat的登录用户名和密码可以任意设置,该用户名及密码是作为登陆mycat时的账户信息。我这里配置的是root/root账户。
我这里没有做特殊权限,这些可以自己根据需求定义。
逻辑库名(即db_im)也即是登陆mycat后显示的库名,登陆后显示的就是代理的真是的mysql数据库的相关表,要和schema里的相对应。
3、测试
启动mycat服务
// 进入mycat安装目录下的bin文件:输入 .\mycat.bat start
PS D:\soooooft\mycat\Mycat-server-1.6-RELEASE-20161028204710-win\mycat\bin> .\mycat.bat start
出现以下结果,表示启动成功:
PS D:\soooooft\mycat\Mycat-server-1.6-RELEASE-20161028204710-win\mycat\bin> .\mycat.bat start
wrapper | Starting the Mycat-server service...
wrapper | Mycat-server started.
navicat 连接mycat:
连接名: test_mycat
ip: 192.168.1.73
端口: 8066 (mycat默认端口)
用户名:
密码: root
连接成功,执行相关新增、删除、查询语句,可以实现读写分离相关功能。
停止mycat服务
// 进入bin文件输入: .\mycat.bat stop
PS D:\soooooft\mycat\Mycat-server-1.6-RELEASE-20161028204710-win\mycat\bin> .\mycat.bat stop
wrapper | Stopping the Mycat-server service...
wrapper | Mycat-server stopped.
停止成功!