使用docker搭建MySQL8主從架構(gòu)

平時做實驗需要用到數(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 的差異, 基本不會有太大問題.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容