Docker に基づくマスター/スレーブ レプリケーション

1: マスター/スレーブ レプリケーションを実現するプロセスは暗礁に乗り上げていましたが、自分で何度か実行して成功したので記録することにしました (そのため、一部のスクリーンショットとコンテキスト (Docker コンテナーなど) が一致しません。名前が一致しません、皆が自分のものを使用できます), centos8にdockerのインストールから最後までマスタースレーブレプリケーションを実装する予定なので、元のdockerをアンインストールして最初から記録しました。スキップできます。 docker をアンインストールする手順に従ってください。
2: 投稿を読んだ友人は焦らずに、まず読んでから始めることをお勧めします
3: 説明が間違っている場合は、お気軽に教えてください。

ドッカーをアンインストールする

1: Dockerコンテナを削除する

 sudo docker stop $(docker ps -aq)

ここに画像の説明を挿入
注: このコマンドは、実行中のコンテナと停止したコンテナを含むすべてのコンテナを停止します。
2: すべてのコンテナを削除します。

sudo docker rm $(docker ps -aq)

注: ここには docker が 1 つしかないため、コマンド docker rm コンテナー ID/コンテナー名が実行されてコンテナーが削除されています。なのでここには写真はありません

3: すべてのミラーを削除します (ここには mysql5.7 のミラーがありますが、削除のプロセスには少し時間がかかります。しばらく待ちます)

sudo docker rmi $(docker images -q)

ここに画像の説明を挿入
ここに画像の説明を挿入
注: このコマンドは、実行中のミラーと停止したミラーを含むすべてのミラーを削除します。このコマンドを実行すると、コマンド ラインに 2 番目の確認プロンプト y/n が表示されます。削除操作を続行するには y を選択します。上の 2 番目のインターフェイスは、削除が完了したことを示しています。

4: Docker をアンインストールする

sudo yum remove docker-ce docker-ce-cli containerd.io

ここに画像の説明を挿入

5: dockerデータディレクトリを削除する

sudo rm -rf /var/lib/docker

注: このコマンドは、すべてのコンテナー、イメージ、データ ボリュームを含む Docker データ ディレクトリを削除します。

上記の操作は、docker のインストールから最初から最後まで記録したいためです。建設プロセス中に何度かピットに横たわり、建設が成功した後は何度も削除しました。実験を繰り返すことでマスターを達成できます-slave レプリケーションなので記録します。docker を削除する必要がない場合は、他の友人を助けるために、次の手順から直接開始できます。

次に、Centos に Docker イメージをインストールすることから始めます。

まず、Centos に Docker イメージをインストールします。
1: データ ソースを更新します。

 sudo yum update

ここに画像の説明を挿入

2: Docker ランタイムに必要ないくつかのツールと依存ライブラリをインストールします。これらの centos8 は完全ではないため、インストールする必要があります。

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

ここに画像の説明を挿入
3: Docker パッケージをダウンロードする

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

ここに画像の説明を挿入

4: docker コミュニティ バージョンをインストールします: (このプロセスもしばらく待つ必要があります)

sudo yum install -y docker-ce

ここに画像の説明を挿入
ここに画像の説明を挿入
5: Docker サービスをセットアップして開始する

sudo systemctl enable docker

ここに画像の説明を挿入

sudo systemctl start docker

ここに画像の説明を挿入

注: 同時に実行することもできます: sudo systemctl enable docker &&sudo systemctl start docker

6: Docker バージョンのクエリ

sudo docker --version

ここに画像の説明を挿入
ここまででdockerがインストールされました、次はmysqlです

mysql イメージをプルします。例として mysql5.7 バージョンを示します。

1: mysql5.7 イメージをプルします

docker pull mysql:5.7

ここに画像の説明を挿入
注: このプロセスは Ha
2: ミラー イメージを表示するまで待つ必要があります。

docker images

ここに画像の説明を挿入
3: mysql コンテナを無造作に作成します。ここでの主な目的は、mysql 構成ファイルをコピーすることです。変更を容易にするために mysql 構成ファイル my.cnf をマウントしたいためです。

docker run -d --name master mysql:5.7

ここに画像の説明を挿入

