当前位置: 首页 > news >正文

MySQL 集群(二):Atlas 结合 Docker MySQL 实现读写分离与验证

本章基于:MySQL 集群(一):Docker 搭建 MySQL,MySQL 主从同步搭建及踩坑
如果还需要主备切换等功能的建议: MySQL 集群(三):MySQL + Mycat 实现读写分离,主备切换集群

由于是基于上一章,因此先说下此时的配置

MySQL 主从同步:

  • master:127.0.0.1:7000
  • slave:127.0.0.1:7001

1.下载 Atlas,安装

官方下载:https://github.com/Qihoo360/Atlas/releases

wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm

由于不需要跨机器分表,且我这是 CentOS 6,往下拉下载非 Sharding 版本,然后安装

rpm -ivh Atlas-2.2.1.el6.x86_64.rpm

装错了之类的可以卸载

rpm -e Atlas

2.配置

cd /usr/local/mysql-proxy
  • conf:配置文件
  • bin:这里有两个比较重要的,encrypt 是用于给数据库的密码进行加密的, mysql-proxyd 用于操作 Atlas
  • log:日志文件夹

先来给数据库密码加下密

[root@VM_0_6_centos bin]# pwd
/usr/local/mysql-proxy/bin
[root@VM_0_6_centos bin]# ./encrypt 123456
/iZxz+0GRoA=
[root@VM_0_6_centos bin]# 

然后来配置下 conf 文件夹下的配置文件 test.cnf
这个配置文件里每一项上面都有说明,很多配置都不需要动了

[mysql-proxy]

#带#号的为非必需的配置项目

#管理接口的用户名
admin-username = root

#管理接口的密码
admin-password = 123456

#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
proxy-backend-addresses = 127.0.0.1:7000

#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
proxy-read-only-backend-addresses = 127.0.0.1:7001@1

#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!
pwds = root:/iZxz+0GRoA=, root:/iZxz+0GRoA=

#设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。
daemon = true

#设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。
keepalive = true

#工作线程数,对Atlas的性能有很大影响,可根据情况适当设置
event-threads = 4

#日志级别,分为message、warning、critical、error、debug五个级别
log-level = message

#日志存放的路径
log-path = /usr/local/mysql-proxy/log

#SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,REALTIME代表记录SQL日志且实时写入磁盘,默认为OFF
sql-log = REALTIME

#慢日志输出设置。当设置了该参数时,则日志只输出执行时间超过sql-log-slow(单位:ms)的日志记录。不设置该参数则输出全部日志。
#sql-log-slow = 10

#实例名称,用于同一台机器上多个Atlas实例间的区分
#instance = test

#Atlas监听的工作接口IP和端口
proxy-address = 0.0.0.0:1234

#Atlas监听的管理接口IP和端口
admin-address = 0.0.0.0:2345

#分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不需要设置该项
#tables = person.mt.id.3

#默认字符集,设置该项后客户端不再需要执行SET NAMES语句
#charset = utf8
  • 管理员账号,我改为了 root,否则在连接 Atlas 时会报未授权,如图:
  • pwds:密码,主库和从库都要写,按顺序先主后从准没错,反正我密码都是 123456。。。
  • event-threads:这个配置影响性能,atlas开发人员推荐将其设置为CPU个数的2~4倍。我这个辣鸡服务器就 1 个 CPU,所以我设置了 4,查看你服务器配置命令:lscpu
  • sql-log:这个服务器上一般时关掉的,这里配置成 REALTIME 是为了后面测试是否成功读写分离,测试完后关掉
  • proxy-address:这里的 1234 端口时工作端口(上面这么写的),说白点,你 navicate 或者 mybatis 连接数据库的时候就是通过这个端口去连接
  • admin-address:这个 2345 时管理端口,通过这个端口连接 Atlas 可以查寻一些运行情况,我这是 docker 部署的 mysql,所以服务器上是没装 mysql 的,所以这个我没用

3.启动 Atlas

启动很简单

# 进入 bin
cd /usr/local/mysql-proxy/bin

# 启动 Atlas
./mysql-proxyd test start

4.测试读写分离

服务器上没有 mysql,所以我选择通过 navicate 连接测试
由于需要 Atlas 去做代理进行读写分离,所以我们是连接 Atlas
用配置文件里的管理接口账号,密码登陆

