本文記錄下通過MySQL Replication在Docker環境下,通過多個容器 實現數據庫主從配置。
MySQL Replication就不多解釋了,簡單說就是MySQL非常出色的一個功能,該功能將一個MySQL實例中的數據復制到另一個MySQL實例中。整個過程是異步進行的,但由於其高效的性能設計,復制的延時非常小。MySQL復制功能在實際的應用場景中被廣泛的應用於保證數據系統數據的安全性和可擴展設計中。想了解更多可從網上找更多的資料。
首先當然是准備好一台安裝好docker的linux環境,然后就直接開始:
下文中出現的ip:112.74.41.236 都是我服務器的ip地址,可替換成自己的本機ip。
#配置容器環境
#創建並啟動主庫 容器
docker run --name master -e MYSQL_ROOT_PASSWORD=123456 -p 9001:3306 -d mysql
#創建並啟動從庫 容器
docker run --name slave -e MYSQL_ROOT_PASSWORD=123456 -p 9002:3306 -d mysql
#然后docker ps查看啟動的容器
#主服務器 數據庫配置
#首先進入主庫容器內部
#docker exec -it master bash
#然后配置主庫docker 容器內mysql配置文件my.cnf,在[mysqld]下修改即可,修改后重啟數據庫容器,使配置生效:
#vi /etc/mysql/my.cnf
[mysqld]
log-bin=mysql-bin //[必須]啟用二進制日志
server-id=1 //[必須]服務器唯一ID,默認是1
#登錄主庫mysql數據庫
#mysql -uroot -p123456
#在主庫上創建同步用戶並授權
CREATE USER 'replicate'@'112.74.41.236' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'replicate'@'112.74.41.236';
FLUSH PRIVILEGES;
#最后增加遠程訪問用戶 並賦予所有權限,遠程訪問測試用
CREATE USER yang IDENTIFIED BY '123456';
GRANT ALL ON *.* TO 'yang'@'%';
#修復遠程登錄報報 caching_sha2_password異常
ALTER USER 'yang'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
ALTER USER 'yang'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;
#查詢master的狀態,此處File,Position數據在配置從庫時用到
show master status;
#配置從數據庫
#首先進入從庫容器內部
#docker exec -it slave bash
#然后配置從庫docker 容器內mysql配置文件my.cnf,在[mysqld]下修改即可,修改后重啟數據庫容器,使配置生效:
#vi /etc/mysql/my.cnf
[mysqld]
log-bin=mysql-bin //[必須]啟用二進制日志
server-id=2 //[必須]服務器唯一ID,默認是1,從庫設置為2
#登錄從庫mysql數據庫
#mysql -uroot -p123456
配置從服務器Slave:(后面兩個數據從主庫查詢得出)
change master to master_host='112.74.41.236',master_port=9001,master_user='replicate',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=1593;
start slave;
查詢slave的狀態,Slave_IO_Running及Slave_SQL_Running進程必須正常運行,即YES狀態,否則都是錯誤的狀態
show slave status\G
#最后同樣增加遠程訪問用戶 並賦予所有權限,遠程訪問測試用
CREATE USER yang IDENTIFIED BY '123456';
GRANT ALL ON *.* TO 'yang'@'%';
#修復遠程登錄報報 caching_sha2_password異常
ALTER USER 'yang'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
ALTER USER 'yang'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;
至此同步相關配置 已完成,接下來可以測試:
#在主庫insert一條記錄,從庫基本實時從主庫同步過來了數據,實現了主從數據同步配置。
#測試腳本
#創建數據庫
drop database if exists my_test;
create database my_test;
use my_test;
#創建測試表
CREATE TABLE `user_info` (
`user_num` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶ID',
`user_id` varchar(36) NOT NULL COMMENT '用戶ID',
`user_name` varchar(50) DEFAULT NULL COMMENT '用戶名字',
`mobile` varchar(50) DEFAULT NULL COMMENT '手機號碼',
`password` varchar(255) DEFAULT NULL COMMENT '密碼',
`user_status` int(11) DEFAULT NULL COMMENT '狀態 0審核中 1有效 2無效',
`create_date` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
`update_date` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間',
PRIMARY KEY (`user_num`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶信息表';
#測試插入
insert into user_info values (null, UUID(), 'yang', '15914338482', '123456', 1, now(), now());