使用docker 搭建mysql集群 mycat实现主从读写分离

​ 单机情况下,没有虚拟机,可以使用docker 模拟多机操作搭建mysql集群

Mycat是开源社区在阿里cobar基础上进行二次开发,解决了cobar存在的问题,并且加入了许多新的功能在其中。青出于蓝而胜于蓝 站在巨人的肩膀上,我们能看到更远。广泛吸取业界优秀的开源项目和创新思路,将其融入到 MyCAT 的基因中,使得 MyCAT 在很多方面都领先于目前其他一些同类的开源项目,甚至超越某些商业产品。MyCAT 背后有一只强大的技术团队,其参与者都是 5 年以上资深软件工程师、架构师、DBA 等,优秀的技术团队保证了 MyCAT 的产品质量。 MyCAT 并不依托于任何一个商业公司,因此不像某些开源项目,将一些重要的特性封闭在其商业产品中,使得开源项目成了一个摆设。

MyCat 架构

http://www.mycat.org.cn/img/1.png

​ Mycat目前版本,已经不是一个单纯的MySQL 代理了,它的后端可以支持MySQL、SQLServer、Oracle、DB2、PostgreSQL 等主流数据库,也支持MongoDB 这种新型NoSQL 方式的存储,未来还会支持更多类型的存储。

搜索镜像
docker search mysql
拉取镜像
docker pull mysql


docker run --restart=always --name=mysql -p 3306:3306  -v /etc/my.cnf:/etc/my.cnf -v /mnt/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=Root123... -d mysql
mysql> set password for root@localhost = password("Root123...");

grant all privileges on *.*  to 'root'@'%' ;  # 设置root用户在任何地方进行远程登录,并具有所有库任何操作权限(暴露的攻击面太大)。
alter user 'root'@'%' identified with mysql_native_password by 'Root123...';
FLUSH PRIVILEGES;

 docker run -p 13306:3306 --name my-mysql -v $PWD/conf:/etc/mysql -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=Dl123456 -d mysql:5.7
-p 13306:3306                      将容器的 3306 端口映射到主机的 3306 端口

--name my-mysql                     启动后容器名为 my-mysql  

-v $PWD/conf:/etc/mysql          将主机当前目录下的 conf/ 挂载到容器的 /etc/mysql       (conf目录为mysql的配置文件,不挂载也没问题)

-v $PWD/logs:/logs          将主机当前目录下的 logs 目录挂载到容器的 /logs           (logs目录为mysql的日志目录,不挂载也没影响)

-v $PWD/data:/var/lib/mysql     将主机当前目录下的data目录挂载到容器的 /var/lib/mysql (data目录为mysql配置的数据文件存放路径,这个还是建议挂载,是存储数据的,容器down掉,还能再次挂载数据。)

-e MYSQL_ROOT_PASSWORD=Dl123456   初始化 root 用户的密码


 
 docker run -id -p 3307:3306 --name=Master1 -v /mnt/MMM/Master1Conf:/etc/mysql/conf.d  -e MYSQL_ROOT_PASSWORD=Root123... mysql
 
 docker run -id -p 3308:3306 --name=M1slave1 -v /mnt/MMM/M1slave1Conf:/etc/mysql/conf.d  -e MYSQL_ROOT_PASSWORD=Root123... mysql
 
 docker run -id -p 3309:3306 --name=M1slave2 -v /mnt/MMM/M1slave2Conf:/etc/mysql/conf.d  -e MYSQL_ROOT_PASSWORD=Root123... mysql
 
 docker run -id -p 3310:3306 --name=Master2 -v /mnt/MMM/Master2Conf:/etc/mysql/conf.d  -e MYSQL_ROOT_PASSWORD=Root123... mysql
 
 docker run -id -p 3311:3306 --name=M2slave1 -v /mnt/MMM/M2slave1Conf:/etc/mysql/conf.d  -e MYSQL_ROOT_PASSWORD=Root123... mysql

M1.cnf:
[mysqld]
#日志文件的名字
log-bin=master-a-bin
#日志文件的格式
binlog_format=ROW
#服务器的id(zk的集群),一定要是唯一的
server-id=1
 
