zoukankan      html  css  js  c++  java
  • MySQL数据库服务器安装标准

    BIOS优化,阵列配置

    1. 关闭CPU节能,因为服务器品牌众多,BIOS设置不相同,主要是关闭CPU节能,如C1、DELLR730已经智能设置,直接有个performance选项关闭了CPU节能。
    2. 如果服务器是8块硬盘,建议两块做RAID1装系统,剩余6块做RAID10做数据分区,RAID1阵列缓存设置成 WriteThrough,RAID10设置成writeback,将有限阵列卡缓存给RAID10阵列用,如果是8块以上的盘,组建两组RAID10,两组缓存策略都是writeback,一组装系统以及存放顺序IO类型的数据,比如redolog,归档日志,mysql的binlog,一组做数据分区。
    3. 使用XFS文件系统,数据分区用XFS文件系统,挂载参数用defaults,noatime,nodiratime,nobarrier,记住根分区是不能用这个挂载参数,不然你根分区下的目录文件都没有访问时间,修改时间,只能用于数据库文件分区。
    4. 修改IO调度策略
      io调度器修改为deadline,如果是ssd或pcie-ssd设备,则修改为noop,下列两种修改方式:
      • 在线动态修改,重启失效
      echo "deadline" >> /sys/block/sdb/queue/scheduler
      #这里sdb修改为实际的设备名称,例如sda,或者sdc。
      
      • 永久生效修改/etc/grub.conf配置文件,在kernel那行最末尾加上 elevtor=deadline numa=off ,例如:
      vim /etc/grub.conf
      kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=UUID=af13b3dc-c142-42b7-8ed6-cb7c60608af2 rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet elevator=deadline numa=off
      #要当前生效可以这样设置
      cat /sys/block/sda/queue/scheduler 
      echo deadline > /sys/block/sda/queue/scheduler
      
      • 核实io调度器配置
      cat /sys/block/sda/queue/scheduler 
      noop anticipatory [deadline] cfq
      
    5. 关闭numa
      新一代架构的NUMA不适用于跑数据库的场景 。它本意是为了提高内存利用率,但实际效果不好,反而可能导致一个CPU的内存尚有剩余,但另一个不够用,发生SWAP的问题,因此建议直接关闭或者修改 NUMA的调度机制。
      • 修改/etc/grub.conf,关闭NUMA,重启后生效
      #在kernel那行增加一个配置后重启生效,例如: 
      kernel /vmlinuz-2.6.18-308.el5 ro root=LABEL=/1 elevator=deadline numa=off rhgb quiet
      
      • 修改/etc/init.d/mysqld或者mysqld_safe脚本,设定启动mysqld进程时的NUMA调度机制,例如:
      numactl -- interleave=all /usr/bin/mysqld_safe --datadir="$datadir" --socket="$socketfile"  
      --log-error="$errlogfile" --pid-file="$mypidfile" 
      --user=mysql >/dev/null 2>&1
      

    操作系统基础优化

    1. 修改最大文件描述符,关闭selinux

      ulimit -SHn 65535
      echo "ulimit -SHn 65535" >> /etc/rc.local
      cat >>/etc/security/limits.conf<<EOF
      * soft nproc 102400
      * hard nproc 102400
      * soft nofile 102400
      * hard nofile 102400
      EOF
      
      sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
      
    2. 关闭不需要的服务,只留下crond,network,rsyslog,sshd ,sysstat,udev-post

    3. 内核参数调整
      swappiness是Linux的一个内核参数,用来控制Linux物理RAM内存进行SWAP页交换的相对权重,尽量减少系统缓存被从内存中清除的情况。取值范围是0~100,vm.swappiness的值越低,Linux内核会尽量不进行SWAP交换页的操作,vm.swappiness的值越高,linux会越多的使用SWAP空间。Linux系统的默认值是60,当系统需要内存时,有60%的概率使用SWAP。对于大多数桌面系统设置为100,可以提高系统的整体性能;对于数据库应用服务器设置为0,可以提高物理内存的使用率,进而提高数据库服务响应性能。需要注意的是RHEL7以上版本,如果vm.swappiness = 0,有可能会由于OOM问题,导致mysqld进程被OOM-Killer进程杀掉。

      减少swap的使用率,如果设置为0,需要结合vm.overcommit_memory=2,可以尽量避免OOM,一般设置为1

      vm.swappiness=1
      

      默认值是3797,保证物理内存有足够空闲空间,防止突发性换页

      vm.min_free_kbytes=204800
      

      默认是100,增大这个参数设置了虚拟内存回收directory和i-node缓冲的倾向,这个值越大。越易回收,尽量保留可用内存

      vm.vfs_cache_pressure=150
      

      确保能持续将脏数据刷新到磁盘,避免瞬间I/O写,产生严重等待和设置MySQL中的innodb_max_dirty_pages_pct低一点原理类似
      当文件系统缓存脏页数量达到系统内存百分之多少时(默认10%)就会触发pdflush/flush/kdmflush等后台回写进程运行,将一定缓存的脏页异步地刷入硬盘

      vm.dirty_background_ratio=5
      

      当文件系统缓存脏页数量达到系统内存百分之多少时(默认20%),系统会停止所有的应用层的IO写操作,等待刷完数据后恢复IO。

      vm.dirty_ratio=10
      

      减少TIME_WAIT,提高TCP效率;

      net.ipv4.tcp_tw_recycle=1
      net.ipv4.tcp_tw_reuse=1
      

    安装jemalloc内存管理器

    jemalloc内存分配方式与系统默认安装的glic的malloc内存分配方式相比,能提高MySQL的性能,降低了系统CPU和内存资源的利用,关于这方便的压测数据,请参考:http://www.linuxeye.com/Linux/1914.html
    编译安装很简单

    wget http://www.canonware.com/download/jemalloc/jemalloc-3.6.0.tar.bz2
    tar xvf jemalloc-3.6.0.tar.bz2
    ./configure
    make && make install
    #已方便安装好mysql后使用,使用也很简单在[mysqld_safe] 加上malloc-lib= /usr/local/lib/libjemalloc.so
    

    安装异步IO支持

    为了提高磁盘操作性能,当前的数据库系统都采用异步IO(Asynchronous IO,AIO)的方式来处理磁盘操作。InnoDB存储引擎亦是如此。
    在InnoDB1.1.x之前,AIO的实现通过InnoDB存储引擎中的代码来模拟实现。而从InnoDB 1.1.x开始(InnoDB Plugin不支持),
    提供了内核级别AIO的支持,称为Native AIO。因此在编译或者运行该版本MySQL时,需要libaio库的支持,centos最小化安装默认是没有安装的,安装也简单:

    yum install libaio-devel
    

    网卡绑定软中断

    网卡软中断不平衡,集中在一个CPU核心上(mpstat 查看%soft集中,通常是cpu0),绑定软中断多个核心上,可以用两个脚本来绑定。自己喜欢用哪个都行:

    vim set_irq_affinity.py
    
    #!/usr/bin/env python 
    import re 
    from os import system,popen 
    from os import walk as walkdir 
    from optparse import OptionParser 
    
    RPS_CPUS_VALUE = 'ffffffff' 
    RPS_FLOW_VALUE = '4096' 
    RPS_RFS_DEFAULT = '0' 
    interrupts_file = '/proc/interrupts' 
    rps_cpus_list = [] 
    rps_flow_list = [] 
    #ENTRY_VALUE=32768 
    
    def get_device(): 
    return re.findall(r'([a-z]+d+)s+Link.*',popen('ifconfig').read()) 
    
    def get_rfs_rps_file(net_device): 
    rps_path = '/sys/class/net/' + net_device + '/queues/' 
    for s in walkdir(rps_path): 
    if len(s[2]) == 2: 
    rps_cpus_list.append('/'.join([s[0],s[2][0]])) 
    rps_flow_list.append('/'.join([s[0],s[2][1]])) 
    
    def file_hander(TARGET,VALUE='0'): 
    try: 
    f_hander = open(TARGET,'w') 
    f_hander.write(VALUE) 
    finally: 
    f_hander.close() 
    
    def set_rfs_rps(net_device): 
    get_rfs_rps_file(net_device) 
    def set_rps_cpus_value(PATH): 
    file_hander(PATH,RPS_CPUS_VALUE) 
    
    def set_rps_flow_value(PATH): 
    file_hander(PATH,RPS_FLOW_VALUE) 
    
    map(set_rps_cpus_value,rps_cpus_list) 
    map(set_rps_flow_value,rps_flow_list) 
    
    def unset_rfs_rps(net_device): 
    get_rfs_rps_file(net_device) 
    def unset_rps_cpus_value(PATH): 
    file_hander(PATH,RPS_RFS_DEFAULT) 
    
    def unset_rps_flow_value(PATH): 
    file_hander(PATH,RPS_RFS_DEFAULT) 
    
    map(unset_rps_cpus_value,rps_cpus_list) 
    map(unset_rps_flow_value,rps_flow_list) 
    
    def set_irq_balance(): 
    stop_irq_balance = 'service irqbalance stop' 
    system(stop_irq_balance) 
    interrupts_ct = open(interrupts_file) 
    cores_nr = len(interrupts_ct.readline().split()) # 获取CPU核心数 
    irq_bit = 0 
    while True: 
    inter_line = interrupts_ct.readline() 
    if inter_line == "": 
    break 
    js = inter_line.split() 
    if len(js[-1]) > 5: 
    if re.match(r'eth.-',js[-1][:5]): 
    irq_nr = js[0][:-1] 
    TARGET = '/proc/irq/%s/smp_affinity' %(irq_nr) 
    VALUE = str(re.sub('0x','',hex(1 << irq_bit))) #1 << irq_bit 相对于2的N次方 ,hex() 二进制转十六进制 
    file_hander(TARGET,VALUE) 
    irq_bit += 1 
    if irq_bit == cores_nr: 
    irq_bit = 0 
    
    def unset_irq_balance(): 
    start_irq_balance = 'service irqbalance start' 
    system(start_irq_balance) 
    
    def usage(): 
    usage = '''================================================= 
    Description: irq_balance_set && rfs_rps_set tools 
    Usage: 
    <script> -i : set irq smp_affinity 
    -I : unset irq smp_affinity 
    -r : set rfs && rps 
    -R : unset rfs && rps 
    '''
    print usage 
    
    if __name__ == '__main__': 
    
    parser = OptionParser() 
    parser.add_option("-i", action="store_true", 
    dest="irq_true", 
    default=False) 
    parser.add_option("-I", action="store_true", 
    dest="irq_false", 
    default=False) 
    parser.add_option("-r", action="store_true", 
    dest="rps_true", 
    default=False) 
    parser.add_option("-R", action="store_true", 
    dest="rps_false", 
    default=False) 
    (options, args) = parser.parse_args() 
    
    if options.irq_true == True: 
    set_irq_balance() 
    print "irq_balance_set successfully" 
    elif options.irq_false == True: 
    unset_irq_balance() 
    print "unset irq balance successfully" 
    elif options.rps_true == True: 
    device_list = get_device() 
    map(set_rfs_rps,device_list) 
    print "rfs&&rps configured successfully" 
    elif options.rps_false == True: 
    device_list = get_device() 
    map(unset_rfs_rps,device_list) 
    print "unconfigured rfs&&rps successfully" 
    else: 
    usage()
    

    加入到开机启动中

    #!/bin/bash
    CORE_SUM="`grep -c '^processor' /proc/cpuinfo`"
    IRQ_SUM="`echo "1 2 4 8 10 20 40 80 100 200 400 800 1000 2000 4000 8000 10000 20000 40000 80000 100000 200000 400000 800000"| cut -d " " -f -${CORE_SUM}`"
    IRQ_NUM="`echo ${IRQ_SUM}`"
    for i in `grep -E '(eth[0-9]+|em[0-9]+)' /proc/interrupts | awk -F ":" '{print $1}' | sed 's/ //g'`; do
            echo -e "${i}	:`cat /proc/irq/${i}/smp_affinity`"
      
            y="`echo ${IRQ_NUM} | awk '{print $1}'`"
            echo ${y} > /proc/irq/${i}/smp_affinity
    #echo "echo ${y} > /proc/irq/${i}/smp_affinity"
            if [ "${y}" == "`echo ${IRQ_SUM} | awk '{print $NF}'`" ]; then
                    IRQ_NUM="`echo ${IRQ_SUM}`"
            else
                    IRQ_NUM="`echo ${IRQ_NUM} | sed 's/^([0-9]+) (.*)/2/g'`"
            fi
      
            echo -e "----	 `cat /proc/irq/${i}/smp_affinity`"
    done
    ######Enable RPS (Receive Packet Steering)
    rfc=4096
    cc=$(grep -c processor /proc/cpuinfo)
    rsfe=$(echo $cc*$rfc | bc)
    sysctl -w net.core.rps_sock_flow_entries=$rsfe
    for fileRps in $(ls /sys/class/net/eth*/queues/rx-*/rps_cpus)
    do
        echo fff > $fileRps
    done
      
    for fileRfc in $(ls /sys/class/net/eth*/queues/rx-*/rps_flow_cnt)
    do
        echo $rfc > $fileRfc
    done
      
    tail /sys/class/net/eth*/queues/rx-*/{rps_cpus,rps_flow_cnt}
    

    MySQL5.7安装配置

    创建用户组

    groupadd mysql
    useradd -g mysql -s /sbin/nologin -M mysql
    

    安装并创建数据目录

    yum install wget gcc gcc-c++ make cmake ncurses-devel libtool zilib-devel openssl openssl-devel numactl -y
    tar xf mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz -C /usr/local
    ln -sv /usr/local/mysql-5.7.16-linux-glibc2.5-x86_64 /usr/local/mysql
    mkdir -p /data/mysql3306/{data,logs,tmp}
    chown -R mysql:mysql /data/mysql3306/
    chown -R mysql:mysql /usr/local/mysql/
    

    创建/etc/my.cnf

    #my.cnf
    [client]
    port            = 3306
    socket          =  /data/mysql3306/data/mysql3306.sock
     
    [mysql]
    prompt="\u@\h:\p [\d]>"
    #pager="less -i -n -S"
    #tee=/data/mysql3306/query.log
    no-auto-rehash
     
    [mysqld]
    #misc
    user = mysql
    basedir = /usr/local/mysql
    datadir = /data/mysql3306/data
    port = 3306
    socket =  /data/mysql3306/tmp/mysql3306.sock
    event_scheduler = 0
    tmpdir =  /data/mysql3306/tmp
    #timeout
    interactive_timeout = 3600
    wait_timeout = 3600
    #character set
    character-set-server = utf8
    open_files_limit = 65535
    max_connections = 500
    max_connect_errors = 100000
    lower_case_table_names =1
    #symi replication
    #rpl_semi_sync_master_enabled=1
    #rpl_semi_sync_master_timeout=1000 # 1 second
    #rpl_semi_sync_slave_enabled=1
    #logs
    log-output=file
    slow_query_log = 1
    slow_query_log_file = slow.log
    log-error = error.log
    log_warnings = 2
    pid-file = mysql.pid
    long_query_time = 1
    #log-slow-admin-statements = 1
    #log-queries-not-using-indexes = 1
    log-slow-slave-statements = 1
    #binlog
    #binlog_format = STATEMENT
    binlog_format = row
    server-id = 13306
    log-bin = /data/mysql3306/logs/mysql-bin
    binlog_cache_size = 4M
    max_binlog_size = 256M
    max_binlog_cache_size = 1M
    sync_binlog = 0
    expire_logs_days = 10
    #procedure
    log_bin_trust_function_creators=1
    #
    gtid-mode = on
    enforce-gtid-consistency=1
    #relay log
    skip_slave_start = 1
    max_relay_log_size = 128M
    relay_log_purge = 1
    relay_log_recovery = 1
    relay-log=relay-bin
    relay-log-index=relay-bin.index
    log_slave_updates
    #slave-skip-errors=1032,1053,1062
    #skip-grant-tables
    #buffers & cache
    table_open_cache = 2048
    table_definition_cache = 2048
    table_open_cache = 2048
    max_heap_table_size = 96M
    sort_buffer_size = 128K
    join_buffer_size = 128K
    thread_cache_size = 200
    query_cache_size = 0
    query_cache_type = 0
    query_cache_limit = 256K
    query_cache_min_res_unit = 512
    thread_stack = 192K
    tmp_table_size = 96M
    key_buffer_size = 8M
    read_buffer_size = 2M
    read_rnd_buffer_size = 16M
    bulk_insert_buffer_size = 32M
    #myisam
    myisam_sort_buffer_size = 128M
    myisam_max_sort_file_size = 1G
    myisam_repair_threads = 1
    #innodb
    innodb_buffer_pool_size = 10G
    innodb_buffer_pool_instances = 1
    innodb_data_file_path = ibdata1:1024M:autoextend
    innodb_flush_log_at_trx_commit = 2
    innodb_log_buffer_size = 8M
    innodb_log_file_size = 100M
    innodb_log_files_in_group = 3
    innodb_max_dirty_pages_pct = 50
    innodb_file_per_table = 1
    innodb_rollback_on_timeout
    innodb_status_file = 1
    innodb_io_capacity = 200
    transaction_isolation = READ-COMMITTED
    innodb_flush_method = O_DIRECT
    

    5.7初始化

    cd /usr/local/mysql
    ./bin/mysqld --initialize 
    #或者
    ./bin/mysqld --initialize-insecure
    

    5.7以下版本初始化

    cd /usr/local/mysql
    ./scripts/mysql_install_db --defaults-file=/etc/my.cnf
    

    安全加固

    alter user 'root'@'localhost' identified by '123456';
    delete from mysql.user where user!='root' or host!='localhost';
    truncate table mysql.db;
    drop database test;
    flush privileges;
    cat /data/mysql3306/logs/error.log |grep "password"
    2016-11-30T13:28:37.276714Z 1 [Note] A temporary password is generated for root@localhost: 6fT?TYzJI*Dg
    

    环境变量

    echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
    source /etc/profile
    

    开机自启

    cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
    chmod +x /etc/init.d/mysql
    chkconfig --add mysql
    chkconfig mysql on
    
  • 相关阅读:
    docker-compose,docker-machine,docker swarm 的简单总结
    linux ubuntu安装好后,开通远程登录
    docker数据卷的使用 -v --volumes--from
    shell脚本中source无效
    模块 shutil
    模块 sys
    模块 os
    模块 random
    模块 datetime,time
    import本质
  • 原文地址:https://www.cnblogs.com/will-space/p/9428923.html
Copyright © 2011-2022 走看看