MySQL读写分离

工作原理

主数据库处理事务性增、删、改操作
从数据路处理select查询操作

为什么要读写分离

面对越来越大的访问压力,单台的服务器的性能成为瓶颈,需要分担负载

主从只负责各自的写和读,极大程度的缓解X锁和S锁争用
从库可配置myisam引擎,提升查询性能以及节约系统开销
增加冗余,提高可用性

实现方式

应用程序实现

优点:
A:应用程序内部实现读写分离,安装既可以使用
B:减少一定部署难度
C:性能很好
缺点:
A:架构一旦调整,代码要跟着变
B:难以实现高级应用,如自动分库,分表
C:无法适用大型应用场景

中间件实现

优点:
A:架构设计更灵活
B:可以在程序上实现一些高级控制,如:透明化水平拆分,failover,监控
C:可以依靠些技术手段提高mysql性能,
D:对业务代码的影响小,同时也安全
缺点:
需要一定的开发运维团队的支持

mycat

 一个彻底开源的,面向企业应用开发的大数据库集群

• 支持事务、ACID、可以替代MySQL的加强版数据库
• 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
• 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
• 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品

服务安装与配置

实验环境

192.168.13.14 master
192.168.13.13 slave1
192.168.13.34 slave2
192.168.13.19 mycat

设置主从

四台机器同步时间
在mycat配置ntp服务,为其他三台服务器提供时间校对服务
[root@haha ~]# yum -y install ntp

[root@haha ~]# vim /etc/ntp.conf
##添加下面两行配置
server 127.127.1.0
fudge 127.127.1.0 stratum 8

[root@haha ~]# systemctl start ntpd
[root@haha ~]# systemctl enable ntpd

其他服务器
[root@haha ~]# yum -y install ntpdate
[root@haha ~]# /usr/sbin/ntpdate 192.168.13.19

四台机器hosts绑定
[root@haha ~]# vim /etc/hosts
192.168.13.19 mycat
192.168.13.14 master
192.168.13.13 slave1
192.168.13.34 slave2

授权用户
mysql> grant replication slave on *.* to 'slave'@'192.168.13.%'  identified by "123"; 
mysql> flush privileges;

配置文件
[root@haha ~]# vim /etc/my.cnf
server-id=1
log-bin=/data/mysql/log/mysql-bin-master
binlog-do-db=haha
sync-binlog=1  ##每一次binlog写入,就同步内容至硬盘
binlog-format=mixed  ##二进制格式
systemctl restart mysqld

主库设置只读锁
mysql> flush tables with read lock;
mysql> flush privileges;

导出数据
[root@haha ~]# mysqldump -uroot -p123456 -B haha>haha.sql

传输数据
[root@haha ~]# scp haha.sql root@192.168.13.13:~
[root@haha ~]# scp haha.sql root@192.168.13.34:~

导入数据
[root@haha ~]# mysql -uroot -p123456 < haha.sql 

配置文件
[root@haha ~]# vim /etc/my.cnf
server-id=2
relay-log=/data/mysql/log/relay-log-bin
relay-log-index=/data/mysql/log/slave-relay-bin.index
replicate-do-db=haha ##只复制指定的库
#replicate-ignore-db=mysql ##不复制的库

[root@haha ~]# systemctl restart mysqld

从库配置
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> change master to master_host="192.168.13.14",master_user="slave",master_password="123456",master_log_file="mysql-bin-master.000001",master_log_pos=1530;Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G
 		Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

解除锁定
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

验证
mysql> insert into haha.test values(2,"zex");
Query OK, 1 row affected (0.00 sec)

mysql> select * from haha.test;
+------+------+
| id   | name |
+------+------+
|    1 | chm  |
|    2 | zex  |
+------+------+
2 rows in set (0.00 sec)
##不解锁,是不能同步的

准备安装包

http://www.mycat.io
rz上传安装包

解压
[root@mycat ~]# tar -zxvf Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz -C /usr/local

[root@mycat ~]# cd /usr/local/mycat/

[root@mycat ~]#  tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local

配置jdk环境变量

[root@mycat ~]# vim /etc/profile
JAVE_HOME=/usr/local/jdk1.8.0_171
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVE_HOME CLASSPATH

[root@mycat ~]# source /etc/profile

查看java环境
[root@mycat ~]# java -version

