背景
眼看还有一天多这个月就过去了,这个月还没有产出博客。坚持这么久,不能就这样放弃了。最近在部署一个应用,需要用mycat做读写分离,成热打铁,学了点mycat的皮毛。马上操刀!
前期准备
- 三台机器为192.168.1.133, 192.168.1.134, 192.168.1.135,133为mycat服务器,134为master,135为slave
- 三台机器都安装mysql8
- 134和135同时创建fucker数据库,并导入数据。
- 134创建fucker_master用户,135创建fucker_slave用户,并授予该有的权限,比如fucker_master允许创建数据库,主从复制等待。
配置MySQL主从复制
主从复制的原理:主库每次增删改操作,会产生二进制日志binlog,从库的IOthread轮询binlog,将binlog的操作写入中继日志relaylog中,Sqlthread轮询relaylog并进行一系列的sql操作。
主节点设置
mysql配置文件配置
vim /etc/my.cnf
server_id=134
log_bin=fucker_binlog
binlog-do-db=fucker
重启mysql服务
service mysqld restart
登录mysql
mysql -ufucker_master -pP@ssword123
查看主节点状态
show master status;
从节点设置
配置mysql配置文件
vim /etc/my.cnf
server_id=135
relay_log=fucker_relaylog
relay_log_index=fucker_relaylog.index
read_only=1
replicate-do-db=fucker
由于slave实例是从master复制过来的,server_uuid相同,而这个配置在auto.cnf上,删除即可(谨慎操作,注意备份)
rm -rf /var/lib/mysql/auto.cnf
重启mysql服务
service mysqld restart
登录mysql
mysql -uroot -pP@ssword123
change master to
master_host='192.168.157.134',master_port=3306,master_user='fucker_master',master_password='P@ssword123',master_log_file='fucker_binlog',master_log_pos=0;
开启从节点
# stop和reset在出问题的时候可以试下
# stop slave;
# reset slave;
start slave;
查看从节点的状态,注意看Slave_IO_Running和Slave_SQL_Running是否为YES,再看看有没有报错信息
show slave status\G;
如果发现错误导致sql线程中断,这个错误又无伤大雅,可以选中跳过一个错误
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
测试
master库改数据,看slave库是否同步更新
可能有用的命令
# 测试是否能连通master
mysql -ufucker_master -h 192.168.157.134 -pP@ssword123 -P3306
# 查看server_id
SHOW VARIABLES LIKE '%server%id%';
# 查看log
show variables like 'relay%';
配置mycat读写分离
安装mycat
在官网下载mycat压缩包,在133解压,并进入mycat目录
cd /develop/server/mycat
配置server.xml
这里是配置逻辑库的连接,对于逻辑库,我的理解是,逻辑库由多个物理库组成。应用通过连接逻辑库可以访问多个物理库节点,类似于在应用和数据库之间加一个中介。
<user name="my_cat_user">
<property name="password">root</property>
<property name="schemas">my_cat_fucker</property>
</user>
配置schema.xml
主要是配置逻辑库,以及对应哪些物理库
<schema name="my_cat_fucker" checkSQLschema="false" sqlMaxLimit="100" dataNode="myDataNode">
</schema>
<dataNode name="myDataNode" dataHost="myDataHost" database="master_slaver_db">
</dataNode>
<dataHost name="myDataHost" maxCon="1000" minCon="10"
balance="0" writeType="0" dbType="mysql" dbDriver="native"
switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="myWriteHost" url="192.168.1.134:3306" user="fucker_master" password="P@ssword123">
<readHost host="myReadHost" url="192.168.1.135:3306" user="root" password="P@ssword123"/>
</writeHost>
</dataHost>
总结
以前江湖上经常流传读写分离、分库分表等各种高大上名词,一次一次的吓走了我,其实如果接触了这些技术,就会觉得非常合理。就像当初接触redis一样,现在反而觉得不用缓存的应用根本不敢写。分表的实践以后有时间再补上。