06linux基础服务-MySQL读写分离
Posted hackerlin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了06linux基础服务-MySQL读写分离相关的知识,希望对你有一定的参考价值。
1、读写分离概述
mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,有单台MySQL作为独立的数据库时完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。因此,一般来说都是通过主从复制(master-slave)的方式来同步数据,再通过读写分离来提示数据库的并发负载能力,这样的方案来进行部署与实施的
2、读写分离工作原理
基本的原理是让主数据库处理事务性增、改、删操作,而从数据库处理查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
3、实现读写分离的方式:
1)应用程序层实现,网站的程序实现。应用程序层实现指的是子应用程序内部及连接器中实现读写分离
2)中间层实现,中间层实现是指在外部中间件程序实现读写分离。常用的中间件程序有:
Cobar:阿里巴巴B2B开发的关系型分布式系统,管理奖金3000个MySQL实例。在阿里经受住了考验,后面由于作者的走开的原因cobar没有人维护了,阿里也开发了tddl代替cobar
MyCAT:社区爱好者在阿里cobar基础上进行二次开发,解决了cobar当时存在的一些问题,并且加入了许多新的功能在其中。目前mycat社区活跃度很高,目前已经有一些公司在使用mycat。总体来说支持度比较高,也会一直维护辖区
oneproxy:数据库界大牛,前支付宝数据库团队领导楼总开发,基于mysql官方 的proxy思想利用c进行开发的,OneProxy是一款商业收费的中间件, 楼总舍去了一些功能点,专注在性能和稳定性上。有朋友测试过说在 高并发下很稳定。
Vitess:这个中间件是Youtube生产在使用的,但是架构很复杂。 与以往中间件不同,使用Vitess应用改动比较大要 使用他提供语言的API接口,我们可以借鉴他其中的一些设计思想。
Kingshard:Kingshard是前360Atlas中间件开发团队的陈菲利用业务时间 用go语言开发的,目前参与开发的人员有3个左右, 目前来看还不是成熟可以使用的产品,需要在不断完善。
Atlas:360团队基于mysql proxy 把lua用C改写。原有版本是支持分表, 目前已经放出了分库分表版本。在网上看到一些朋友经常说在高并 发下会经常挂掉,如果大家要使用需要提前做好测试。
MaxScale与MySQL Route:这两个中间件都算是官方的吧,MaxScale是mariadb (MySQL原作者维护的一个版本)研发的,目前版本不支持分库分表。MySQL Route是现在MySQL官方Oracle公司发布出来的一个中间件。
4、实验环境的准备
准备三台linux虚拟机,一台作为中间件安装mycat(Ip:192.168.204.130),一台作为数据库的master(Ip:192.168.204.128),一台作为数据库的slave(Ip:192.168.204.129)
5、配置安装mycat
mycat有提供编译好的安装包,支持Windows、Linux、Mac、Solaris等系统上安装与运行,官网地址http://www/mycat.lo
linux下可以下载Mycat-server-xxxxx.linux.tar.gz 解压在某个目录下,注意目录不能有空格,在Linux(Unix)下,建议放在usr/local/Mycat目录下,如下:
创建一个mycat用户来管理mycat服务,并给刚刚解压的mycat文件修改属主属组,并创建mycat用户的密码为123456
[root@mycat src]# useradd mycat
[root@mycat src]# chown mycat:mycat /usr/local/mycat/ -R
[root@mycat src]# pa
packer parted paste
pam_console_apply partprobe pathchk
pam_tally2 partx
pam_timestamp_check passwd
[root@mycat src]# pas
passwd paste
[root@mycat src]# passwd mycat
更改用户 mycat 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
目录解释如下:
bin 程序目录,存放了window版本和linux版本,处理提供封装成服务的版本之外,也提供了nowrap的shell脚本命令,方便大家选择和修改
conf目录下存放配置文件,server.xml是mycat服务器参数调整和用户授权的配置文件,schema.xml是逻辑库定义和表以及分片定义的配置文件,rule.xml是分片规则的配置文件,分别规则的具体一些参数信息单独存放为文件,也在这个目录下,配置文件修改,需要重启mycat或者通过9066端口reload
lib目录下主要存放mycat依赖的一些jar文件
日志放在logs/mycat.log中,每天一个文件,日志的配置是在conf/log4j.xml中,根据自己的需要,可以调整输出基本为debut,debut级别下,会输出更多的信息,方便查询问题
注意:linux下部署安装MySQL,默认不忽略表名大小写,需要手动到/etc/my.cnf下配置lower_case_table_names=1 使linux环境下MySQL忽略表名大小写,否则使用mycat的时候会提示找不到表的错误
mycat需要安装jdl1.7或者以上版本
第一步:下载jdk-8u221-linux-x64.tar.gz文件
第二步:新建/usr/java文件夹,将jdk-8u221-linux-x64.tar.gz放到改文件中,并解压到当前目录下
第三步:配置环境变量在/etc/profile底部加入如下内容
JAVA_HOME=/usr/java/jdk1.8.0_221
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
第四步:重新加载profile文件,使环境变量生效
[root@mycat java]# source /etc/profile
mycat在linux中部署启动时,首先需要再linux系统的环境变量中配置MYCAT_HOME,操作方法如下
第一步:vim /etc/profile ,在系统环境变量文件中增加如下内容
MYCAT_HOME=/usr/local/mycat
PATH=$MYCAT_HOME/bin:$PATH
第二步:source /etc/profile命令,是环境变量生效
[root@mycat java]# source /etc/profile
如果是在多台Linux系统中组建的MyCAT集群,那需要在MyCAT Server所在的服务器上配置对其他ip和主机名的映射,配置方式如下:
vi /etc/hosts
例如:我有3台机器,配置如下:
IP 主机名:
192.168.204.128 master.cn
192.168.204.129 slave.cn
192.168.204.130 mycat.cn
编辑完后,保存文件。
mycat的用户账号和授权信息在conf/server.xml文件中配置
[root@mycat java]# vim /usr/local/mycat/conf/server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="defaultSqlParser">druidparser</property> <!-- 1为开启实时统计、0为关闭 -->
</system>
<user name="root">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
</mycat:server>
编辑mycat的配置文件schema.xml,关于dataHost的配置信息如下:
[root@mycat java]# vim /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode=‘dn1‘>
</schema>
<dataNode name="dn1" dataHost="dthost" database="ha"/>
<dataHost name="dthost" maxCon="500" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="master.cn" url="192.168.204.128:3306" user="root" password="123456">
</writeHost>
<writeHost host="slave.cn" url="192.168.204.129:3306" user="root" password="123456" />
</dataHost>
</mycat:schema>
有两个参数需要注意,balance和switchtype
其中balance值的负载均衡类型,目前的取值有4中
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%‘。
经过以上两个步骤的配置,就可以到/usr/local/mycat/bin 目录下执行:
./mycat start
即可启动mycat服务!。至此mycat服务器也就配置完成了。
6、配置MySQL主从
由于通过yum安装只能安装mariadb,所以我这里为了方便都使用mariadb,使用编译安装MySQL也可以。
[root@slave ~]# yum -y install mariadb mariadb-server
6.1 配置master
编辑my.cnf配置文件
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-bin=mysql-bin-master #启用二进制文件
server-id=1 #本机数据库ID标示
binlog-do-db=TESTDB #可以被从服务器复制的库,二进制需要同步的数据库名
binlog-ignore-db-mysql #不可以被从服务器复制的库
lower_case_table_names=1 #配置mysql忽略表名大小写,mycat需要
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d
启动服务
[root@master ~]# systemctl start mariadb
创建一个数据路TESTDB
MariaDB [(none)]> create database TESTDB;
Query OK, 1 row affected (0.01 sec)
MariaDB [(none)]> use TESTDB;
Database changed
MariaDB [TESTDB]> create table T1(id int,name varchar(20));
Query OK, 0 rows affected (0.01 sec)
MariaDB [TESTDB]> grant replication slave on *.* to slave@192.168.204.129 identi fied by ‘123456‘; #授权登录
Query OK, 0 rows affected (0.00 sec)
MariaDB [TESTDB]> show master status; #查看master状态
+-------------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------------+----------+--------------+------------------+
| mysql-bin-master.000003 | 596 | TESTDB | mysql |
+-------------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
6.2 配置slave
编辑配置文件
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
server-id=2
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
master-host=192.168.204.128
master-user=slave
master-password=123456
master-port=3306
master-connect-retry=60
!includedir /etc/my.cnf.d
启动服务[root@salve ~]# systemctl start mariadb
MariaDB [(none)]> stop slave #先停止slave
-> ;
Query OK, 0 rows affected, 1 warning (0.00 sec)
MariaDB [(none)]> change master to master_host=‘192.168.204.128‘,master_user=‘slave‘,master_password=‘123456‘; #连接主服务器
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> start slave; #启动slave
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> show slave status\\G #查看slave状态,出现两个yes,则表示成功了,可以查看数据库TESTDB是否同步
7、配置主从服务器连接mycat
7.1授权主服务器mycat用户登录
MariaDB [(none)]> grant all on *.* to mycat@192.168.204.130 identified by ‘123456‘;
Query OK, 0 rows affected (0.01 sec)
7.2授权从服务器mycat用户登录
MariaDB [(none)]> grant all on *.* to mycat@192.168.204.130 identified by ‘123456‘;
Query OK, 0 rows affected (0.01 sec)
8、测试客户端连接mycat服务器,看是否成功。并测试主从服务器分别宕机之后的结果
以上是关于06linux基础服务-MySQL读写分离的主要内容,如果未能解决你的问题,请参考以下文章
Linux 使用Mycat实现读写分离(基于Mysql的读写分离)
Linux云计算-使用 MyCat 实现 MySQL 主从读写分离
Database基础:实现MySQL读写分离MySQL性能调优