服务启动与启动设置

配置mycat环境变量
[root@mycat ~]# vim /etc/profile
PATH=$PATH:/usr/local/mycat/bin

[root@mycat ~]# source /etc/profile

配置mycat的连接信息(账号密码):
[root@mycat ~]# cd /usr/loca/mycat/conf
[root@mycat ~]# cp server.xml server.xml.bak
[root@mycat ~]# vim server.xml
<user name="mycatroot" defaultAccount="true">
##name=连接mycat的账号

<property name="passwod">123</property>
##password=密码
<property name="schemas">haha</property>
##schemas=对应数据库读写分离配置文件,<schems>中设置的名称

</user>

 <user name="mycatreadonly">
 	<property name="password">123</property>
  	<property name="schemas">haha</property>
  	<property name="readOnly">true</property>
</user>
##只读权限账号(其余同上)

[root@mycat ~]# cd /usr/local/mycat/conf
[root@mycat ~]# cp schema.xml schema.xml.bak

[root@mycat ~]# vim schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

<schema name="haha" checkSQLschema="false" sqlMaxLimit="100" data
Node="dn1"></schema>
<dataNode name="dn1" dataHost="dh1" database="haha" />
<dataHost name="dh1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>

<writeHost host="master" url="192.168.13.14:3306" user="root" password="123" />
<writeHost host="slave1" url="192.168.13.13:3306" user="root" password="123" />
<writeHost host="slave2" url="192.168.13.34:3306" user="root" password="123" />
</dataHost>
</mycat:schema>
##balance=1”除了第一个writehost,随机读其他的writehost,因为writetype=0”,写操作发给了第一个writehost,如过switchtype设置为“1”或者“2”,第一个writehost宕机后,自动的把写操作写入第二个writehost,只读第三个writehost,这时候第二个writehost并不会同步数据到第三个writehost,所以查不到数据,使用高可用架构解决此问题


给所有MySQL root 远程登录权限
所有的数据库都执行操作
mysql> grant all on *.* to root@'192.168.13.%' identified by '123456';
mysql> flush privileges;

启动mycat服务
mycat console  
##先使用console进行检测

出现successfully后,ctrl+c退出

[root@mycat ~]# mycat start
##mycat支持的命令{ console | start | stop | restart | status | dump }

检测端口8066
[root@mycat ~]# netstat -antup | grep 8066
##如果没有端口,查看/usr/local/mycat/logs/mycat.log里的日志

# 连接mycat
## 使用mycatroot账号登录
````c
[root@mycat ~]# yum -y install mysql 
##安装mysql客户端命令

[root@mycat ~]# mysql -u mycatroot -p123456 -h 192.168.13.19 -P 8066

MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| haha     |
+----------+

MySQL [(none)]> use haha;

MySQL [haha]> select * from test;
+------+------+
| id   | name |
+------+------+
|    1 | chm  |
|    2 | zex  |
+------+------+

MySQL [haha]> insert into test values(3,"haha");
Query OK, 1 row affected (0.04 sec)
mysql> select * from haha.test;
+------+------+
| id   | name |
+------+------+
|    1 | chm  |
|    2 | zex  |
|    3 | haha |
+------+------+
##测试写,可以插入数据,因为从库会同步数据,在从库查看,发现插入数据是成功的

mysql> insert into test values(4,"13.13");
mysql> insert into test values(5,"13.34");
##测试读,插入不同数据到从库中,因为主库没有,所以可以随机查看到两个从库的内容,就说明读是从从库读来的

MySQL [haha]> select * from test;
+------+--------+
| id   | name   |
+------+--------+
|    1 | chm    |
|    2 | zex    |
|    3 | haha   |
|   11 | slave1 |
+------+--------+
##从13.13中读的

MySQL [haha]> select * from test;
+------+--------+
| id   | name   |
+------+--------+
|    1 | chm    |
|    2 | zex    |
|    3 | haha   |
|   12 | slave2 |
+------+--------+
##从13.34中读的

使用mycatonly账号登录

使用mycatonly只读账号登陆测试是否有写权限
mysql -umycatreadonly -p123 -h 192.168.13.19 -P8066

MySQL [(none)]> use haha

MySQL [haha]> insert into test values(19,"test");
ERROR 1495 (HY000): User readonly
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值