day 10 数据库读写拆散和负载平衡

此文档是依据上课流程编写,更多细节和图片请参见刘老师的专栏。

江哥的专栏

《cgb2008-京淘day10》

两台数据库:129 --> 主库;130 --> 从库
高可用:HA

一. 实现数据库读写拆散
  1. 原理

    用户在和数据库连贯时,默认是一个服务器连贯一个数据库。查问操作多,写入操作少。读从库,读/写主库。增加数据库代理,治理主从库。代理服务器须要晓得IP地址和端口号。用户不晓得本人连的是哪个服务器,所以是反向代理技术,客户端连贯的是代理的IP地址。

    用户 --> 数据库代理[Amoba --> Mycat] --> 数据库

    Mycat:数据库分库分表中间件

  2. 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) 负载平衡测试

    将从库的数据库信息手动地进行批改

  3. 实现数据库双机热备

    外围: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;
二. 实现数据库高可用
  1. 批改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>
  2. 上传文件

    # 进行mycat服务./mycat stop
  3. 数据库高可用的测试

    i. 首先应该将129数据库敞开

    ii. 启动程序,通过数据库代理查看是否拜访正确(查),入库是否失常(写)

    iii. 重启129数据库,看数据是否同步

三. Redis缓存
  1. 系统优化策略

    缓存服务器:当用户进行查问操作时,先看缓存服务器中是否有数据,如果有,将缓存中的数据返回给用户;否则用户间接查询数据库,并将查问到的后果存储到缓存。能够升高用户拜访物理设施的频次,从而进步响应速度。

  2. 缓存的设计

    1) 缓存数据如何存储?应该采纳什么样的数据结构呢? K-V --> key的唯一性

    2) 缓存数据的容量大小,2G? 100G? 1000G? 应该动静保护缓存数据,将不须要的数据提前删除 --> LRU/LFU/随机/TTL算法

    3) 缓存数据保留到内存中,缓存的特点是断电即擦除。定期将内存数据长久化 --> 写入磁盘中

    4) 单台缓存服务器性能有余,所以个别须要搭建集群,实现高可用

    5) 应用C语言开发

  3. 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

  4. Redis根底命令

    Redis服务在运行时,必须依赖redis.conf。操作redis时最好在根目录中。

    # 启动redisredis-server redis.conf# 进入redis客户端redis-cli -p 6379Ctrl+C 退出# 敞开redis服务器redis-cli shutdown
  5. 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