docker二进制安装mysql_Docker搭建MySQL读写分离主从模式 分布式数据库中间件Mycat分库分表应用...
一、MySQL讀寫分離主從模式
1.?下載鏡像
docker pull mysql
當前最新版本:mysql Ver 8.0.19 for Linux on x86_64 (MySQL Community Server - GPL)
2. 啟動主節點并修改配置文件
docker run -it --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql bash
修改/etc/mysql/my.cnf配置文件(還得先apt update更新軟件包列表才能安裝vim等編輯工具,比較繁瑣,所以可以選擇先配置好my.cnf文件再docker run -v 掛載進容器)
配置文件 my.cnf 修改如下:
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
# 以上是原有默認配置,add variables如下:
# 在同一個Master-Slave集群里不能有重復id
server-id = 3306
# 不配置默認3306
# port= 3306
# 二進制日志文件存儲路徑及名稱(在docker容器內涉及到權限問題,所以直接寫在datadir下)
log-bin = /var/lib/mysql/binlog
# 需要開啟binlog的數據庫,多個則配置多行binlog-do-db
binlog-do-db = training
# binlog-do-db= db2
# binlog-do-db= db3
# 密碼認證方式(加密方式) MySQL 8.0+ 默認是caching_sha2_password
# 如果需要直接連接可以如下改回老版本的mysql_native_password或者create user時identified with mysql_native_password by 針對單個用戶
# default_authentication_plugin= mysql_native_password
注:修改完配置文件后需要重啟mysql才能生效,一般命令是systemctl restart mysqld,但是在docker容器中沒有權限執行systemctl命令,所以選擇退出容器后 docker restart
docker exec -it mysql bash
mysql -uroot -p [-hx.x.x.x -P3306]
# 創建用戶, @"ip"可以用@"%",不限IP
create user "replica"@"x.x.x.x" identified by "123456";
# 賦予復制權限
GRANT REPLICATION SLAVE ON *.* to "replica"@"x.x.x.x";
FLUSH PRIVILEGES;
# 查看主機狀態
show master status;
記下File和Position兩個參數值在從庫連接主庫時將用到
3. 從節點配置
# 容器內依然使用3306端口,免去修改端口的麻煩,宿主機端口使用3307
docker run -it --name mysql_3307 -p 3307:3306 -e MYSQL_ROOT_PASSWORD mysql bash
從節點my.cnf配置主要修改server-id不同,不需要log-bin和binlog-do-db參數
[mysqld]
server-id = 3307
# 容器內端口
# port= 3306
# 讀寫分離,從庫只讀(0: 讀寫,1: 只讀)
read_only= 1
# 限制super用戶,read_only只限制普通用戶寫操作
super_read_only= 1
重啟容器后生效
Ctrl+P+Q 快捷鍵
docker restart mysql_3307
docker exec -it mysql_3307
mysql -uroot -p123456# 如果容器內也使用3307端口,需跟上參數 -P3307
stop slave;
# 連接主機CHANGE MASTER TO option [, option] ...
change master to master_host="xxx.xxx.xxx.xx",
master_port=3306,
master_user="replica",
master_password="123456",
# 這兩個參數要跟上述截圖master status的參數值一致
master_log_file="binlog.000010",
master_log_pos=155,
# 默認使用caching_sha2_password加密方式時添加如下參數
get_master_public_key=1,
# 或者使用master_public_key_path指定主機公鑰文件
master_public_key_path="/etc/mysql/master_rsa_public.key";
# 啟動slave進程
# 查看從機狀態
show slave statusG
至此主從復制配置完成,Slave_IO_Running和Slave_SQL_Running都為Yes說明開啟主從同步成功,
否則可以查看Slave_SQL_Running_State狀態查看失敗原因,或者沒有沒有執行start slave;
change master的更多參數可見官網:https://dev.mysql.com/doc/refman/8.0/en/change-master-to.html
關于主機公鑰文件獲取:
進入master后show variables like "%caching_sha2_password%";
可以看到Caching_sha2_password_rsa_public_key或者key_path: public_key.pem,這個文件路徑:/var/lib/mysql/public_key.pem
拷貝--BEGIN……END--這部分內容到從服務器,可以新建文件/etc/mysql/master_rsa_public.key寫入。
change master時master_public_key_path="/etc/mysql/master_rsa_public.key"參數指定 ;
客戶端登錄時mysql -uroot -p --server-public-key-path=/etc/mysql/master_rsa_public.key指定
4. 備份主庫已有數據
完成上述步驟后,后續對主機的寫操作才會同步到從機,開啟同步前主機已有數據并不會同步,需要備份后導入從庫,再開啟主從同步。
(1)備份前鎖定主庫,只允許讀不允許寫,防止備份過程中、開啟主從同步前有新數據插入
mysql> show global variables like "%read_only%";
mysql> set global read_only=1;
mysql> set global super_read_only=1# 限制super用戶寫操作
# 如果當前不是super用戶,需要限制super用戶寫操作就執行給所有表加讀鎖命令,但是當前連接不能退出,否則就自動釋放鎖了
mysql> flush tables with read lock;
(2)備份主庫
mysqldump語法:
備份命令:
docker exec mysql /usr/bin/mysqldump -uroot -p123456 training > mysql_master_backup.sql
注:對于警告不要在命令行輸入密碼的問題,可以先在/etc/mysql/my.cn添加配置:
[mysqldump]
user= root
password= 123456
然后執行docker exec mysql mysqldump training > mysql_master_backup.sql
(3)將備份數據導入從庫
注:需要在從庫中建立好同名數據庫才能將數據導入從庫
mysql> create database training;
同理在從庫的my.cnf中添加配置:
[mysql]
user= root
password= 123456
導入數據:
cat mysql_master_backup.sql | docker exec -i mysql_3307 /usr/bin/mysql training
(4)開啟主從同步
也就是上面2、 3點的步驟了,最好是在鎖表前先配置好,只留最后 change master 和 start slave 到這里執行,以減少鎖表的時間。
change master 注意修改 master_log_file 和 master_log_pos 的值與 master status 的值一致。
(5)釋放主庫的鎖
mysql> unlock tables;
mysql> set global read_only=0;
mysql> set global super_read_only=0;
mysql> show global variables like "%read_only%";
注:線上環境要注意盡量減少鎖表的時間和鎖表的范圍!
mysql> show full processlist; 可以看到:
至此讀寫分離的主從架構就搭建完成了,但不會自動進行主備切換,自動切換需要第三方工具配合,如:
Keepalived 與MySQL互為主從自動切換配置
MHA 實現MySQL主從自動切換 高可用 (Master High Availability)
對于配置文件錯誤無法啟動容器的情況可以先把配置文件復制出來修改好再復制回去:
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
docker cp mysql_3307:/etc/mysql/my.cnf ./my.cnf
docker cp ./my.cnf mysql_3307:/etc/mysql/my.cnf
端口開放情況排查:
能否ping通
netstat -apt 端口監聽狀態
telnet ip port 能否遠程連接
ECS 安全規則配置
防火墻(ufw)
iptables (iptables -I INPUT -p tcp --dport 3308 -j ACCEPT)
二、分布式數據庫中間件Mycat分庫分表簡單應用
1. Mycat 安裝
Mycat 官網 查找所需版本下載鏈接
# 下載
wget http://dl.mycat.io/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz Mycat-server-1.6.7.4-release-linux.tar.gz
# 解壓至 /etc/,會自動創建 mycat 目錄
tar -zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /etc
conf目錄下有三個主要的配置文件:
server.xml Mycat系統配置信息,包括賬號密碼、權限、端口等參數
scheme.xml Mycat的邏輯庫、表、分片規則、DataNode以及DataSource
rule.xml 表拆分規則定義
因為Mycat到目前為止,還不支持caching_sha2_password的加密方式,所以連接節點時mycat.log日志會報錯如下:
can"t connect to mysql server ,errmsg:Client does not support authentication protocol requested by server;
只能更改登錄user@ip的密碼加密方式為較早版本的mysql_native_password:
mysql> select user, host, plugin from mysql.user;
mysql> ALTER USER "root"@"%" IDENTIFIED BY "123456" PASSWORD EXPIRE NEVER;
mysql> ALTER USER "root"@"%" IDENTIFIED WITH mysql_native_password BY "123456";
mysql> FLUSH PRIVILEGES;
mysql> select user, host, plugin from mysql.user;
待續……
總結
以上是生活随笔為你收集整理的docker二进制安装mysql_Docker搭建MySQL读写分离主从模式 分布式数据库中间件Mycat分库分表应用...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LFW数据集—人脸对齐
- 下一篇: IDEA 方法自动添加注释