MySQL的主从复制:
读写分离,分库分表等全部依赖于主从复制,先完成基础的主从复制部分:
主从复制简介 :
1. MySQL 默认支持主(master)从(slave)功能.
2. 主从复制效果:在主数据库中操作时,从同步进行变化.
3. 主从复制本质:主数据的操作写入到日志中,从数据库从日志中读取,进行操作.
主从备份要素:
1. 开启主数据库日志功能
2. 每个数据库需要有一个 server_id,主 server_id 值小于从server_id(标识从哪server写入的)
3. 每个 mysql 都有一个 uuid,由于虚拟机直接进行克隆,需要修改uuid 的值(唯一识别码)
了解了主从复制的原理,先来安装下MySQL
安装MySQL:
下载地址:MySQL :: Download MySQL Community Server
卸载预装MySQL:
#查看已安装:
[root@centos upload] rpm -qa | grep mariadb
#卸载:
[root@centos upload] rpm -e --nodeps mariadb-libs-5.5.65-1.el7.x86_64
#再次查看:
[root@centos upload] rpm -qa | grep mariadb
解压安装包:
[root@centos upload] tar -zxvf mysql-5.6.31-linux-glibc2.5-x86_64.tar.gz -C /usr/local
[root@centos upload] cd /usr/local
[root@centos local] mv mysql-5.6.31-linux-glibc2.5-x86_64 mysql
复制MySQL的配置文件:
[root@centos java] cd mysql
[root@centos mysql] cp support-files/my-default.cnf /etc/my.cnf
[root@centos mysql] cp support-files/mysql.server /etc/rc.d/init.d/mysql
修改my.cnf配置文件
vim /etc/my.cnf
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
log-error = /usr/local/mysql/data/error.log
pid-file = /usr/local/mysql/data/mysql.pid
user = root
tmpdir = /tmp
初始化数据库
[root@centos local] cd /usr/local/mysql[root@centos mysql] ./scripts/mysql_install_db --user=root --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/mysql.pid --tmpdir=/tmp
如果初始化失败,出现以下错误:
FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:Data::Dumper
还需安装autoconf库
命令: yum install autoconf -y
启动和关闭mysql:
[root@centos mysql] service mysql start #启动
Starting MySQL.. [确定]
[root@centos mysql] service mysql stop #关闭
Shutting down MySQL.. [确定]
[root@centos mysql] service mysql restart #重启
Shutting down MySQL..
Starting MySQL..
如果提示没有mysql命令,需要添加软连接
[root@centos mysql] ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
修改MySQL的密码:
[root@centos upload] mysql -u root
mysql> use mysql;
mysql> update user set password= password("1111") where user='root';
mysql> flush privileges;
配置开放远程登录权限
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '1111' WITH GRANT OPTION;
mysql>FLUSH PRIVILEGES;
设置开机启动:
[root@centos mysql] chkconfig mysql on
到这里就算是安装完毕了
然后按照同样的方式,再安装两台(主从复制需要配置最少三台MySQL)
配置主数据库:
修改主数据库的my.cnf文件
重启mysql:
[root@centos upload] service mysql restart
查看主数据库在主从关系的状态:
再来配置从数据库
修改server_id
重启MySQL
service mysql restart
登录MySQL配置主从复制
mysql> stop slave;
mysql> change master to master_host='192.168.40.147',master_user='root',master_password='1111',master_log_file='master_log.000001';
mysql> start slave;
查看从节点状态
mysql>show slave status \G;
只要没有错误,说明配置成功主从关系:
MyCat安装和使用:
如图所示:MyCAT使用Mysql的通讯协议模拟成了一个Mysql服务器,所有能使用Mysql的客户端以及编程语言都能将MyCAT当成是Mysql Server来使用,不必开发新的客户端协议。
MyCat的下载安装:
官方网站:MyCat2
github地址:MyCATApache · GitHub
解压缩:
[root@centos upload]# tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local
启动和关闭命令:
进入mycat/bin,启动MyCat
启动命令:./mycat start
停止命令:./mycat stop
重启命令:./mycat restart
查看状态:./mycat status
注意:可以使用mysql的客户端直接连接mycat服务。默认服务端口为8066
MyCat分库分表:
垂直分割(分库):指按照业务将表进行分类,分布到不同的数据库上面,这样也就将数据或者说压力分担到不同的库上面。
水平分割(分表):一个表格的数据按照行分割到多个节点上。
MyCat的重要概念:
1、逻辑库(schema):一个包含了所有数据库的逻辑上的数据库
2、逻辑表(table):一个包含了所有表的逻辑上的表
3、数据主机(dataHost):数据库软件安装到哪个服务器上
4、数据节点(dataNode):服务器上的mysql
5、分片规则(rule):拆分规则
schema逻辑库:
Schema.xml作为MyCat中重要的配置文件之一,管理着MyCat的逻辑库、表、分片规则、DataNode数据节点以及DataHost数据主机。
文件内容如下:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--逻辑库的名称,对应原始数据库-->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<!--逻辑库中的表,对应分配给哪些库节点,采用什么规则分配-->
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
<table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3"
rule="mod-long" />
<table name="employee" primaryKey="ID" dataNode="dn1,dn2"
rule="sharding-by-intfile" />
<table name="customer" primaryKey="ID" dataNode="dn1,dn2"
rule="sharding-by-intfile">
<childTable name="orders" primaryKey="ID" joinKey="customer_id"
parentKey="id">
<childTable name="order_items" joinKey="order_id"
parentKey="id" />
</childTable>
<childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"
parentKey="id" />
</table>
</schema>
/> -->
<!--定义节点名称,指定节点主机以及节点所在的数据库-->
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" 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>
<!--配置读与写的主机-->
<writeHost host="hostM1" url="localhost:3306" user="root"
password="123456">
<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />
</writeHost>
<writeHost host="hostS1" url="localhost:3316" user="root"
password="123456" />
</dataHost>
</mycat:schema>
server.xml配置文件介绍:
server.xml几乎保存了所有mycat需要的系统配置信息。最常用的是在此配置用户名、密码及权限。其中系统部分配置一般不用改,这里看一下用户的配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<!--配置用户名以及其对应的逻辑库-->
<user name="root">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
</user>
<!--只读用户-->
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
</mycat:server>
配置rule.xml
1)<columns>id</columns>中推荐配置主键列
2)所有的 tableRule 只能使用一次。如果需要为多个表配置分片规则,那么需要在此重新定义该规则。
3) 要分片的数据库节点数量,必须指定,否则没法分片
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
<tableRule name="rule2">
<rule>
<columns>user_id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
<tableRule name="sharding-by-intfile">
<rule>
<columns>sharding_id</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<tableRule name="sharding-by-murmur">
<rule>
<columns>id</columns>
<algorithm>murmur</algorithm>
</rule>
</tableRule>
<tableRule name="crc32slot">
<rule>
<columns>id</columns>
<algorithm>crc32slot</algorithm>
</rule>
</tableRule>
<tableRule name="sharding-by-month">
<rule>
<columns>create_time</columns>
<algorithm>partbymonth</algorithm>
</rule>
</tableRule>
<tableRule name="latest-month-calldate">
<rule>
<columns>calldate</columns>
<algorithm>latestMonth</algorithm>
</rule>
</tableRule>
<tableRule name="auto-sharding-rang-mod">
<rule>
<columns>id</columns>
<algorithm>rang-mod</algorithm>
</rule>
</tableRule>
<tableRule name="jch">
<rule>
<columns>id</columns>
<algorithm>jump-consistent-hash</algorithm>
</rule>
</tableRule>
<function name="crc32slot" class="io.mycat.route.function.PartitionByCRC32PreSlot">
<property name="count">3</property><!-- 要分片的数据库数量,必须指定,否则没法分片 -->
</function>
</mycat:rule>
rule有两种分片规则
1、auto-sharding-long 规则,以 500 万为单位,实现分片规则:1-500 万保存在 db1 中, 500 万零 1 到 1000 万保存在 db2 中,1000 万零 1 到 1500 万保存在 db3 中.
2、crc32slot 规则,在 CRUD 操作时,根据具体数据的 crc32 算法计算,数据应该保存在哪一个dataNode 中(主要使用这种)