最近为了增加公司服务的抗压能力,搭建了一套mysql的主从结构。目前这套服务只是最基本的一主一从结构,只是实现了最基本的读写分离功能,后期还需要大量的优化。这里把搭建过程记录下来,以备后续。
首先,先描述一下具体的实施步骤:
1.搭建mysql数据库
2.配置数据库热备份
3.配置mycat中间件
需要准备:
1:两台centos服务器
192.168.1.1
192.168.1.2
2:mysql5.6安装包
安装包下载地址
https://dev.mysql.com/downloads/mysql/
选择相应的安装包版本下载
3:jdk1.8
mycat运行需要jdk环境,所以首先要下载安装jdk
安装包下载地址
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
4:下载mycat
下载地址
http://www.mycat.io/
环境搭建:
一:安装mysql
1)检查安装环境
首先,需要确认服务器是是否安装有mysql
一般centsos7会自带一个Mariadb,需要先卸载掉
rpm -qa|grep mariadb #查看安装的包
rpm -e --nodeps 查询出的包名 #卸载安装包
删除etc目录下的my.cnf文件
rm /etc/my.cnf
检查mysql是否存在
rpm -qa | grep mysql
如果存在,卸载,如果不存在执行安装步骤
rpm -e --nodeps 查询出的包名 #卸载安装包
find / -name mysql 将查询出的相关信息
rm -rf 查询出的相关文件删除掉
2)安装mysql
将下载好的mysql包上传到192.168.1.1
解压
tar -zxvf 安装包名称
一般安装三个server client del
rpm -ivh 安装包名
按照上安装包名称依次安装,否则会缺少环境报错。
将初始配置文件copy一份到etc目录下
cp /usr/share/mysql/my-default.cnf /etc/my.cnf
分别运行下述命令,初始化MySQL及设置密码。
/usr/bin/mysql_install_db #初始化MySQL
service mysql start #启动MySQL
cat /root/.mysql_secret #查看root账号的初始密码
登录mysql,将cat/root/.mysql_secret 显示的密码输入
mysql -u root -p
修改密码
set password=password('123456');
退出mysql
exit;
设置mysql开机启动
chkconfig mysql on
chkconfig --list | grep mysql 查看打印出的mysql启动信息 2~5 位on表示已经设置为开机启动
重启mysql
service mysqld restart
按照上述配置重新配置另一台服务器
二:搭建数据库主从结构
1.给两个服务器分配新的mysql用户和权限等信息
主库:
mysql -u root -p #root用户登录
insert into mysql.user (host,user,password) values('%','test',PASSWORD('test')); #设置新的test用户
update user set password=password('test123') where user='test' #更新密码
创建新的数据库
create database test_db;
#给数据库赋权,允许本地和另一台ip为192.168.1.2的服务进行
grant all privileges on test_db.* to test@localhost identified by 'test1234';
grant all privileges on test_db.* to test@'192.168.1.2' identified by 'test1234';
flush privileges; #刷新数据库权限
按照上述描述配置另一个数据库
2.搭建读写分离
mysql读写分离,也叫热备份,是通过开启主库日志,从库读取主库日志来同步数据库操作。对数据库写的操作在主库进行,读的操作在从库进行。
主库配置:
修改配置文件信息 /etc/my.cnf
在[mysqld]下增加如下信息
#配置启动日志
log_bin = master-bin
log_bin_index = master-bin.index
#配置唯一标志
server-id = 1
#配置日志记录时间
expire_logs_days = 7
#日志最大空间
max_binlog_size = 100M
#若涉及及同步函数或者存储过程需要配置,否则主备会产生异常不能同步
log_bin_trust_function_creators = TRUE
#配置记录日志的数据库
binlog_do_db = test#需要备份数据,多个写多行,不写全部都备份
binlog_do_db = test2
binlog_ignore_db = information_schema
binlog_ignore_db = mysql
保存退出
重启mysql
mysqld service restart
登录账户赋权
mysql -u root -p
GRANT REPLICATION SLAVE ON test.* to 'test'@'%' identified by 'test1234';
flash privileges; #刷新权限
show master status; #查询主库配置信息
记录下file 和 position 的位置
从库:
#配置启动日志
relay-log = slave-relay-bin
relay-log-index = slave-relay-bin.index
#配置唯一标志
server-id = 2
#配置日志记录时间
expire_logs_days = 7
#日志最大空间
max_binlog_size = 100M
replicate-do-db = test #复制某个库
replicate-do-db = test2
replicate-ignore-db = information_schema #不复制某个库
replicate-ignore-db = mysql
保存退出
重启mysql
mysqld service restart
登录账户赋权
mysql -u root -pchange master to master_host='192.168.1.1',master_user='test',master_password='test123',master_log_file='主库file',master_log_pos=主库position;
start slave; #启动从库赋值功能
show slave satatus;#显示配置信息
Slave_IO_Running: Yes Slave_SQL_Running: Yes 两个状态为yes表示配置成功
登录navicat查看检验功能的实现。
三:配置jdk1.8
mycatt需要jdk作为运行环境,首先查看是否有安装jdk
java -version
如果没有将,jdk上传到服务器
tar -zxvf 安装包名称 #解压tar包
vi /etc/profile
在profile中添加如下内容:
#set java environment
JAVA_HOME=/usr/java/jdk1.8.0_79
JRE_HOME=/usr/java/jdk1.8.0_79/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
让修改文件生效
source /etc/profile
java -version
四:配置mycat作为中间件
mycat作为一个中间件,提供了类似于nignx的功能,将负载通过配置自动分发到不同的数据库,javaweb可以之间jdbc连接替换为mycat。
mycat配置文件有很多,这里只做一个最简单的配置,主要配置server.xml和schema.xml
首先配置server.xml
server.xml中主要配置了一些登录信息,记录了登录用户名密码和数据源等参数
<user name="test">
<property name="password">test123</property>
<property name="schemas">testdb</property>
<property name="readOnly">false</property>
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<user name="test2">
<property name="password">test2345</property>
<property name="schemas">testdb2</property>
<property name="readOnly">false</property>
</user>
然后配置schema.xml,schema.xml中配置一些数据库的连接属性和一些读写特性,初始的文件十分复杂,这里只把修改后的文件给贴出来
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 业务逻辑库 -->
<schema name="testdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>
<schema name="testdb2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"></schema>
<!-- 业务分片 -->
<dataNode name="dn1" dataHost="localhost1" database="testdb" />
<dataNode name="dn2" dataHost="localhost2" database="testdb2" />
<!--
balance:
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
2. balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,
并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
3. balance="2",所有读操作都随机的在writeHost、readhost上分发。
4. balance="3",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力
switchType: 指的是切换的模式,目前的取值也有4种:
1. switchType='-1' 表示不自动切换
2. switchType='1' 默认值,表示自动切换
3. switchType='2' 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status
4. switchType='3'基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like 'wsrep%'。
writeType:
writeType="0",所有的操作发送到配置的第一个writehost
writeType="1",随机发送到配置的所有writehost
writeType="2",不执行写操作
-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.1.1:3306" user="test"
password="test123">
<!-- can have multi read hosts -->
<readHost host="hostS1" url="192.168.1.2:3306" user="test" password="test123"/>
</writeHost>
</dataHost>
<dataHost name="localhost2" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM2" url="192.168.1.1:3306" user="test2"
password="test2345">
<!-- can have multi read hosts -->
<readHost host="hostS2" url="192.168.1.2:3306" user="test2" password="test2345"/>
</writeHost>
</dataHost>
</mycat:schema>
至此,简单的javaweb读写分离搭建完成,其中一些数据库的用户名密码有些不对,需要根据实际情况自行修改设计。
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。