平時做實驗需要用到數(shù)據(jù)庫, 自己的 NAS 又有點剩余性能, 所以考慮在 NAS 上搭建一個常用的數(shù)據(jù)庫.
NAS 系統(tǒng)使用群暉的 DSM7.0.1, 本質(zhì)上是基于某個 Linux 內(nèi)核的改版系統(tǒng), 所以選擇耦合度低的 docker 方式來部署, 部署過程與普通的 Linux 環(huán)境上一樣. 考慮到 NAS 的可視化 docker 界面做文件映射時選擇不到一些系統(tǒng)的目錄, 所以還是建議直接 ssh 到 NAS 上使用 root 用戶操作.
其實用 docker 部署數(shù)據(jù)庫與其設(shè)計理念有點沖突了, 理想的 docker 應(yīng)用應(yīng)該是無狀態(tài)的, docker 容器不耦合宿主機. 使用 docker 部署持久型數(shù)據(jù)庫不但違背這一理念, 同時也會讓數(shù)據(jù)庫損失一部分性能. 不過由于并非生產(chǎn)環(huán)境, 實驗的物理機虛擬機有限, 而且 docker 應(yīng)用不但有開箱即用的特性, 而且多實例部署也方便, 即使是部署數(shù)據(jù)庫, 也能一定程度上減少與系統(tǒng)的耦合, 所以就不在意這個問題了.
準備目錄與配置文件
想法: 暫時使用一個 MySQL8 做主庫, 一個 MySQL8 做從庫, 以后若想擴展多個從庫或者擴展不同版本的數(shù)據(jù)庫做實驗都是可以的.
鏡像: mysql/mysql-server:8.0.30
在 NAS 上新建目錄用于映射到容器內(nèi), 如下:
cluster-master-slave/
├── mysql-8.0.30-master
│ ├── conf
│ └── data
└── mysql-8.0.30-slave1
├── conf
└── data
先隨便 docker start 個MySQL 鏡像, 然后 docker exec 進去看看配置文件位置:
bash-4.4# mysql --help |grep my.cnf -A 1 -B 1
-P, --port=# Port number to use for connection or 0 for default to, in
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/services, built-in default (3306).
--
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
The following groups are read: mysql client
這幾個位置都找找看, 發(fā)現(xiàn)自帶的配置文件就是 /etc/my.cnf , 退出 docker bash, 然后直接 docker cp 出來, 比如我的環(huán)境下是執(zhí)行:
docker cp mysql-8.0.30:/etc/my.cnf /volume1/docker/mysql/cluster-master-slave/mysql-8.0.30-master/conf/my.cnf
docker cp mysql-8.0.30:/etc/my.cnf /volume1/docker/mysql/cluster-master-slave/mysql-8.0.30-slave1/conf/my.cnf
然后稍微做下集群化的修改, 在 master 的配置文件的 [mysqld] 模塊上加如下配置:
server_id=1
log-bin=mysql-bin
read-only=0
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
binlog_format=STATEMENT
#binlog_format=ROW
#binlog_format=MIXED
在 slave1 的配置文件的 [mysqld] 模塊上加如下配置:
server_id=2
log-bin=mysql-bin
read-only=1
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
配置主要是忽略部分系統(tǒng)表的同步, 以及從庫開啟只讀模式.
注: 從庫的只讀模式只對非 SUPER 用戶起作用, 同時不影響主從復(fù)制的寫功能.
最終準備好的目錄是:
cluster-master-slave/
├── mysql-8.0.30-master
│ ├── conf
│ │ └── my.cnf
│ └── data
└── mysql-8.0.30-slave1
├── conf
│ └── my.cnf
└── data
當(dāng)然自己寫或者拷貝官網(wǎng)的文件也行, 但因為mysql 版本眾多, 而且docker有現(xiàn)成鏡像的配置文件可以用, 所以我就選擇用鏡像自生成的, 肯定是最不容易出錯的.
啟動容器
起名是非常重要的, 直接決定了以后的管理成本
確定容器名稱(因為我的 cluster1 為 nacos 集群, 所以 MySQL 集群就順延使用 cluster2 了)
- 主服務(wù)器
cluster2-master-mysql-8.0.30 - 從服務(wù)器
cluster2-slave1-mysql-8.0.30
創(chuàng)建 master :
docker run --name cluster2-master-mysql-8.0.30 -d -p 4306:3306 -e MYSQL_ROOT_PASSWORD=root -v /volume1/docker/mysql/cluster-master-slave/mysql-8.0.30-master/data:/var/lib/mysql -v /volume1/docker/mysql/cluster-master-slave/mysql-8.0.30-master/conf/my.cnf:/etc/my.cnf mysql/mysql-server:8.0.30
創(chuàng)建 slave1 :
docker run --name cluster2-slave1-mysql-8.0.30 -d -p 4307:3306 -e MYSQL_ROOT_PASSWORD=root -v /volume1/docker/mysql/cluster-master-slave/mysql-8.0.30-slave1/data:/var/lib/mysql -v /volume1/docker/mysql/cluster-master-slave/mysql-8.0.30-slave1/conf/my.cnf:/etc/my.cnf mysql/mysql-server:8.0.30
創(chuàng)建完成后進入主庫創(chuàng)建同步賬戶并賦予權(quán)限:
create user 'slave1'@'%' identified with mysql_native_password by '123456';
grant replication slave on *.* to 'slave1'@'%';
flush privileges;
查看主庫狀態(tài):
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 1582 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.02 sec)
在從庫上執(zhí)行同步語句:
change master to master_host='nas.me', master_user='slave1', master_password='123456', master_port=4306, master_log_file='mysql-bin.000003', master_log_pos=1582;
開始同步, 并查看同步狀態(tài):
start slave;
show slave status\G
如果發(fā)現(xiàn) status 中有任何錯誤, 則停止從庫同步:
stop slave;
排查完原因后, 可能需要重置同步:
reset slave;
重新 start slave 后當(dāng)看到如下顯示說明成功了:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: nas.me
Master_User: slave1
Master_Port: 4306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 4487
Relay_Log_File: 80191758b1f2-relay-bin.000002
Relay_Log_Pos: 1002
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB: mysql,sys,information_schema,performance_schema
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 4487
Relay_Log_Space: 1219
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: b769452d-1cac-11ed-a13f-0242ac110008
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
Network_Namespace:
1 row in set, 1 warning (0.01 sec)
中途遇到問題多 goo 幾下, 注意 MySQL8 與 MySQL5 的差異, 基本不會有太大問題.