天天看點

docker swarm部署mysql主從

搭建swarm叢集

安裝前的準備,安裝docker和docker-compose

vi pre_install.sh

#!/bin/bash
###關閉selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce
###配置拉取國内鏡像倉庫
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
 "https://5sr5uink.mirror.aliyuncs.com",
 "https://docker.mirrors.ustc.edu.cn",
 "https://hub-mirror.c.163.com",
 "https://mirror.baidubce.com"
  ],
 "insecure-registries": ["harbor.xxx.com"]
}
EOF
###啟動docker
systemctl start docker
systemctl enable docker
### 下載下傳docker-compose
curl -L "https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose
docker-compose -version           

sh pre_install.sh

準備2台主機,一台管理節點,一台工作節點

在管理節點:

docker swarm init

初始化管理節點後會産生一串加入叢集的指令,複制到工作節點執行

如果忘記了産生的token可以執行以下檢視:

docker swarm join-token manager
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-0iq85hac12m20vmc19s5xzlmnxi77ab74dn4adpuoa44bi0xmj-4sgl3edr6qu9sbp375okw90so 10.10.10.203:2377           
在工作節點:

執行以下指令

docker swarm join --token SWMTKN-1-0iq85hac12m20vmc19s5xzlmnxi77ab74dn4adpuoa44bi0xmj-4sgl3edr6qu9sbp375okw90so 10.10.10.203:2377

檢視叢集

docker node ls

[root@localhost-203-root-all ~]# docker node ls
ID                            HOSTNAME                    STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
t82for6td6ouficu9pr2r89qs *   localhost-203-root-all      Ready     Active         Leader           20.10.6
y5fuwec4lpoim6tyqkrl5lo67     swarm-client-10-10-10-206   Ready     Active                          20.10.6           

leader表示這台主機是管理節點

建立master主配置檔案

在管理節點建立/deploy/sorts/swarm/mysql目錄

mkdir -p /deploy/sorts/swarm/mysql

建立子目錄

cd /deploy/sorts/swarm/mysql

mkdir conf data log

編輯my.cnf檔案

vi conf/my.cnf

[mysqld]
server_id=1
log-bin= mysql-bin

replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema

read-only=0
relay_log=mysql-relay-bin
log-slave-updates=on
auto-increment-offset=1
auto-increment-increment=2

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
           

建立slave主配置檔案

在工作節點建立/deploy/sorts/swarm/mysql目錄

[mysqld]
server_id=2
log-bin= mysql-bin

replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema

read-only=0
relay_log=mysql-relay-bin
log-slave-updates=on
auto-increment-offset=2
auto-increment-increment=2

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
           

管理節點編輯docker-compose.yml檔案

version: "3.7"
networks:
  network:
    driver: overlay
services:
#mysql1服務
    mysql-1:
      image: mysql:5.7
      ports:
        - 3310:3306
      networks:
        #指定容器加入的網絡
        - network
      environment:
        #最好使用此設定時區,其它靜像也可以使用
        - TZ=CST-8
        #指定mysql的通路密碼
        - MYSQL_ROOT_PASSWORD=123456
      #可以加--default-time-zone='+8:00'設定時區
      volumes:
        #本地檔案目錄,持久化
        - ./data/:/var/lib/mysql
        #指定開啟binlog的配置檔案
        - ./conf/my.cnf:/etc/mysql/my.cnf
      command: --character-set-server=utf8
               --collation-server=utf8_general_ci
               --sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
      deploy:
        placement:
          constraints:
            #該hostname為指定容器在哪個主機啟動
            - node.hostname == localhost-203-root-all
        restart_policy:
          condition: on-failure
           

在管理節點啟動mysql主從

docker stack deploy -c docker-swarm-mysql.yml mysql           

檢視狀态

在管理節點

[root@localhost-203-root-all swarm]# docker stack ls
NAME      SERVICES   ORCHESTRATOR
mysql     2          Swarm
[root@localhost-203-root-all swarm]# docker service ls
ID             NAME            MODE         REPLICAS   IMAGE       PORTS
gxnxt6fr3t64   mysql_mysql-1   replicated   1/1        mysql:5.7   *:3310->3306/tcp
3idz9gcbeqol   mysql_mysql-2   replicated   1/1        mysql:5.7   *:3311->3306/tcp
[root@localhost-203-root-all swarm]# docker ps -f "name=myql1"
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost-203-root-all swarm]# docker ps -f "name=myql-1"
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@localhost-203-root-all swarm]# docker ps -f "name=mysql-1"
CONTAINER ID   IMAGE       COMMAND                  CREATED        STATUS        PORTS                 NAMES
f51adcd1f37c   mysql:5.7   "docker-entrypoint.s…"   24 hours ago   Up 24 hours   3306/tcp, 33060/tcp   mysql_mysql-1.1.nx5g3hj2tp0e1q4x8vfavh7qo           

在工作節點

[root@swarm-client-10-10-10-206 conf]# docker ps -f "name=mysql-2"
CONTAINER ID   IMAGE       COMMAND                  CREATED        STATUS        PORTS                 NAMES
1b1b8dcd88fb   mysql:5.7   "docker-entrypoint.s…"   24 hours ago   Up 24 hours   3306/tcp, 33060/tcp   mysql_mysql-2.1.2hfieodttb2j00c4rr3mwjipb           

開始配置主從

登陸管理節點mysql容器
建立複制使用者
root@f51adcd1f37c:/# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.35-log MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> grant replication slave on *.* to 'repl'@'%' identified by 'abc.123';
mysql> flush privileges;           
檢視主狀态
mysql> show master status\G;
*************************** 1. row ***************************
             File: mysql-bin.000011
         Position: 327
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)           

docker exec -it 1b1b8dcd88fb bash
 mysql -uroot -p123456
 mysql> change master to master_host='mysql-1',master_port=3306,master_user='repl',master_password='abc.123',master_log_file='mysql-bin.000011',master_log_pos=327;
 mysql> start slave
 mysql> show slave status\G;
 mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: mysql-1
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000011
          Read_Master_Log_Pos: 327
               Relay_Log_File: mysql-relay-bin.000015
                Relay_Log_Pos: 540
        Relay_Master_Log_File: mysql-bin.000011
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes           

繼續閱讀