同步操作将从 cow11023/docker-Mysql-Mycat 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
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]
server-id=1
log-bin=mysql-bin
binlog-ignore-db=mysql
sync_binlog = 1
slave-skip-errors = all
从slave1配置文件my.cnf
vim mysql-slave1/conf/my.cnf
[mysqld]
server-id=2
#log-slave-updates
#replicate-do-db = cov;
replicate-ignore-db=mysql
log-bin=mysql-bin log-bin-index=mysql-bin.index
#relay_log=edu-mysql-relay-bin
#expire_logs_days=14
slave-skip-errors = all
从slave2配置文件my.cnf vim mysql-slave2/conf/my.cnf [mysqld]
server-id=2
#log-slave-updates
#replicate-do-db = cov;
replicate-ignore-db=mysql
log-bin=mysql-bin log-bin-index=mysql-bin.index
#relay_log=edu-mysql-relay-bin
#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.查看从数据库上的数据是否已同步
最后结果:数据已正常同步
图中展示的是一主二从的情况,我们这里是最基础的是一主一从,这里仅仅是为了展示,当我们是一主多从时,需要读取多个数据库吗?明显这是一种不科学的行为,因此我们使用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/">
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
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中间件中,我们既不能创建数据库,也不能创建数据表!!!!!!!
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。