Mysql多實例安裝+主從複製+讀寫分離 -學習筆記

一. Mysql多實例編譯安裝mysql

-------------------------------------c++

1.多實例定義:web

    同一套mysql程序,不一樣的「my.cnf,啓動程序,端口」。屬於邏輯上面的多實例。sql

2.下載mysql-5.5.32.tar.gz數據庫

3.安裝相關依賴:vim

   yum install ncurses-devel libaio-devel cmake gcc-c++服務器

4.建立用戶:多線程

  useradd mysql -s /sbin/nologin -M架構

5.解壓縮開始編譯:  socket

 

[plain]  view plain  copy
 
  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

 

[plain]  view plain  copy
 
  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

 

[plain]  view plain  copy
 
  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參數就能夠

 

[plain]  view plain  copy
 
  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.導出主庫數據文件:

 

[plain]  view plain  copy
 
  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文件,並啓動同步:

[plain]  view plain  copy
 
  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.若是出現同步錯誤,須要忽略錯誤,進行下條語句繼續同步。

 

[plain]  view plain  copy
 
  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

 

[plain]  view plain  copy
 
  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。

[plain]  view plain  copy
 
  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 processlist\G;

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

相關文章
相關標籤/搜索