1. 安装和配置 Docker
服务器版本
阿里云 CentOS7.4
docker 版本
18.06.0-ce
docker 安装步骤
https://docs.docker.com/install/linux/docker-ce/centos/#install-docker-ce-1
下载 mysql 镜像
# docker pull mysql:5.7
启动两个 mysql 镜像, 分别映射 3306 和 3316 端口
主库: 3306 端口
备库: 3316 端口
- # docker run -p 3306:3306 --name mysql3306 -v /opt/mysql/data/data3306:/var/lib/mysql -v /opt/mysql/logs/logs3306:/logs -e MYSQL_ROOT_PASSWORD=xxxxxxxxxxxx -d mysql:5.7
- # docker run -p 3316:3306 --name mysql3316 -v /opt/mysql/data/data3316:/var/lib/mysql -v /opt/mysql/logs/logs3316:/logs -e MYSQL_ROOT_PASSWORD=xxxxxxxxxxxx -d mysql:5.7
2. 配置主从复制
从主库的 docker 容器中把默认的配置文件拷贝出来
# docker cp 37735c072370:/etc/mysql/mysql.conf.d/mysqld.cnf /opt/mysql/conf/conf3306
修改配置文件增加两行
- #vim mysqld.cnf
- [mysqld]
- log-bin=mysql-bin #开启二进制日志
- server-id=1 #设置 server-id
将修改后的配置文件拷回容器里, 并重启容器
- # docker cp /opt/mysql/conf/conf3306/mysqld.cnf 37735c072370:/etc/mysql/mysql.conf.d/
- # docker restart 37735c072370
创建主从复制需要的 mysql 账户, 并分配权限
- mysql>CREATE USER 'repl'@'xxx.xxx.xxx.xxx' IDENTIFIED BY 'repl123';
- mysql>GRANT REPLICATION SLAVE ON *.* TO 'repl'@'xxx.xxx.xxx.xxx'
查看主库状态, 记录下 File 和 Position
mysql>SHOW MASTER STATUS;
修改从库配置文件
- #vim mysqld.cnf
- [mysqld]
- server-id=2 #设置 server-id
同样拷进从库镜像, 并重启容器
mysql 中执行配置主库的语句
- mysql>change master to master_host='xxx.xxx.xxx.xxx', #Master 服务器 Ip
- master_port=3306,
- master_user='repl',
- master_password='repl123',
- master_log_file='master-bin.000001',#Master 服务器产生的日志
- master_log_pos=2986;
- mysql>start slave;
- mysql>show slave status\G
如果 slave_io_running 和 slave_sql_running 都为 yes, 表示启动同步成功
建立两个客户端连接并创建测试库
主库建立 student 表并插入一条记录, 可以看到, 从库自动同步了数据, 配置成功
3. 用 mysql-proxy 实现读写分离
下载 mysql-proxy
https://downloads.mysql.com/archives/proxy/
解压并配置 mysql-proxy
- # tar zxvf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
- # cd mysql-proxy-0.8.5-linux-el6-x86-64bit
- # vim /etc/mysql-proxy.cnf
- [mysql-proxy]
- user=root #运行 mysql-proxy 用户
- admin-username=proxy #主从 mysql 共有的用户
- admin-password=proxy123 #共有用户密码
- proxy-read-only-backend-addresses=xxx.xxx.xxx.xxx:3316 #备库地址
- proxy-backend-addresses=xxx.xxx.xxx.xxx:3306 #主库地址
- proxy-lua-script=/usr/local/mysql-proxy/mysql-proxy-0.8.5-linux-el6-x86-64bit/share/doc/mysql-proxy/rw-splitting.lua #指定读写分离配置文件位置
- admin-lua-script=/usr/local/mysql-proxy/mysql-proxy-0.8.5-linux-el6-x86-64bit/share/doc/mysql-proxy/admin-sql.lua #指定管理脚本
- daemon=true #以守护进程方式运行
- keepalive=true #mysql-proxy 崩溃时, 尝试重启
修改读写分离配置文件
- # vim /usr/local/mysql-proxy/mysql-proxy-0.8.5-linux-el6-x86-64bit/share/doc/mysql-proxy/rw-splitting.lua
- min_idle_connections = 1, #默认超过 4 个连接数时才开始读写分离, 改为 1
- max_idle_connections = 1,
mysql-proxy 的 bin 目录下启动 mysql-proxy
# ./mysql-proxy --defaults-file=/etc/mysql-proxy.cnf
主库和从库分别创建用户
mysql>GRANT ALL ON *.* TO 'proxy'@'xxx.xxx.xxx' identified by 'proxy123';
创建 mysql-proxy 的数据里连接 (默认端口 4040), 可以看到之前验证主从复制时简历的 test 库和 student 表
只修改从库的数据, 然后通过 mysql-proxy 查询, 可以看到读取的数据是从库修改过的数据, 读分离验证成功.
主库:
从库:
mysql-proxy:
停止从库的 docker 容器, 通过 mysql-proxy 插入一条数据, 主库中刷新也有新增的数据, 写分离验证成功.
mysql-proxy:
主库:
从库:
来源: http://www.linuxidc.com/Linux/2018-08/153469.htm