使用Docker-compose 搭建 MySQL 主从 集群
使用Docker-compose 搭建 MySQL 主从 集群
安装 docker
- 系统要求
Docker 支持 64 位版本 CentOS 7/8,并且要求内核版本不低于 3.10。 CentOS 7 满足最低内核的要求,但由于内核版本比较低,部分功能(如 overlay2 存储层驱动)无法使用,并且部分功能可能不太稳定。
- 安装命令
sudo yum install -y yum-utils
执行以下命令安装依赖包:
设置yum 软件源
sudo yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
# 官方源
# sudo yum-config-manager \
# --add-repo \
# https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
安装 Docker
sudo systemctl enable docker && sudo systemctl start docker
启动
- 镜像加速
请首先执行以下命令,查看是否在 docker.service 文件中配置过镜像地址。
systemctl cat docker | grep '\-\-registry\-mirror'
如果该命令有输出,那么请执行 $ systemctl cat docker 查看 ExecStart= 出现的位置,修改对应的文件内容去掉 –registry-mirror 参数及其值,并按接下来的步骤进行配置。
如果以上命令没有任何输出,那么就可以在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
之后重新启动服务。
systemctl daemon-reload
sudo systemctl restart docker
- docker-compose安装
sudo curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
- docker-compose mysql启动和配置
编写docker-compose.yml
version: "3.7"
services:
db1:
image: mysql:5.7
command: --default-authentication-plugin=mysql_native_password
ports:
- "13307:3306"
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- "./conf/db1/mysql.cnf:/etc/mysql/conf.d/mysql.cnf"
- "./data/db1:/var/lib/mysql/"
expose:
- 3306
db2:
image: mysql:5.7
command: --default-authentication-plugin=mysql_native_password
ports:
- "13308:3306"
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- "./conf/db2/mysql.cnf:/etc/mysql/conf.d/mysql.cnf"
- "./data/db2:/var/lib/mysql/"
expose:
- 3306
在当前文件夹下创建两个文件, conf, data, 用来存放配置和数据库文件
这里会启动两个service 名为 db1 db2, 对外提供端口13307,13308, expose是对内提供端口,让容器与容器之间可以通信
在conf目录创建两个目录db1 db2 用来区分两个db
db1 我们用来当master即我们的主库
[client]
port = 3306
default-character-set = utf8mb4
[mysqld]
user = mysql
port = 3306
sql_mode = ""
server_id = 1 ## 全局id 这里用来区分
log_bin = mysql-bin
# 需要同步的数据库,如果不配置则同步全部数据库
#binlog-do-db=test_db
expire_logs_days = 10 ## 存放天数 超过天数丢弃
binlog_format = ROW ## 日志格式
default-storage-engine = InnoDB
default-authentication-plugin = mysql_native_password
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
slow_query_log
long_query_time = 3
slow-query-log-file = /var/lib/mysql/mysql.slow.log
log-error = /var/lib/mysql/mysql.error.log
default-time-zone = '+8:00'
[mysql]
default-character-set = utf8mb4
编写db2的配置 即从库 slave
[client]
port = 3306
default-character-set = utf8mb4
[mysqld]
user = mysql
port = 3306
sql_mode = ""
server_id = 2 ## 全局id 不能和其他库的一样
log_bin = mysql-bin
binlog_format = ROW
log_slave_updates = ON ## 默认没有开启, 是从库自己也更新binlog
read_only = ON ## 从库只读模式
super_read_only = ON ## 通用只读但是是super也一样
default-storage-engine = InnoDB
default-authentication-plugin = mysql_native_password
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
slow_query_log
long_query_time = 3
slow-query-log-file = /var/lib/mysql/mysql.slow.log
log-error = /var/lib/mysql/mysql.error.log
default-time-zone = '+8:00'
[mysql]
default-character-set = utf8mb4
启动 mysql
docker-compose up -d
运行完之后我们就启动了两个db 这时候我们先设置 master 进入db1容器
docker inspect mysqls_db1_1 #查看容器ip
docker exec -it mysqls_db1_1 bash
mysql -u root -p
GRANT REPLICATION SLAVE ON *.* to 'slave_user2'@'db2' identified by '123456'; # 这里db2 换成db2的IP
FLUSH PRIVILEGES; ## 刷新并应用
show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 | 602 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.02 sec)
接来下编辑从库 进入db2容器
docker exec -it mysqls_db2_1 bash
mysql -u root -p
## 从库只需要指定master是谁就可以
change master to master_host='db1',master_port=3306,master_user='slave_user2',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=602;
start slave; ## 启动
show slave status; ## 查看从库状态
##查看从库状态信息 Last_IO_Error是否正常
容器内可以通过名称来指定 因为docker内部有自己的dns指定了对应的ip, 正常情况都是指定IP, [master_log_file填写master上打印的信息master_log_pos也一样]
进入主节点查看所有从节点
SHOW SLAVE HOSTS;
+-----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID |
+-----------+------+------+-----------+--------------------------------------+
| 2 | | 3306 | 1 | 16d57f3c-393e-11ec-bbc7-0242ac190002 |
+-----------+------+------+-----------+--------------------------------------+
1 row in set (0.03 sec)