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

原文地址:https://www.cnblogs.com/jpfss/p/8144554.html