1. 程式人生 > 其它 >使用 docker 搭建 MySQL 主從同步/讀寫分離

使用 docker 搭建 MySQL 主從同步/讀寫分離

拉取 MySQL 容器映象

docker pull mysql:5.7

這裡我使用的是 5.7 版本,如果你想要拉取最新版本的映象,可以使用:

docker pull mysql:latest

下載完成之後我們可以先檢視一下映象是拉取成功

docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               5.7                 f6509bac4980        4 days ago          373MB

建立 MySQL 容器

建立主資料庫容器

docker run --name mysql-master -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

建立從資料庫容器

docker run --name mysql-slave -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

這裡我們分別使用了 3307 和 3308 埠,因為我們本地宿主機器上已經跑了 MySQL 了,3306 埠被佔用。

配置主資料庫

首先,進入容器:

docker exec -it mysql-master /bin/bash 
root@c72a3032f986:/#

連線 MySQL

mysql -u root -p123456

修改 root 可以通過任何客戶端連線

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

修改 MySQL 配置文件/etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]段新增以下配置:

log-bin=mysql-bin    //[必須]啟用二進位制日誌
server-id=1          //[必須]伺服器標識ID,每臺伺服器唯一

配置從伺服器

首先,進入容器:

docker exec -it mysql-slave /bin/bash 
root@89bdbb5786ab:/#

連線 MySQL

mysql -u root -p123456

修改 root 可以通過任何客戶端連線

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

修改 MySQL 配置文件/etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]段新增以下配置:

log-bin=mysql-bin    //[必須]啟用二進位制日誌
server-id=2          //[必須]伺服器標識ID,每臺伺服器唯一

配置 MySQL 主從複製

首先連線 master 伺服器,檢視資料庫狀態:

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

記錄 File 的值和 Position 的值,等會配置 slave 伺服器的時候要用。

接下來連線 slave 伺服器,配置主從複製:

mysql>change master to
master_host='x.x.x.x',
master_user='user',
master_log_file='mysql-bin.000003',
master_log_pos=154,
master_port=3307,
master_password='123456';
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

解釋下配置引數

master_host='x.x.x.x' // 這裡填 master 主機 ip
master_log_file='mysql-bin.000003', // 這裡填寫 File 的值
master_log_pos=154,// 這裡填寫 Position 的值。
mysql> start slave;// 啟動從伺服器複製功能

如果不小心配置錯, 輸入 mysql> stop slave; 然後重新錄入一遍就可以了。

接下來我們可以檢查主從連線狀態:

show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

這兩個必須是 Yes 為 No 或者 connect 說明沒有連線上。

重啟容器,使配置生效

分別重啟mysql-mastermysql-slave容器

docker stop mysql-master
docker start mysql-master

docker stop mysql-slave
docker start mysql-slave

測試

在 master 容器中建立一張 user 表;

mysql> CREATE TABLE `user` (
    ->   `user_id` bigint(20) AUTO_INCREMENT,
    ->   `username` varchar(30) NOT NULL,
    ->   `password` varchar(30) DEFAULT NULL,
    ->   PRIMARY KEY (`user_id`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.47 sec)

然後在 slave 容器檢視:

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user           |
+----------------+
1 row in set (0.00 sec)

發現已經同步過來了。

在 master 伺服器user表插入一條資料:

mysql> insert into user(username, password) values ('test_user', 'test_pass');
Query OK, 1 row affected (0.07 sec)

然後看看 slave 伺服器是否有同步

mysql> select * from user;
+---------+-----------+-----------+
| user_id | username  | password  |
+---------+-----------+-----------+
|       1 | test_user | test_pass |
+---------+-----------+-----------+
1 row in set (0.00 sec)

顯然,已經完美同步了。

如果docker容器中沒有vim命令安裝

mv /etc/apt/sources.list /etc/apt/sources.list.bak

echo "deb http://mirrors.163.com/debian/ jessie main non-free contrib"

>> /etc/apt/sources.list

echo "deb http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib"

>>/etc/apt/sources.list

echo "deb-src http://mirrors.163.com/debian/ jessie main non-free contrib" >>/etc/apt/sources.list

echo "deb-src http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib"

>>/etc/apt/sources.list

#更新安裝源

apt-get update

apt-get install vim命令即可