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 时会报未授权,如图:
    MySQL 集群(二):Atlas 结合 Docker MySQL 实现读写分离与验证_第1张图片
  • 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
用配置文件里的管理接口账号,密码登陆

MySQL 集群(二):Atlas 结合 Docker MySQL 实现读写分离与验证_第2张图片

我这里测试用的 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

MySQL 集群(二):Atlas 结合 Docker MySQL 实现读写分离与验证_第3张图片

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

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

MySQL 集群(二):Atlas 结合 Docker MySQL 实现读写分离与验证_第4张图片

5. MyBatis 连接数据库

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


    mysql
    mysql-connector-java
    5.1.47

连接池配置:

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

你可能感兴趣的:(#,Mysql)