注: ここでは、mysql コンテナを作成して実行します。mysql 構成ファイル my.cnf を表示する必要がある場合は、次のコマンドを実行する必要があります。必要ない場合はスキップできます。ステップ 1
:コンテナを作成して起動する

docker run -d -p 3333:3306 --name master -e MYSQL_ROOT_PASSWORD=123456 docker.io/mysql:5.7

ここに画像の説明を挿入

意味を説明してください:

docker run -d -p 3333:3306 --name master -e MYSQL_ROOT_PASSWORD=123456 docker.io/mysql:5.7
这个 docker 命令用于在 docker 中运行一个 MySQL 容器,以下是命令中各个参数的含义:
docker run:用于在 docker 中运行一个容器的命令。
-d:表示在后台(detached 模式)运行容器,即不在终端上显示容器的输出。
-p 3333:3306:将主机(Host)的 3333 端口映射到容器的 3306 端口。这意味着你可以通过主机的 3333 端口访问容器中的 MySQL 服务。
--name master:指定容器的名称为 "master"。
-e MYSQL_ROOT_PASSWORD=123456:设置 MySQL 根用户的密码为 "123456"。这里使用环境变量来传递密码给容器内的 MySQL 服务。
docker.io/mysql:5.7:表示使用 Docker Hub 上的 mysql 镜像,并指定标签为 5.7。
综合起来,这个命令的作用是在 Docker 中创建一个 MySQL 5.7 版本的容器,
容器名称为 "master",
通过主机的 3333 端口访问 MySQL 服务,并设置根用户密码为 "123456"。
容器在后台运行,不在终端上显示输出。

ステップ 2: コンテナーのシェルに入る

docker exec -it master bash

ステップ 3: デフォルトの my.cnf 構成ファイルを表示する

ls /etc/my.cnf
cat /etc/my.cnf
或者是
ls /etc/mysql/my.cnf
cat /etc/mysql/my.cnf

ここに画像の説明を挿入
4: docker を作成して起動してフォルダーの作成を開始し、mysql のデフォルト設定ファイルをコピーして、設定を変更してマウントアウトします。これにより、mysql の設定ファイルを変更できるようになります。

mkdir mysql // home文件下创建mysql文件

mkdir /home/mysql/master // mysql文件夹下创建主库文件夹master

mkdir /home/mysql/slave // mysql文件夹下创建从库文件夹slave

ここに画像の説明を挿入
5: 構成ファイルを、
メイン フォルダーの上に作成されたマスター/スレーブ ファイルの my.cnf 構成ファイルにコピーします。

docker cp master:/etc/my.cnf /home/mysql/master

フォルダーから:

docker cp master:/etc/my.cnf /home/mysql/slave

コピーが成功したか確認する
ここに画像の説明を挿入
6: 上記実行中のコンテナを削除する

docker ps -a  //查看
docker stop master  //停止 ,test是我上面创建的容器的名字
docker rm master //删除

ここに画像の説明を挿入

7: メインコンテナを起動します

docker run -d \
--restart=always \
-p 3306:3306 \
-v /home/mysql/master/my.cnf:/etc/my.cnf \
-e MYSQL_ROOT_PASSWORD=123456 \
--name master mysql:5.7

上記の docker コマンドの各パラメータの意味は次のとおりです。

docker run:用于在 Docker 中运行一个容器的命令。
-d:表示在后台(detached 模式)运行容器,即不在终端上显示容器的输出。
-p 3333:3306:将主机(Host)的 3333 端口映射到容器的 3306 端口。这意味着你可以通过主机的 3333 端口访问容器中的 MySQL 服务。
--name master:指定容器的名称为 "master"。
-e MYSQL_ROOT_PASSWORD=123456:设置 MySQL 根用户的密码为 "123456"。这里使用环境变量来传递密码给容器内的 MySQL 服务。
docker.io/mysql:5.7:表示使用 Docker Hub 上的 mysql 镜像,并指定标签为 5.7。

ここに画像の説明を挿入

8: メインライブラリの設定ファイルを入力し、ファイル[mysqld]の下に次の内容を追加し、保存して終了します。

vim /home/mysql/master/my.cnf

