Linux数据库管理——day10——分库分表、数据库硬件优化

分库分表
    分库分表也称作分片技术,主要作用是将存放在一个数据库中的数据按照特定的方法进行拆分,分散存放在多个数据库中,以达到分散多台设备实现负载均衡

    垂直分割
       纵向切分,把一个表的表结构拆分开来,形成多个表
       实质上就是把一个表的表结构中的多个字段拆成多个组合,每个组合都自成一个表

    水平分割
       横向切分,把一个表的表记录切分成多个表
       实质上吧一个表中的数据拆成多个模块,而表结构没有变化。


Mycat
   mycat是基于java的分布式数据库系统,为高并发环境的分布式访问提供解决方案

   工作流程
      Mycat有很多算法,每个算法都有专属的标识字段,根据这些字段,mycat可以找到数据具体存储的位置。

   搭建mycat服务器
      1. 装包
        1.1 安装jdk,也就是java相关的软件包
        1.2 安装 mycat-server 服务软件包
      2. 配置

        修改配置文件server.xml

        <user name="用户名">
                <property name="password">密码</property>
                <property name="schemas">逻辑库名(用户看到的库名)</property>
                <property name="readOnly">true(只读权限设定,不写这一行默认为读写权限)</property>
        </user>

        配置文件schema.xml

        <table name="travelrecord" dataNode="dn1,dn2(结点名,根据自己的数据库个数决定)" rule="auto-sharding-long" />

        <!-- global table is auto cloned to all defined data nodes ,so can join 
            with any table whose sharding node is in the same data node -->
        <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2(这两行也是根据数据库个数决定)" />
        <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />

        <!-- 指定数据存储节点的数据库名,以及这个数据库中存储数据的库名 -->
        <dataNode name="dn1(结点名)" dataHost="localhost1(数据库名)" database="db1" />

        <!-- 给每个数据库指定相应的信息 -->
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <writeHost host="hostM1" url="数据库服务器IP:端口号(3306)" user="连接使用的用户名"
                        password="密码">
                        <!-- can have multi read hosts -->
                </writeHost>
        </dataHost>

      3. 对数据库服务器进行相关操作

sed -i '/lower_case_table_names/d' /etc/my.cnf
sed -i '/\[mysqld\]/alower_case_table_names = 1' /etc/my.cnf
systemctl restart mysqld

      4. 启动服务

mycat start
netstat -ntlup | grep :8066 

   注意:
     1. 客户端连接的时候,发现有很多空表,这些都是要自己修改创建的
     2. 不过创建的时候,需要根据数据库的具体算法进行,创建算法要求的字段(列)


系统优化
   设置最大并发数

# 查看设定的最大并发数:
show variables like 'max_connections';
# 修改最大并发数
set max_connections=值;
# 查看历史访问最大并发数:
show global status like 'max_used_connections';

      设置的最优值:
        max_connections = max_used_connections / 0.85
         设定的最大并发值 = 历史最大并发数 / 0.85
      查看连接的详细信息:

show processlist;
连接超时(单位秒)
connect_timeout 等待连接超时,当用户在TCP三次握手连接的时候相应时间太久就会自动登出,一般时间不宜太高,默认10s
wait_timeout 等待关闭连接不活动超时,当从最后一次SQL语句操作开始计时,到下一个SQL语句间隔时间,过长久断开,不过为了让SQL语句能完整的执行完,不宜太短,默认8小时
 
缓存控制(单位字节)
key_buffer_size 用于MyISAM引擎的关键索引缓存大小
show global status like 'key_read%'; 如果查出来的值较低的时候提高这个缓存值
sort_buffer_size 为每个排序的线程分配此大小的缓存空间
提高此值可以提高order的group的执行速度
read_buffer_size 为排序读取表记录保留的缓存大小
影响SQL查询的相应速度,此值越大查询越快
tread_buffer_size 允许保存在缓存中的被重用的线程数量
show gloabal status like 'threads_%'; 查看线程状态,以这个值的常值为线程数最优
table_open_cache 为所有线程缓存的打开的表的数量
show global status like 'open%tables'; 查看已经打开的表,是理想比例<=95%
优化查询缓存设置
show variables like 'query_cache%';
query_cache_limit  缓存最大存储限制
query_cache_min_res_unit 缓存最小存储单元
query_cache_wlock_invalidate 是否开启写锁,如果开启,当数据修改,就会自动把缓存中的数据删除,下次用户查看的时候就是到磁盘中找
优化后作用表现(命中情况越高说明优化的越好)
show global status like 'qcache%';
Qcache_hits  查询缓存中的命中情况
Qcache_inserts 查询请求总数

优化思路
   1. 查看硬件使用情况(cpu 内存 存储空间)
   2. 查看网络接口流量
   3. 查看数据库服务运行时,参数配置

 show variables;
 show global status;

  并发连接数量  超时时间   重复使用的线程数量
  多个线程同时打开表的数量
  查询缓存配置   索引缓存
  处理不同查询方式mysql存储使用缓存设置

错误日志
   默认已经开启,记录数据库所有错误信息

查询日志
   记录mysql数据库中所有执行的命令
   启动查询日志,修改配置文件/etc/my.cnf

sed -i '/\[mysqld\]/ageneral_log' /etc/my.cnf

   不修改存储位置,默认存在 /var/lib/myql/主机名.log 文件内
   如果需要修改查询日志的位置

sed -i '/\[mysqld\]/ageneral_log_file=存储位置' /etc/my.cnf

慢查询日志
    记录耗时较长或不使用索引的查询操作
    启动慢查询日志,修改配置文件/etc/my.cnf

sed -i '/\[mysqld\]/alog-queries-not-using-indexes' /etc/my.cnf
sed -i '/\[mysqld\]/aslow-query-log' /etc/my.cnf

    默认存储在 /var/lib/myql/主机名-slow.log 
    如果想修改存储位置

sed -i '/\[mysqld\]/aslow-query-log-file=存储位置' /etc/my.cnf

    默认统计的是查询时间超过 10s的查询记录,如果想修改,命令如下

sed -i '/\[mysqld\]/along-query-time=数字' /etc/my.cnf

    统计查看慢查询日志记录的sql命令

mysqldumpslow /var/lib/mysql/mysql51-slow.log


 

猜你喜欢

转载自blog.csdn.net/Yu1543376365/article/details/83450821