1,下載mysql鏡像
mysql版本:mysql5.7
docker pull mysql:5.7
注意:如果使用docker pull mysql,則默認拉取的是最新版本的mysql(文章發佈時是 mysql 8.0.15版本),則下述的配置方法無效。
2,創建主服務器所需目錄
在本機上先創建好mysql主服務器所需目錄,以便與mysql主服務器所需目錄進行映射,便於管理。
mkdir /usr/local/mysqlData/master/cnf -p
mkdir /usr/local/mysqlData/master/data -p
3,定義主服務器配置文件
vim /usr/local/mysqlData/master/cnf/mysql.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
symbolic-links=0
character-set-server = utf8
#skip-networking
innodb_print_all_deadlocks = 1
max_connections = 2000
max_connect_errors = 6000
open_files_limit = 65535
table_open_cache = 128
max_allowed_packet = 4M
binlog_cache_size = 1M
max_heap_table_size = 8M
tmp_table_size = 16M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
sort_buffer_size = 8M
join_buffer_size = 28M
key_buffer_size = 4M
thread_cache_size = 8
query_cache_type = 1
query_cache_size = 8M
query_cache_limit = 2M
ft_min_word_len = 4
log-bin = mysql-bin
server-id = 1
binlog_format = mixed
performance_schema = 0
explicit_defaults_for_timestamp
#lower_case_table_names = 1
interactive_timeout = 28800
wait_timeout = 28800
#Recommended in standard MySQL setup
sql_mode=NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER,STRICT_TRANS_TABLES
[mysqldump]
quick
max_allowed_packet = 16M
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M
4,創建並啓動mysql主服務
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/mysql 5.7 98455b9624a9 5 days ago 372 MB
[root@localhost ~]# docker run -itd -p 3306:3306 --name master -v /usr/local/mysqlData/master/cnf:/etc/mysql/conf.d -v /usr/local/mysqlData/master/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=masterpwd 98455b9624a9 //注意修改鏡像ID。
6405439bdd40d10507400dd0d750836de36a1f50e081a56ea4880dfc187dbb34
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6405439bdd40 98455b9624a9 "docker-entrypoint..." About a minute ago Up About a minute 0.0.0.0:3306->3306/tcp, 33060/tcp master
5,進入主服務器控制檯,添加複製master數據的用戶reader,供從服務器使用
[root@localhost ~]# docker exec -it 6405439bdd40 /bin/bash //注意修改容器ID
root@6405439bdd40:/# mysql -u root -pmasterpwd
mysql> GRANT REPLICATION SLAVE ON *.* to 'reader'@'%' identified by 'readerpwd';
Query OK, 0 rows affected, 1 warning (1.60 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.03 sec)
6,創建從服務器所需目錄,編輯配置文件
[root@localhost ~]# mkdir /usr/local/mysqlData/slave/cnf -p
[root@localhost ~]# mkdir /usr/local/mysqlData/slave/cnf -p
[root@localhost ~]# vim /usr/local/mysqlData/slave/cnf/mysql.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
symbolic-links=0
character-set-server = utf8
#skip-networking
innodb_print_all_deadlocks = 1
max_connections = 2000
max_connect_errors = 6000
open_files_limit = 65535
table_open_cache = 128
max_allowed_packet = 4M
binlog_cache_size = 1M
max_heap_table_size = 8M
tmp_table_size = 16M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
sort_buffer_size = 8M
join_buffer_size = 28M
key_buffer_size = 4M
thread_cache_size = 8
query_cache_type = 1
query_cache_size = 8M
query_cache_limit = 2M
ft_min_word_len = 4
log-bin = mysql-bin
server-id = 2
binlog_format = mixed
performance_schema = 0
explicit_defaults_for_timestamp
#lower_case_table_names = 1
interactive_timeout = 28800
wait_timeout = 28800
#Recommended in standard MySQL setup
sql_mode=NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER,STRICT_TRANS_TABLES
[mysqldump]
quick
max_allowed_packet = 16M
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M
7,創建並運行mysql從服務器
[root@localhost ~]# docker run -itd -p 3307:3306 --name slaver -v /usr/local/mysqlData/slave/cnf:/etc/mysql/conf.d -v /usr/local/mysqlData/slave/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=slavepwd 98455b9624a9
8,在從服務器上配置連接主服務器的信息
首先主服務器上查看master_log_file,master_log_pos兩個參數,然後切換到從服務器上進行主服務器的連接信息的設置
/*主服務上執行*/
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 765 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.01 sec)
/*從服務器上執行*/
[root@localhost ~]# docker exec -it fbc7e934f424 /bin/bash
root@fbc7e934f424:/# mysql -u root -pslavepwd
mysql> change master to master_host='172.17.0.2',master_user='reader',master_password='readerpwd',master_log_file='mysql-bin.000003',master_log_pos=765;
主服務器ip(master_host)可以在主服務器上通過命令:cat /etc/hosts查看,用戶名以及密碼就是在步驟5中創建的用戶以及設定的密碼。
9,從服務器啓動I/O 線程和SQL線程
不帶任何參數,表示同時啓動I/O 線程和SQL線程。
I/O線程從主庫讀取bin log,並存儲到relay log中繼日誌文件中。
SQL線程讀取中繼日誌,解析後,在從庫重放。
mysql> start slave;
Query OK, 0 rows affected (0.03 sec)
mysql> show slave status\G
Slave_IO_State: Waiting for master to send event
Master_Host: 172.17.0.2
Master_User: reader
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 765
Relay_Log_File: b3a8ba2fdc0c-relay-bin.000002
Relay_Log_Pos: 494
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Slave_IO_Running: Yes,Slave_SQL_Running: Yes即表示啓動成功。
10,測試
主服務器上創建測試數據庫:slavetest
mysql> create database slavetest;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| slavetest |
| sys |
+--------------------+
5 rows in set (0.00 sec
在從服務器上查看
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| slavetest |
| sys |
+--------------------+
5 rows in set (0.00 sec)
可以看到,slavetest已成功複製到mysql從服務器。
注意:本文介紹的是單向複製,即只能從master複製到slaver,而不能逆向進行。
延伸:實現讀寫分離
主從複製是在主服務器上添加或更新數據,從服務器進行復制操作。因此,如果要實現讀寫,可以調整應用程序,對主數據庫進行寫的操作,而查詢,讀取的操作可以放到從服務器上執行。這樣,便可以通過在應用程序上的控制,實現對數據庫的讀寫分離。
延伸:其他複製方式
MySQL數據庫支持單向、雙向、鏈式級聯、環狀等不同業務場景的複製。在複製過程中,一臺服務器充當主服務器(Master),接收來自用戶的內容更新,而一個或多個其他的服務器充當從服務器(Slave),接收來自主服務器binlog文件的日誌內容,解析出SQL重新更新到從服務器,使得主從服務器數據達到一致。
如果設置了鏈式級聯複製,那麼,從(slave)服務器本身除了充當從服務器外,也會同時充當其下面從服務器的主服務器。鏈式級複製類似A→B→C的複製形式。MySQL數據庫支持單向、雙向、鏈式級聯、環狀等不同業務場景的複製
http://baijiahao.baidu.com/s?id=1598186201849829616&wfr=spider&for=pc