本章基于:MySQL 集群(一):Docker 搭建 MySQL,MySQL 主从同步搭建及踩坑
如果还需要主备切换等功能的建议: MySQL 集群(三):MySQL + Mycat 实现读写分离,主备切换集群
由于是基于上一章,因此先说下此时的配置
MySQL 主从同步:
官方下载: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
cd /usr/local/mysql-proxy
先来给数据库密码加下密
[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
启动很简单
# 进入 bin
cd /usr/local/mysql-proxy/bin
# 启动 Atlas
./mysql-proxyd test start
服务器上没有 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,懂得大佬可以来解释下,如图:
我这里连接时候出了版本问题,还有连接异常,不知道是不是个人原因,所以我上下我这的依赖
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