MySQL读写分离,分库分表详解(包括Linux下的安装)

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 中(主要使用这种)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值