天天看點

Docker MySQL M-S 實戰

擷取鏡像

docker run -p 33006:3306 --name mysql-master    -v /data/docker/mysql/conf/:/etc/mysql/mysql.conf.d/:rw -v /data/docker/mysql/logs:/var/log/mysql/:rw -v /data/docker/mysql/data/:/var/lib/mysql/:rw -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
           
  • 進入docker mysql

    docker exec -it mysql /bin/bash

  • docker mysql 授權(注意權限保護)

    GRANT ALL PRIVILEGES ON . TO ‘root’@’%’WITH GRANT OPTION;

  • 目錄介紹

    basedir 安裝目錄

    datadir 檔案目錄 預設位址 /var/lib/mysql/

    error_log log_error = /data/mysql/logs/mysql-error.log 預設位置/var/log/mysql/error.log [需要代理]

    slow_query_log_file = /data/mysql/logs/mysql-slow.log

主從配置

主:
    server-id=1  
    log_bin=/var/log/mysql/binlog  
從:
    server-id=2  
    log_bin=/var/log/mysql/binlog  
    innodb_file_per_table=ON  
    skip_name_resolve=ON  
    binlog-format=row  
    log-slave-updates=true  
    relay_log=/var/log/mysql/relay.log  
           

配置檔案對比

[mysqld]
    These properties are for the MySQL Server, and you can use this file: /etc/mysql/mysql.conf.d/mysqld.cnf
[mysql]
    These properties are for the MySQL Client (command line), and you can use this file: /etc/mysql/conf.d/mysql.cnf
[mysqld_safe]
    These properties are for MySQL when you start it up in safe mode using mysql_safe and can be found in this file: /etc/mysql/conf.d/mysqld_safe_syslog.cnf
           

主從配置

1. 配置cnf
    主:
        [client]
        port        = 3306
        socket      = /var/run/mysqld/mysqld.sock

        [mysqld_safe]
        pid-file    = /var/run/mysqld/mysqld.pid
        socket      = /var/run/mysqld/mysqld.sock
        nice        = 0

        [mysqld]
        user        = mysql
        pid-file    = /var/run/mysqld/mysqld.pid
        socket      = /var/run/mysqld/mysqld.sock
        port        = 3306
        basedir     = /usr
        datadir     = /var/lib/mysql
        tmpdir      = /tmp
        lc-messages-dir = /usr/share/mysql
        explicit_defaults_for_timestamp
        character_set_server=utf8mb4
        log-error = /var/log/mysql/mysql-error.log
        log-bin = mysql-bin 
        server-id = 1 

        # Recommended in standard MySQL setup
        sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

        # Disabling symbolic-links is recommended to prevent assorted security risks
        symbolic-links=0
    從配置
        [client]
        port        = 3306
        socket      = /var/run/mysqld/mysqld.sock

        [mysqld_safe]
        pid-file    = /var/run/mysqld/mysqld.pid
        socket      = /var/run/mysqld/mysqld.sock
        nice        = 0

        [mysqld]
        user        = mysql
        pid-file    = /var/run/mysqld/mysqld.pid
        socket      = /var/run/mysqld/mysqld.sock
        port        = 3306
        basedir     = /usr
        datadir     = /var/lib/mysql
        tmpdir      = /tmp
        lc-messages-dir = /usr/share/mysql
        explicit_defaults_for_timestamp
        character_set_server=utf8mb4
        log-error = /var/log/mysql/mysql-error.log
        log-bin = mysql-bin 
        server-id = 2

        # Recommended in standard MySQL setup
        sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

        # Disabling symbolic-links is recommended to prevent assorted security risks
        symbolic-links=0        
           

啟動master

docker run -p 33006:3306 --name mysql-master    -v /data/docker/mysql/conf/33006/:/etc/mysql/mysql.conf.d/:rw -v /data/docker/mysql/logs/33006/:/var/log/mysql/:rw -v /data/docker/mysql/data/33006/:/var/lib/mysql/:rw -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
docker exec -it mysql-master /bin/bash
           

啟動slave

docker run -p 33007:3306 --name mysql-slave     -v /data/docker/mysql/conf/33007/:/etc/mysql/mysql.conf.d/:rw -v /data/docker/mysql/logs/33007/:/var/log/mysql/:rw -v /data/docker/mysql/data/33007/:/var/lib/mysql/:rw -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
docker exec -it mysql-slave /bin/bash
           

master 授權

GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by '123456';
           
  • master 狀态
    1. show master status;
    2. 記住 bin-log 檔案以及偏移
  • slave 連接配接master

    change master to master_host=’127.0.0.1’,master_user=’backup’,master_password=’123456’, master_log_file=’mysql-bin.000004’,master_log_pos=439,master_port=33006;

配置成功驗證

  • slave staus

    登入slave 上的mysql ,敲入指令

    show slave status;

    結果顯示:Slave_IO_State: Waiting for master to send event。也就成功了。

  • 資料驗證

    在master上面建立響應的資料庫,資料表,插入一些測試資料。如果slave中含有這些資料,那麼就完成了整個配置流程。

Q&A

在啟動的時候,可能會遇見權限不足不能夠建立log.index檔案的情況,這時候一種方案是,先不要挂載日志檔案目錄,啟動容器,進入容器通過chown指令,設定需要被挂載的日志檔案目錄的,然後在重新啟動容器。

後續

後面會基于現在的配置完成Linkin開源的Databus 以及阿裡巴巴開源 canal的配置以及架構以及實作原理總結。

提供一份比較詳盡的配置檔案

[mysqld]
pid-file    = /var/run/mysqld/mysqld.pid
socket      = /var/run/mysqld/mysqld.sock
datadir     = /var/lib/mysql
#log-error  = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address   = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
#支援符号連結,就是可以通過軟連接配接的方式,管理其他目錄的資料庫,最好不要開啟,當一個磁盤或分區空間不夠時,可以開啟該參數将資料存儲到其他的磁盤或分區。
#http://blog.csdn.net/moxiaomomo/article/details/17092871
symbolic-links=0

