一、MySQL主从复制
1、服务性能扩展方式
2、MySQL的扩展
2.1、读写分离
2.2、复制
每个节点都有相同的数据集,向外扩展,基于二进制日志的单向复制
- 数据分布
- 负载均衡读操作
- 备份
- 高可用和故障切换
- MySQL升级测试
2.3、主从复制与读写分离
在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似于rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库中的数据、语句做备份。
3、主从复制原理 重要
3.1、主从复制相关线程
3.2、 跟复制功能相关的文件:
3.3、MySQL 主从复制延迟
- master服务器高并发,形成大量事务
- 网络延迟
- 主从硬件设备导致
cpu主频、内存io、硬盘io - 本来就不是同步复制、而是异步复制
从库优化Mysql参数。比如增大innodb_buffer_pool_size,让更多操作在Mysql内存中完成,减少磁盘操作。
从库使用高性能主机。包括cpu强悍、内存加大。避免使用虚拟云主机,使用物理主机,这样提升了i/o面性。
从库使用SSD磁盘
网络优化,避免跨机房实现同步
二、实际操作
1.环境配置
2.初始环境准备
systemctl stop firewalld setenforce 0 3.搭建时间同步:
3.1 主服务器设置
[root@master ~]# yum install ntp -y [root@master ~]# vim /etc/ntp.conf 
改成

[root@master ~]# service ntpd start Redirecting to /bin/systemctl start ntpd.service
3.2 从服务器设置
[root@localhost mysql]# yum install ntpdate -y [root@localhost mysql]# service ntpd start Redirecting to /bin/systemctl start ntpd.service [root@localhost mysql]# /usr/sbin/ntpdate 192.168.133.75 4 Dec 22:27:16 ntpdate[60067]: the NTP socket is in use, exiting [root@localhost mysql]# crontab -e no crontab for root - using an empty one crontab: installing new crontab

[root@localhost mysql]# systemctl start crond
4.配置主从
4.1 主服务配置
[root@master ~]# vim /etc/my.cnf

[root@master ~]# systemctl restart mysqld.service [root@master ~]# mysql -uroot -pzy44123 (root@localhost) [(none)]> grant replication slave on *.* to 'zy'@'192.168.133.%' identified by ''; Query OK, 0 rows affected, 1 warning (0.00 sec) (root@localhost) [(none)]> flush privileges; Query OK, 0 rows affected (0.00 sec) (root@localhost) [hellodb]> show master status;

4.2从服务器配置
[root@localhost mysql]# vim /etc/my.cnf

id号按主从顺序依次类推
[root@localhost mysql]# systemctl restart mysqld.service [root@localhost mysql]# mysql -uroot -p
(root@localhost) [(none)]> help change master to
(root@localhost) [(none)]> change master to master_host='192.168.133.75',master_user='zy',master_password='',master_log_file='mysqlbk-binter_lo.000002',master_log_pos=10882; Query OK, 0 rows affected, 2 warnings (0.01 sec) (root@localhost) [(none)]> start slave; 开启从服务功能 Query OK, 0 rows affected (0.00 sec) (root@localhost) [(none)]> show slave status\G

验证
查看主服务器上现有数据库

新建一个数据库
(root@localhost) [hellodb]> create database class; Query OK, 1 row affected (0.00 sec)
5、搭建Amoeba 实现读写分离
5.1、安装 Java 环境
因为 Amoeba 基于是 jdk1.5 开发的,所以官方推荐使用 jdk1.5 或 1.6 版本,高版本不建议使用。
[root@localhost ~]# systemctl stop firewalld.service [root@localhost ~]# setenforce 0 [root@localhost ~]# cd /opt
[root@localhost opt]# cp jdk-6u14-linux-x64.bin /usr/local/ [root@localhost opt]# chmod +x /usr/local/jdk-6u14-linux-x64.bin [root@localhost opt]# cd /usr/local/ [root@localhost local]# ./jdk-6u14-linux-x64.bin
[root@localhost local]# mv jdk1.6.0_14/ jdk1.6 [root@localhost local]# vim /etc/profile export JAVA_HOME=/usr/local/jdk1.6 export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin export AMOEBA_HOME=/usr/local/amoeba export PATH=$PATH:$AMOEBA_HOME/bin
[root@localhost local]# source /etc/profile
5.2、安装amoeba
[root@localhost local]# mkdir /usr/local/amoeba [root@localhost local]# cd /opt [root@localhost opt]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba [root@localhost opt]# chmod -R 755 /usr/local/amoeba/ [root@localhost opt]# /usr/local/amoeba/bin/amoeba

5.3、配置 Amoeba读写分离,两个 Slave 读负载均衡
#先在Master、Slave1、Slave2 的mysql上开放权限给 Amoeba 访问
grant all on *.* to test@'192.168.133.%' identified by ''; flush privileges;
5.4、修改amoeba配置
[root@localhost opt]# cd /usr/local/amoeba/conf/ [root@localhost conf]# cp amoeba.xml amoeba.xml.bak [root@localhost conf]# vim amoeba.xml

