摘要:上需要主從服務器端配合完成初始化同步用戶主服務器端手動同步初始數據添加測試數據,適合從一臺拓展至多臺服務器的情況。
目前已完成:php7及擴展、redis5的Dockerfile測試版編寫,稍許完善后同步上傳到github,(記下這里memcached還沒有剝離安裝)。
今天數據庫,編程的一個重要原則是不要重復造輪子,php因為需要很多自定義插件、所以多帶帶編譯鏡像,其實其他包括redis都應該使用官方的,直接pull就行。
參考官方鏡像,根據官方鏡像,準備的mysql、mysql_slave文件樹,添加了個數據文件夾。
[]:~/tmp/dk/mysql/mysql_slave# tree ./ ./ ├── config │?? ├── conf.d #后面修改my.cnf后刪掉 │?? │?? └── docker.cnf │?? └── my.cnf └── data1、創建mysql鏡像
[]:~/tmp/dk# docker pull mysql:8.0 # 清空舊數據庫數據 []:~/tmp/dk# rm -rf /root/tmp/dk/mysql/data/* /root/tmp/dk/mysql_slave/data/* []:~/tmp/dk# docker run --name mm -p 3306:3306 -v /root/tmp/dk/mysql/data:/var/lib/mysql -v /root/tmp/dk/mysql/config:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0 []:~/tmp/dk# docker run --name ms -p 3308:3306 -v /root/tmp/dk/mysql_slave/data:/var/lib/mysql -v /root/tmp/dk/mysql_slave/config:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
退出后臺運行的容器,按 Ctrl+D 進行退出容器,請牢記!
run后運行的容器進入:
a.舊式進入 []:~/tmp/dk# docker attach mm b.命令進入 []:~/tmp/dk# docker exec -it mm /bin/bash(或/bin/sh)
參考《Docker容器進入的4種方式》
a.普通進入:有一個問題。當多個窗口同時使用該命令進入該容器時,所有的窗口都會同步顯示。如果有一個窗口阻塞了,那么其他窗口也無法再進行操作。所以docker attach命令不太適合于生產環境,平時自己開發應用時可以使用該命令。
b.推薦
-- 小內存主機需要開啟swap交換分區,并加入開機啟動:
[]:~/tmp/dk# vim /etc/rc.local # +swap swapon /swapfile
-- mysql的重啟:
不能進入容器、在容器中重啟,會報 Unable to lock ./ibdata1 error: 11 的錯誤,容器無法對共享文件加鎖。
# 重啟mysql容器 []:~# docker restart mm2、mysql配置
[mysqld] user = mysql pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql # 主從賦值增加項 log-bin=mysql-bin #[必須]啟用二進制日志 server-id=1 #[必須]服務器唯一ID,默認是1 binlog-do-db=test #要同步的數據庫名,從服務器不需要這幾項 binlog-ignore-db = mysql #不同步mysql庫和sys庫 binlog-ignore-db = sys replicate-ignore-db=mysql secure-file-priv= NULL # 忽略表名大小寫 lower_case_table_names = 1 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci init_connect="SET NAMES utf8mb4" #是否對sql語句大小寫敏感,1表示不敏感 lower_case_table_names=1 #最大連接數 max_connections = 150 #最大錯誤連接數 max_connect_errors=1000 #TIMESTAMP如果沒有顯示聲明NOT NULL,允許NULL值 explicit_defaults_for_timestamp=true #SQL數據包發送的大小,如果有BLOB對象建議修改成1G max_allowed_packet=2M #MySQL連接閑置超過一定時間后(單位:秒)將會被強行關閉 #MySQL默認的wait_timeout 值為8個小時, interactive_timeout參數需要同時配置才能生效 interactive_timeout = 1800 wait_timeout = 1800 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION #時區 default-time_zone = "+8:00"3、主從同步數據
在主服務器添加用于同步的賬戶。上需要主從服務器端配合完成
a.初始化同步用戶### 主服務器端 mysql> CREATE USER "repl"@"%" IDENTIFIED WITH mysql_native_password BY "Ron_master_1"; mysql> GRANT REPLICATION SLAVE ON *.* TO "repl"@"%"; mysql> flush privileges; mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000003 | 825 | test | mysql,sys | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)b.手動同步初始數據
添加測試數據,適合從一臺拓展至多臺服務器的情況。如果庫數據已同步,跳過此步驟。
現在master中已有數據,需要先同步到slave,登錄master,執行鎖表操作
### 容器mm(master)主服務器添加初始庫、表,及后續操作 mysql> create database test; Query OK, 1 row affected (0.01 sec) mysql> use test Database changed mysql> create table sys ( id int unsigned auto_increment primary key, `column` varchar(255) not null ); Query OK, 0 rows affected (0.03 sec) mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000003 | 1272 | test | mysql,sys | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) #只讀鎖表,等待復制 mysql> FLUSH TABLES WITH READ LOCK; Query OK, 0 rows affected (0.01 sec) # 等待主從關系建立完成后,解鎖寫入 mysql> UNLOCK TABLES; Query OK, 0 rows affected (0.00 sec)
### 容器ms(slave):從服務器導入master的庫數據 xx@fd8bb25a86fc:/# mysql -uroot -p123456 mysql> create database test; Query OK, 1 row affected (0.01 sec) mysql> quit Bye root@fd8bb25a86fc:/# mysqldump -uroot -p -h remote_host -P3306 test > /tmp/test.dump Enter password: # 或直接use然后source file root@fd8bb25a86fc:/# mysql -u root -p test < /tmp/test.dumpc.建立主從關系,完成同步
這里需要注意的參數是master_log_file、master_log_pos改為與master當前值相同。
### 容器ms(slave):從服務器添加 # 查詢當前狀態:show slave statusG; 重置復制狀態參數:reset slave all; 關閉:stop slave; # remote_host可以是 192.168.1.102 的內網、公網地址 mysql> change master to master_host="remote_host",master_port=3306,master_user="repl", master_password="Ron_master_1",master_log_file="mysql-bin.000003",master_log_pos=1272; Query OK, 0 rows affected, 2 warnings (0.01 sec) mysql> start slave; Query OK, 0 rows affected (0.00 sec) #查詢設置結果 mysql> show slave statusG; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: xx.xx.xx.xx Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 1272 Relay_Log_File: 6e9640cfaa53-relay-bin.000003 Relay_Log_Pos: 322 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes ... ...
Slave_IO_Running和 Slave_SQL_Running都是Yes,說明主從復制已經開啟成功。
小結這其中遇到很多問題,比如:mysql的容器無法啟動(配置文件問題,或使用現成配置好的,通過docker logs mm查看日志解決),無法從內部重啟(搜索良久,應該是官方的問題,也確實沒有從外部方便,只是對不是用mysql命令restart的別扭而已),主從復制沒好(要點:my.cnf配置,鎖表/確定不寫入也行,master_log_file、master_log_pos參數)。
以前只是看過些,浮于理論,實踐完成后才感覺通暢。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/27938.html
摘要:前面容器重建后需要重新運行命令綁定關聯,需要命令行下生效。直接同步成功,在查看關系均有對方信息。是否要守護進程這里是經過多次測試,發現容器重啟,也會正常啟動。哨兵的配置于此類似,略過。 前面mysql容器重建后需要重新運行 change master to 命令綁定關聯,8.0需要命令行下生效。redis首先想到用官方的,沒想到進去各個基本shell命令無法使用,所以先棄了。這次由于官...
摘要:前面容器重建后需要重新運行命令綁定關聯,需要命令行下生效。直接同步成功,在查看關系均有對方信息。是否要守護進程這里是經過多次測試,發現容器重啟,也會正常啟動。哨兵的配置于此類似,略過。 前面mysql容器重建后需要重新運行 change master to 命令綁定關聯,8.0需要命令行下生效。redis首先想到用官方的,沒想到進去各個基本shell命令無法使用,所以先棄了。這次由于官...
摘要:作為面試官,我是如何甄別應聘者的包裝程度語言和等其他語言的對比分析和主從復制的原理詳解和持久化的原理是什么面試中經常被問到的持久化與恢復實現故障恢復自動化詳解哨兵技術查漏補缺最易錯過的技術要點大掃盲意外宕機不難解決,但你真的懂數據恢復嗎每秒 作為面試官,我是如何甄別應聘者的包裝程度Go語言和Java、python等其他語言的對比分析 Redis和MySQL Redis:主從復制的原理詳...
閱讀 2049·2021-11-15 11:39
閱讀 3233·2021-10-09 09:41
閱讀 1496·2019-08-30 14:20
閱讀 3266·2019-08-30 13:53
閱讀 3330·2019-08-29 16:32
閱讀 3384·2019-08-29 11:20
閱讀 3025·2019-08-26 13:53
閱讀 780·2019-08-26 12:18