########basic settings########
server-id = 11 
port = 3306
user = mysql
#設定autocommit=0,則使用者将一直處于某個事務中,直到執行一條commit送出或rollback語句才會結束目前事務重新開始一個新的事務。set autocommit=0的好處是在頻繁開啟事務的場景下,減少一次begin的互動。
autocommit = 1
#utf8mb4編碼是utf8編碼的超集,相容utf8,并且能存儲4位元組的表情字元。 
#采用utf8mb4編碼的好處是:存儲與擷取資料的時候,不用再考慮表情字元的編碼與解碼問題。
character_set_server=utf8mb4
skip_name_resolve = 1
max_connections = 800
# 對于同一主機,如果有超出該參數值個數的中斷錯誤連接配接,則該主機将被禁止連接配接。如需對該主機進行解禁,執行:FLUSH HOST。
max_connect_errors = 1000
#資料庫隔離級别
transaction_isolation = READ-COMMITTED
#MySQL在完成某些join(連接配接)需求的時候,為了減少參與join的“被驅動表”的讀取次數以提高性能,需要使用到join buffer來協助完成join操作當join buffer 太小,MySQL不會将該buffer存入磁盤檔案而是先将join buffer中的結果與需求join的表進行操作,然後清空join buffer中的資料,繼續将剩餘的結果集寫入次buffer中
join_buffer_size = 128M
tmp_table_size = 64M
tmpdir = /tmp
#該值設定過小将導緻單個記錄超過限制後寫入資料庫失敗,且後續記錄寫入也将失敗
max_allowed_packet = 64M
#mysql在關閉一個互動的連接配接之前所要等待的秒數
interactive_timeout = 1200
#mysql在關閉一個非互動的連接配接之前所要等待的秒數
wait_timeout = 600
#MySQL讀入緩沖區的大小
read_buffer_size = 16M
#MySQL的随機讀緩沖區大小
read_rnd_buffer_size = 8M
#MySQL的順序讀緩沖區大小
sort_buffer_size = 8M
########log settings########
log_error = /var/log/docker_log/mysql/error.log
#開啟慢查詢日志
slow_query_log = 1
#超出次設定值的SQL即被記錄到慢查詢日志
long_query_time = 6
slow_query_log_file = /var/log/docker_log/mysql/slow.log
#表示記錄下沒有使用索引的查詢
log_queries_not_using_indexes = 1
#記錄管理語句
log_slow_admin_statements = 1
#開啟複制從庫複制的慢查詢的日志
log_slow_slave_statements = 1
#設定每分鐘增長的沒有使用索引查詢的日志數量
log_throttle_queries_not_using_indexes = 10
expire_logs_days = 90
min_examined_row_limit = 100
########replication settings########
#将master.info和relay.info儲存在表中
master_info_repository = TABLE
relay_log_info_repository = TABLE
log_bin = bin.log
#當每進行n次事務送出之後,MySQL将進行一次fsync之類的磁盤同步指令來将binlog_cache中的資料強制寫入磁盤。設定為零是讓系統自行決定
sync_binlog = 5
#開啟全局事務ID,GTID能夠保證讓一個從伺服器到其他的從伺服器那裡實作資料複制而且能夠實作資料整合的
gtid_mode = on
#開啟gtid,必須主從全開
enforce_gtid_consistency = 1
#從伺服器的更新是否寫入二進制日志
log_slave_updates = 1
#三種模式 STATEMENT(有可能主從資料不一緻,日品質小)、ROW(産生大量二進制日志)、MIXED
binlog_format = mixed
#relay-log日志記錄的是從伺服器I/O線程将主伺服器的二進制日志讀取過來記錄到從伺服器本地檔案,然後SQL線程會讀取relay-log日志的内容并應用到從伺服器
relay_log = /var/log/docker_log/mysql/relay.log
relay_log_recovery = 1
#開啟簡單gtid,開啟此項會提升mysql執行恢複的性能
binlog_gtid_simple_recovery = 1
slave_skip_errors = ddl_exist_errors
########innodb settings########
#這個參數在一開始初始化時就要加入my.cnf裡,如果已經建立了表,再修改,啟動MySQL會報錯。最好為8K
#innodb_page_size = 16K
innodb_page_size = 8K
#資料緩沖區buffer pool大小,建議使用實體記憶體的 75%
innodb_buffer_pool_size = 2G
#當buffer_pool的值較大的時候為1,較小的設定為8
innodb_buffer_pool_instances = 8
#運作時load緩沖池,快速預熱緩沖池,将buffer pool的内容(檔案頁的索引)dump到檔案中,然後快速load到buffer pool中。避免了資料庫的預熱過程,提高了應用通路的性能
innodb_buffer_pool_load_at_startup = 1
#運作時dump緩沖池
innodb_buffer_pool_dump_at_shutdown = 1
#在innodb中處理使用者查詢後,其結果在記憶體空間的緩沖池已經發生變化,但是還未記錄到磁盤。這種頁面稱為髒頁,将髒頁記錄到磁盤的過程稱為刷髒
innodb_lru_scan_depth = 2000
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
#事務等待擷取資源等待的最長時間,超過這個時間還未配置設定到資源則會傳回應用失敗,預設50s
innodb_lock_wait_timeout = 30
#日志組所在的路徑,預設為data的home目錄;
innodb_log_group_home_dir = /data/mysql/
#innodb_undo_directory = /data/mysql/undolog/
#這個參數控制着innodb資料檔案及redo log的打開、刷寫模式,http://blog.csdn.net/gua___gua/article/details/44916207
#innodb_flush_method = O_DIRECT-不經過系統緩存直接存入磁盤,
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
innodb_strict_mode = 1
#innodb獨享表空間,有點很多,缺點會導緻單個表檔案過大
#innodb_file_per_table = 1
#undo日志復原段 預設為128
innodb_undo_logs = 128
#傳統機械硬碟建議使用,而對于固态硬碟可以關閉
#innodb_flush_neighbors = 1
innodb_log_file_size = 1G
innodb_log_buffer_size = 64M
#控制是否使用獨立purge線程
innodb_purge_threads = 1
#改為ON時,允許單列索引最大達到3072。否則最大為767
innodb_large_prefix = 1
innodb_thread_concurrency = 8
#開啟後會将所有的死鎖記錄到error_log中
innodb_print_all_deadlocks = 1
innodb_sort_buffer_size = 16M 
########semi sync replication settings########
#半同步複制
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
loose_rpl_semi_sync_master_timeout = 5000
#表示轉儲每個bp instance LRU上最熱的page的百分比。通過設定該參數可以減少轉儲的page數。
innodb_buffer_pool_dump_pct = 40
#刷髒的程序N-1
innodb_page_cleaners = 4
innodb_undo_log_truncate = 1
innodb_max_undo_log_size = 2G
#控制回收(收縮)undo log的頻率.undo log空間在它的復原段沒有得到釋放之前不會收縮,
innodb_purge_rseg_truncate_frequency = 128
log_timestamps=system
#該參數基于MySQL5.7 Group Replication組複制的,沒有使用不要設定
#transaction_write_set_extraction=MURMUR32
#http://www.cnblogs.com/hzhida/archive/2012/08/08/2628826.html
show_compatibility_56=on
           

繼續閱讀