改成


改成

[root@localhost conf]# vim dbServers.xm

注释




上下2行删除,添加密码


改name=master 并改成主服务器地址





[root@localhost conf]#amoeba start & #开启服务

可通过查询端口或者服务看是否配置成功


这时开启客户机
客户机上装有mysql
并且关闭防火墙
[root@localhost mysql]# mysql -uamoeba -p -h 192.168.133.136 -P8066 用户名 密码 Amoeba服务器地址 端口号

5.5、测试读写分离
先关闭从服务器上的从的功能
(root@localhost) [(none)]> stop slave; Query OK, 0 rows affected (0.00 sec)
5.6、测试写的能力
(root@localhost) [class]> set global general_log=1; Query OK, 0 rows affected (0.00 sec)
三、中间件mycat
1、应用场景
2、优势
3、模拟架构
3.1、环境配置
3.2、主mysql服务器配置
[root@localhost ~]#vim /etc/my.cnf
检查是否有以下命令,如没有请添加
server-id = 1 log-bin=master-bin binlog_format=MIXED log-slave-updates=true
进入数据库
grant replication slave on *.* to 'zy'@'192.168.133.%' identified by ''; flush privileges; show master status;

3.3 mysql从服务器配置
[root@localhost ~]#vim /etc/my.cnf
检查是否有以下命令,没有请添加
server-id = 2 relay-log=relay-log-bin relay-log-index=slave-relay-bin.index
[root@localhost ~]# systemctl restart mysqld.service [root@localhost ~]#mysql -uroot -p
(root@localhost) [(none)]> change master to master_host='192.168.133.75',master_user='zy',master_password='',master_log_file='mysqlbk-bin.000002',master_log_pos=599; Query OK, 0 rows affected, 2 warnings (0.01 sec) (root@localhost) [(none)]> start slave; Query OK, 0 rows affected (0.00 sec) (root@localhost) [(none)]> show slave status\G

3.4、安装mycat服务器主机
[root@localhost ~]# systemctl stop firewalld.service [root@localhost ~]# setenforce 0 [root@localhost ~]# yum install java -y [root@localhost ~]# mkdir /apps [root@localhost ~]# wget http://dl.mycat.org.cn/1.6.7.6/759/Mycat-server-1.6.7.6-release-759-linux.tar.gz 可能有更高版本,不过这个版本可以做成功 [root@localhost ~]# tar zxvf Mycat-server-1.6.7.6-release-759-linux.tar.gz -C /apps/ [root@localhost ~]# echo 'PATH=/apps/mycat/bin:$PATH' > /etc/profile.d/mycat.sh [root@localhost ~]# source /etc/profile.d/mycat.sh [root@localhost ~]# mycat start Starting Mycat-server...
[root@localhost ~]# ll /apps/mycat/logs/ [root@localhost ~]# tail -f /apps/mycat/logs/wrapper.log


3.5、第一次在客户机上测试
[root@localhost mysql]# mysql -uroot -p -h 192.168.133.25 -P8066 这里密码初始为 需要加端口
3.6、修改 mycat 配置文件
[root@localhost ~]# vim /apps/mycat/conf/server.xml

改

50行左右修改删除


110行这里因为试验我们暂时不改,实际环境中还是要改的

[root@localhost conf]# vim 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> <dataNode name="dn1" dataHost="localhost1" database="hellodb" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host1" url="192.168.133.75:3306" user="root" password=""> <readHost host="host2" url="192.168.133.50:3306" user="root" password=""/> </writeHost> </dataHost> </mycat:schema>
[root@localhost ~]# mycat restart 重启mycat Stopping Mycat-server... Mycat-server was not running. Starting Mycat-server...

[root@localhost conf]# cat /apps/mycat/logs/wrapper.log 查看日志

3.7、主服务器上建立一个用户
(root@localhost) [(none)]> GRANT ALL ON *.* TO 'root'@'192.168.133.%' IDENTIFIED BY '' ; Query OK, 0 rows affected, 1 warning (0.00 sec)
3.8、客户端测试
[root@localhost ~]# mysql -uroot -p -h 192.168.133.25 这时可以不加端口直接进入数据库了 (root@192.168.133.25) [(none)]> show databases; +----------+ | DATABASE | +----------+ | TESTDB | +----------+ 1 row in set (0.00 sec) (root@192.168.133.25) [(none)]> use TESTDB; Database changed (root@192.168.133.25) [TESTDB]> SHOW TABLES; 打开表显示的就是hellodb数据库里的表

(root@localhost) [mysql]> select @@server_id;

(root@localhost) [hellodb]> set global general_log=1; 主服务器打开日志 Query OK, 0 rows affected (0.00 sec) (root@localhost) [mysql]> set global general_log=1; 从服务器打开日志 Query OK, 0 rows affected (0.00 sec)
主从服务器都输入监控数据库的命令
[root@localhost ~]# tail -f /usr/local/mysql/data/mysql_general.log
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207342.html原文链接:https://javaforall.net
