1 Star 0 Fork 1

jachin / docker-Mysql-Mycat

forked from cow11023 / docker-Mysql-Mycat 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

1.MyCAT中间件服务实现读写分离

        要实现这个,必须先实现Mysql的主从复制,因为第一周作业老师认为我提交的作业太过简单,所以这里
我先把mysql主从简单说明一下。
        
        前提条件是先实现mysql主从复制
        框架: 一主一从
        1)创建启动目录 mkdir -p /data/mysql/mysql-master/conf   —配置主节点目录
                                    mkdir -p /data/mysql/mysql-master/data
                                    mkdir -p /data/mysql/mysql-master/logs
                                    mkdir -p /data/mysql/mysql-slave/conf       —配置从节点目录
                                    mkdir -p /data/mysql/mysql-slave/data
                                    mkdir -p /data/mysql/mysql-slave/logs
         2)创建docker-compose.yml   位于/data/mysql下

version: '3.3' services: mysql-master: container_name: mysql-master image: mysql:5.7.31 restart: always ports: - 3340:3306 privileged: true volumes: - $PWD/mysql-master/logs:/var/log/mysql
- $PWD/mysql-master/conf/my.cnf:/etc/mysql/my.cnf - $PWD/mysql-master/data/:/var/lib/mysql - $PWD/mysql-master/mysql-files:/var/lib/mysql-files environment: MYSQL_ROOT_PASSWORD: “root1234” ##配置root管理员账户密码,主从节点都要配置这项 command: [ '--character-set-server=utf8mb4', '--collation-server=utf8mb4_general_ci', '--max_connections=3000' ] networks: - myweb mysql-slave: container_name: mysql-slave image: mysql:5.7.31 restart: always ports: - 3341:3306 privileged: true volumes: - $PWD/mysql-slave/logs:/var/log/mysql
- $PWD/mysql-slave/conf/my.cnf:/etc/mysql/my.cnf - $PWD/mysql-slave/data:/var/lib/mysql - $PWD/mysql-slave/mysql-files:/var/lib/mysql-files environment: MYSQL_ROOT_PASSWORD: "root1234" command: [ '--character-set-server=utf8mb4', '--collation-server=utf8mb4_general_ci', '--max_connections=3000' ] networks: - myweb
networks: myweb: driver: bridge

主master配置my.cnf vim mysql-master/conf/my.cnf [mysqld]

[必须]服务器唯一ID,默认是1,一般取IP最后一段

server-id=1

[必须]启用二进制日志

log-bin=mysql-bin

复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)

binlog-ignore-db=mysql

设置需要同步的数据库 binlog_do_db = 数据库名;

如果是多个同步库,就以此格式另写几行即可。

如果不指明对某个具体库同步,表示同步所有库。除了binlog-ignore-db设置的忽略的库

binlog_do_db = test #需要同步test数据库。

确保binlog日志写入后与硬盘同步

sync_binlog = 1

跳过所有的错误,继续执行复制操作

slave-skip-errors = all
从slave1配置文件my.cnf vim mysql-slave1/conf/my.cnf [mysqld]

[必须]服务器唯一ID,默认是1,一般取IP最后一段

server-id=2

如果想实现 主-从(主)-从 这样的链条式结构,需要设置:

#log-slave-updates

设置需要同步的数据库,主服务器上不限定数据库,在从服务器上限定replicate-do-db = 数据库名;

如果不指明同步哪些库,就去掉这行,表示所有库的同步(除了ignore忽略的库)。

#replicate-do-db = cov;

不同步test数据库 可以写多个例如 binlog-ignore-db = mysql,information_schema

replicate-ignore-db=mysql

开启二进制日志功能,以备Slave作为其它Slave的Master时使用

log-bin=mysql-bin log-bin-index=mysql-bin.index

relay_log配置中继日志

#relay_log=edu-mysql-relay-bin

还可以设置一个log保存周期:

#expire_logs_days=14

跳过所有的错误,继续执行复制操作

slave-skip-errors = all

从slave2配置文件my.cnf vim mysql-slave2/conf/my.cnf [mysqld]

[必须]服务器唯一ID,默认是1,一般取IP最后一段

server-id=2

如果想实现 主-从(主)-从 这样的链条式结构,需要设置:

#log-slave-updates

设置需要同步的数据库,主服务器上不限定数据库,在从服务器上限定replicate-do-db = 数据库名;

如果不指明同步哪些库,就去掉这行,表示所有库的同步(除了ignore忽略的库)。

#replicate-do-db = cov;

不同步test数据库 可以写多个例如 binlog-ignore-db = mysql,information_schema