ここに画像の説明を挿入

## 设置server_id, 同一个局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql,information_schema
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

ここに画像の説明を挿入
9: メインライブラリコンテナを再起動します。

docker restart master

ここに画像の説明を挿入
注: 次の手順に進む前に、マスター ライブラリが正常に起動していることを確認してください。そうしないと、図に示すように、mysql へのログイン時にエラーが報告され、ユーザー名とパスワードが間違っているというメッセージが表示されます。ログが表示されます. 図 2 の赤いボックスが表示されたら、起動が成功したことを意味します. この時点で、次の手順を続行すると、mysql へのログイン時にエラーは報告されません。
ここに画像の説明を挿入

docker logs master   //查看容器名为master的日志

ここに画像の説明を挿入

10: メイン ライブラリでデータ同期を作成します。これは次のステップに分かれています。
ステップ 1: mysql コンテナー

docker exec -it master bash

ステップ 2: mysql にログインする

mysql -uroot -p123456

ステップ 3: 「slave」という名前のユーザーに、マスター データベースからデータをレプリケートする権限を付与します。

GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';

具体的な意味:

GRANT REPLICATION SLAVE:授予从数据库复制数据的权限。
ON *.*:将权限应用于所有数据库和所有表。
TO 'slave'@'%':授予 "slave" 用户在任何主机上的访问权限。'%' 表示任意主机。
IDENTIFIED BY '123456':设置用户 "slave" 的密码为 "123456"。

ステップ 4: 「slave」という名前のユーザーに、データベースからデータをコピーし、いくつかのクライアント操作を実行するために必要な権限を付与します。

grant replication slave, replication client on *.* to 'slave'@'%';

具体的な意味:

grant replication slave:授予从数据库复制数据的权限。
replication client:授予从数据库执行一些客户端操作的权限,例如读取主数据库的二进制日志信息。
on *.*:将权限应用于所有数据库和所有表。
to 'slave'@'%':授予 "slave" 用户在任何主机上的访问权限。'%' 表示任意主机

ステップ 5: 更新する

flush privileges;

ステップ 6: このステータスでマスター/スレーブ同期ステータス レコード master_log_file および master_log_pos を表示します。これら 2 つのパラメータの値は記憶する必要があり、後で使用されます。

show master status;

ここに画像の説明を挿入
次に、ctrl+d を押して終了します。
注: 上記の手順は、navicat でも操作できます。
1: データベースにログインするための新しい mysql リンクを作成します。
2: コマンドを実行します (順番に実行します)。

GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456'; 
grant replication slave, replication client on *.* to 'slave'@'%';
flush privileges;
show master status;

11: スレーブコンテナの起動

docker run -d \
--restart=always \
-p 3307:3306 \
-v /home/mysql/slave/my.cnf:/etc/my.cnf \
-e MYSQL_ROOT_PASSWORD=123456 \
--name slave mysql:5.7

ここに画像の説明を挿入
12: スレーブ ライブラリ設定ファイルを変更し、[mysqld] の下に次の内容を追加します。

vim /home/mysql/slave/my.cnf

以下をファイル [mysqld] に追加します。


## 设置server_id, 同一个局域网内需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql,information_schema
## 开启二进制日志功能,以备slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断
## 如:1062错误是指一些主键重复,1032是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置只读(具有super权限的用户除外)
read_only=1

ここに画像の説明を挿入
13: スレーブコンテナを再起動します

docker restart slave

ここに画像の説明を挿入
14: ライブラリからデータ同期ユーザーを作成します。これは次のステップに分かれています。
ステップ 1: mysql コンテナーに入る

docker exec -it slave bash

ここに画像の説明を挿入

ステップ 2: mysql にログインする

mysql -uroot -p123456

ここに画像の説明を挿入

ステップ 3: MySQL マスター/スレーブ レプリケーションでスレーブ データベースの接続および同期情報を構成します。これにより、データ レプリケーションの更新を取得するためにマスター データベースに接続する方法がスレーブ データベースに指示されます。

CHANGE MASTER TO master_host = '192.168.0.25',
master_user = 'slave',
master_password = '123456',
master_port = 3306,
master_log_file = 'mall-mysql-bin.000001',
master_log_pos = 807,
master_connect_retry = 30;

