1. 程式人生 > 其它 >快速使用docker 搭建 MySQL主從複製與讀寫分離

快速使用docker 搭建 MySQL主從複製與讀寫分離

搭建 MySQL主從複製與讀寫分離 :

在實際環境中 ,如果對資料庫的讀和寫都在同一個資料庫服務中操作 ,無論實在安全性、高可用性,
還是高併發等各個方面都是完全不能滿足實際需求的 ,因此 ,一般來說都只通過主從複製的方式來同

本機已經搭建了一個mysql,不知道如何構建可以參考docker 搭建mysql

1,配置 主MySQL 配置檔案 :

vim /etc/my.cnf        #在配置檔案新增

server-id = 1              #修改
log-bin=master-bin         #開啟二進位制日誌
log-slave-updates=true     #開啟從伺服器同步主伺服器二進位制日誌

2,重啟mysql, 進入資料庫給從伺服器授權 :

[root@localhost /]# docker exec -it mysql bash                   //進入主mysql容器

root@d89e02feef14:/# mysql -u root  -proot
mysql> create user `coolr`@`%` identified by "root";             #建立使用者
mysql> grant all on *.* to `coolr`@`%` with grant option;        #新增許可權

mysql> FLUSH PRIVILEGES;                                         #重新整理許可權
mysql> show master status;                                       #檢視主伺服器狀態

如圖:說明我們的bin-log 日誌已經開啟了

3,從機搭建 :


[root@localhost mysql]# mkdir mysql-serve1
#建立 從庫對映目錄
[root@localhost mysql]# cd mysql-serve1

[root@localhost mysql-serve1]# cp /etc/my.cnf /docker/mysql/mysql-serve1/
#複製主庫my.cnf配置
[root@localhost mysql-serve1]# vim my.cnf
#修改從庫my.cnf配置
[client]
port        = 3307          //從庫埠
socket        = /tmp/mysql.sock

[mysqld]
secure_file_priv=/var/lib/mysql
port        = 3307
socket        = /tmp/mysql.sock
datadir = /usr/local/mysql/data
default_storage_engine = InnoDB
performance_schema_max_table_instances = 400
table_definition_cache = 400
skip-external-locking
key_buffer_size = 32M
max_allowed_packet = 100G
table_open_cache = 128
sort_buffer_size = 768K
net_buffer_length = 4K
read_buffer_size = 768K
read_rnd_buffer_size = 256K
myisam_sort_buffer_size = 8M
thread_cache_size = 16
tmp_table_size = 32M
default_authentication_plugin = mysql_native_password
lower_case_table_names = 1
sql-mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

explicit_defaults_for_timestamp = true
max_connections = 500
max_connect_errors = 100
open_files_limit = 65535

log-bin=mysql-bin
binlog_format=mixed
server-id = 2                # id 主庫不一樣  別一臺從伺服器同樣配置 id 不同即可
binlog_expire_logs_seconds = 600000
slow_query_log=1
slow-query-log-file=/usr/local/mysql/data/mysql-slow.log
long_query_time=3
early-plugin-load = ""

innodb_data_home_dir = /usr/local/mysql/data
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /usr/local/mysql/data
innodb_buffer_pool_size = 128M
innodb_log_file_size = 64M
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
innodb_max_dirty_pages_pct = 90
innodb_read_io_threads = 1
innodb_write_io_threads = 1

[mysqldump]
quick
max_allowed_packet = 500M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 32M
sort_buffer_size = 768K
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

修改完成之後構建從機的mysql

3,從機搭建 :

[root@localhost mysql-serve1]# docker run -p 3307:3307 -d --name mysql-serve1 -v /docker/mysql/mysql-serve1/my.cnf:/etc/mysql/my.cnf --privileged=true -e MYSQL_ROOT_PASSWORD=root mysql
#構建從庫
[root@localhost mysql-serve1]# docker exec -it mysql-serve1 bash
#進入從庫
root@cacb4a88b156:/# mysql -uroot -proot

mysql> change master to master_host='192.168.74.129',master_user='coolr',master_password='root',master_log_file='mysql-bin.000011',master_log_pos=983460;   # 主伺服器地址、授權使用者、二進位制日誌名稱、偏移量 。
mysql> start slave;
# 開啟從伺服器
mysql> show slave status\G;
 #檢視從伺服器狀態
*************************** 1. row ***************************
           Slave_IO_State: Waiting for master to send event
              Master_Host: 192.168.217.130
              Master_User: myslave
              Master_Port: 3306
            Connect_Retry: 60
          Master_Log_File: master-bin.000001
      Read_Master_Log_Pos: 604
           Relay_Log_File: relay-log-bin.000002
            Relay_Log_Pos: 321
    Relay_Master_Log_File: master-bin.000001
         Slave_IO_Running: Yes                # 為yes 表示同步中
        Slave_SQL_Running: Yes                # 為yes 表示同步中

在本地使用Navicat測試mysql:

主庫 建立資料庫:shop

重新整理從庫

資料已同步