此文档是根据上课流程编写,更多细节和图片请参见刘老师的专栏。mysql
《cgb2008-京淘day10》linux
两台数据库:129 --> 主库;130 --> 从库
高可用:HAredis
用户在和数据库链接时,默认是一个服务器链接一个数据库。查询操做多,写入操做少。读从库,读/写主库。添加数据库代理,管理主从库。代理服务器须要知道IP地址和端口号。用户不知道本身连的是哪一个服务器,因此是反向代理技术,客户端链接的是代理的IP地址。算法
用户 --> 数据库代理[Amoba --> Mycat] --> 数据库sql
Mycat:数据库分库分表中间件数据库
Mycat中间件json
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) 负载均衡测试
将从库的数据库信息手动地进行修改
实现数据库双机热备
核心: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;
修改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数据库,看数据是否同步
缓存服务器:当用户进行查询操做时,先看缓存服务器中是否有数据,若是有,将缓存中的数据返回给用户;不然用户直接查询数据库,并将查询到的结果存储到缓存。能够下降用户访问物理设备的频次,从而提升响应速度。
1) 缓存数据如何存储?应该采用什么样的数据结构呢? K-V --> key的惟一性
2) 缓存数据的容量大小,2G? 100G? 1000G? 应该动态维护缓存数据,将不须要的数据提早删除 --> LRU/LFU/随机/TTL算法
3) 缓存数据保存到内存中,缓存的特色是断电即擦除。按期将内存数据持久化 --> 写入磁盘中
4) 单台缓存服务器性能不足,因此通常须要搭建集群,实现高可用
5) 使用C语言开发
Redis缓存服务
i. 什么是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
Redis基础命令
Redis服务在运行时,必须依赖redis.conf。操做redis时最好在根目录中。
# 启动redis redis-server redis.conf # 进入redis客户端 redis-cli -p 6379 Ctrl+C 退出 # 关闭redis服务器 redis-cli shutdown
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