M1S1.cnf:
[mysqld]
#服务器的id,一定要是唯一的
server-id=2
 
M1S2.cnf:
[mysqld]
#服务器的id,一定要是唯一的
server-id=3
 
M2.cnf:
[mysqld]
#日志文件的名字
log-bin=master-a-bin
#日志文件的格式
binlog_format=ROW
#服务器的id,一定要是唯一的
server-id=4
#双主互相备份(表示从服务器可能是另外一台服务器的主服务器)
log-slave-updates=true
 
M2S1.cnf
[mysqld]
#服务器的id,一定要是唯一的
server-id=5
 
 
---------------------------------------------------------------------------------
配置完之后,重启docker容器。使配置文件生效。
docker restart $(docker ps -a)

进入数据库设置主从复制

M1: 
#添加完之后需要登录主服务器给从服务器授权(root ip地址 密码 按情况修改。)
CREATE USER 'root'@'192.168.50.%' IDENTIFIED WITH mysql_native_password BY 'Root123...';
grant replication slave on *.* to 'root'@'192.168.50.%' ;

进入容器登录mysql并开启远程连接
alter user 'root'@'%' identified with mysql_native_password by 'Root123...';

#刷新系统权限表
flush privileges;
# 查看状态
show master status;
# 得到日志名和文件偏移量:File:master-a-bin.000002  Position:606, 用于后面从服务器的配置
 
 
M1S1 和 M1S2:
#登录从服务器,设置从服务器如何找到主服务器
change master to master_host='192.168.50.190',master_port=3307,master_user='root',master_password='Root123...',master_log_file='master-a-bin.000002',master_log_pos=606;
# 开启主从复制
start slave;

运行完上述步骤之后如果标点的位置的都是yes,并且连对了数据库,那么说明主从配置成功了,有一个不正确都是失败。
SHOW SLAVE STATUS\G;
 
 Slave_IO_Running:  Yes
 Slave_SQL_Running: Yes

 如果有问题注意看报错  Last_IO_Error:
 
 例如:
 Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).

 
M2(即是主服务器也是从服务器):
#添加完之后需要登录主服务器给从服务器授权
CREATE USER 'root'@'192.168.50.%' IDENTIFIED WITH mysql_native_password BY 'Root123...';
grant replication slave on *.* to 'root'@'192.168.50.%' ;
#刷新系统权限表
flush PRIVILEGES;
 
# 设置从服务器如何找到主服务器
change master to master_host='192.168.50.190',master_port=3307,master_user='root',master_password='Root123...',master_log_file='master-a-bin.000002',master_log_pos=157;
# 开启主从复制
start slave 

运行完上述步骤之后如果标点的位置的都是yes,并且连对了数据库,那么说明主从配置成功了,有一个不正确都是失败。
SHOW SLAVE STATUS\G;
 
# 查看状态
show master status;
# 得到日志名和文件偏移量:File:master-a-bin.000001  Position:2172, 用于后面从服务器的配置
 
M2S1:
登录从服务器,设置从服务器如何找到主服务器
change master to master_host='192.168.50.190',master_port=3310,master_user='root',master_password='Root123...',master_log_file='master-a-bin.000001',master_log_pos=2172;
# 开启主从复制
start slave;

运行完上述步骤之后如果标点的位置的都是yes,并且连对了数据库,那么说明主从配置成功了,有一个不正确都是失败。
SHOW SLAVE STATUS\G;
 

mycat镜像站 http://dl.mycat.org.cn/

搜索镜像

