Mysql 读写分离
数据库“写”操作是比较耗时,但是读是很快的,因此设置读写分离可以解决数据库写入影响查询效率的问题。
基本原理是,让注数据库处理“写”操作(insert 、update、delete),从数据库处理“读”操作,同时使用数据库把事务性操作的变更同步到集群中的从数据库。
本文通过代理来实现读写分离。
代理功能
数据库代理可以为数据库集群提供统一入口,为集群分发请求,实现负载均衡和读写分离。
常见的代理有:mysql proxy (mysql官方)atlas(360) mycat(阿里巴巴)
Mycat实现读写分离
mycat是一个开源的分布式数据库系统,是一个实现了mysql协议的服务器,前端用户可将他理解为数据库代理,其后端可与大多数主流数据库服务器通信。
1.配置Java环境
1.官网下载jdk
2.tar xvf jdk-8u91...-x64.tar.gz -C /usr/local
3.ln -s /usr/local/jdk.../ /usr/local/java
4.vim /etc/profile 添加三行
JAVA_HOME=/usr/local/java
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH
5.source /etc/profile
6.java -version
2.配置Mycat
下载mycat
1.官方网站 http://www.mycat.io/
2.wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
3.tar xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
4.ls /usr/local/mycat/
配置Mycat前端
启动mycat管理员
vim /usr/local/mycat/conf/server.xml
<user name="root"> # 连接mycat数据库的账户
<property name="password">123456</property>
#连接数据库的账号
<property name="schemas">dbname1</property>
#后方数据库的统称
配置Mycat后端
vim /usr/local/mycat/conf/schema.xml
- schema name:mycat维护的集群名称。
- datanode:后方节点群的名称。
- datahost:后方节点群的主机名称。
- writehost:写主机
- readhost:读主机
属性—负载均衡类型
- balance=”0”, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
- balance=”1”, 全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
- balance=”2”, 所有读操作都随机的在 writeHost、readhost 上分发。
- balance=”3”, 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力
属性—write Type 属性
- writeType=”0”, 所有写操作发送到配置的第一个 writeHost,
第一个挂了切到还生存的第二个writeHost,
重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties . - writeType=”1”,所有写操作都随机的发送到配置的 writeHost。
3.配置mysql群
(MM-SS)
grant all on *.* to 'mycatproxy'@'192.168.0.118' identified by 'password';
4.启动Mycat
(在mycat服务器上)
/usr/local/mycat/bin/mycat start
Starting Mycat-server...
启动成功,否则就是配置Mycat后端语法错误。
netstat -anpt | grep java //监测端口是否启动
ps aux | grep mycat //检测进程是否启动
yum install -y mariadb //安装客户端
mysql -hmycat -uroot -p123456 -P8066
5.Mycat使用后方数据库
select * from tianyun.t1;
insert into tianyun.t1 values(3);