一 数据库主从复制
本次实验使用了三台机器,分别是10.26.7.20,10.26.7.21,10.26.7.22。 实现分为四个部分,首先是数据库主从复制,然后是mycat配置,再是keepalived配置,最后写测试代码。其中,数据库主从复制和mycat配置都是在普通用户身份下进行的,keepalived配置需要root权限才能进行操作。
1.1,安装mysql
参考博客:https://blog.youkuaiyun.com/weixin_30773135/article/details/94862745
-
先下载mysql编译好的二进制包mysql-5.7.28-el7-x86_64.tar.gz,这里需要注意的是若没有带操作系统位数则是源码包是需要编译的
-
解压安装包,在用户目录下新建一个目录用来存放mysql解压包
-
进入mysql,执行vim my.cnf命令,添加如下信息
-
初始化数据库,这是一行命令
./bin/mysqld--defaults-file=/home/wangfeng/local/mysql/my.cnf--initialize--user=wangfeng--basedir=/home/wangfeng/local/mysql--datadir=/home/wangfeng/local/data
-
获取root密码
cat /home/wangfeng/local/log/error.log |grep root@localhost
-
启动mysql
cd /home/wangfeng/local/mysql/bin/ ./mysqld_safe --defaults-file=/home/wangfeng/local/mysql/my.cnf --user=wangfeng &
-
登录mysql
cd /home/wangfeng/local/mysql/bin/ ./mysql -uroot -P3337 -p -S /home/wangfeng/local/mysql/mysql.sock
-
登录后修改root密码及远程登录设置
alter user 'root'@'localhost' identified by 'mysql@123'; grant all privileges on *.* to 'root'@'%' identified by 'mysql@123' with grant option; FLUSH PRIVILEGES;
-
在另外两台服务器上执行同样的操作
1.2,配置主从复制
参考博客:https://blog.youkuaiyun.com/yifanSJ/article/details/79281016
参考博客:https://www.jianshu.com/p/29b0fc835f27
-
先进入10.26.7.20服务器,修改my.cnf配置文件
-
重启数据库后,设置同步账号,并查看master status
CREATE USER 'wangfeng1'@'10.26.7.21' IDENTIFIED BY 'wangfeng123456'; GRANT REPLICATION SLAVE ON *.* TO 'wangfeng1'@'10.26.7.21'; CREATE USER 'wangfeng2'@'10.26.7.22' IDENTIFIED BY 'wangfeng123456'; GRANT REPLICATION SLAVE ON *.* TO 'wangfeng2'@'10.26.7.22'; flush privileges;
-
进入从服务器10.26.7.21,修改my.cnf配置文件
重启数据库,执行下面语句:change master to master_host='10.26.7.20', Master_port=3337, master_user='wangfeng1', master_password='wangfeng123456', master_log_file='master-bin.000005', master_log_pos=463; start slave;
查看slave状态,出现下图中两个yes就算成功
-
进入从服务器10.26.7.22,修改my.cnf配置文件
重启数据库,执行下面语句:change master to master_host='10.26.7.20', Master_port=3337, master_user='wangfeng2', master_password='wangfeng123456', master_log_file='master-bin.000005', master_log_pos=463; start slave;
查看slave状态,出现下图中两个yes就算成功
-
至此,配置完成,可以测试,在主数据库20上创建数据库和表,在从数据库21和22上可以同样看到。
二 mycat配置
mycat的配置主要是在10.26.7.21和10.26.7.22上,10.26.7.20作为物理数据库测试。
1,jdk安装
- 非root安装jdk,下载安装包解压,配置环境变量即可。
2,mycat安装
-
下载并解压Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz,得到mycat目录
-
进入mycat/conf目录中,执行命令vim server.xml,把下图注释部分去掉
这里改成0
这里用户和密码根据需要修改,我这里没有修改
-
执行命令vim schema.xml
这里面主要的几个位置是:
1)schema name=””对应server.xml文件user name=””中schemas的值。
2)dataNode database=””应是下面writeHost中实际地址所拥有的数据库名,并且要提前创建好。
3)writeHost 是实际数据库所在位置。 -
两台机器都配置好后,执行mycat start命令启动,mycat status查看mycat状态
-
之后就可以进行测试了,先在两台mycat上建好表,要和实际数据库表结构一样,然后在其中一台上插入数据,实际数据库和另一台mycat上都会查到相同的结果。
-
若是遇到错误java.rmi.server.exportexception: port already in use: 1984,通过修改mycat中wrapper.conf的端口号即可解决。
三 keepalived配置
- keepalived也是在21和22号机器上安装的。一开始使用源码包编译安装但没成功,后来使用yum,报错openssl找不到也是用yum安装即可解决;安装好后主要就是去/etc/keepalived/keepalived.conf文件中进行配置。
- 启动keepalived,查看vip,并先在服务端关闭MASTER服务看vip是否会浮动。
- 在用户层面直接连接虚拟ip进行数据库操作
- 然后断开MASTER服务,看外部数据库操作是否正常。
四 测试代码编写
测试代码部分主要使用java语言,mybatis框架,还有多线程技术实现。
该测试代码主要功能是通过多线程进行数据库的大量插入操作,同时有一个统计线程去统计每秒有多少次操作执行,另一个线程记录每次操作消耗多长时间,两个线程结果都写入各自的文件中,分别记录着每秒操作次数以及每次操作耗时。然后使用python进行可视化展示。上面介绍的mysql,mycat,以及keepalived的测试都是通过在该处的数据库配置文件中修改相关信息完成的。
- 工程结构如下所示
- mybatis配置文件和实体类
该工程中只有一个实体类Student,DMLCount和DMLTime为临界资源类,分别对应统计线程和日志线程。
Mybatis配置文件为mybatis-config.xml和StudentMapper.xml,分别是数据库映射配置和实体类操作映射配置:
- 工作线程,统计线程,日志线程
- 临界资源类,通过使用Synchronized进行同步
- 主函数,使用线程池开启多线程
- 运行程序,结果会写入logThread.txt和countThread.txt文件中
- 将logThread.txt文件拷贝到python程序目录下,执行python程序进行可视化,横轴是所有操作总次数,纵轴代表每次操作所耗费时间,从图中可以看出来0-100毫秒的操作占大多数,有少数操作会高于100毫秒。
总结
在大数据时代,用户量的扩大必然带来数据存储的问题,存储在一台机器上会存在很大的安全隐患,比如硬件问题,软件问题,以及自然因素,那么就有了数据库的备份,也就是主从复制,通过设置一些配置文件,可以让多个数据库间数据保持同步;有了多个数据库进行数据备份的同时,外界对数据库的调用又出现了困扰,为了避免用户对不同数据库进行冗余的操作,于是又出现了mycat中间件,mycat可以让用户在一台服务上同时对多个数据库进行操作,它可以做到分库分表,读写分离等功能;同样,只有一台mycat还是会有单点故障的问题,那么就需要有多台服务安装mycat,但同样也会引发一个问题,那就是用户的调用,为了保证用户调用的方便,便引入了keepalived;keepalived是一个能检测服务器状态的软件,其底层主要依赖VRRP即虚拟路由冗余协议,生成一个vip,并通过竞选机制实现vip在主备之间的浮动,这样外界用户只需要访问该虚拟ip即可,不需要访问多个不同的服务器,避免了用户对不同服务器数据库的访问操作。