[root@localhost ~]# docker search mycat
NAME                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
longhronshens/mycat-docker       mycat-docker                                    7                    [OK]
mycatisblack/consul-agent        Fork of gliderlabs/consul-agent but with nag…   4                    [OK]
cuilc/mycat                      oracle jdk8, tomcat, mycat                      3                    
fify/mycat                       MyCAT database mid-ware.                        2                    
manondidi/mycat                   alibaba mycat 1.6.7.5                          2                    
mycat/leader-icenode             Zeroc Ice 3.6 with Oracle JDK installed ,so …   1                    
mycatisblack/staytus             automated build of staytus                      1                    [OK]
mycatisblack/docker-mumo         Mumo python bot server for mumble.              1                    [OK]
yanglibao/mycat                  mycat1.6 - opengauss                            0                    
mycat/imking                     The first community for IT in China.            0                    
mycatisblack/5calls              Fork of 5calls                                  0                    [OK]
mycatisblack/consul-server       Minor fork to consul-server repo to add nagi…   0                    [OK]
mycat83/myrecipes-api                                                            0                    
qiyue/mycat                      centos:7 + jdk:1.8 + mycat                      0                    
mycat/ratelimit-hpe                                                              0                    
mycat/hpe_clearwater_scratch     Clearwater  scratch docker image ,used to bu…   0                    
mycatisblack/mumble-soundboard   Simple node soundboard for mumble.              0                    [OK]
brikeyes1/mycat                                                                  0                    
fjy8018/mycat                    docker mycat images Docker MyCat 镜像             0                    
huhengbo1992/mycat               mycat                                           0                    
mycat/eshop-web                                                                  0                    
mycat/eshop-auth-image                                                           0                    
xiangzhi/mycat                   mycat server + mycat eye                        0                    
mycat/tensorflow-playground                                                      0                    
mycat/nmist-webclient                                                            0                    
[root@localhost ~]# 

拉取镜像

docker pull manondidi/mycat
[root@localhost ~]# docker pull manondidi/mycat
Using default tag: latest
latest: Pulling from manondidi/mycat
5040bd298390: Pull complete 
fce5728aad85: Pull complete 
76610ec20bf5: Pull complete 
60170fec2151: Pull complete 
e98f73de8f0d: Pull complete 
11f7af24ed9c: Pull complete 
49e2d6393f32: Pull complete 
bb9cdec9c7f3: Pull complete 
f40d0588646d: Pull complete 
025c7b8fa97a: Pull complete 
Digest: sha256:af9d23d587445d408cfbe37b9ab1ccfc9653a60d9ee06e85f2e741e73c13fcda
Status: Downloaded newer image for manondidi/mycat:latest
docker.io/manondidi/mycat:latest
[root@localhost ~]# docker images
REPOSITORY            TAG          IMAGE ID       CREATED         SIZE
manondidi/mycat       latest       9ce0614662fc   2 years ago     696MB
[root@localhost ~]# 

mycat 有两个端口,8066 数据端口,9066 管理端口,命令行的登陆是通过9066 管理端口来操作。

bindIp : mycat 服务监听的IP 地址,默认值为0.0.0.0。

serverPort : 定义mycat 的使用端口,默认值为8066。

managerPort : 定义mycat 的管理端口,默认值为9066。

创建并启动mycat容器,将配置文件映射到容器内部


docker run -d \
  -p 8066:8066 \
  -p 9066:9066 \
  --name mycat \
  -v /mnt/mycat/conf/server.xml:/usr/local/mycat/conf/server.xml \
  -v /mnt/mycat/conf/schema.xml:/usr/local/mycat/conf/schema.xml\				
  -v /mnt/mycat/conf/rule.xml:/usr/local/mycat/conf/rule.xml \
  --privileged=true -d manondidi/mycat
  


[root@localhost ~]# docker run -d \
>   -p 8066:8066 \
>   -p 9066:9066 \
>   --name mycat \
>   -v /mnt/mycat/conf/server.xml:/usr/local/mycat/conf/server.xml \
>   -v /mnt/mycat/conf/schema.xml:/usr/local/mycat/conf/schema.xml\
>   -v /mnt/mycat/conf/rule.xml:/usr/local/mycat/conf/rule.xml \
>   --privileged=true -d manondidi/mycat
6bf9f68419f05f141840c8ad0c9f6d619ac28d068059dff4f1278517a221a865
docker: Error response from daemon: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/mnt/mycat/conf/schema.xml" to rootfs at "/usr/local/mycat/conf/schema.xml": mount /mnt/mycat/conf/schema.xml:/usr/local/mycat/conf/schema.xml (via /proc/self/fd/6), flags: 0x5000: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.
[root@localhost ~]# 
[root@localhost ~]#   docker rm 6bf9f68419f05f141840c8ad0c9f6d619ac28d068059dff4f1278517a221a865
6bf9f68419f05f141840c8ad0c9f6d619ac28d068059dff4f1278517a221a865
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# ps -ef|grep 9066
root      16408  16033  0 09:15 pts/1    00:00:00 grep --color=auto 9066
[root@localhost ~]#systemctl restart docker

  

