摘要:上需要主從服務(wù)器端配合完成初始化同步用戶主服務(wù)器端手動(dòng)同步初始數(shù)據(jù)添加測(cè)試數(shù)據(jù),適合從一臺(tái)拓展至多臺(tái)服務(wù)器的情況。
目前已完成:php7及擴(kuò)展、redis5的Dockerfile測(cè)試版編寫(xiě),稍許完善后同步上傳到github,(記下這里memcached還沒(méi)有剝離安裝)。
今天數(shù)據(jù)庫(kù),編程的一個(gè)重要原則是不要重復(fù)造輪子,php因?yàn)樾枰芏嘧远x插件、所以多帶帶編譯鏡像,其實(shí)其他包括redis都應(yīng)該使用官方的,直接pull就行。
參考官方鏡像,根據(jù)官方鏡像,準(zhǔn)備的mysql、mysql_slave文件樹(shù),添加了個(gè)數(shù)據(jù)文件夾。
[]:~/tmp/dk/mysql/mysql_slave# tree ./ ./ ├── config │?? ├── conf.d #后面修改my.cnf后刪掉 │?? │?? └── docker.cnf │?? └── my.cnf └── data1、創(chuàng)建mysql鏡像
[]:~/tmp/dk# docker pull mysql:8.0 # 清空舊數(shù)據(jù)庫(kù)數(shù)據(jù) []:~/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
退出后臺(tái)運(yùn)行的容器,按 Ctrl+D 進(jìn)行退出容器,請(qǐng)牢記!
run后運(yùn)行的容器進(jìn)入:
a.舊式進(jìn)入 []:~/tmp/dk# docker attach mm b.命令進(jìn)入 []:~/tmp/dk# docker exec -it mm /bin/bash(或/bin/sh)
參考《Docker容器進(jìn)入的4種方式》
a.普通進(jìn)入:有一個(gè)問(wèn)題。當(dāng)多個(gè)窗口同時(shí)使用該命令進(jìn)入該容器時(shí),所有的窗口都會(huì)同步顯示。如果有一個(gè)窗口阻塞了,那么其他窗口也無(wú)法再進(jìn)行操作。所以docker attach命令不太適合于生產(chǎn)環(huán)境,平時(shí)自己開(kāi)發(fā)應(yīng)用時(shí)可以使用該命令。
b.推薦
-- 小內(nèi)存主機(jī)需要開(kāi)啟swap交換分區(qū),并加入開(kāi)機(jī)啟動(dòng):
[]:~/tmp/dk# vim /etc/rc.local # +swap swapon /swapfile
-- mysql的重啟:
不能進(jìn)入容器、在容器中重啟,會(huì)報(bào) Unable to lock ./ibdata1 error: 11 的錯(cuò)誤,容器無(wú)法對(duì)共享文件加鎖。
# 重啟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 # 主從賦值增加項(xiàng) log-bin=mysql-bin #[必須]啟用二進(jìn)制日志 server-id=1 #[必須]服務(wù)器唯一ID,默認(rèn)是1 binlog-do-db=test #要同步的數(shù)據(jù)庫(kù)名,從服務(wù)器不需要這幾項(xiàng) binlog-ignore-db = mysql #不同步mysql庫(kù)和sys庫(kù) binlog-ignore-db = sys replicate-ignore-db=mysql secure-file-priv= NULL # 忽略表名大小寫(xiě) lower_case_table_names = 1 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci init_connect="SET NAMES utf8mb4" #是否對(duì)sql語(yǔ)句大小寫(xiě)敏感,1表示不敏感 lower_case_table_names=1 #最大連接數(shù) max_connections = 150 #最大錯(cuò)誤連接數(shù) max_connect_errors=1000 #TIMESTAMP如果沒(méi)有顯示聲明NOT NULL,允許NULL值 explicit_defaults_for_timestamp=true #SQL數(shù)據(jù)包發(fā)送的大小,如果有BLOB對(duì)象建議修改成1G max_allowed_packet=2M #MySQL連接閑置超過(guò)一定時(shí)間后(單位:秒)將會(huì)被強(qiáng)行關(guān)閉 #MySQL默認(rèn)的wait_timeout 值為8個(gè)小時(shí), interactive_timeout參數(shù)需要同時(shí)配置才能生效 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 #時(shí)區(qū) default-time_zone = "+8:00"3、主從同步數(shù)據(jù)
在主服務(wù)器添加用于同步的賬戶。上需要主從服務(wù)器端配合完成
a.初始化同步用戶### 主服務(wù)器端 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.手動(dòng)同步初始數(shù)據(jù)
添加測(cè)試數(shù)據(jù),適合從一臺(tái)拓展至多臺(tái)服務(wù)器的情況。如果庫(kù)數(shù)據(jù)已同步,跳過(guò)此步驟。
現(xiàn)在master中已有數(shù)據(jù),需要先同步到slave,登錄master,執(zhí)行鎖表操作
### 容器mm(master)主服務(wù)器添加初始庫(kù)、表,及后續(xù)操作 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) #只讀鎖表,等待復(fù)制 mysql> FLUSH TABLES WITH READ LOCK; Query OK, 0 rows affected (0.01 sec) # 等待主從關(guān)系建立完成后,解鎖寫(xiě)入 mysql> UNLOCK TABLES; Query OK, 0 rows affected (0.00 sec)
### 容器ms(slave):從服務(wù)器導(dǎo)入master的庫(kù)數(shù)據(jù) 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.建立主從關(guān)系,完成同步
這里需要注意的參數(shù)是master_log_file、master_log_pos改為與master當(dāng)前值相同。
### 容器ms(slave):從服務(wù)器添加 # 查詢當(dāng)前狀態(tài):show slave statusG; 重置復(fù)制狀態(tài)參數(shù):reset slave all; 關(guān)閉:stop slave; # remote_host可以是 192.168.1.102 的內(nèi)網(wǎng)、公網(wǎng)地址 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) #查詢?cè)O(shè)置結(jié)果 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,說(shuō)明主從復(fù)制已經(jīng)開(kāi)啟成功。
小結(jié)這其中遇到很多問(wèn)題,比如:mysql的容器無(wú)法啟動(dòng)(配置文件問(wèn)題,或使用現(xiàn)成配置好的,通過(guò)docker logs mm查看日志解決),無(wú)法從內(nèi)部重啟(搜索良久,應(yīng)該是官方的問(wèn)題,也確實(shí)沒(méi)有從外部方便,只是對(duì)不是用mysql命令restart的別扭而已),主從復(fù)制沒(méi)好(要點(diǎn):my.cnf配置,鎖表/確定不寫(xiě)入也行,master_log_file、master_log_pos參數(shù))。
以前只是看過(guò)些,浮于理論,實(shí)踐完成后才感覺(jué)通暢。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/27938.html
摘要:前面容器重建后需要重新運(yùn)行命令綁定關(guān)聯(lián),需要命令行下生效。直接同步成功,在查看關(guān)系均有對(duì)方信息。是否要守護(hù)進(jìn)程這里是經(jīng)過(guò)多次測(cè)試,發(fā)現(xiàn)容器重啟,也會(huì)正常啟動(dòng)。哨兵的配置于此類似,略過(guò)。 前面mysql容器重建后需要重新運(yùn)行 change master to 命令綁定關(guān)聯(lián),8.0需要命令行下生效。redis首先想到用官方的,沒(méi)想到進(jìn)去各個(gè)基本shell命令無(wú)法使用,所以先棄了。這次由于官...
摘要:前面容器重建后需要重新運(yùn)行命令綁定關(guān)聯(lián),需要命令行下生效。直接同步成功,在查看關(guān)系均有對(duì)方信息。是否要守護(hù)進(jìn)程這里是經(jīng)過(guò)多次測(cè)試,發(fā)現(xiàn)容器重啟,也會(huì)正常啟動(dòng)。哨兵的配置于此類似,略過(guò)。 前面mysql容器重建后需要重新運(yùn)行 change master to 命令綁定關(guān)聯(lián),8.0需要命令行下生效。redis首先想到用官方的,沒(méi)想到進(jìn)去各個(gè)基本shell命令無(wú)法使用,所以先棄了。這次由于官...
摘要:作為面試官,我是如何甄別應(yīng)聘者的包裝程度語(yǔ)言和等其他語(yǔ)言的對(duì)比分析和主從復(fù)制的原理詳解和持久化的原理是什么面試中經(jīng)常被問(wèn)到的持久化與恢復(fù)實(shí)現(xiàn)故障恢復(fù)自動(dòng)化詳解哨兵技術(shù)查漏補(bǔ)缺最易錯(cuò)過(guò)的技術(shù)要點(diǎn)大掃盲意外宕機(jī)不難解決,但你真的懂?dāng)?shù)據(jù)恢復(fù)嗎每秒 作為面試官,我是如何甄別應(yīng)聘者的包裝程度Go語(yǔ)言和Java、python等其他語(yǔ)言的對(duì)比分析 Redis和MySQL Redis:主從復(fù)制的原理詳...
閱讀 2052·2021-11-15 11:39
閱讀 3236·2021-10-09 09:41
閱讀 1500·2019-08-30 14:20
閱讀 3269·2019-08-30 13:53
閱讀 3333·2019-08-29 16:32
閱讀 3389·2019-08-29 11:20
閱讀 3029·2019-08-26 13:53
閱讀 783·2019-08-26 12:18