读写分离实践
绝大多数的企业的应用场景对于数据库来说都是读多写少,比如微博,明星发一条微博,上千万人读。所以为了分担数据库压力,做负载均衡,首先考虑到的就是读写分离,读写分离基于上面实现的主从复制,使用主库作为写库,从库为读库,提高数据库性能,提高IO性能
读写分离的实现方式
为了实现读写分离,出现了很多解决方案,其中比较流行的是采用中间件做为Proxy,保持应用层代码不随数据库的变动而发生变化,这里包括Amoeba、Atlas、Cobar、Mycat、MySQL Proxy等,而Mycat是目前开源的数据库中间件中比较成熟的解决方案。
一、前提条件
1、需要三台虚拟机(代理机、主机、从机)
2、提前关闭三台主机的 firewalld 、selinux/config/下ELINUX=disabled 、getenforce=0
3、将主机和从机搭建主存备份,并且确定一个共用数据库
4、下载并安装Navicat(GUI界面)
5、下载并安装Mycat(CLI界面)
6、安装jdk1.8 (后续有详细步骤)
7、查看三台主机的密码算法及使用权限要相同
二、开始搭建
1、下载安装Mycat
Mycat的安装其实只要解压下载的目录就可以了,非常简单
安装完成后,目录如下:
目录 |
说明 |
bin |
mycat命令,启动、重启、停止等 |
catlet |
catlet为Mycat的一个扩展功能 |
conf |
Mycat 配置信息,重点关注 |
lib |
Mycat引用的jar包,Mycat是java开发的 |
logs |
日志文件,包括Mycat启动的日志和运行的日志。 |
配置
Mycat的配置文件都在conf目录里面,这里介绍几个常用的文件
文件 |
说明 |
server.xml |
Mycat的配置文件,设置账号、参数等 |
schema.xml |
Mycat对应的物理数据库和数据库表的配置 |
rule.xml |
Mycat分片(分库分表)规则 |
MyCat的架构
Mycat的架构其实很好理解,Mycat是代理,Mycat后面就是物理数据库。和Web服务器的Nginx类似。对于使用者来说,访问的都是Mycat,不会接触到后端的数据库。
Mycat作为主数据库中间件,肯定是与代码弱关联的,所以代码是不用修改的,使用Mycat后, 连接数据库是不变的,默认端口是8066。连接方式和普通数据库一样,如 jdbc:mysql://192.168.0.1:806
2、安装jdk1.8
--- 解压缩包 tar -xzvf jdk-8u161-linux-x64.tar.gz -C /usr/local/java
--- 环境变量文件/etc/profile配置 (添加到/etc/profile中)
export JAVA_HOME=/usr/local/java/jdk1.8.0_161
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}
--- 使用source命令使修改即时生效,无需重启服务器
source /etc/profile
3、配置Mycat
--- mycat/conf/server.xml 的配置 这里 第一个name后的字段和Navicat登录的用户名一致,第二个name后的password和Navicat登录的密码一致,第三个name后的schemas字段跟配置文件mycat/conf/schema.xml中name字段一致
各配置参数含义
这里配置了一个账号root,密码也是root,针对逻辑数据库nebula(自己定义别名,不是真实的物理数据库),读写权限都有,没有针对表做任何特殊的权限。
--- mycat/conf/schema.xml的配置
schema.xml是最主要的配置项,首先看我的配置文件。 database=“nebula_cloud” 必须是主从 库都存在的数据库。
下面是关于每个节点的配置说明
4、创建读库的test用户
create user 'test'@'%' identified with mysql_native_password by 'Nebula@123';
GRANT select ON *.* TO 'test';
flush privileges;(刷新用户请求表)
5、启动Mycat
--- Mycat的启动也非常简单,进入到mycat/bin目录下:
##启动 ./mycat start(后台启动) ./mycat console(前台启动)
##停止 ./mycat stop
##重启 ./mycat restart
--- 如果在启动时发现异常,在logs目录中查看日志。
--- 启动正常的结果如下
出现successfully就说明启动成功
三、搭建完成,使用Navicat登录Mycat实现读写分离
1、 连接9066端口
右击mycat_manager 进入命令行界面输入 show @@help ; 查看帮助
RS_CODE 状态:
OK_STATUS = 1;正常状态
ERROR_STATUS = -1; 连接出错
TIMEOUT_STATUS = -2; 连接超时
INIT_STATUS = 0; 初始化状态
如果是-1 使用window测试 2.查看防火墙 3.授权
2、连接8066端口
--- 连接成功则会出现如下的绿色,否则请检查
--- 可以用简单的指令查看当前数据库
show databases;
use xxx; # 其中xxx为刚才看到的数据库中的一个
show tables;
select * from xxx; #为后续做验证准备,这个我们可以按照我们真实表来,此处因为我的数据库中有xxx表,所以以此来示例
!!! 注意 !!!
这里的数据库名可能不会使用自己设定的数据库的真名(为了隐藏详细)
四、测试
1、
五、读写分离完成