zoukankan      html  css  js  c++  java
  • Mysql多实例安装+主从复制+读写分离 -学习笔记

    <h1>
        <span class="link_title"><a href="/wmj2004/article/details/53393528">
        Mysql多实例安装+主从复制+读写分离 -学习笔记        
           
        </a>
        </span>
    
         
    </h1>
    
    <style type="text/css">        
            .embody{
                padding:10px 10px 10px;
                margin:0 -20px;
                border-bottom:solid 1px #ededed;                
            }
            .embody_b{
                margin:0 ;
                padding:10px 0;
            }
            .embody .embody_t,.embody .embody_c{
                display: inline-block;
                margin-right:10px;
            }
            .embody_t{
                font-size: 12px;
                color:#999;
            }
            .embody_c{
                font-size: 12px;
            }
            .embody_c img,.embody_c em{
                display: inline-block;
                vertical-align: middle;               
            }
             .embody_c img{               
                30px;
                height:30px;
            }
            .embody_c em{
                margin: 0 20px 0 10px;
                color:#333;
                font-style: normal;
            }
    </style>
    <script type="text/javascript">
        $(function () {
            try
            {
                var lib = eval("("+$("#lib").attr("value")+")");
                var html = "";
                if (lib.err == 0) {
                    $.each(lib.data, function (i) {
                        var obj = lib.data[i];
                        //html += '<img src="' + obj.logo + '"/>' + obj.name + "&nbsp;&nbsp;";
                        html += ' <a href="' + obj.url + '" target="_blank">';
                        html += ' <img src="' + obj.logo + '">';
                        html += ' <em><b>' + obj.name + '</b></em>';
                        html += ' </a>';
                    });
                    if (html != "") {
                        setTimeout(function () {
                            $("#lib").html(html);                      
                            $("#embody").show();
                        }, 100);
                    }
                }      
            } catch (err)
            { }
            
        });
    </script>
    

    一. Mysql多实例编译安装

    -------------------------------------

    1.多实例定义:

        同一套mysql程序,不同的“my.cnf,启动程序,端口”。属于逻辑上面的多实例。

    2.下载mysql-5.5.32.tar.gz

    3.安装相关依赖:

       yum install ncurses-devel libaio-devel cmake gcc-c++

    4.创建用户:

      useradd mysql -s /sbin/nologin -M

    5.解压缩开始编译:  

    1. cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.5.32/ -DMYSQL_DATADIR=/data/mysql   
    2. -DMYSQL_UNIX_ADDR=/usr/local/mysql-5.5.32/tmp/mysql.sock  -DDEFAULT_CHARSET=utf8  -DDEFAULT_COLLATION=utf8_general_ci    
    3. -DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii  -DENABLED_LOCAL_INFILE=ON  -DWITH_INNOBASE_STORAGE_ENGINE=1    
    4. -DWITH_FEDERATED_STORAGE_ENGINE=1  -DWITH_BLACKHOLE_STORAGE_ENGINE=1  -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1    
    5. -DWITHOUT_PARTITION_STORAGE_ENGINE=1 -DWITH_FAST_MUTEXES=1  -DWITH_ZLIB=bundled  -DENABLED_LOCAL_INFILE=1    
    6. -DWITH_READLINE=1   -DWITH_EMBEDDED_SERVER=1  -DWITH_DEBUG=0  

      make&&make install


    6.创建实例目录:

     mkdir -p /data/{3306,3307}/data

    7.创建配置文件:

    PS:server-id 每个实例要不一样。

    vim /data/3306/my.cnf

    1. [client]  
    2. port            = 3306  
    3. socket          = /data/3306/mysql.sock  
    4.   
    5.   
    6. [mysql]  
    7. no-auto-rehash  
    8.   
    9.   
    10. [mysqld]  
    11. user    = mysql  
    12. port    = 3306  
    13. socket  = /data/3306/mysql.sock  
    14. basedir = /usr/local/mysql-5.5.32  
    15. datadir = /data/3306/data  
    16. open_files_limit    = 1024  
    17. character-set-server = utf8  
    18. back_log = 600  
    19. max_connections = 800  
    20. max_connect_errors = 3000  
    21. table_cache = 614  
    22. external-locking = FALSE  
    23. max_allowed_packet =8M  
    24. sort_buffer_size = 1M  
    25. join_buffer_size = 1M  
    26. thread_cache_size = 100  
    27. thread_concurrency = 2  
    28. query_cache_size = 2M  
    29. query_cache_limit = 1M  
    30. query_cache_min_res_unit = 2k  
    31. #default_table_type = InnoDB  
    32. thread_stack = 192K  
    33. #transaction_isolation = READ-COMMITTED  
    34. tmp_table_size = 2M  
    35. max_heap_table_size = 2M  
    36. long_query_time = 1  
    37. #log_long_format  
    38. #log-error = /data/3306/error.log  
    39. #log-slow-queries = /data/3306/slow.log  
    40. pid-file = /data/3306/mysql.pid  
    41. log-bin = /data/3306/mysql-bin  
    42. relay-log = /data/3306/relay-bin  
    43. relay-log-info-file = /data/3306/relay-log.info  
    44. binlog_cache_size = 1M  
    45. max_binlog_cache_size = 1M  
    46. max_binlog_size = 2M  
    47. expire_logs_days = 7  
    48. key_buffer_size = 16M  
    49. read_buffer_size = 1M  
    50. read_rnd_buffer_size = 1M  
    51. bulk_insert_buffer_size = 1M  
    52. #myisam_sort_buffer_size = 1M  
    53. #myisam_max_sort_file_size = 10G  
    54. #myisam_max_extra_sort_file_size = 10G  
    55. #myisam_repair_threads = 1  
    56. #myisam_recover  
    57.   
    58.   
    59. lower_case_table_names = 1  
    60. skip-name-resolve  
    61. slave-skip-errors = 1032,1062  
    62. #replicate-ignore-db = mysql  
    63.   
    64.   
    65. server-id = 1  
    66.   
    67.   
    68. innodb_additional_mem_pool_size = 4M  
    69. innodb_buffer_pool_size = 16G                    #设置成内存的一半最好  
    70. innodb_data_file_path = ibdata1:128M:autoextend  
    71. innodb_file_io_threads = 4  
    72. innodb_thread_concurrency = 8  
    73. innodb_flush_log_at_trx_commit = 2  
    74. innodb_log_buffer_size = 2M  
    75. innodb_log_file_size = 4M  
    76. innodb_log_files_in_group = 3  
    77. innodb_max_dirty_pages_pct = 90  
    78. innodb_lock_wait_timeout = 120  
    79. innodb_file_per_table = 0  
    80. [mysqldump]  
    81. quick  
    82. max_allowed_packet = 2M  
    83.   
    84.   
    85. [mysqld_safe]  
    86. log-error=/data/3306/mysql_3306.err  
    87. pid-file=/data/3306/mysqld.pid  

    vim /data/3307/my.cnf

    1. [client]  
    2. port            = 3307  
    3. socket          = /data/3307/mysql.sock  
    4.   
    5.   
    6. [mysql]  
    7. no-auto-rehash  
    8.   
    9.   
    10. [mysqld]  
    11. user    = mysql  
    12. port    = 3307  
    13. socket  = /data/3307/mysql.sock  
    14. basedir = /usr/local/mysql-5.5.32  
    15. datadir = /data/3307/data  
    16. open_files_limit    = 1024  
    17. character-set-server = utf8  
    18. back_log = 600  
    19. max_connections = 800  
    20. max_connect_errors = 3000  
    21. table_cache = 614  
    22. external-locking = FALSE  
    23. max_allowed_packet =8M  
    24. sort_buffer_size = 1M  
    25. join_buffer_size = 1M  
    26. thread_cache_size = 100  
    27. thread_concurrency = 2  
    28. query_cache_size = 2M  
    29. query_cache_limit = 1M  
    30. query_cache_min_res_unit = 2k  
    31. #default_table_type = InnoDB  
    32. thread_stack = 192K  
    33. #transaction_isolation = READ-COMMITTED  
    34. tmp_table_size = 2M  
    35. max_heap_table_size = 2M  
    36. #long_query_time = 1  
    37. #log_long_format  
    38. #log-error = /data/3307/error.log  
    39. #log-slow-queries = /data/3307/slow.log  
    40. pid-file = /data/3307/mysql.pid  
    41. #log-bin = /data/3307/mysql-bin  
    42. relay-log = /data/3307/relay-bin  
    43. relay-log-info-file = /data/3307/relay-log.info  
    44. binlog_cache_size = 1M  
    45. max_binlog_cache_size = 1M  
    46. max_binlog_size = 2M  
    47. expire_logs_days = 7  
    48. key_buffer_size = 16M  
    49. read_buffer_size = 1M  
    50. read_rnd_buffer_size = 1M  
    51. bulk_insert_buffer_size = 1M  
    52. #myisam_sort_buffer_size = 1M  
    53. #myisam_max_sort_file_size = 10G  
    54. #myisam_max_extra_sort_file_size = 10G  
    55. #myisam_repair_threads = 1  
    56. #myisam_recover  
    57.   
    58.   
    59. lower_case_table_names = 1  
    60. skip-name-resolve  
    61. slave-skip-errors = 1032,1062  
    62. #replicate-ignore-db = mysql  
    63.   
    64.   
    65. server-id = 3  
    66.   
    67.   
    68. innodb_additional_mem_pool_size = 4M  
    69. innodb_buffer_pool_size = 16G                    #设置成内存的一半  
    70. innodb_data_file_path = ibdata1:128M:autoextend  
    71. innodb_file_io_threads = 4  
    72. innodb_thread_concurrency = 8  
    73. innodb_flush_log_at_trx_commit = 2  
    74. innodb_log_buffer_size = 2M  
    75. innodb_log_file_size = 4M  
    76. innodb_log_files_in_group = 3  
    77. innodb_max_dirty_pages_pct = 90  
    78. innodb_lock_wait_timeout = 120  
    79. innodb_file_per_table = 0  
    80. [mysqldump]  
    81. quick  
    82. max_allowed_packet = 2M  
    83.   
    84.   
    85. [mysqld_safe]  
    86. log-error=/data/3307/mysql_3307.err  
    87. pid-file=/data/3307/mysqld.pid  


    8.创建启动脚本:

     vim /data/3306/mysql

    #3307只要改动port参数就可以

    1. #!/bin/sh  
    2.   
    3. #init  
    4. port=3306  
    5. mysql_user="root"  
    6. mysql_pwd="Root123"  
    7. cmdpath="/usr/local/mysql-5.5.32/bin"  
    8. mysql_sock="/data/${port}/mysql.sock"  
    9. #startup function  
    10. function_start_mysql()  
    11. {  
    12.     if [ ! -e "$mysql_sock" ];then  
    13.       echo "starting mysql…"  
    14.   
    15.   
    16.       /bin/sh ${cmdpath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /devull &  
    17.     else  
    18.       echo "mysql is running…"  
    19.       exit  
    20.     fi  
    21. }  
    22.   
    23. #stop function  
    24. function_stop_mysql()  
    25. {  
    26.     if [ ! -e "$mysql_sock" ];then  
    27.        echo "mysql is stopped…"  
    28.        exit  
    29.     else  
    30.        echo "stoping mysql…"  
    31.        ${cmdpath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown  
    32.    fi  
    33.   
    34.   
    35. }  
    36.   
    37. #restart function  
    38. function_restart_mysql()  
    39. {  
    40.     echo "restarting mysql…"  
    41.     function_stop_mysql  
    42.     sleep 2  
    43.     function_start_mysql  
    44. }  
    45.   
    46. case $1 in  
    47.   
    48. start)  
    49.   
    50.     function_start_mysql  
    51. ;;  
    52.   
    53. stop)  
    54.   
    55.     function_stop_mysql  
    56. ;;  
    57.   
    58. restart)  
    59.   
    60.     function_restart_mysql  
    61. ;;  
    62.   
    63. *)  
    64.     echo "usage: /data/${port}/mysql {start|stop|restart}"  
    65. esac  
    9.修改目录权限:

     chown -R mysql:mysql /data/

     find /data -type f -name mysql -exec chmod 700 {} ;


    10.添加环境变量:

     echo 'export PATH=/usr/local/mysql-5.5.32/bin/:$PATH' >> /etc/profile


    11.初始化数据库:

     cd /usr/local/mysql-5.5.32/scripts/

     ./mysql_install_db --basedir=/usr/local/mysql-5.5.32/ --datadir=/data/3306/data/ --user=mysql

     ./mysql_install_db --basedir=/usr/local/mysql-5.5.32/ --datadir=/data/3307/data/ --user=mysql


    12.启动数据库:

     /data/3306/mysql start

     /data/3307/mysql start


    13.设置数据库root密码:

    mysqladmin -uroot password Root123 -S /data/3306/mysql.sock

     mysqladmin -uroot password Root456 -S /data/3307/mysql.sock

    14.登陆数据库:

     mysql -uroot -pRoot123 -S /data/3306/mysql.sock

     mysql -uroot -pRoot456 -S /data/3307/mysql.sock

    15.远程登陆数据库:

     mysql -uroot -pRoot123 -h 172.16.1.214 -P 3306


    二. Mysql主从复制基础

    -------------------------------------

    1.主动复制架构图:

    2.主从复制流程图:


    3.主从复制条件:

    #我们下面的操作是多实例主从复制,3306为主库,3307为从库。

     主库要开启log-bin,主库和从库的server-id要不一样。


    4.在主库上面创建同步用户:

    mysql> grant replication slave on *.* to 'rep'@'172.16.1.%' identified by 'Root1234';    #后面的密码要设置复杂些。

    mysql> flush privileges;


    5.导出主库数据文件:

    1. 一。常规方法:  
    2. mysql> flush table with read lock;     #先锁表,锁表后不能退出mysql窗口,否则失效  
    3. mysql> show master status;   #记录bin-log的位置信息  
    4. +------------------+----------+--------------+------------------+  
    5. | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |  
    6. +------------------+----------+--------------+------------------+  
    7. | mysql-bin.000004 |      560 |              |                  |  
    8. +------------------+----------+--------------+------------------+  
    9. mysqldump -uroot -pRoot123 -S /data/3306/mysql.sock --events -A -B|gzip >/tmp/bak_$(date +%F).sql.gz  
    10. mysql> unlock tables;   #解锁数据库  
    11.   
    12. 二。快捷方法:  
    13. mysqldump -uroot -pRoot123 -S /data/3306/mysql.sock --events -A -B -F --master-data=2 -x|gzip >/tmp/bak_f_$(date +%F).sql.gz      
    14. -x 自动锁表  
    15. -F --master-data=2    以备注形式记录bin-log的位置。(可以打开文件看头部备注信息)  


    6.还原备份内容到从库:

    gzip -d bak_2016-12-02.sql.gz

    mysql -uroot -pRoot456 -S /data/3307/mysql.sock < bak_2016-12-02.sql


    7.在从库创建master_info文件,并启动同步:

    1. mysql -uroot -pRoot456 -S /data/3307/mysql.sock  <<EOF  
    2. CHANGE MASTER TO    
    3. MASTER_HOST='172.16.1.214',   
    4. MASTER_PORT=3306,  
    5. MASTER_USER='rep',   
    6. MASTER_PASSWORD='Root1234',   
    7. MASTER_LOG_FILE='mysql-bin.000004',  
    8. MASTER_LOG_POS=560;  
    9. EOF  
    10.   
    11. mysql> start slave;        #开启同步  
    12. mysql> show slave status G ;    #查看同步状态信息  

    8.监控mysql主从复制的状态指标:

    mysql -uroot -pRoot456 -S /data/3307/mysql.sock -e "show slave status G ;" | egrep -i "_Running|_Behind"

                 Slave_IO_Running: Yes                             #同步进程是否启动
                Slave_SQL_Running: Yes                           #sql进程是否启动
            Seconds_Behind_Master: 0                                   #从库同步完成需要的时间


    三. Mysql主主复制+读写分离进阶

    --------------------------------------------------------------------

    1.如果出现同步错误,需要忽略错误,进行下条语句继续同步。

    1. mysql> stop slave;  
    2. mysql> set global sql_slave_skip_counter =1;           
    3. mysql> start slave  


    2.通过配置文件自动忽略同步错误“1007”,生产环境主从分离要用:

    vim /data/3307/my.cnf

      slave-skip-errors = 1032,1062,1007,1008

    3.让从库开启bin_log的办法:

    vim /data/3307/my.cnf

    1. log-slave-updates  
    2. log-bin = /data/3307/mysql-bin  
    3. expire_logs_days = 7                #日志只保留7天  


    4,.双主库同步方案:

     a.让表的ID自增,让主1写1,3,5     主2  写2,4,6。

    1. A增加:  
    2. auto_increment_increment = 2  
    3. auto_increment_offset=1  
    4. B增加:  
    5. <p> b.不让表的ID自增,通过WEB程序去seq服务器取ID,写入双主。</p>  


    5.读写分离的方案:

     a.通过开发的程序控制读写的位置。 (推荐)

     b.通过开源软件实现。(Amoeba,Mysql_proxy)

     c.自己开发DAL层。(大公司用)

    6.增量备份步骤:

     一。选择一台从库,不对外提供业务,专门用了做备份。此从库开启bin_log功能,做增量备份。

     二。备份的时候需要停止sql线程,在用mysqldump备份:

      stop slave sql_thread;                 #停止sql线程,不会停止同步IO进程

     三。然后将备份文件和bin_log文件远程保存起来。

        下面命令可以用来远程备份bin_log:

      mysqlbinlog --read-from-remote-server --raw --host=172.16.1.214 --port=3306 --user=rep --password=Root1234 --stop-never mysql-bin.000001

    7.主从复制延时原因:

     a.从库太多,一般要3-5个

     b.从库配置太低。

     c.慢sql过多。

     d.高版本mysql支持多线程复制

    8.同一账号在主从库拥有不同权限方案:

     a.在主库上创建拥有读写权限账号,然后再从库上面收回写入权限。

     mysql> grant insert,update,delete,select on *.* to web@'172.16.1.%' identified by '123';             #创建web用户对所有表拥有读写权限,主库执行。

     mysql> show grants form  web@'172.16.1.%';             #查看用户权限

     mysql> REVOKE insert,update,delete ON *.* FROM 'web'@'172.16.1.%';                #回收web用户写入权限,从库执行

     b.从库不同步mysql授权表:(推荐方案)

      my.cnf 里面加:

       replicate-ignore-db = mysql  

       binlog-ignore-db = mysql   

     c.在从库设置read-only:

      mysql> set global read_only=1;

      或者 my.cnf 加 read-only


    四. Mysql 灾难恢复演练

    --------------------------------------------------------------------

    1.主库当机从库接管方案:

     a.半同步从库(谷歌半同步插件)。

     b.选一台从库什么都不干,等着接管。

     c.当机后选举一台从库来当主库。

    2.查看从库的同步状态:

    mysql> show processlistG;

    3.手动从库提升成主库的步骤:

     a.停止同步,重置master。

      mysql> stop slave ;

      mysql> reset master;

     b.删除目录文件里面的master.info 和 relay-bin。

     c.取消read-only设置,确认bin-log是否开启。

     d.重启数据库。

     PS: 有一个软件“MHA”可以自动实现上面操作。

    4.mysql的高可用方案:

      MYSQL+HA+DRBD 

      MYSQL+MHA

  • 相关阅读:
    高斯函数 and 对数高斯函数 拟合曲线
    Python3.6、3.7、3.8新特性
    常用限流策略——漏桶与令牌桶介绍
    常用的HTTP服务压测工具介绍
    使用swagger生成接口文档
    validator库参数校验若干实用技巧
    树形结构数据处理
    element-ui 抽屉组件(el-drawer ) 二次封装 增加resize拖曳改变宽度大小
    pm2常用命令
    vue3-- setup中获取数组dom
  • 原文地址:https://www.cnblogs.com/jpfss/p/8144554.html
Copyright © 2011-2022 走看看