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