從零開始,通過docker實現mysql 主從複製,圖文並茂,保證可以實現!
1.安裝映象
第一次實現docker實現mysql 主從複製的時候,各種百度,各種熱折騰,用了業餘幾天時間才實現!!現在把實現的詳細過程,全部寫出來,希望參對大家有所幫助。首先,準備好環境,映象:CentOS-7-x86_64-DVD-1503-01.iso。用虛擬機器安裝,我的VMware Workstation14版本,安裝虛擬機器的過程,我不再這裡討論了。安裝好後,如下:
通過ifconfig,不能查詢得ip地址,得用ip addr
2.安裝docker
很簡單,命令:- yum install -y docker
接下來,修改映象地址,編輯/etc/docker/daemon.json
vim 沒裝,其實vi 也可以用,但vim可以對關鍵字加亮,所以安裝vim ,命令:
- yum -y install vim
退出儲存。
啟動docker:
- systemctl start docker //centos7及以後版本
# service docker start //centos6及之前的版本
檢視映象
- docker images
此時沒有映象,抓取映象:
抓取映象
- docker pull registry.cn-hangzhou.aliyuncs.com/moensun/centos7
再檢視映象,此時已經有映象了:
建立docker 容器(可以根據一個映象建立多個容器)
- docker run -tid 映象ID/usr/sbin/init //centos7版本。使用/usr/sbin/init解決systemctl報錯不能使用的問題
docker run -tid 映象ID/bin/bash //非centos7
檢視容器列表
- docker ps -a
進入容器
- docker exec -it 容器名稱 /bin/bash
進入容器後,注意變化,之前是[email protected],現在變成[email protected]容器id,也就是容器ID,現在進入容器後,你可以理解成,一個全新的linux作業系統,就像我們wondow下安裝VMware Workstation後,成功通過映象安裝一臺linux的道理是樣的!你在容器的幹什麼,裝什麼不會影響到宿主,兩個作業系統是隔離的,獨立的。
退出容器的命令是:exit。
接下來,按照這樣步驟,再建立一臺docker 容器。就是有一臺宿主作業系統,然後通過docker,再建立兩個docker容器
3.兩個docker 容器,分別安裝mysql
安裝mysql就三個命令就裝好了:
- # wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
- # rpm -ivh mysql-community-release-el7-5.noarch.rpm
- # yum install mysql-community-server
wget 沒有安裝,現在通過命令安裝wget
- yum -y install wget
再次執行:
如下遇到下圖,直接輸入:y
安裝完成!linux 安裝mysql,就三條命令就可以了,前提條件是得有網路,在無網路情況下linux 安裝mysql很麻煩也挺困難的。
4.開始搭建主從複製
現在架構如下:
啟動mysql
# systemctl start mysql
登陸mysql
mysql -uroot //預設沒有密碼
設定mysql初始密碼:
mysql> set password = password(‘你的密碼’)遠端登陸授權
- mysql> grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
- mysql> flush privileges;
主從複製原理,是通過binlog實現的,如下圖
兩個docker容器的mysql都改
- 修改配置檔案:vim /etc/my.cnf
- [mysqld]
- server-id = 2
- port = 3306
- datadir = /var/lib/mysql
- socket = /var/lib/mysql/mysql.sock
- default-storage-engine = InnoDB
- log-bin = mysql-bin
- log-bin-index = mysql-bin.index
- relay-log = mysql-relay
- relay-log-index = mysql-relay.index
- expire-logs-days = 10
- max-binlog-size = 100M
- max_binlog_cache_size = 8M
- log-slave-updates = 1
- binlog_cache_size = 4M
- # use MIXED binlog
- binlog_format = MIXED
- #binlog_format = ROW
- #replicate-do-db = db%.%
- #replicate-ignore-db = mysql.%
- # ignore tables
- replicate-wild-ignore-table = mysql.%
- sync_binlog = 1
- relay_log_recovery = 1
- log_slave_updates = 1
- skip-name-resolve
- sql_mode=STRICT_TRANS_TABLES
- [mysqldump]
- quick
- max_allowed_packet = 32M
server-id 這個千萬不能跟別的mysql的配置一樣,無論主機還是從機server-id不能相同
主要server-id = 2和log-bin = mysql-bin,一定要配置,其它的可以沒有
檢視容器IP:
我以mad_euclid為主機,distracted_wright為從機。
- 主從複製過程(在主機上操作):
- 1. 建立同步複製的使用者
- mysql> create user 'hdg'@'172.17.0.%' identified by 'root';
- 2. 給同步複製使用者賦權
- mysql> grant replication slave on *.* to 'hdg'@'172.17.0.%' identified by 'root';
- mysql> flush privileges;
- 3. 開啟binlog
- 配置時候注意幾個坑:
- Replication-do-db的坑,如果多個庫則使用多行Replication-do-db進行配置
- Replication-ignore-db的坑,如果忽略多個庫則使用多行Replication-ignore-db進行配置
- 4. 重啟mysql
- #sysctemctl restart mysql
登陸主機mysql
這個時候就產生binlog了,離成功不遠了!
- 從機操作
- 1. Stop slave;
- 主從複製的最關鍵語句:
- 2. Change master to
- Master_host=’172.17.0.3’, //主機的IP地址
- Master_user=’hdg’,
- Master_password=’root’,
- Master_log_file=’mysql-bin.000001’,
- Master_log_pos=120;
- 3. Start slave;
檢視主機狀態:
- show master status;
檢視從機狀態:
- show slave status\G;
5.大功靠成
驗證,在主機上建立資料庫,然後建立表,進行增刪改查,會自動同步到從機上,從而實現主從複製!!哈哈,以後出去面試,可以吹牛逼了。現在網際網路專案,都是讀寫分離,高併發解決方案之一。
在主機上建立資料庫:
- create database hdg;
至此,主從複製功能,全部實現!!!!!
主從複製實現了,主主複製也是一樣的,反過來就行可以。
6.排錯
可能有些小夥伴沒有成功。這裡寫個檢查錯誤的方法: 在主庫,執行:- show processlist;
- [[email protected] mysql]# netstat -natp
昨天截圖沒有提交成功,今天找圖補上,可能映象ID不一樣。