一、Mysql的读写分离和高可用
1.读写分离
在开发工作中,有时候会遇见某个sql 语句需要锁表,导致暂时不能使用读的服务,这样就会影响现有业务,使用主从复制,让主库负责写,从库负责读,这样即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。
2. mysql的高可用
高可用对于互联网应用基本上是标配,目的是最大程度的为用户提供服务,避免因为服务器宕机等意外故障而终止服务。相比于无状态服务(如前后端应用),数据库服务的高可用问题更为复杂,不仅仅是能访问,更需要保证其数据的正确性。
在考虑数据库高可用架构时,需要考虑以下问题:
- 数据库服务器如果发生宕机或者意外中断等故障,能够尽快恢复数据库服务的可用性,减少停机时间
- 用作备份、只读副本等功能的非主节点应该与主节点的数据实时或者最终保持一致
- 当业务发生数据库切换时,切换前后的数据库内容应当一致,不会因为数据缺失或者数据不一致而影响业务
二、解决Mysql中数据不同步的问题
如果我们的数据库出现数据不同步导致的组复制的失败,我们可以先将需要备份的结点中的数据进行备份,关闭组复制,重置master和slave,将之前备份的数据库信息导入该结点的数据库中,然后在执行相关组复制的操作,这样就解决了数据不同步导致的组复制失败的问题(其他复制操作步骤类似)
mysqldump --all-databases --single-transaction --routines --events --host=127.0.0.1 --port=3306 --user=root --password=Jiang+123 > dbdump.db #数据库备份
scp dbdump.db server2: #将备份拷贝到server2的家目录中
stop group_replication #关闭组复制
reset master; #重置master
reset slave; #重置slave
mysql -p < dbdump.db
备份完成后,执行相应的开启组复制操作(其他复制执行相关复制的操作即可)
三、Mysql的读写分离
实验准备:
server1和server2要实现基于gtid的主从复制,具体细节可以参考上一篇文章
- 一台主数据库server1(172.25.65.1)
- 一台从数据库server2(172.25.65.2)
- 一台管理读写分离的server3(172.25.65.3)
- 一台测试机
1. 在server1和server2中操作,实现gtid主从复制(具体操作见上一篇博客)
vim /etc/my.cnf
server_id=1
log-bin=mysql-bin #server2中没有该参数
gtid_mode=ON
enforce-gtid-consistency=true
systemctl start mysqld
cat /var/log/mysqld.log | grep password #查看随机密码
mysql -uroot -p #通过随机密码登录
alter user root@localhost identified by 'Jiang+123'; #修改密码
server1中创建,用于提供复制数据的用户
CREATE USER 'repl'@'172.25.65.%' IDENTIFIED BY 'Jiang+123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.25.65.%';
flush privileges;
show master status;
server2中设置从结点
CHANGE MASTER TO
MASTER_HOST='172.25.65.1',
MASTER_USER='repl',
MASTER_PASSWORD='Jiang+123',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=1432;
start slave;
show slave status\G #io线程和sql线程为yes则表明从结点设置成功
2. server3中进行如下操作
在server3中下载mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz压缩包,目前之有版本6的,可以在版本7中使用,注意如果之前在server3中做过mysql实验,需要关闭mysqld,不然mysql的3306端口会与mysql-proxy的3306端口冲突
解压软件包,手动编写mysql-proxy配置文件
tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz -C /usr/local #解压到指定目录
cd /usr/local
mv mysql-proxy-0.8.5-linux-el6-x86-64bit mysql-proxy #重命名,方便管理
cd mysql-proxy/
mkdir conf #创建配置文件目录
mkdir log #创建日志文件目录
vim conf/mysql-proxy.conf #编写配置文件
[mysql-proxy]
proxy-address=0.0.0.0:3306 #监听本机中所有IP的端口。
proxy-backend-addresses=172.25.65.1:3306 #进行写的数据库server1
proxy-read-only-backend-addresses=172.25.65.2:3306
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
pid-file=/usr/local/mysql-proxy/log/mysql-proxy.pid #pid文件
log-file=/usr/local/mysql-proxy/log/mysql-proxy.log #生成日志文件
plugins=proxy #proxy插件
log-level=debug #日志等级为debug
keepalive=true #心跳检测
daemon=true #守护进程
修改lua脚本,默认超过4个连接才会启用读写分离,改为超过2个连接启用读写分离
vim /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
min_idle_connections = 1,
max_idle_connections = 2,
启动mysql-proxy
在启动前我们需要为配置文件加上660权限,没有修改权限,则会报错
chmod 660 ./conf/mysql-proxy.conf
/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf #启动mysql-proxy
ps aux |