day 10 数据库读写拆散和负载平衡
此文档是依据上课流程编写,更多细节和图片请参见刘老师的专栏。
江哥的专栏
《cgb2008-京淘day10》
两台数据库:129 --> 主库;130 --> 从库
高可用:HA
一. 实现数据库读写拆散
- 原理
用户在和数据库连贯时,默认是一个服务器连贯一个数据库。查问操作多,写入操作少。读从库,读/写主库。增加数据库代理,治理主从库。代理服务器须要晓得IP地址和端口号。用户不晓得本人连的是哪个服务器,所以是反向代理技术,客户端连贯的是代理的IP地址。
用户 --> 数据库代理[Amoba --> Mycat] --> 数据库
Mycat:数据库分库分表中间件
Mycat中间件
i. Mycat介绍
参见官网《MYCAT官方网站—开源分布式数据库中间件》
ii. Mycat配置
1) 装置Mycat
# 跳转到工作门路cd /usr/local/src# 解压Mycattar -xvf Mycat-server-1.7.0-DEV-20170416134921-linux.tar.gz# 将Mycat文件挪动到/softwaremv Mycat-server-1.7.0-DEV-20170416134921-linux.tar.gz software/
2) 配置用户和代理服务器,服务器和数据库的连贯
cd mycat/== application.yml#连贯的是数据库的代理url: jdbc:mysql://192.168.126.129:8066/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=trueusername: rootpassword: root
3) 编辑server.xml
用户与代理服务器之间的连贯通过server.xml文件进行配置
<!--用户标签--><user name="root"> <property name="password">root</property> <!--与schema.xml中的配置雷同 留神数据库的大小写--> <!--<property name="schemas">jtdb,db2,db3</property>--> <property name="schemas">jtdb</property></user><user name="user"> <!--只读的用户--> <property name="password">user</property> <property name="schemas">jtdb</property> <property name="readOnly">true</property></user>
4) 编辑schema.xml
该文件示意代理和数据库的配置 HOST:PORT:用户名:明码:数据库名称
<writeHost host="hostM1" url="192.168.126.129:3306" user="root" password="root"><!--读数据库1--><readHost host="hostS1" url="192.168.126.130:3306" user="root" password="root" /><!--读数据库2--><readHost host="hostS2" url="192.168.126.129:3306" user="root" password="root" /></writeHost>
5) Mycat命令
# 跳转到工作目录cd ../bin# 启动mycat./mycat start# 查看mycat状态./mycat status
6) 负载平衡测试
将从库的数据库信息手动地进行批改
实现数据库双机热备
外围:2台数据库互为主从,实现数据库高可用的条件式实现主从的备份。
之前:129为主,130为从;当初的配置:130为主,129为从
1) 查看主库状态
192.168.126.130SHOW MASTER STATUS;
2) 实现主从配置
192.168.126.129CHANGE MASTER to MASTER_HOST="192.168.126.130",MASTER_PORT=3306,MASTER_user="root",MASTER_PASSWORD="root",MASTER_LOG_FILE="mysql-bin.000001",MASTER_LOG_POS=700;#启动主从服务start slave #查看状态show slave status;
二. 实现数据库高可用
批改schema配置文件
<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://io.mycat/"> <!--name属性是自定义的 dataNode示意数据库的节点信息 jtdb示意逻辑库--><schema name="jtdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="jtdb"/> <!--定义节点名称/节点主机/数据名称--> <dataNode name="jtdb" dataHost="localhost1" database="jtdb" /> <!--参数介绍 UTF-8 中文报错 应用单行正文 --> <!--balance 0示意所有的读操作都会发往writeHost主机 --> <!--1示意所有的读操作发往readHost和闲置的主节点中--> <!--writeType=0 所有的写操作都发往第一个writeHost主机--> <!--writeType=1 所有的写操作随机发往writeHost中--> <!--dbType 示意数据库类型 mysql/oracle--> <!--dbDriver="native" 固定参数 不变--> <!--switchType=-1 示意不主动切换, 主机宕机后不会主动切换从节点--> <!--switchType=1 示意会主动切换(默认值)如果第一个主节点宕机后,Mycat会进行3次心跳检测,如果3次都没有响应,则会主动切换到第二个主节点--> <!--并且会更新/conf/dnindex.properties文件的主节点信息 localhost1=0 示意第一个节点.该文件不要随便批改否则会呈现大问题--> <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.129:3306" user="root" password="root"> <!--读数据库1--> <readHost host="hostS1" url="192.168.126.130:3306" user="root" password="root" /> <!--读数据库2--> <readHost host="hostS2" url="192.168.126.129:3306" user="root" password="root" /> </writeHost> <!--定义第二台主机 因为数据库外部曾经实现了双机热备.--> <!--Mycat实现高可用.当第一个主机137宕机后.mycat会主动收回心跳检测.检测3次.--> <!--如果主机137没有给Mycat响应则判断主机死亡.则回启东第二台主机持续为用户提供服务.--> <!--如果137主机复原之后则处于期待状态.如果141宕机则137再次继续为用户提供服务.--> <!--前提:实现双机热备.--> <writeHost host="hostM2" url="192.168.126.130:3306" user="root" password="root"> <readHost host="hostS1" url="192.168.126.130:3306" user="root" password="root" /> <readHost host="hostS2" url="192.168.126.129:3306" user="root" password="root" /> </writeHost></dataHost></mycat:schema>
上传文件
# 进行mycat服务./mycat stop
- 数据库高可用的测试
i. 首先应该将129数据库敞开
ii. 启动程序,通过数据库代理查看是否拜访正确(查),入库是否失常(写)
iii. 重启129数据库,看数据是否同步
三. Redis缓存
- 系统优化策略
缓存服务器:当用户进行查问操作时,先看缓存服务器中是否有数据,如果有,将缓存中的数据返回给用户;否则用户间接查询数据库,并将查问到的后果存储到缓存。能够升高用户拜访物理设施的频次,从而进步响应速度。
- 缓存的设计
1) 缓存数据如何存储?应该采纳什么样的数据结构呢? K-V --> key的唯一性
2) 缓存数据的容量大小,2G? 100G? 1000G? 应该动静保护缓存数据,将不须要的数据提前删除 --> LRU/LFU/随机/TTL算法
3) 缓存数据保留到内存中,缓存的特点是断电即擦除。定期将内存数据长久化 --> 写入磁盘中
4) 单台缓存服务器性能有余,所以个别须要搭建集群,实现高可用
5) 应用C语言开发
Redis缓存服务
i. 什么是redis?
参见官网《Redis》《Redis中文网》
开源,数据结构服务器,可用作非关系型数据库、高速缓存和音讯队列代理。
速度:读:11.2W/s,写:8.6W/s
ii. 上传redis安装文件
tar -xvf redis-5.0.4.tar.gzmv redis-5.0.4 redismv redis-5.0.4.tar.gz software
iii. 装置redis
cd redismakemake install
iv. 批改redis配置文件redis.conf
# 去除IP绑定# bind 127.0.0.1# 批改保护模式protected-mode no# 设置后盾运行daemonize yes
80,8080,3306,8066,redis端口号:6379
Redis根底命令
Redis服务在运行时,必须依赖redis.conf。操作redis时最好在根目录中。
# 启动redisredis-server redis.conf# 进入redis客户端redis-cli -p 6379Ctrl+C 退出# 敞开redis服务器redis-cli shutdown
Redis客户端命令
i. String类型命令
set a aaaget a => "aaa"strlen a => (integer)3exists a => (integer)1del a => (integer)1keys *keys akeys a*keys ??mset a a b b c cmget a b => "a" "b"append a btype aselect 3flushdb 0 清空第一个数据库flushall 清空所有数据库incr decr incrby decrbyexpire a 5ttl apersist a