1. 程式人生 > >使用Docker實現MySql資料庫在容器中的主從配置(詳解)

使用Docker實現MySql資料庫在容器中的主從配置(詳解)

使用Docker容器搭建MySql主從複製
關於如何建立映象,我的部落格中有詳細的步驟文件
檢視容器ip命令為docker inspect 96fd[id前四位]
Master_mysql_ip_172.17.0.4
slave_mysql_ip_172.17.0.5
1.docker上面尋找mysq,找到需要的mysql版本進行下載,
命令如下所示:docker search mysql,效果如圖所示
在這裡插入圖片描述
2.開始拉取映象pull mysql到本地,我拉取的映象版本為5.6,
命令如下:docker pull mysql:5.6 如圖所示
在這裡插入圖片描述
(成功之後,使用docker images檢視是否已經下載成功)
3.在主機下面新建conf資料夾,新增master.cnf和slave.cnf配置檔案
(建立檔案命令如下:mkdir conf、vim master.cnf 記住配置檔案必須是以cnf結尾。)用來儲存主從配置資訊
在這裡插入圖片描述


master.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

slave.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

(我加粗的那些是開啟主從資料庫的關鍵,重要引數解釋如下:
lower_case_table_names:忽略表名、列名等資料結構的大小寫(注意:不是每行記錄內容的大小寫!)。
server-id=1: 表示此MySQL伺服器是主伺服器 。
log-bin:開啟二進位制記錄。這是為了主從複製而做的設定。本文使用RBR(Row-Based Replication)模式。
slow_query_log=1:開啟慢查詢日誌。如果某一條SQL執行的時間超過long_query_time設定的秒數,那麼就記錄下來。記錄檔案路徑可以使用show variables;命令,在變數名是slow_query_log_file下查詢到具體的日誌檔案路徑。
long_query_time=1:單位是秒。指如果某一條SQL語句執行時間超過1秒,就記錄下來。必須開啟慢查詢日誌了以後,此變數才能使用。
log_error:開啟錯誤日誌。show variables like ‘log_error’; 就可以查詢到日誌檔案的路徑。mysql的docker官方映象如果設定別的取值會導致容器無法正常啟動。

4.執行容器
啟動master容器:
docker run -p 3306:3306 --name master -v /conf/master.cnf:/etc/mysql/conf.d/master.cnf -e MYSQL_ROOT_PASSWORD=qwer1234 -dit mysql:latest /bin/bash
啟動slave容器:
docker run -p 3307:3306 --name slave -v /conf/slave.cnf:/etc/mysql/conf.d/slave.cnf -e MYSQL_ROOT_PASSWORD=qwer1234 -dit mysql:latest /bin/bash
(引數解釋如下:
-p 3306:3306:將容器的3306埠對映到主機的3306埠。
-v /conf/master.cnf:/etc/mysql/conf.d/master.cnf:將主機當前目錄下的conf/master.cnf掛載到容器的/etc/mysql/conf.d/master.cnf。記住只能是在conf.d的檔案下面才可以。
-e MYSQL_ROOT_PASSWORD=220316:初始化root使用者的密碼。)
在這裡插入圖片描述
5.進入容器中,命令如下:
進入到slave容器中:docker exec -i -t 1f105944a7c4 /bin/bash
進入到master容器中:docker exec -i -t 7e4c483127c7 /bin/bash
在這裡插入圖片描述
6.進入master容器中,進入mysql中,命令如下:mysql -hlocalhost -uroot -p
報錯:
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)
在這裡插入圖片描述
7.檢視master資料庫狀態,命令如下:show master status;
在這裡插入圖片描述
(如果出現這個表格就說明啟動成功了,這邊我們需要記錄file欄位的值(binlog.000002),position(4178)因為在slave中需要用這個值進行主從關聯)
8.在master資料庫中建立使用者,命令如下:create user hefeihu;
在這裡插入圖片描述
9.在master資料庫中給剛才建立的使用者賦予一定許可權,命令如下:
GRANT ALL PRIVILEGES ON . TO [email protected]’%’ IDENTIFIED BY ‘220316’; FLUSH PRIVILEGES;FLUSH PRIVILEGES;
在這裡插入圖片描述
(引數介紹:
1.FLUSH PRIVILEGES;這個命令必須填寫,否則上面設定的使用者許可權失效。
2.ip地址是可以設定範圍的。例如:GRANT REPLICATION SLAVE ON . TO’linzhiqiang’@‘192.168.0.%’ IDENTIFIED BY’220316’;
3.操作的資料庫也是可以指定的。
4.使用者的許可權也是可以設定的。具體的命令大家可以自己去學習,我這裡就不多說了。
如果不設定使用者許可權的話,本地可以連線的上mysql伺服器,區域網或者外網是連線不上,會顯示連線被拒絕或者使用者沒有這個許可權。除此之外許可權還可以精確到某個資料庫,連線者的IP地址區間,設定是某個資料的操作問題等等都可以進行設定。我這邊設定的是linzhiqiang這個使用者具備所有使用者資料庫的許可權,所有的ip地址都可以通過Master這個使用者來連線主資料庫。)
10.在slave資料庫中配置主從關係關聯:
change master to
master_host=‘172.17.0.4’,
master_port=3306,
master_user=‘hefeihu’,
master_password=‘qwer1234’,
master_log_file=‘binlog.000002’,
master_log_pos=4888;

change master to
master_host=‘192.168.88.22’, //Master 伺服器Ip地址,也就是上面寫的192.168.88.22
master_port=3306,//Master 埠號
master_user=‘linzhiqiang’,//Master 使用者名稱
master_password=‘220316’,//使用者密碼
master_log_file=‘mysql-bin.000004’,//Master伺服器產生的日誌要和Master伺服器所配置的相互對應如下如所示的file對應
master_log_pos=0;//要和Master伺服器所配置的相互對應如下如所示的Position對應(經過測試發現如果是一樣的只能同步一次,所以這裡修正成0,0是可以每次都同步成功的)
(我這邊用//是為了解釋方便,資料庫中操作的時候一定不要加上!!!)
12.在salve資料庫中啟動服務,命令如下:start slave;
13.在salve資料庫中檢視啟動狀態,命令如下:show slave status\G
在這裡插入圖片描述

Slave_SQL_Running: No

在這裡插入圖片描述
14.利用Navicat進行測試,是否同步成功。
在這裡插入圖片描述
結果顯示同步成功!!!
啟動映象,對映埠,以及配置檔案的命令如下
docker run -p 3306:3306 --name master -v /conf/master.cnf:/etc/mysql/conf.d/master.cnf -e MYSQL_ROOT_PASSWORD=qwer1234 -d mysql:5.6