在遠端linux主機用docker部署mysql一主一從跟雙主從複製
在遠端linux主機用docker部署mysql一主一從跟雙主從複製
本處使用的是SSH連線工具Xshell連線遠端linux主機(需先在windows上安裝Xshell軟體),在同一臺linux主機或者兩臺linux主機都可以部署主從
(在操作過程中可能遇到的問題時的處理命令:當run的時候可能會提示埠已經佔用,你可以換一個埠3305:3306這樣;或者你配置錯了需要重新來,可以先把執行中的容器關閉再刪除,先用命令docker ps -a檢視所有的容器,包括不在執行狀態的,docker ps僅僅列出正在執行狀態的容器,然後停止的命令是docker stop 容器ID,刪除容器是docker rm 容器ID;之前配置過slave,需要先stop slave;停止下再輸入change那一串,再start slave;)
在連線遠端主機後鍵入依次以下命令:
1、docker search mysql 查詢mysql映象
2、docker pull mysql:5.7.19 把mysql映象拉取到本地
3、在linux主機上建立conf資料夾目錄,並且在這個目錄裡面建立master.conf跟slave.cnf檔案,或者
master.conf跟slave.cnf檔案可以預先在windows電腦上建立,分別在裡頭鍵入以下內容(待會在下面提供),然後直接在xshell軟體上,點選傳檔案,會跳轉到Xftp軟體(如果預先沒有在windows上安裝這個軟體要先安裝),然後直接從windows主機上直接拖動master.conf跟slave.cnf檔案到指定遠端linux主機的/root/conf資料夾(剛才我們在linux主機上預先建立的資料夾)下,master.conf跟slave.cnf檔案是我們在建立mysql容器
的時候要用到的,通過對映,作為mysql的配置檔案:
master檔案內容:
[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 relay-log-index=slave-relay-bin.index 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官方映象如果設定別的取值會導致容器無法正常啟動。
)
slave檔案內容:
[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
relay-log=relay-bin
relay-log-index=slave-relay-bin.index
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
其中兩個檔案的server-id一定要不一樣,其餘部分都一樣。
4、啟動master容器:
docker run -p 3309:3306 --name master -v /root/conf/master.cnf:/etc/mysql/conf.d/master.cnf -e MYSQL_ROOT_PASSWORD=220316 -d mysql:5.7.19
(引數解釋如下:
-p 3309:3306:將容器的3306埠對映到主機的3309埠。
-v /root/conf/master.cnf:/etc/mysql/conf.d/master.cnf:將主機當前目錄下的/root/conf/master.cnf掛載到容器的/etc/mysql/conf.d/master.cnf。記住只能是在conf.d的檔案下面才可以。
-e MYSQL_ROOT_PASSWORD=220316:初始化root使用者的密碼。)
5、啟動slave容器:
docker run -p 3307:3306 --name slave -v /root/conf/slave.cnf:/etc/mysql/conf.d/slave.cnf -e MYSQL_ROOT_PASSWORD=220316 -d mysql:5.7.19
6、docker ps 檢視正在執行的容器
7、進入到master容器中:docker exec -i -t 8a16c84f8bde /bin/bash
8、登陸master容器的mysql,命令:mysql -hlocalhost -uroot -p,然後回車,輸入密碼,如剛才我們在建立mysql容器的時候設定的密碼220316,
密碼在輸入過程是不可見的,確保輸入正確然後回車即可
9、檢視master資料庫狀態,命令如下:show master status; (要記錄下file跟position的地址,待會兒配置從庫的時候要用到)
10、在master資料庫中建立使用者,命令如下:create user zhangsan;
11、在master資料庫中給剛才建立的使用者賦予一定許可權,命令如下:
GRANT ALL PRIVILEGES ON . TO [email protected]’%’ IDENTIFIED BY ‘220316’;
12、進入到slave容器中:docker exec -i -t 4a768410fbdd /bin/bash
13、登陸slave容器mysql,命令:mysql -hlocalhost -uroot -p,然後回車,輸入密碼,如剛才我們在建立mysql容器的時候設定的密碼220316,密碼
在輸入過程是不可見的,確保輸入正確然後回車即可
14、在slave資料庫中配置主從關係關聯:
change master to
master_host=‘data.synron.cn’,
master_port=3309,
master_user=‘zhangsan’,
master_password=‘220316’,
master_log_file=‘mysql-bin.000003’,
master_log_pos=640;
15、在salve的mysql資料庫中啟動服務,命令如下:start slave;
16、在salve的mysql資料庫中檢視啟動狀態,命令如下:show slave status\G
如果Slave_IO_Running: Yes 跟Slave_SQL_Running: Yes都為Yes的話即為設定主從成功,這時候可以返回master的mysql容器,建立一個數據庫,然後再
回到slave的mysql容器檢視show databases; ,如果你看到在slave的mysql資料庫下也有剛才在master下建立的資料庫,即驗證mysql一主一從複製成功
17、接下來配置雙主複製,即互為主從;登陸前面建立的slave的mysql裡面,建立使用者create user lisi;
18、給剛才建立的使用者賦予一定許可權,命令如下:GRANT ALL PRIVILEGES ON . TO [email protected]’%’ IDENTIFIED BY ‘220316’;
19、然後輸入命令:show master status; (要記錄下file跟position的地址,待會兒配置從庫的時候要用到)
20、接著,回到master的mysql下,並登陸,鍵入以下內容:
change master to
master_host=‘data.synron.cn’,
master_port=3307,
master_user=‘lisi’,
master_password=‘220316’,
master_log_file=‘mysql-bin.000003’,
master_log_pos=632;
21、接著輸入命令:start slave;
22、輸入命令:show slave status\G檢視啟動狀態
如果Slave_IO_Running: Yes 跟Slave_SQL_Running: Yes都為Yes的話即為設定主從成功,即我們反向配置主從也成功,這時候可以去驗證下,也可以在外面windows
本地上先連線什麼的master跟slave資料庫,然後再建立資料庫進行驗證
參考博文 使用Docker容器搭建MySql主從複製,在 此博文的基礎上,我進行了更詳細的描述