启动临时容器获取mycat配置文件

[root@localhost ~]# docker run -p 8066:8066 -p 9066:9066 -d --name mycat manondidi/mycat
0b0ea99971fac0e345cfa195d987e8a39abf5d4108b3a66e1de4b2a137283cd9
[root@localhost ~]# docker ps 
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS              PORTS                                                                                                      NAMES
0b0ea99971fa   manondidi/mycat       "/usr/local/mycat/bi…"   11 seconds ago   Up 10 seconds       0.0.0.0:8066->8066/tcp, :::8066->8066/tcp, 0.0.0.0:9066->9066/tcp, :::9066->9066/tcp                       mycat

创建文件夹
mkdir /mnt/mycat/
mkdir /mnt/mycat/conf/

docker cp mycat:/usr/local/mycat/conf/rule.xml /mnt/mycat/conf
docker cp mycat:/usr/local/mycat/conf/server.xml /mnt/mycat/conf
docker cp mycat:/usr/local/mycat/conf/schema.xml /mnt/mycat/conf

[root@localhost ~]# mkdir /mnt/mycat/conf/
mkdir: 无法创建目录"/mnt/mycat/conf/": 文件已存在
[root@localhost ~]# cd /m
media/ mnt/   
[root@localhost ~]# cd /mnt/
[root@localhost mnt]# ls
mycat  
[root@localhost mnt]# rm -rf mycat/
[root@localhost mnt]# 
[root@localhost mnt]# cd
[root@localhost ~]# docker cp mycat:/usr/local/mycat/conf/rule.xml /mnt/mycat/conf
stat /mnt/mycat: no such file or directory
[root@localhost ~]# mkdir /mnt/mycat/conf/
mkdir: 无法创建目录"/mnt/mycat/conf/": 没有那个文件或目录
[root@localhost ~]# mkdir /mnt/mycat/
[root@localhost ~]# mkdir /mnt/mycat/conf/
[root@localhost ~]# docker cp mycat:/usr/local/mycat/conf/rule.xml /mnt/mycat/conf
[root@localhost ~]# docker cp mycat:/usr/local/mycat/conf/server.xml /mnt/mycat/conf
[root@localhost ~]# docker cp mycat:/usr/local/mycat/conf/schema.xml /mnt/mycat/conf
[root@localhost ~]# 




[root@localhost ~]# docker stop mycat
mycat
[root@localhost ~]# docker rm mycat
mycat
[root@localhost ~]# 

创建并启动mycat容器,将配置文件映射到容器内部

[root@localhost ~]# docker run -d \
>   -p 8066:8066 \
>   -p 9066:9066 \
>   --name mycat \
>   -v /mnt/mycat/conf/server.xml:/usr/local/mycat/conf/server.xml \
>   -v /mnt/mycat/conf/schema.xml:/usr/local/mycat/conf/schema.xml\
>   -v /mnt/mycat/conf/rule.xml:/usr/local/mycat/conf/rule.xml \
>   --privileged=true -d manondidi/mycat
8290fe345847822876309f76bbc9bf6978a66210979ad814432e218b38ed1966
[root@localhost ~]# 

v /mnt/mycat/conf/server.xml:/usr/local/mycat/conf/server.xml \

-v /mnt/mycat/conf/schema.xml:/usr/local/mycat/conf/schema.xml
-v /mnt/mycat/conf/rule.xml:/usr/local/mycat/conf/rule.xml
–privileged=true -d manondidi/mycat
8290fe345847822876309f76bbc9bf6978a66210979ad814432e218b38ed1966
[root@localhost ~]#


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RDZ-hyd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值