当前位置:网站首页>第四阶段笔记 Jingtao_day10

第四阶段笔记 Jingtao_day10

2020-12-07 19:23:16 嘉全JacquesCN

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
    # 解压Mycat
    tar -xvf Mycat-server-1.7.0-DEV-20170416134921-linux.tar.gz
    # 将Mycat文件移动到/software
    mv 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=true
    username: root
    password: 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.130
    SHOW MASTER STATUS;

    2) 实现主从配置

    192.168.126.129
    CHANGE 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.gz
    mv redis-5.0.4 redis
    mv redis-5.0.4.tar.gz software

    iii. 安装redis

    cd redis
    make
    make 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时最好在根目录中。

    # 启动redis
    redis-server redis.conf
    # 进入redis客户端
    redis-cli -p 6379
    Ctrl+C 退出
    # 关闭redis服务器
    redis-cli shutdown
  5. Redis客户端命令

    i. String类型命令

    set a aaa
    get a => "aaa"
    strlen a => (integer)3
    exists a => (integer)1
    del a => (integer)1
    keys *
    keys a
    keys a*
    keys ??
    mset a a b b c c
    mget a b => "a" "b"
    append a b
    type a
    select 3
    flushdb 0 清空第一个数据库
    flushall 清空所有数据库
    incr decr incrby decrby
    expire a 5
    ttl a
    persist a

版权声明
本文为[嘉全JacquesCN]所创,转载请带上原文链接,感谢
https://segmentfault.com/a/1190000038404255