replicate-ignore-db=mysql

开启二进制日志功能,以备Slave作为其它Slave的Master时使用

log-bin=mysql-bin log-bin-index=mysql-bin.index

relay_log配置中继日志

#relay_log=edu-mysql-relay-bin

还可以设置一个log保存周期:

#expire_logs_days=14

跳过所有的错误,继续执行复制操作

slave-skip-errors = all 启动服务

查询服务地址

所图示,mysql-master的地址为192.168.112.2 mysql-slave的地址为192.168.112.3

进入主mysql服务 docker exec -it mysql-master /bin/bash mysql -uroot -proot1234 #登入数据库 执行命令: show variables like ‘%server_id%’; #查看server_id

查看master节点上的File和Position信息,从节点上要用的 执行命令:show master status;

配置master节点上的slave账户权限 grant replication slave,replication client on . to 'slave'@'%' identified by "root1234"; flush privileges;

进入从slave服务 docker exec -it mysql_slave /bin/bash

mysql -uroot -proot1234 #登入数据库 执行命令: show variables like ‘%server_id%’; #查看server_id

连接到mysql主master节点 change master to master_host='172.26.0.3',master_user='slave',master_password='root1234',master_port=3306,master_log_file='mysql-bin.000004',master_log_pos=154,master_connect_retry=30;

启动slave服务

start slave; show slave status \G;

看到两个yes,证明已经成功 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes

设置从服务器slave为只读 在slave上执行 SHOW VARIABLES LIKE '%read_only%’; #查看只读状态 SET GLOBAL super_read_only=1; #超级权限的只读状态 SET GLOBAL read_only=1; ##普通用户权限的只读状态

下面可以测试一下数据库的主从同步:

1.在主数据库上创建用户数据库cov CREATE DATABASE IF NOT EXISTS cov DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

2.往cov数据库上添加测试数据 3.查看从数据库上的数据是否已同步

最后结果:数据已正常同步

    1. 架构图

图中展示的是一主二从的情况,我们这里是最基础的是一主一从,这里仅仅是为了展示,当我们是一主多从时,需要读取多个数据库吗?明显这是一种不科学的行为,因此我们使用Mycat中间件,写入的话只写入一个主库,从库只需要从主库同步即可,读入的话只读一个从库

    1. 初始化mycat配置信息 修改mycat_config/mycat/server.xml ,配置mycat用户信息
     <!-- 设置用户名以及虚拟逻辑数据库 -->
      <user name="mycat">
              <property name="password">123456</property>
              <property name="schemas">db_order</property>
      </user>

修改mycat_config/mycat/schema.xml,配置需要分片的数据库信息

<mycat:schema xmlns:mycat="http://io.mycat/">

select user() </mycat:schema> balance属性说明: 负载均衡类型,目前的取值为三种

balance="0,不开启读写分离操作,所有读操作全部发往writeHost上。 balance="1" ,全部的readHost和stand by readHost参与select语句的负载均衡。简单来说,当使用双主模式下(M1->S1,M2->S2)下,正常情况下,M2,S1,S2都参与了select语句的负载均衡。 balance="2",所有读操作在writeHost,readHost上分发。 balance="3",所有读操作请求随机发送到writerHost对应的readHost上执行,writeHost不负担读取压力。 修改mycat_config/mycat/rule.xml,配置master的数据节点 1 3. 配置docker-compose.yml 可以放在mycat目录下,也可以放在他的上层目录mysql之上,就是和Mysql主从复制放一块 version: '3' services: mycat: build: . container_name: mycat volumes: - ./config/mycat/:/mycat/conf/:ro - ./log/mycat-logs/:/mycat/logs/:rw #- /etc/localtime:/etc/localtime:ro - ./config/hosts:/etc/hosts:ro ports: - "8066:8066" - "9066:9066" ulimits: nproc: 65535 hostname: mycat

mem_limit: 1024m

restart: always

networks: default: external: name: mysql_network 4. 启动mycat分库分表中间件 docker-compose build docker-compose up -d 注意: 事先一定要在master节点创建对应的数据库db_order和数据表tb_order,不然连接mycat会出现异常。 5. 通过mycat对db.order.tb_order表进行操作

注意:在mycat中间件中,我们既不能创建数据库,也不能创建数据表!!!!!!!

空文件

简介

Mysql主从复制(一主二从)+Mycat中间件 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/stards_cai/docker-mysql-mycat.git
git@gitee.com:stards_cai/docker-mysql-mycat.git
stards_cai
docker-mysql-mycat
docker-Mysql-Mycat
master

搜索帮助