SQL の上の段落の各パラメータの意味は次のとおりです。

master_host = '192.168.0.25':这是主数据库的 IP 地址或主机名。从数据库将连接到该主数据库来获取复制数据。

master_user = 'slave':这是连接主数据库所使用的用户名。通常创建一个用于复制的专用用户。

master_password = '123456':连接主数据库所使用的密码,与上述用户名对应。

master_port = 3306:主数据库的端口号,通常为 MySQL 默认的端口号 3306。

master_log_file = 'mall-mysql-bin.000001':这是主数据库二进制日志中的日志文件名,它包含复制数据的更新记录。

master_log_pos = 807:这是主数据库二进制日志文件中的位置,指示从数据库在何处开始读取二进制日志以进行复制。

master_connect_retry = 30:在连接主数据库失败时,从数据库会尝试重新连接的时间间隔(以秒为单位)。

总体而言,这些配置参数告诉从数据库应该连接到哪个主数据库,使用哪个用户和密码来获取复制数据,并从主数据库的指定二进制日志位置开始同步数据。这是主从复制配置的一部分,使得从数据库可以与主数据库保持数据同步。在执行 CHANGE MASTER TO 后,从数据库可以开始运行复制进程,从主数据库同步数据更新。

ここに画像の説明を挿入
13: ステータスを確認します。この時点では、Slave_IO_Running と Slave_SQL_Running は両方とも No です。

show slave status \G;

ここに画像の説明を挿入

14: マスター/スレーブ同期を有効にする

start slave;

ここに画像の説明を挿入

15: マスターとスレーブの同期ステータスを再度確認します。この時点では、Slave_IO_Running と Slave_SQL_Running は両方とも Yes です。

show slave status \G;

ここに画像の説明を挿入
注: 上記の手順は navicat でも実行できます。手順は次のとおりです。
ステップ 1: 新しい mysql リンクを作成してデータベースにログインします。
ステップ 2: MySQL マスター/スレーブでスレーブ データベースの接続および同期情報を構成します。レプリケーション

CHANGE MASTER TO master_host = '192.168.0.25',
master_user = 'slave',
master_password = '123456',
master_port = 3306,
master_log_file = 'mall-mysql-bin.000001', //与主库中一致
master_log_pos = 1444, // 与主库中一致
master_connect_retry = 30;

ステップ 3: マスターとスレーブの同期ステータスを確認する# この時点では、Slave_IO_Running と Slave_SQL_Running は両方とも No です

show slave status;

ステップ 4: マスター/スレーブ同期をオンにする

start slave;

ステップ 5: マスターとスレーブの同期ステータスを再度確認します# この時点では、Slave_IO_Running と Slave_SQL_Running は両方とも Yes です

show slave status;

16: スレーブ ライブラリの Slave_IO_Running と Slave_SQL_Running が両方とも Yes の場合、マスター/スレーブ構成が成功したことを意味します。次に、nacivat でリンクを作成できます。接続が成功したら、データベースを作成し、データを挿入して、コマンドラインでは、nacivat を例としてライブラリ、テーブルを作成し、データを挿入し、同期されているかどうかを確認します 検証 1: ライブラリが同期されているかどうか メインデータベースに新しいデータベースを作成

ます:
ここに画像の説明を挿入
データベースからテストを更新して確認します:
ここに画像の説明を挿入
結論: スレーブ データベースにも存在します テスト ライブラリを作成しました
検証 2: テーブルが同期されているかどうか
メイン ライブラリにテーブルを作成します
ここに画像の説明を挿入ここに画像の説明を挿入

ライブラリを更新してもう一度見てみる:
ここに画像の説明を挿入
結論: スレーブ ライブラリにもユーザー テーブルが存在する
検証 3: データが同期されているかどうか

ここに画像の説明を挿入
ライブラリから更新してもう一度見る:
ここに画像の説明を挿入
結論: user テーブルのデータはライブラリにも存在します
. この時点で、終わっていても記述が間違っていたら修正してください。

おすすめ

転載: blog.csdn.net/fortunate_leixin/article/details/132295426