Ameba读写分离_mycat分库分表_redis缓存
1 数据库的读写分离
1.1 Amoeba实现读写分离
1.1.1 定义
Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy
优点:
- 配置读写分离时较为简单.配置文件编写方便
- 可以做到整个数据库的读写分离
- 占用的资源较少.
缺点:
- 不能实现高可用
- 现在不更新维护了
1.2 搭建amoeba
1.2.1 安装JDK
说明:Amoeba的使用依赖于JDK.
1.2.2 安装Amoeba
说明:将Amoeba文件拖入/usr/local/src/
将其解压
1.2.3 使用工具修改xml
通过工具连接远程的amoeba虚拟机
1.3 修改DBServer.xml
1.3.1 修改用户名和密码
1.3.2 配置数据库服务
说明:定义主数据库的IP地址
1.3.3 定义读操作策略
1.4 Amoeba配置
1.4.1 修改Amoeba.xml文件
说明:
默认的amoeba访问主库.
如果配置了读写分离则采用读写分离的操作数据库
所有的写库操作访问主数据库.
所有的读操作,访问multiPool负载均衡后的数据库slave,master,salve
Amoeba默认的访问端口是8066
1.5 修改JVM内存
1.5.1 修改内存
说明:
说明:原因的jvm配置文件大小只有256M太小,amoeba不能正常启动,需要修改JVM大小.
1.6 Amoeba启动
1.6.1 启动Amoeba
说明:进入到bin目录下执行启动命令
/usr/local/src/amoeba-mysql-3.0.4-BETA/bin
./launcher 启动
./shutdown 停止
1.7 Amoeba测试
1.7.1 连接Amoeba
说明:通过工具连接远程Amoeba.切记关闭防火墙
1.7.2 代码测试
说明:通过京淘后台管理修改数据源配置,通过代码测试Amoeba
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.126.139:8066/jtdb?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
jdbc.username=root
jdbc.password=root
1.8 错误集锦
1.8.1 关闭主库和从库的防火墙
说明:当虚拟机开机后,防火墙默认开启了,需要再次手动关闭.
1.8.2 修改配置文件后没有及时报错
共修改2个配置文件dbServer.xml,amoeba.xml
需要通过工具进行下载和上传/保证上传的文件不错.
1.8.3 报错端口占用
- 关机重启
- 查询项目的进程后杀死进程
Kill -9 5652
- ./shutdown 关闭amoeba
- 修改JVM内存
2 Mycat介绍
2.1 Mycat下载
2.1.1 下载地址
官网地址: http://www.mycat.io/
2.1.2 安装JDK
2.2 MyCat安装
2.2.1 解压文件
tar -xvf Mycat………
2.2.2 编辑schemas.xml文件
2.2.3 定义负载策略:
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select 1</heartbeat>
<!--配置第一台主机主要进行写库操作,在默认的条件下Mycat主要操作第一台主机
在第一台主机中已经实现了读写分离.
因为默认写操作会发往137的数据库.
读的操作默认发往141.如果从节点比较忙,则主节点分担部分压力.
-->
<writeHost host="hostM1" url="192.168.126.137:3306" user="root" password="root">
<!--读数据库-->
<readHost host="hostS1" url="192.168.126.141:3306" user="root" password="root" />
</writeHost>
<!--定义第二台主机 由于数据库内部已经实现了双机热备.
Mycat实现高可用.当第一个主机137宕机后.mycat会自动发出心跳检测.检测3次.如果主机137没有给Mycat响应则判断主机死亡.则启动第二台主机继续为用户提供服务.
如果137主机恢复之后则处于等待状态.如果141宕机则137再次持续为用户提供服务.
前提:实现双机热备.
-->
<writeHost host="hostM2" url="192.168.126.141:3306" user="root" password="root">
<readHost host="hostS1" url="192.168.126.137:3306" user="root" password="root" />
</writeHost>
</dataHost>
2.2.4 修改server.xml
默认的schemas是TextDB.需要手动修改
2.2.5 启动Mycat
说明:进入根目录cd /usr/local/src/bin
./mycat start 启动
./mycat stop关闭mycat
2.2.6 测试
2.3 报错说明
2.3.1 IP错误
检测IP地址和自己的机器是否匹配
192.168.126.137
2.3.2 配置文件上传是否正确
- 分别检测server.xml和schema文件是否上传成功
2.如果正确还是测试不成功,则先关闭mycat,控制台通过rm -rf 命令将Mycat的2个配置文件删除.之后通过FZ工具上传修改后的配置文件.之后重启mycat
2.3.3 检测日志是否启动成功
cd /usr/local/src/mycat/logs/ cat wrapper.log
2.3.4 关于getByte报错
由于Mycat中解析配置文件时会出现报错信息,
所以将每行注释都添加<!—注释-->
3 Redis学习
3.1 传统框架中的瓶颈
3.1.1 缓存机制
缓存机制其实就是降低了客户端访问真实数据源的访问频次.缓存中的数据就是数据源就数据的备份.如果数据源数据发生改变.缓存数据需要及时更新.
3.1.2 缓存中遇到的问题
- 如果采用单台缓存服务器,很容器出现宕机现象.如果缓存服务器宕机将直接影响整个服务.---解决方案部署缓存集群
- 如果实现缓存则需要实现数据的同步—配置主从
- 如果缓存服务器宕机.数据如何保存.应该将数据尽可能持久化
3.1.3 Redis内存数据库
说明:redis现阶段所有企业中使用最多的内存数据库.其中主要采用key-value的形式保存数据.并且提供很多实用的数据类型.String/list/set/hash.
Redis底层通过C编辑,可以每秒支持110000次的集合运算.并且在内存中运行.
Redis底层实现时自动支持数据的持久化.如果reids重启会自动的扫描持久化文件之后恢复数据.
3.1.4 Redis的下载
Window版本不建议使用
因为官方没有提供window版本,该window版本是微软自己研发.稳定性不强
3.1.5 缓存架构
3.1.6 解压redis
tar -xvf redis-3.2.8.tar.gz
3.1.7 编译redis
在根目录下执行 /usr/local/src/redis-3.2.8 执行make指令
make
生成可执行文件
3.1.8 安装redis
make install
4 Redis操作
4.1 启动redis
4.1.1 直接启动
命令:redis-server
说明:默认端口都是6379
问题:通过redis-server启动时,之后不能编写linux命令,需要再次创建链接.造成编码不便
4.1.2 后台启动
- 解除IP绑定
- 关闭保护模式
- 开启后台运行
- 开启后台redis
redis-server redis.conf
ps -ef |grep redis
root 5847 1 0 01:45 ? 00:00:00 redis-server *:6379
root 5852 2571 0 01:45 pts/1 00:00:00 grep redis
4.2 操作redis
4.2.1 进入客户端
执行命令:redis-cli
4.3 Redis的操作命令
4.3.1 String 类型操作
指令 |
说明 |
案例 |
set |
设定key的值 |
set name tom |
get |
获取指定 key 的值 |
get name |
strlen |
获取key值的长度 |
strlen name |
exists |
检查给定 key 是否存在 |
exists name 返回1存在 0不存在 |
del |
删除指定的key/key1 key2 |
del name1 name2 |
keys |
命令用于查找所有符合给定模式 pattern 的 key |
Keys * 查询全部的key值 Keys n?me 占位符 Keys name* 以name开头的key |
mset |
赋值多个key-value |
mset key1 value1 key2 value2 key3 value3 同时赋值多个值 |
mget |
获取多个key |
Mget key1 key2 key3 |
append |
对指定的key进行追加 |
append key 123456 value123456 append key " 123456" value 123456中间多一个空格 |
Type |
查看key的类型 |
Type key1 127.0.0.1:6379> TYPE key1string |
Flushdb |
清空当前数据库 |
Flushdb 清空数据库 |
Select |
切换数据库 |
Select 0-15 redis一共有16个数据库 |
FLUSHALL |
清空全部数据库数据 |
flushall |
Incr |
自动增长1 |
Incr num 数据会自动加1 Incr string 数据库会报错 |
Decr |
自动减1 |
Decr name 数据会自动减1 |
incrby |
指定步长自增 |
Incrby 2 每次自增2 |
Decrby |
指定步长自减 |
Decrby 2每次减2 |
Expire |
指定key的失效时间单位是秒(s) |
EXPIRE name1 5 5秒后数据失效 |
Ttl |
查看key的剩余存活时间 |
Ttl name -2表示失效 -1没有失效时间 |
Pexpire |
设置失效时间(毫秒) |
Pexpire name 1000 用于秒杀业务 |
Persist |
撤销失效时间 |
撤销失效时间 |
指令 |
说明 |
案例 |
hset |
Hset key值 属性名 属性值 |
Hset user id 1 Hset user name tom 设置id和name的属性值 |
hget |
获取指定 key的属性值 |
Hget user name 获取name属性值 |
hmset |
Hmset user key value1 key2 value2 |
hmset user id 1 name tom age 18 |
hmget |
hmget user id name age |
hmget user id name age 获取user对象的id,name,age的属性值 |
hgetall |
取出key的全部字段值和属性值 |
HGETALL user |
hdel |
删除key的指定字段 |
删除key的指定字段 |
Hkeys |
查看key的全部字段 |
HKEYS user |
hvals |
查看key的全部值 |
Hvals user |
hlen |
查看key的字段数 |
Hlen user 查看user的字段数 |
4.3.2 Redis集合数据类型
1.字符串类型 String
2.散列类型 hash
3.列表类型 list
4.集合类型 set
5.有序集合类型
1.散列类型
可以通过散列类型用来保存对象和属性的值
例如:user对象 {id:2,name:小明,age:19}
通过散列类型赋值不需要{}
4.3.3 List列表类型
List列表类型(list)是一个存储有序的元素的集合类型.List数据类型底层是一个双端列表.可以从左右分别进行写入操作
指令 |
说明 |
案例 |
lpush |
将一个或多个值插入到列表左部插入 |
LPUSH list1 1 2 3 4 |
rpush |
在列表中添加一个或多个从列表右侧插入 |
RPUSH list1 5 6 7 8 |
lpop |
从列表左侧移除元素,并且返回结果 |
LPOP list1 |
rpop |
从列表右侧移除元素,并且返回结果 |
RPOP list1 |
llen |
获取list集合的元素个数 |
Llen list1 |
Lrange |
获取指定区间内的片段值 |
LRANGE list1 0 3 获取从左数第1个到第4个值 LRANGE list1 -3 -1 从右数第三个到第一个数据 Lrange list1 0 -1 查询全部列表数据 |
Lrem |
删除列表中指定的值 Irem key count value 当count>0,从左开始删除前count个值为value的元素 当count<0,从右侧开始删除前count个值为value的元素 当count=0时,删除所有value的元素 |
LREM list1 2 2 从左数前2个为2的元素 LREM list1 -2 3 从右数前2个为3的元素 LREM list1 0 4 删除全部为4的元素 |
Lindex |
根据指定索引值查询元素 |
LINDEX list1 0 查找索引值为0的值 LINDEX list1 -1 查询最右边的值 |
Lset |
为指定索引赋值 |
LSET list1 0 10 |
LINSERT |
LINSERT key before value1 value2 在value1之前插入value2 LINSERT list1 after 1 2 |
LINSERT list1 before 10 100 从左数第一个为10的元素前插入100 LINSERT list1 after 1 2 从左数第一个为1的值之后插入2 |
双端列表的数据特点:查询两端数据时速度较快,查询中间数据较慢.
4.3.4 redis集合类型
redis支持集合类型,并且每个集合的元素类型都可以不同,并且集合时无序的.
指令 |
说明 |
案例 |
sadd |
向集合添加一个或多个成员 |
sadd set a b c |
scard |
获取集合的成员数 |
SCARD set |
srem |
删除集合的指定元素 |
SREM set a 删除set中的a元素 |
smembers |
查看集合的所有元素 |
SMEMBERS set |
Sismember |
查看元素是否属于集合 |
SISMEMBER set a 查看a是否属于set集合 |
sdiff |
返回给定所有集合的差集 |
|
sinter |
返回给定所有集合的交集 |
|
sunion |
返回所有给定集合的并集 |
A={1,2,3} B={2,3,4} SUNION a b = 1,2,3,4 |
Ameba读写分离_mycat分库分表_redis缓存的更多相关文章
- spring boot sharding-jdbc实现分佈式读写分离和分库分表的实现
分布式读写分离和分库分表采用sharding-jdbc实现. sharding-jdbc是当当网推出的一款读写分离实现插件,其他的还有mycat,或者纯粹的Aop代码控制实现. 接下面用spring ...
- mycat+mysql集群:实现读写分离,分库分表
1.mycat文档:https://github.com/MyCATApache/Mycat-doc 官方网站:http://www.mycat.org.cn/ 2.mycat的优点: 配 ...
- Mycat数据库中间件对Mysql读写分离和分库分表配置
Mycat是一个开源的分布式数据库系统,不同于oracle和mysql,Mycat并没有存储引擎,但是Mycat实现了mysql协议,前段用户可以把它当做一个Proxy.其核心功能是分表分库,即将一个 ...
- MyCat读写分离、分库分表
系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一 ...
- Mycat实现读写分离、分库分表
系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一 ...
- sharing-jdbc实现读写分离及分库分表
需求: 分库:按业务线business_id将不同业务线的订单存储在不同的数据库上: 分表:按user_id字段将不同用户的订单存储在不同的表上,为方便直接用非分片字段order_id查询,可使用基因 ...
- Mysql之Mycat读写分离及分库分表
## 什么是mycat ```basic 1.一个彻底开源的,面向企业应用开发的大数据库集群 2.支持事务.ACID.可以替代MySQL的加强版数据库 3.一个可以视为MySQL集群的企业级数据库,用 ...
- Tbase读写分离与分库分表
一.读写分离 1.1 what 读写分离 读写分离,基本的原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELETE),而从数据库处理SELECT查询操作.数据库复制被用来把事 ...
- mysql主从读写分离,分库分表
1.分表 当项目上线后,数据将会几何级的增长,当数据很多的时候,读取性能将会下降,更新表数据的时候也需要更新索引,所以我们需要分表,当数据量再大的时候就需要分库了. a.水平拆分:数据分成多个表 b. ...
随机推荐
- JPA实体的常用注解
@Entity 标注于实体类上,通常和@Table是结合使用的,代表是该类是实体类@Table 标注于实体类上,表示该类映射到数据库中的表,没有指定名称的话就表示与数据库中表名为该类的简单类名的表名相 ...
- 看eShopOnContainers学一个EventBus
最近在看微软eShopOnContainers 项目,看到EventBus觉得不错,和大家分享一下 看完此文你将获得什么? eShop中是如何设计事件总线的 实现一个InMemory事件总线eShop ...
- Python中if __name__=="__main__" 语句在调用多进程Process过程中的作用分析
2018年2月27日 于创B515 引言 最近准备学习一下如何使用Python中的多进程.在翻看相关书籍.网上资料时发现所有代码都含有if __name__=="__main__" ...
- asp.net动态网站repeater控件使用及分页操作介绍
asp.net动态网站repeater控件使用及分页操作介绍 1.简单介绍 Repeater 控件是一个容器控件,可用于从网页的任何可用数据中创建自定义列表.Repeater 控件没有自己内置的呈现功 ...
- JavaScript中基本数据类型和引用数据类型的区别
1.基本数据类型和引用数据类型 ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型. 基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象. 当我们把变量赋值给一个变 ...
- 对于vxworks下硬盘驱动
1.曾经看到帖子说vxworks5.5下没有sata驱动,vxworks6.6下有,这样的说法恐怕不正确,由 于俺在5.5下也运用运用了sata硬盘,请注重这里俺只是说运用运用,没有说运用运用了sat ...
- JSP标签c:forEach报错(二)
1.今天,我在用c标签写一些样例,结果出现一些错误,写下作为记录 具体错误如下: 三月 31, 2014 9:46:28 下午 org.apache.catalina.core.StandardWra ...
- zTree实现删除树子节点
zTree实现删除树子节点 1.实现源码 <!DOCTYPE html> <html> <head> <title>zTree实现基本树</tit ...
- C# 扩展方法 白话总结
我们在变成的时候时常遇到这样的问题,new了一个系统内的对象之后,我们想要对该对象有一个方法可是却点不出来,说明该对象本身没有声明该方法,可是微软又不允许我们去该对象的代码,怎么办? 在C# 3.0 ...
- http协议的补充二
一,浏览器到服务器request 1.1,浏览器里面的内容 请求(浏览器->服务器) GET /day09/hello HTTP/1.1 Host: localhost:8080 User-Ag ...