Docker部署MySQL集群+主从复制+Atlas读写分离

Docker部署MySQL集群+主从复制+Atlas读写分离

主从复制

1.拉取 MySQL 容器镜像

docker pull mysql:5.7

# 这里我使用的是 5.7 版本,如果你想要拉取最新版本的镜像,可以使用:
docker pull mysql:latest

2.查看镜像

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

3.创建主库容器

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

4.创建从库容器

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

PS:这里我们分别使用了 3307 和 3308 端口,因为我们本地宿主机器上已经跑了 MySQL 了,3306 端口被占用。

5.配置主库

  • 进入容器,并修改
docker exec -it mysql-master /bin/bash 
root@c72a3032f986:/# mysql -u root -p123456

# 修改 root 可以通过任何客户端连接
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
  • .修改 MySQL 配置文件
vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
log-bin=mysql-bin    //[必须]启用二进制日志
server-id=1          //[必须]服务器标识ID,每台服务器唯一

6.配置从库

同上主库配置,略~

7.配置 MySQL 主从复制

1)获取master信息

  • 查看master数据库状态,记录 File 的值和 Position 的值,等会配置 slave 服务器的时候要用。
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)

2)配置主从

  • 接下来连接 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;			# 启动从服务器复制功能

PS:过程中如果不小心配置错,输入 mysql> stop slave; 然后重新录入一遍就可以了。

8.检查主从连接状态:

  • 这两个必须是 Yes ,若为 No 或者 connect 说明没有连接上!
show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

9.重启容器,使配置生效

分别重启 mysql-mastermysql-slave 容器

docker restart mysql-master
docker restart mysql-slave

10.测试

1)在 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)

2)然后在 slave 容器查看

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

发现已经同步过来了。

3)在 master 服务器 user 表插入一条数据

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

4)然后看看 slave 服务器是否有同步

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

显然,已经完美同步了。

读写分离

1.安装Atlas

docker run -it --name atlas -v /usr/local/mysql-proxy/conf:/usr/local/mysql-proxy/conf -p 1234:1234 -p 2345:2345  mybbcat/docker-360atlas /bin/bash

2.修改test.cnf

vim /usr/local/mysql-proxy/conf
[mysql-proxy]
#管理接口的用户名,指定也行,默认也行
admin-username = admin
#管理接口的密码,指定也行,默认也行
admin-password = admin
#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
proxy-backend-addresses = 10.0.0.51:3306
#Atlas后端连接的MySQL从库的IP和端口
proxy-read-only-backend-addresses = 10.0.0.52:3306,10.0.0.53:3306
#用户名与其对应的加密过的MySQL密码,需改密码后指定到此
pwds = slave:KyaJUrNF4Pw=
#设置Atlas的运行方式,true为守护进程方式,false时为前台方式,一般开发调试时设为false,线上运行时设为true,true后面不能有空格
daemon = true
#设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启
keepalive = true
#工作线程数,对Atlas的性能有很大影响,可根据情况适当设置
event-threads = 8
#日志级别,分为message、warning、critical、error、debug五个级别
log-level = message
#日志存放的路径
log-path = /usr/local/mysql-proxy/log
#SQL日志的开关
sql-log = ON
#Atlas监听的工作接口IP和端口
proxy-address = 0.0.0.0:1234
#Atlas监听的管理接口IP和端口
admin-address = 0.0.0.0:2345
#默认字符集,设置该项后客户端不再需要执行SET NAMES语句
charset = utf8

3.重启Atlas

docker restart atlas

4.进入容器

docker exec -it atlas /bin/bash
/usr/local/mysql-proxy/bin/mysql-proxyd test start		# 启动Atlas服务

5.查看读写操作是否正确

tail -f /usr/local/mysql-proxy/log/sql_test.log
posted @ 2022-06-09 18:36  秋风お亦冷  阅读(208)  评论(0编辑  收藏  举报