我这里测试用的 test 库,表 student
顺便贴下表的 SQL

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL,
  `age` int(11) NULL DEFAULT NULL,
  `content` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '小明', 400, '小明111');
INSERT INTO `student` VALUES (2, '小红', 200, '小红222');

SET FOREIGN_KEY_CHECKS = 1;

这里进来后看到的 Atlas 的表应该是从库的,修改会代理到主库,来跑几个 SQL 看看
 

SELECT * FROM student;

insert INTO student (name,age,content) VALUES ("Tom",555,"Tom 555");

UPDATE student SET age = 400 WHERE 1 = 1;

SELECT * FROM student ;

新增更新查询都跑一跑,然后来看下日志文件

# 进入日志文件夹
/usr/local/mysql-proxy/log

# 我这叫 sql_test,命名应该是 sql_库名
cat sql_test.log

从图中可以看到,写的操作都是在 7000 端口上运行的,7001 上运行的都是读操作,配置成功

PS:发现个现象,就是如果在新增后面如果跟着查询,这个读操作会现在 7000 上运行一遍然后才会在 7001 上运行,不知道是 不是 Bug,懂得大佬可以来解释下,如图:

5. MyBatis 连接数据库

我这里连接时候出了版本问题,还有连接异常,不知道是不是个人原因,所以我上下我这的依赖

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
</dependency>

连接池配置:

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:1234/test
    username: root
    password: MydnLmKHotFzcbM3/jKN6j7j4MqgzxYsGv32wZ1QKSzdHWB44sOn6VGwbLqCs1YFVZM3v5kTcHpIQ18zKL6DOw==
    publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIyb6+/M6yqU7NwSf8bdlZP4K09ohHMCsJOhrwpywaFm9Qv0iFL1+9DNcoiiT4KD8cLXlgUkx0Py6/GNyi9jrCUCAwEAAQ==
    driver-class-name: com.mysql.jdbc.Driver

这里密码用了 Druid 的非对称加密:SpringCloud 之 Druid 配置及数据库密码加密

PS:最后别忘了把配置文件里 sql-log 配置改成 OFF

相关文章:

  • Jenkins + Docker 部署,使用,持续集成以及踩坑
  • Docker 删除 Exited 容器以及删除 none 镜像
  • LeetCode Java 深度优先算法(DFS)实现岛屿个数计算,附带详细分析
  • LeetCode Java 队列结合广度优先算法(BFS)实现岛屿个数计算,附带详细分析
  • navicat连接oracle报错:ORA-12737 Instant Client Light:unsupported server character set ZHS16GBK
  • Spring Boot,Spring Cloud,Spring Cloud Alibaba 版本选择说明以及整理归纳
  • RestTemplate 工具类
  • SpringCloud 之 Ribbon
  • SpringCloud 之 Hystrix 断路器,服务降级,自定义配置
  • Oracle 让指定数据排在最前面
  • Gitlab 之 Windows 环境进行 tomcat 持续集成部署,包含项目打包,备份,部署以及问题
  • Git 克隆指定分支的代码
  • Vue 新手学习笔记:vue-element-admin 之 入门开发教程(v4.0.0 之后)
  • Tomcat 内存优化
  • SpringCloud 之 Zuul 基础使用与进阶
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • extract-text-webpack-plugin用法
  • Javascript基础之Array数组API
  • JSDuck 与 AngularJS 融合技巧
  • mysql_config not found
  • Promise初体验
  • spring boot下thymeleaf全局静态变量配置
  • SQLServer之创建数据库快照
  • Vue2.0 实现互斥
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 讲清楚之javascript作用域
  • 前嗅ForeSpider中数据浏览界面介绍
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • #QT(串口助手-界面)
  • #WEB前端(HTML属性)
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .cfg\.dat\.mak(持续补充)
  • .equals()到底是什么意思?
  • .net 8 发布了,试下微软最近强推的MAUI
  • .net core 6 redis操作类
  • .net core使用ef 6
  • .net framework profiles /.net framework 配置
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .Net7 环境安装配置
  • .py文件应该怎样打开?
  • ;号自动换行
  • ?php echo ?,?php echo Hello world!;?
  • @EnableConfigurationProperties注解使用
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • [.net] 如何在mail的加入正文显示图片
  • [C#基础知识系列]专题十七:深入理解动态类型
  • [C++]类和对象【下】
  • [CentOs7]图形界面